ox-latex: convert verbatim text in headings to texttt

* lisp/ox-latex.el (org-latex--protect-texttt): New function.
(org-latex--text-markup): Use new function.
(org-latex-headline): Convert any instances of \verb text with
\texttt.  This is required to work around LaTeX peculiarities that
would otherwise cause compilation to fail (see the code comment for
more information).
This commit is contained in:
TEC 2021-03-31 23:06:14 +08:00 committed by Nicolas Goaziou
parent f7e0e17e82
commit bcfe6f985c
1 changed files with 24 additions and 17 deletions

View File

@ -1521,22 +1521,23 @@ INFO is a plist used as a communication channel. See
separator
(replace-regexp-in-string "\n" " " text)
separator)))
;; Handle the `protectedtexttt' special case: Protect some
;; special chars and use "\texttt{%s}" format string.
(protectedtexttt
(format "\\texttt{%s}"
(replace-regexp-in-string
"--\\|[\\{}$%&_#~^]"
(lambda (m)
(cond ((equal m "--") "-{}-")
((equal m "\\") "\\textbackslash{}")
((equal m "~") "\\textasciitilde{}")
((equal m "^") "\\textasciicircum{}")
(t (org-latex--protect-text m))))
text nil t)))
(protectedtexttt (org-latex--protect-texttt text))
;; Else use format string.
(t (format fmt text)))))
(defun org-latex--protect-texttt (text)
"Protect special chars, then wrap TEXT in \"\\texttt{}\"."
(format "\\texttt{%s}"
(replace-regexp-in-string
"--\\|[\\{}$%&_#~^]"
(lambda (m)
(cond ((equal m "--") "-{}-")
((equal m "\\") "\\textbackslash{}")
((equal m "~") "\\textasciitilde{}")
((equal m "^") "\\textasciicircum{}")
(t (org-latex--protect-text m))))
text nil t)))
(defun org-latex--delayed-footnotes-definitions (element info)
"Return footnotes definitions in ELEMENT as a string.
@ -1952,10 +1953,16 @@ holding contextual information."
;; Create a temporary export back-end that hard-codes
;; "\underline" within "\section" and alike.
(section-back-end
(org-export-create-backend
:parent 'latex
:transcoders
'((underline . (lambda (o c i) (format "\\underline{%s}" c))))))
(org-export-create-backend
:parent 'latex
:transcoders
'((underline . (lambda (o c i) (format "\\underline{%s}" c)))
;; LaTeX isn't happy when you try to use \verb inside the argument of other
;; commands (like \section, etc.), and this causes compilation to fail.
;; So, within headings it's a good idea to replace any instances of \verb
;; with \texttt.
(code . (lambda (_ c _) (org-latex--protect-texttt c)))
(verbatim . (lambda (_ c _) (org-latex--protect-texttt c))))))
(text
(org-export-data-with-backend
(org-element-property :title headline) section-back-end info))