From bcfe6f985cc791e90638d3adac8cfa81291375ae Mon Sep 17 00:00:00 2001 From: TEC Date: Wed, 31 Mar 2021 23:06:14 +0800 Subject: [PATCH] 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). --- lisp/ox-latex.el | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 29663b3f2..932f38530 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -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))