From baf9cc50313bb7df94e8173349db9c834f1ccf64 Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias Date: Fri, 11 Aug 2023 19:57:49 +0200 Subject: [PATCH] lisp/ox-latex.el: add the `:literal' attribute to verse block. * (org-latex-verse-block): now the treatment of blank lines is consistent with the syntax of the LaTeX `verse' environment, and the one provided by the `verse' package. If the `':literal attribute is used, the content is not exported within a `verse' environment, but as-is, preserving horizontal spaces, line breaks, and blank lines. --- lisp/ox-latex.el | 52 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 31cad1dc4..557ceee1b 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -4116,32 +4116,58 @@ contextual information." (let* ((lin (org-export-read-attribute :attr_latex verse-block :lines)) (latcode (org-export-read-attribute :attr_latex verse-block :latexcode)) (cent (org-export-read-attribute :attr_latex verse-block :center)) - (attr (concat - (if cent "[\\versewidth]" "") - (if lin (format "\n\\poemlines{%s}" lin) "") - (if latcode (format "\n%s" latcode) ""))) + (lit (org-export-read-attribute :attr_latex verse-block :literal)) + (attr (if (not lit) + (concat + (if cent "[\\versewidth]" "") + (if lin (format "\n\\poemlines{%s}" lin) "") + (if latcode (format "\n%s" latcode) "")) + "")) (versewidth (org-export-read-attribute :attr_latex verse-block :versewidth)) - (vwidth (if versewidth (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "")) - (linreset (if lin "\n\\poemlines{0}" ""))) + (vwidth (if (not lit) + (if versewidth (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "") + "")) + (linreset (if (not lit) + (if lin "\n\\poemlines{0}" "") + ""))) (concat (org-latex--wrap-label verse-block ;; In a verse environment, add a line break to each newline ;; character and change each white space at beginning of a line - ;; into a space of 1 em. Also change each blank line with - ;; a vertical space of 1 em. - (format "%s\\begin{verse}%s\n%s\\end{verse}%s" + ;; into a normal space, calculated with `\fontdimen2\font'. + ;; One or more blank lines between lines are exported as a + ;; single blank line. If the `:literal' attribute is used, + ;; CONTENTS is exported as is, with no environment, preserving + ;; line breaks and vertical and horizontal spaces. + (format (if (not lit) + "%s\\begin{verse}%s\n%s\\end{verse}%s" + "%s%s\n%s%s") vwidth attr (replace-regexp-in-string - "^[ \t]+" (lambda (m) (format "\\hspace*{%dem}" (length m))) + "^[ \t]+" (lambda (m) (format "\\hspace*{%d\\fontdimen2\\font}" (length m))) (replace-regexp-in-string - (concat "^[ \t]*" (regexp-quote org-latex-line-break-safe) "$") - "\\vspace*{1em}" + (if (not lit) + (concat "\\(" + (regexp-quote org-latex-line-break-safe) + "\n\\)" + "\\(^[ \t]*" + (regexp-quote org-latex-line-break-safe) + "\n" + "\\)+") + (concat "^[ \t]*" (regexp-quote org-latex-line-break-safe) "$")) + (if (not lit) + (if lin "\\\\!\n\n" "\n\n") + "\\vspace*{\\baselineskip}") (replace-regexp-in-string "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" (concat org-latex-line-break-safe "\n") - contents nil t) + (if (not lit) + ;; Remove any blank lines before and after CONTENTS. + (concat (org-trim contents t) "\n") + contents) + nil t) nil t) nil t) linreset) -- 2.41.0