diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index a049284ba..3b03c6685 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -2994,22 +2994,20 @@ contextual information." (cond ;; Case 1. No source fontification. ((or (not lang) (not listings)) - (let* ((caption-str (org-latex--caption/label-string src-block info)) - (float-env - (cond ((string= "multicolumn" float) - (format "\\begin{figure*}[%s]\n%s%%s\n%s\\end{figure*}" - (plist-get info :latex-default-figure-position) - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) - (caption (concat - (if caption-above-p caption-str "") - "%s" - (if caption-above-p "" (concat "\n" caption-str)))) - (t "%s")))) - (format - float-env - (concat (format "\\begin{verbatim}\n%s\\end{verbatim}" - (org-export-format-code-default src-block info)))))) + (let ((caption-str (org-latex--caption/label-string src-block info)) + (verbatim (format "\\begin{verbatim}\n%s\\end{verbatim}" + (org-export-format-code-default src-block info)))) + (cond ((string= "multicolumn" float) + (format "\\begin{figure*}[%s]\n%s%s\n%s\\end{figure*}" + (plist-get info :latex-default-figure-position) + (if caption-above-p caption-str "") + verbatim + (if caption-above-p "" caption-str))) + (caption (concat + (if caption-above-p caption-str "") + verbatim + (if caption-above-p "" (concat "\n" caption-str)))) + (t verbatim)))) ;; Case 2. Custom environment. (custom-env (let ((caption-str (org-latex--caption/label-string src-block info)) diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 3f39645af..54558041b 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -3907,6 +3907,103 @@ Another text. (ref:text) (org-export-format-code-default (org-element-map tree 'src-block #'identity info t) info)))))) +(ert-deftest test-org-export/latex-src-block-verbatim-caption () + "Test `org-latex-src-block' caption for verbatim environment. +Check that percent sign does not become a part of format. +This test does not cover listings and custom environments." + (let ((export + (lambda (buffer-text) + (org-test-with-parsed-data + buffer-text + (let* ((backend (org-export-get-backend 'latex)) + (info (org-combine-plists + (org-export--get-export-attributes backend) + (org-export-get-environment backend))) + (result (org-latex-src-block + (org-element-map tree 'src-block #'identity info t) + t info))) + ;; Remove properties to make failure reports more clear. + (set-text-properties 0 (length result) nil result) + result))))) + + (should (equal + "\ +\\begin{verbatim} +\"No float, no listings, 20%S\" +\\end{verbatim} +\\captionof{figure}{Caption of verbatim is below, 20\\%s} +" + (funcall export + "\ +#+CAPTION: Caption of verbatim is below, 20%s +#+BEGIN_SRC emacs-lisp + \"No float, no listings, 20%S\" +#+END_SRC"))) + + ;; `org-latex-caption-above' has no associated property or keyword. + (should (equal + "\ +\\captionof{figure}{Caption of verbatim is above, 40\\%s} +\\begin{verbatim} +\"No float, no listings, 40%S\" +\\end{verbatim}" + (let ((org-latex-caption-above t)) + (funcall export + "\ +#+CAPTION: Caption of verbatim is above, 40%s +#+BEGIN_SRC emacs-lisp + \"No float, no listings, 40%S\" +#+END_SRC")))) + + (should (equal + "\ +\\begin{figure*}[tp] +\\caption{Caption is above, 60\\%s} +\\begin{verbatim} +\"Float, no listings, 60%S\" +\\end{verbatim} +\\end{figure*}" + (let ((org-latex-caption-above t) + (org-latex-default-figure-position "tp")) + (funcall export + "\ +#+CAPTION: Caption is above, 60%s +#+ATTR_LATEX: :float multicolumn +#+BEGIN_SRC emacs-lisp + \"Float, no listings, 60%S\" +#+END_SRC")))) + + (should (equal + "\ +\\begin{figure*}[tp] +\\begin{verbatim} +\"Float, no lang, listings, 80%S\" +\\end{verbatim} +\\caption{Caption is below, 60\\%s} +\\end{figure*}" + (let ((org-latex-listings 'minted) ; inactive due to missing lang + (org-latex-default-figure-position "tp")) + ;; Namely "multicolumn" value to get just figure environment + ;; looks like a bug. + (funcall export + "\ +#+CAPTION: Caption is below, 60%s +#+ATTR_LATEX: :float multicolumn +#+BEGIN_SRC + \"Float, no lang, listings, 80%S\" +#+END_SRC")))) + + (should (equal + "\ +\\begin{verbatim} +\"No caption, no float, no listings, 100%S\" +\\end{verbatim}" + (funcall export + "\ +#+BEGIN_SRC emacs-lisp + \"No caption, no float, no listings, 100%S\" +#+END_SRC"))))) + ;;; Smart Quotes