Explorar o código

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).
TEC %!s(int64=4) %!d(string=hai) anos
pai
achega
bcfe6f985c
Modificáronse 1 ficheiros con 24 adicións e 17 borrados
  1. 24 17
      lisp/ox-latex.el

+ 24 - 17
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))