From ec560f6f037b902d603e9f34bbe593cb4c6bf4a9 Mon Sep 17 00:00:00 2001 From: TEC Date: Mon, 9 May 2022 00:04:10 +0800 Subject: [PATCH 10/10] ox-latex: Fix %-captions in minted/engraved code * lisp/ox-latex.el (org-latex-src-block--engraved, org-latex-src-block--minted): Refactor float-env to be clearer, and switch from `format' to `concat' to fix the bug where %-chars in captions are interpreted as a format specifier. --- lisp/ox-latex.el | 55 +++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 528243a59..bb8072230 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -3332,23 +3332,20 @@ (cl-defun org-latex-src-block--minted (let* ((caption-str (org-latex--caption/label-string src-block info)) (placement (or (org-unbracket-string "[" "]" (plist-get attributes :placement)) (plist-get info :latex-default-figure-position))) + (multicolumn-p (string= "multicolumn" float)) (float-env (cond - ((string= "multicolumn" float) - (format "\\begin{listing*}[%s]\n%s%%s\n%s\\end{listing*}" - placement - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) - (caption - (format "\\begin{listing}[%s]\n%s%%s\n%s\\end{listing}" - placement - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) + ((or caption multicolumn-p) + (cons + (concat "\\begin{listing" (when multicolumn-p "*") + "}[" placement "]\n" + (if caption-above-p caption-str "")) + (concat "\n" (if caption-above-p "" caption-str) + "\\end{listing" (when multicolumn-p "*") "}"))) ((string= "t" float) - (concat (format "\\begin{listing}[%s]\n" - placement) - "%s\n\\end{listing}")) - (t "%s"))) + (cons + (concat "\\begin{listing}[" placement "]\n") + "\n\\end{listing}")))) (options (plist-get info :latex-minted-options)) (body (format @@ -3388,8 +3385,7 @@ (cl-defun org-latex-src-block--minted ?\s) (format "(%s)" ref))))) nil (and retain-labels (cdr code-info))))))) - ;; Return value. - (format float-env body))) + (concat (car float-env) body (cdr float-env)))) (defun org-latex-src--engrave-code (content lang &optional theme options inline) "Engrave CONTENT to LaTeX in a LANG-mode buffer, and give the result. @@ -3442,23 +3438,20 @@ (cl-defun org-latex-src-block--engraved (let* ((caption-str (org-latex--caption/label-string src-block info)) (placement (or (org-unbracket-string "[" "]" (plist-get attributes :placement)) (plist-get info :latex-default-figure-position))) + (multicolumn-p (string= "multicolumn" float)) (float-env (cond - ((string= "multicolumn" float) - (format "\\begin{listing*}[%s]\n%s%%s\n%s\\end{listing*}" - placement - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) - (caption - (format "\\begin{listing}[%s]\n%s%%s\n%s\\end{listing}" - placement - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) + ((or caption multicolumn-p) + (cons + (concat "\\begin{listing" (when multicolumn-p "*") + "}[" placement "]\n" + (if caption-above-p caption-str "")) + (concat "\n" (if caption-above-p "" caption-str) + "\\end{listing" (when multicolumn-p "*") "}"))) ((string= "t" float) - (concat (format "\\begin{listing}[%s]\n" - placement) - "%s\n\\end{listing}")) - (t "%s"))) + (cons + (concat "\\begin{listing}[" placement "]\n") + "\n\\end{listing}")))) (options (let ((engraved-options (plist-get info :latex-engraved-options)) (local-options (plist-get attributes :options))) @@ -3493,7 +3486,7 @@ (cl-defun org-latex-src-block--engraved content lang (when engraved-theme (intern engraved-theme)) options))) - (format float-env body))) + (concat (car float-env) body (cdr float-env)))) (cl-defun org-latex-src-block--listings (&key src-block info lang caption caption-above-p label num-start retain-labels attributes float &allow-other-keys) -- 2.35.3