* [patch] ox-latex.el: fix blank lines behavior in verse block @ 2023-08-06 12:03 Juan Manuel Macías 2023-08-07 11:40 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-06 12:03 UTC (permalink / raw) To: orgmode [-- Attachment #1: Type: text/plain, Size: 3441 bytes --] Rationale for this patch: the treatment of blank lines in `org-latex-verse-block' is inconsistent with the syntax of the `verse' environment, both the one that includes LaTeX and the one provided by the `verse' package as a replacement for the former. Currently, each blank line is exported to LaTeX as an explicit vertical space: \vspace*{1em}. This can return unexpected results. For example, this: ┌──── │ #+begin_verse │ │ lorem │ ipsum │ dolor | │ #+end_verse └──── is exported to LaTeX as: ┌──── │ \begin{verse} │ \vspace*{1em} │ lorem\\[0pt] │ ipsum\\[0pt] │ dolor\\[0pt] │ \vspace*{1em} │ \end{verse} └──── In the LaTeX `verse' environment, spaces before and after the content are not taken into account. As for the separation between stanzas, this is marked with at least one blank line between the stanzas, as in normal paragraphs (not with an explicit vertical space). Also it is not necessar y that the last verse of each stanza ends with the linebreak mark `\\'. So, after this patch: • Any blank line before and/or after the content is removed; • One or more blank lines between stanzas are exported as a single blank line, leaving the previous final verse without the linebreak mark `\\'; • When verse numbering is enabled via the `:lines' attribute (for the `verse' package), the last verses of each stanza are marked with `\\!', according to the verse package syntax (this was not necessary with the previous behavior). This way, the `verse' block is exported to LaTeX with the correct syntax. This also brings the advantage of being able to globally control the spacing between stanzas via the verse package’s \stanzaskip command. Example: ┌──── │ #+begin_verse │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ #+end_verse └──── LaTeX: ┌──── │ \begin{verse} │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor │ │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor │ │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ \end{verse} └──── And with verse numbers: ┌──── │ #+ATTR_LaTeX: :lines 5 │ #+begin_verse │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ │ Lorem ipsum dolor │ lorem ipsum dolor │ lorem ipsum dolor │ #+end_verse └──── LaTeX: ┌──── │ \begin{verse} │ \poemlines{5} │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\! │ │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\! │ │ Lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ lorem ipsum dolor\\[0pt] │ \end{verse} │ \poemlines{0} └──── N.B.: the `\\[0pt]' mark of the last verse does not affect the final result. Best regards, Juan Manuel -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-ox-latex.el-fix-blank-lines-behavior-in-verse-b.patch --] [-- Type: text/x-patch, Size: 1944 bytes --] From 0c8a352567333d0d743b5235b68e9cd5d513f615 Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias <maciaschain@posteo.net> Date: Sun, 6 Aug 2023 12:42:36 +0200 Subject: [PATCH] lisp/ox-latex.el: fix blank lines behavior in verse block export. * (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. --- lisp/ox-latex.el | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 31cad1dc4..26827537a 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -4128,20 +4128,28 @@ contextual information." 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. + ;; into a space of 1 em. One or more blank lines between lines + ;; are exported as a single blank line. (format "%s\\begin{verse}%s\n%s\\end{verse}%s" vwidth attr (replace-regexp-in-string "^[ \t]+" (lambda (m) (format "\\hspace*{%dem}" (length m))) (replace-regexp-in-string - (concat "^[ \t]*" (regexp-quote org-latex-line-break-safe) "$") - "\\vspace*{1em}" + (concat "\\(" + (regexp-quote org-latex-line-break-safe) + "\n\\)" + "\\(^[ \t]*" + (regexp-quote org-latex-line-break-safe) + "\n" + "\\)+") + (if lin "\\\\!\n\n" "\n\n") (replace-regexp-in-string "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" (concat org-latex-line-break-safe "\n") - contents nil t) + ;; Remove any blank lines before and after CONTENTS. + (concat (org-trim contents t) "\n") + nil t) nil t) nil t) linreset) -- 2.41.0 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-06 12:03 [patch] ox-latex.el: fix blank lines behavior in verse block Juan Manuel Macías @ 2023-08-07 11:40 ` Ihor Radchenko 2023-08-07 17:23 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-07 11:40 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > Rationale for this patch: the treatment of blank lines in > `org-latex-verse-block' is inconsistent with the syntax of the `verse' > environment, both the one that includes LaTeX and the one provided by > the `verse' package as a replacement for the former. > ... > So, after this patch: > > • Any blank line before and/or after the content is removed; > > • One or more blank lines between stanzas are exported as a single blank > line, leaving the previous final verse without the linebreak mark > `\\'; > > • When verse numbering is enabled via the `:lines' attribute (for the > `verse' package), the last verses of each stanza are marked with > `\\!', according to the verse package syntax (this was not necessary > with the previous behavior). I see nothing that would prevent merging this patch. However, I believe that removing blank lines before/after content is something we may want to do in other built-in backends as well. WDYT? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-07 11:40 ` Ihor Radchenko @ 2023-08-07 17:23 ` Juan Manuel Macías 2023-08-09 7:57 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-07 17:23 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: >> Rationale for this patch: the treatment of blank lines in >> `org-latex-verse-block' is inconsistent with the syntax of the `verse' >> environment, both the one that includes LaTeX and the one provided by >> the `verse' package as a replacement for the former. >> ... >> So, after this patch: >> >> • Any blank line before and/or after the content is removed; >> >> • One or more blank lines between stanzas are exported as a single blank >> line, leaving the previous final verse without the linebreak mark >> `\\'; >> >> • When verse numbering is enabled via the `:lines' attribute (for the >> `verse' package), the last verses of each stanza are marked with >> `\\!', according to the verse package syntax (this was not necessary >> with the previous behavior). > > I see nothing that would prevent merging this patch. > However, I believe that removing blank lines before/after content is > something we may want to do in other built-in backends as well. WDYT? I think you're right. My impression is that the blank lines before/after content is not a desired feature, but rather a consequence of substituting line breaks to create the space between stanzas. I think the space before/after is better removed because it doesn't make sense and adds unnecessary direct formatting[1]. Maybe it could be changed to `(org-trim contents t) in all cases, like in this patch? [1] However, the horizontal 'verbatim' space that can be added before each line/verse seems like a great feature to me, since verses can also be indented arbitrarily. This block it's a gem, and it has some really cool features, not just to quote poetry. Best regards, Juan Manuel ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-07 17:23 ` Juan Manuel Macías @ 2023-08-09 7:57 ` Ihor Radchenko 2023-08-09 8:41 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-09 7:57 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: >> I see nothing that would prevent merging this patch. >> However, I believe that removing blank lines before/after content is >> something we may want to do in other built-in backends as well. WDYT? > > I think you're right. My impression is that the blank lines before/after > content is not a desired feature, but rather a consequence of > substituting line breaks to create the space between stanzas. Do you mean that people use extra leading/trailing spaces just to get extra vertical space before/after the verse block in _latex_ export? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-09 7:57 ` Ihor Radchenko @ 2023-08-09 8:41 ` Juan Manuel Macías 2023-08-10 9:27 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-09 8:41 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: >>> I see nothing that would prevent merging this patch. >>> However, I believe that removing blank lines before/after content is >>> something we may want to do in other built-in backends as well. WDYT? >> >> I think you're right. My impression is that the blank lines before/after >> content is not a desired feature, but rather a consequence of >> substituting line breaks to create the space between stanzas. > > Do you mean that people use extra leading/trailing spaces just to get > extra vertical space before/after the verse block in _latex_ export? No, I don't think people use it for that purpose. I meant that if someone puts a space before or after the content (which can be usual, for clarity): #+begin_verse blah... #+end_verse that vertical space appears in the export, which shouldn't. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-09 8:41 ` Juan Manuel Macías @ 2023-08-10 9:27 ` Ihor Radchenko 2023-08-10 10:39 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-10 9:27 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: >> Do you mean that people use extra leading/trailing spaces just to get >> extra vertical space before/after the verse block in _latex_ export? > > No, I don't think people use it for that purpose. I meant that if > someone puts a space before or after the content (which can be usual, > for clarity): > > #+begin_verse > > blah... > > #+end_verse > > that vertical space appears in the export, which shouldn't. Well. Technically, we already warn users that the blank lines are preserved in the verse blocks: 12.1 Paragraphs =============== Paragraphs are separated by at least one empty line. If you need to enforce a line break within a paragraph, use ‘\\’ at the end of a line. To preserve the line breaks, indentation and blank lines in a region, but otherwise use normal formatting, you can use this construct, which can also be used to format poetry. #+BEGIN_VERSE Great clouds overhead Tiny black birds rise and fall Snow covers Emacs ---AlexSchroeder #+END_VERSE So, I now think that while extra cleanups might be OK for ox-latex, we may not want to ignore empty lines universally in all the verse blocks. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-10 9:27 ` Ihor Radchenko @ 2023-08-10 10:39 ` Juan Manuel Macías 2023-08-11 10:00 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-10 10:39 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: > Well. Technically, we already warn users that the blank lines are > preserved in the verse blocks: > > 12.1 Paragraphs > =============== > > Paragraphs are separated by at least one empty line. If you need to > enforce a line break within a paragraph, use ‘\\’ at the end of a line. > > To preserve the line breaks, indentation and blank lines in a region, > but otherwise use normal formatting, you can use this construct, which > can also be used to format poetry. > > > #+BEGIN_VERSE > Great clouds overhead > Tiny black birds rise and fall > Snow covers Emacs > > ---AlexSchroeder > #+END_VERSE > > So, I now think that while extra cleanups might be OK for ox-latex, we > may not want to ignore empty lines universally in all the verse blocks. hmm, I don't know if phrased like that (as read in the documentation) it's clear enough that the empty lines before and after the content are also preserved. I would understand not, but it could also be a habit that I inherited from LaTeX: I usually leave a blank line between the #+begin/#+end directives and the content because it makes it easier for me to read. I don't know if it is a widespread habit among other users... Anyway, I don't mind leaving things as they are in the other backends, but in the case of LaTeX, with my patch modifications, it would be necessary to remove the blank lines before and after the content. Otherwise it would produce something like: \begin{verse} \\[0pt] \\[0pt] \\[0pt] \\[0pt] \\[0pt] lorem ipsum dolor \end{verse} which would return the error "There's no line here to end". Also, the LaTeX 'verse' environment has its own syntax for vertical spaces. It is not necessary to put an explicit \vspace just to separate stanzas. ... In any case, the fact that the verse block can also be used to literally export line breaks and horizontal/vertical spaces is interesting. Something occurred to me that I don't know if it's a bit foolhardy: how about a LaTeX attribute ':literal t'? If used, it would not export to a verse environment (specialized in poetry) but to normal text, without environment, but with line breaks and horizontal and vertical spacing preserved... wdyt? -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-10 10:39 ` Juan Manuel Macías @ 2023-08-11 10:00 ` Ihor Radchenko 2023-08-11 18:52 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-11 10:00 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > ... In any case, the fact that the verse block can also be used to > literally export line breaks and horizontal/vertical spaces is > interesting. Something occurred to me that I don't know if it's a bit > foolhardy: how about a LaTeX attribute ':literal t'? If used, it would > not export to a verse environment (specialized in poetry) but to normal > text, without environment, but with line breaks and horizontal and > vertical spacing preserved... wdyt? If one uses verse blocks to export to multiple backends, your suggestion sounds reasonable. That way, export results will look closer across different export backends. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-11 10:00 ` Ihor Radchenko @ 2023-08-11 18:52 ` Juan Manuel Macías 2023-08-12 7:56 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-11 18:52 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode [-- Attachment #1: Type: text/plain, Size: 1647 bytes --] Ihor Radchenko writes: > Juan Manuel Macías <maciaschain@posteo.net> writes: > >> ... In any case, the fact that the verse block can also be used to >> literally export line breaks and horizontal/vertical spaces is >> interesting. Something occurred to me that I don't know if it's a bit >> foolhardy: how about a LaTeX attribute ':literal t'? If used, it would >> not export to a verse environment (specialized in poetry) but to normal >> text, without environment, but with line breaks and horizontal and >> vertical spacing preserved... wdyt? > > If one uses verse blocks to export to multiple backends, your suggestion > sounds reasonable. That way, export results will look closer across > different export backends. How about this (pre-)patch? With the `:literal' attr., the content of the block is exported "as is", with all manual formatting preserved. I have made some modifications in the horizontal and vertical spaces (in case :literal is used), because the em does not seem the correct length to me. The em equals the font size in points, and, vertically, it would not equal a blank line (line spacing is usually 120% of the em), so it's safest to use \baselineskip. Thus, \vspace*{\baselineskip} is identical to leaving an empty line. As for the horizontal space, the em is greater than the normal space. The closest thing would be to use \fontdimen2\font. So, if one puts 6 manual spaces (with the spacebar key), it is exported as \hspace*{6\fontdimen2\font} -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-ox-latex.el-add-the-literal-attribute-to-verse-.patch --] [-- Type: text/x-patch, Size: 3962 bytes --] From baf9cc50313bb7df94e8173349db9c834f1ccf64 Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias <maciaschain@posteo.net> 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-11 18:52 ` Juan Manuel Macías @ 2023-08-12 7:56 ` Ihor Radchenko 2023-08-12 11:28 ` Juan Manuel Macías 2023-08-14 20:10 ` Juan Manuel Macías 0 siblings, 2 replies; 22+ messages in thread From: Ihor Radchenko @ 2023-08-12 7:56 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > How about this (pre-)patch? With the `:literal' attr., the content of the > block is exported "as is", with all manual formatting preserved. Looks reasonable in general. Of course, we will also need to document the new attribute. > I have made some modifications in the horizontal and vertical spaces (in > case :literal is used)... Makes sense to me. > + (vwidth (if (not lit) > + (if versewidth (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "") > + "")) Can just do (if (and versewidth (not lit)) (format ...) "") > + (linreset (if (not lit) > + (if lin "\n\\poemlines{0}" "") > + ""))) (if (and lin (not lit)) ...) > (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") In the case of lit vwidth and attr are always empty. So, you are inserting an extra newline in front. Is it intentional? > + (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) "$")) May also use rx for better readability. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-12 7:56 ` Ihor Radchenko @ 2023-08-12 11:28 ` Juan Manuel Macías 2023-08-13 8:06 ` Ihor Radchenko 2023-08-14 20:10 ` Juan Manuel Macías 1 sibling, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-12 11:28 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: > Juan Manuel Macías <maciaschain@posteo.net> writes: >> + (vwidth (if (not lit) >> + (if versewidth (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "") >> + "")) > > Can just do (if (and versewidth (not lit)) (format ...) "") > >> + (linreset (if (not lit) >> + (if lin "\n\\poemlines{0}" "") >> + ""))) > > (if (and lin (not lit)) ...) Thanks for the suggestions. Yes, it's simpler that way. >> (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") > > In the case of lit vwidth and attr are always empty. So, you are > inserting an extra newline in front. Is it intentional? I used that procedure because an extra blank line before (in the LaTeX code) it has no effect in LaTeX compilation. And in case the :literal attribute is present, vertical spaces are achieved by explicit \vspace*{}. One or more empty lines before it just marks the beginning of a new paragraph. Naturally, if :literal is used the rest of attributes are meaningless because they are intended for the verse environment. They can even give some error in the compilation. So I opted to disable them with the mere presence of :literal, leaving them 'empty' (so as not to manipulate the function further). >> + (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) "$")) > > May also use rx for better readability. I remember that I tried rx a while ago and found it very useful and comfortable, but then I haven't done anything with it. The fact is that over time I have ended up getting used to suffering from the classic regexp and it is hard for me to get out of there :-). Of course, with rx it would be clearer but I would have to refresh my memory. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-12 11:28 ` Juan Manuel Macías @ 2023-08-13 8:06 ` Ihor Radchenko 0 siblings, 0 replies; 22+ messages in thread From: Ihor Radchenko @ 2023-08-13 8:06 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: >>> + (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) "$")) >> >> May also use rx for better readability. > > I remember that I tried rx a while ago and found it very useful and > comfortable, but then I haven't done anything with it. The fact is that > over time I have ended up getting used to suffering from the classic > regexp and it is hard for me to get out of there :-). Of course, with rx > it would be clearer but I would have to refresh my memory. You can refer to [[info:elisp#Rx Constructs][elisp#Rx Constructs]] I think your regexp in rx should look like (rx-to-string `(seq (group ,org-latex-line-break-safe "\n") (1+ (group line-start (0+ space) ,org-latex-line-break "\n")))) -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-12 7:56 ` Ihor Radchenko 2023-08-12 11:28 ` Juan Manuel Macías @ 2023-08-14 20:10 ` Juan Manuel Macías 2023-08-15 10:08 ` Ihor Radchenko 1 sibling, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-14 20:10 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode [-- Attachment #1: Type: text/plain, Size: 388 bytes --] Ihor Radchenko writes: > Looks reasonable in general. Of course, we will also need to document > the new attribute. Here is the modified patch (with your suggestions, including the `rx' code) and the documentation of the new attribute. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-ox-latex.el-add-the-literal-attribute-to-verse-.patch --] [-- Type: text/x-patch, Size: 5506 bytes --] From 463e4a984b0ccc9bc1fdde699cb5cfed1ac59613 Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias <maciaschain@posteo.net> Date: Mon, 14 Aug 2023 21:48:58 +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. The rx code has been suggested by Ihor Radchenko, to improve readability. * doc/org-manual.org (Verse blocks in LaTeX export): the new feature is documented. --- doc/org-manual.org | 12 ++++++++++-- lisp/ox-latex.el | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index e59efc417..b640bbc7c 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -14425,8 +14425,8 @@ The LaTeX export backend converts horizontal rules by the specified #+cindex: verse blocks, in @LaTeX{} export #+cindex: @samp{ATTR_LATEX}, keyword -The LaTeX export backend accepts four attributes for verse blocks: -=:lines=, =:center=, =:versewidth= and =:latexcode=. The three first +The LaTeX export backend accepts five attributes for verse blocks: +=:lines=, =:center=, =:versewidth=, =:latexcode= and =:literal=. The three first require the external LaTeX package =verse.sty=, which is an extension of the standard LaTeX environment. @@ -14440,6 +14440,14 @@ of the standard LaTeX environment. verse. - =:latexcode= :: It accepts any arbitrary LaTeX code that can be included within a LaTeX =verse= environment. +- =:literal= :: With value t, the block is not exported to a =verse= + environment; instead, the content is exported as-is, preserving all + white lines as =\vspace{\baselineskip}=. Note that in the =verse= + environment, one or more blank lines between stanzas are exported as + a single blank line, and any blank lines before or after the content + are removed. If the =verse= package is loaded, the vertical spacing + between stanzas can be controlled by the length =\stanzaskip= (see + https://www.ctan.org/pkg/verse). A complete example with Shakespeare's first sonnet: diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 31cad1dc4..fcf22f87d 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -4116,32 +4116,49 @@ 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 (and versewidth (not lit)) (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "")) + (linreset (if (and lin (not lit)) "\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) + (rx-to-string + `(seq (group ,org-latex-line-break-safe "\n") + (1+ (group line-start (0+ space) ,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) + (concat (org-trim contents t) "\n") + contents) + nil t) nil t) nil t) linreset) -- 2.41.0 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-14 20:10 ` Juan Manuel Macías @ 2023-08-15 10:08 ` Ihor Radchenko 2023-08-15 11:50 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-15 10:08 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > Ihor Radchenko writes: > >> Looks reasonable in general. Of course, we will also need to document >> the new attribute. > > Here is the modified patch (with your suggestions, including the `rx' code) > and the documentation of the new attribute. Thanks! I tested the patch with #+attr_latex: :literal t #+begin_verse This is just a test. ASF. #+end_verse and then with #+attr_latex: :literal t #+begin_verse This is just a test. ASF. #+end_verse The output is not different, which it should be, AFAIU. Am I missing something? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-15 10:08 ` Ihor Radchenko @ 2023-08-15 11:50 ` Juan Manuel Macías 2023-08-15 11:53 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-15 11:50 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: > Thanks! > I tested the patch with > > #+attr_latex: :literal t > > #+begin_verse > > This is just a test. > ASF. > > #+end_verse > > > and then with > > #+attr_latex: :literal t > > #+begin_verse > > This is just a test. > > ASF. > > #+end_verse > > The output is not different, which it should be, AFAIU. Am I missing something? I have tried your examples and I think both give the expected result. Look at this screenshot: https://i.imgur.com/ofl8Z9f.png Note one important thing: the only horizontal spaces that are exported "literally" (ie with \hspace...) are the ones at the beginning of the line. This is the same as the old behavior, and works with both :literal and the verse environment. Spaces between words are not exported. Well, they are exported, but not as \hspace, so LaTeX resolves one or more space to a single space. It could be an interesting feature that spaces between words are also preserved, but none of the other backends do that... Actually the :literal attribute has effect only on blank lines. (Anyway, I think that without exporting the spaces between words, the :literal attribute is a bit incomplete. But if those spaces are exported, it would break compatibility with the other backends. The horizontal space before the line makes sense for verses, because these can often be indented arbitrarily in a poem. The other possibility is that the :literal attribute also exports to a verse environment. In that case, it would not break compatibility [the verse block in LaTeX would just have two "modes": one more coherent with the syntax of the verse environment and another one more similar to the behavior of the rest of the backends and the "old" verse block behavior in LaTeX export]). -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-15 11:50 ` Juan Manuel Macías @ 2023-08-15 11:53 ` Ihor Radchenko 2023-08-15 14:25 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-15 11:53 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: >> The output is not different, which it should be, AFAIU. Am I missing something? > > I have tried your examples and I think both give the expected result. > Look at this screenshot: > > https://i.imgur.com/ofl8Z9f.png Sure, but look at the pdf. The generated pdfs are not different for some reason. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-15 11:53 ` Ihor Radchenko @ 2023-08-15 14:25 ` Juan Manuel Macías 2023-08-16 8:10 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-15 14:25 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode Ihor Radchenko writes: > Sure, but look at the pdf. The generated pdfs are not different for some > reason. Ah, sorry. It was a foolish oversight of mine. The point is that a \vspace after a line break in normal text has no effect. This does work: lorem ipsum\\ \vspace*{10ex}\\ dolor but it's a dirty workaround. In addition, there are more problems that I had not noticed. If it is normal text, LaTeX indents the first line. A \parindent=0 should be added, but that means complicating things unnecessarily... I think the best thing is to rethink the :literal attribute, as I commented at the end of my other email: - without :literal --> verse environment with a more "canonical" syntax. - with :literal --> verse environment seen in the "old (org) style", preserving the blank lines. In that context \vspace does work. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-15 14:25 ` Juan Manuel Macías @ 2023-08-16 8:10 ` Ihor Radchenko 2023-08-16 14:10 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-16 8:10 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > I think the best thing is to rethink the :literal attribute, as I > commented at the end of my other email: > > - without :literal --> verse environment with a more "canonical" syntax. > > - with :literal --> verse environment seen in the "old (org) style", > preserving the blank lines. In that context \vspace does work. +1 -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-16 8:10 ` Ihor Radchenko @ 2023-08-16 14:10 ` Juan Manuel Macías 2023-08-17 10:35 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-16 14:10 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode [-- Attachment #1: Type: text/plain, Size: 608 bytes --] Ihor Radchenko writes: > Juan Manuel Macías <maciaschain@posteo.net> writes: > >> I think the best thing is to rethink the :literal attribute, as I >> commented at the end of my other email: >> >> - without :literal --> verse environment with a more "canonical" syntax. >> >> - with :literal --> verse environment seen in the "old (org) style", >> preserving the blank lines. In that context \vspace does work. > > +1 Here is the modified patch. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-ox-latex.el-add-the-literal-attribute-to-verse-.patch --] [-- Type: text/x-patch, Size: 5856 bytes --] From 8c77b42404ef5d96b2944e8e43bbc6c9412ad808 Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias <maciaschain@posteo.net> Date: Mon, 14 Aug 2023 21:48:58 +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, all blank lines are preserved and exported as `\vspace*{\baselineskip}', including the blank lines before or after contents. The rx code has been suggested by Ihor Radchenko, to improve readability. * doc/org-manual.org (Verse blocks in LaTeX export): the new feature is documented. --- doc/org-manual.org | 18 ++++++++++++++---- lisp/ox-latex.el | 36 +++++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index e59efc417..e52792183 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -14425,10 +14425,10 @@ The LaTeX export backend converts horizontal rules by the specified #+cindex: verse blocks, in @LaTeX{} export #+cindex: @samp{ATTR_LATEX}, keyword -The LaTeX export backend accepts four attributes for verse blocks: -=:lines=, =:center=, =:versewidth= and =:latexcode=. The three first -require the external LaTeX package =verse.sty=, which is an extension -of the standard LaTeX environment. +The LaTeX export backend accepts five attributes for verse blocks: +=:lines=, =:center=, =:versewidth=, =:latexcode= and =:literal=. The +three first require the external LaTeX package =verse.sty=, which is +an extension of the standard LaTeX environment. - =:lines= :: To add marginal verse numbering. Its value is an integer, the sequence in which the verses should be numbered. @@ -14440,6 +14440,16 @@ of the standard LaTeX environment. verse. - =:latexcode= :: It accepts any arbitrary LaTeX code that can be included within a LaTeX =verse= environment. +- =:literal= :: With value t, all blank lines are preserved and + exported as =\vspace*{\baselineskip}=, including the blank lines + before or after contents. Note that without the =:literal= + attribute, one or more blank lines between stanzas are exported as a + single blank line, and any blank lines before or after the content + are removed, which is more consistent with the syntax of the LaTeX + `verse' environment, and the one provided by the `verse' package. + If the =verse= package is loaded, the vertical spacing between all + stanzas can be controlled by the global length =\stanzaskip= (see + https://www.ctan.org/pkg/verse). A complete example with Shakespeare's first sonnet: diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 31cad1dc4..d11e3befa 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -4116,10 +4116,11 @@ 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)) + (lit (org-export-read-attribute :attr_latex verse-block :literal)) (attr (concat - (if cent "[\\versewidth]" "") - (if lin (format "\n\\poemlines{%s}" lin) "") - (if latcode (format "\n%s" latcode) ""))) + (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}" ""))) @@ -4128,20 +4129,37 @@ contextual information." 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. + ;; into a normal space, calculated with `\fontdimen2\font'. One + ;; or more blank lines between lines are exported as a single + ;; blank line. If the `:lines' attribute is used, the last + ;; verse of each stanza ends with the string `\\!', according to + ;; the syntax of the `verse' package. The separation between + ;; stanzas can be controlled with the length `\stanzaskip', of + ;; the aforementioned package. If the `:literal' attribute is + ;; used, all blank lines are preserved and exported as + ;; `\vspace*{\baselineskip}', including the blank lines before + ;; or after CONTENTS. (format "%s\\begin{verse}%s\n%s\\end{verse}%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) + (rx-to-string + `(seq (group ,org-latex-line-break-safe "\n") + (1+ (group line-start (0+ space) ,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) + (concat (org-trim contents t) "\n") + contents) + nil t) nil t) nil t) linreset) -- 2.41.0 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-16 14:10 ` Juan Manuel Macías @ 2023-08-17 10:35 ` Ihor Radchenko 2023-08-17 20:17 ` Juan Manuel Macías 0 siblings, 1 reply; 22+ messages in thread From: Ihor Radchenko @ 2023-08-17 10:35 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > Here is the modified patch. Thanks! > * (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, all blank lines are preserved and exported as Please use double space between sentences and start sentences with capital letter. > +- =:literal= :: With value t, all blank lines are preserved and > + exported as =\vspace*{\baselineskip}=, including the blank lines > + before or after contents. Note that without the =:literal= > + attribute, one or more blank lines between stanzas are exported as a > + single blank line, and any blank lines before or after the content > + are removed, which is more consistent with the syntax of the LaTeX > + `verse' environment, and the one provided by the `verse' package. > + If the =verse= package is loaded, the vertical spacing between all > + stanzas can be controlled by the global length =\stanzaskip= (see > + https://www.ctan.org/pkg/verse). s/`verse'/=verse=/ And you need to update `test-ox-latex/verse' test - it is currently failing. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-17 10:35 ` Ihor Radchenko @ 2023-08-17 20:17 ` Juan Manuel Macías 2023-08-18 8:44 ` Ihor Radchenko 0 siblings, 1 reply; 22+ messages in thread From: Juan Manuel Macías @ 2023-08-17 20:17 UTC (permalink / raw) To: Ihor Radchenko; +Cc: orgmode [-- Attachment #1: Type: text/plain, Size: 1434 bytes --] Ihor Radchenko writes: > Thanks! > >> * (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, all blank lines are preserved and exported as > > Please use double space between sentences and start sentences with > capital letter. > >> +- =:literal= :: With value t, all blank lines are preserved and >> + exported as =\vspace*{\baselineskip}=, including the blank lines >> + before or after contents. Note that without the =:literal= >> + attribute, one or more blank lines between stanzas are exported as a >> + single blank line, and any blank lines before or after the content >> + are removed, which is more consistent with the syntax of the LaTeX >> + `verse' environment, and the one provided by the `verse' package. >> + If the =verse= package is loaded, the vertical spacing between all >> + stanzas can be controlled by the global length =\stanzaskip= (see >> + https://www.ctan.org/pkg/verse). > > s/`verse'/=verse=/ > > And you need to update `test-ox-latex/verse' test - it is currently failing. Sorry for the typos... Here goes the corrected patch again, with the updated test. -- Juan Manuel Macías https://juanmanuelmacias.com https://lunotipia.juanmanuelmacias.com https://gnutas.juanmanuelmacias.com [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-ox-latex.el-Add-the-literal-attribute-to-verse-.patch --] [-- Type: text/x-patch, Size: 6513 bytes --] From bd956aa947e080ef10aa851f339414dc1cda1baf Mon Sep 17 00:00:00 2001 From: Juan Manuel Macias <maciaschain@posteo.net> Date: Mon, 14 Aug 2023 21:48:58 +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, all blank lines are preserved and exported as `\vspace*{\baselineskip}', including the blank lines before or after contents. The rx code has been suggested by Ihor Radchenko, to improve readability. * doc/org-manual.org (Verse blocks in LaTeX export): The new feature is documented. * testing/lisp/test-ox-latex.el (test-ox-latex/verse): Updated. --- doc/org-manual.org | 18 ++++++++++++++---- lisp/ox-latex.el | 36 ++++++++++++++++++++++++++--------- testing/lisp/test-ox-latex.el | 8 ++++---- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index e59efc417..ce0521dee 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -14425,10 +14425,10 @@ The LaTeX export backend converts horizontal rules by the specified #+cindex: verse blocks, in @LaTeX{} export #+cindex: @samp{ATTR_LATEX}, keyword -The LaTeX export backend accepts four attributes for verse blocks: -=:lines=, =:center=, =:versewidth= and =:latexcode=. The three first -require the external LaTeX package =verse.sty=, which is an extension -of the standard LaTeX environment. +The LaTeX export backend accepts five attributes for verse blocks: +=:lines=, =:center=, =:versewidth=, =:latexcode= and =:literal=. The +three first require the external LaTeX package =verse.sty=, which is +an extension of the standard LaTeX environment. - =:lines= :: To add marginal verse numbering. Its value is an integer, the sequence in which the verses should be numbered. @@ -14440,6 +14440,16 @@ of the standard LaTeX environment. verse. - =:latexcode= :: It accepts any arbitrary LaTeX code that can be included within a LaTeX =verse= environment. +- =:literal= :: With value t, all blank lines are preserved and + exported as =\vspace*{\baselineskip}=, including the blank lines + before or after contents. Note that without the =:literal= + attribute, one or more blank lines between stanzas are exported as a + single blank line, and any blank lines before or after the content + are removed, which is more consistent with the syntax of the LaTeX + `verse' environment, and the one provided by the =verse= package. + If the =verse= package is loaded, the vertical spacing between all + stanzas can be controlled by the global length =\stanzaskip= (see + https://www.ctan.org/pkg/verse). A complete example with Shakespeare's first sonnet: diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 31cad1dc4..d11e3befa 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -4116,10 +4116,11 @@ 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)) + (lit (org-export-read-attribute :attr_latex verse-block :literal)) (attr (concat - (if cent "[\\versewidth]" "") - (if lin (format "\n\\poemlines{%s}" lin) "") - (if latcode (format "\n%s" latcode) ""))) + (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}" ""))) @@ -4128,20 +4129,37 @@ contextual information." 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. + ;; into a normal space, calculated with `\fontdimen2\font'. One + ;; or more blank lines between lines are exported as a single + ;; blank line. If the `:lines' attribute is used, the last + ;; verse of each stanza ends with the string `\\!', according to + ;; the syntax of the `verse' package. The separation between + ;; stanzas can be controlled with the length `\stanzaskip', of + ;; the aforementioned package. If the `:literal' attribute is + ;; used, all blank lines are preserved and exported as + ;; `\vspace*{\baselineskip}', including the blank lines before + ;; or after CONTENTS. (format "%s\\begin{verse}%s\n%s\\end{verse}%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) + (rx-to-string + `(seq (group ,org-latex-line-break-safe "\n") + (1+ (group line-start (0+ space) ,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) + (concat (org-trim contents t) "\n") + contents) + nil t) nil t) nil t) linreset) diff --git a/testing/lisp/test-ox-latex.el b/testing/lisp/test-ox-latex.el index adb3a60ea..79ef8793b 100644 --- a/testing/lisp/test-ox-latex.el +++ b/testing/lisp/test-ox-latex.el @@ -61,11 +61,11 @@ lorem ipsum dolor (search-forward "\\begin{verse} lorem ipsum dolor\\\\[0pt] +lorem ipsum dolor + lorem ipsum dolor\\\\[0pt] -\\vspace*{1em} -lorem ipsum dolor\\\\[0pt] -lorem ipsum dolor\\\\[0pt] -\\vspace*{1em} +lorem ipsum dolor + lorem ipsum dolor\\\\[0pt] lorem ipsum dolor\\\\[0pt] \\end{verse}")))) -- 2.41.0 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [patch] ox-latex.el: fix blank lines behavior in verse block 2023-08-17 20:17 ` Juan Manuel Macías @ 2023-08-18 8:44 ` Ihor Radchenko 0 siblings, 0 replies; 22+ messages in thread From: Ihor Radchenko @ 2023-08-18 8:44 UTC (permalink / raw) To: Juan Manuel Macías; +Cc: orgmode Juan Manuel Macías <maciaschain@posteo.net> writes: > Subject: [PATCH] lisp/ox-latex.el: Add the `:literal' attribute to verse > block. Thanks! Applied, onto main. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=2eb4fd890 -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2023-08-18 8:45 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-08-06 12:03 [patch] ox-latex.el: fix blank lines behavior in verse block Juan Manuel Macías 2023-08-07 11:40 ` Ihor Radchenko 2023-08-07 17:23 ` Juan Manuel Macías 2023-08-09 7:57 ` Ihor Radchenko 2023-08-09 8:41 ` Juan Manuel Macías 2023-08-10 9:27 ` Ihor Radchenko 2023-08-10 10:39 ` Juan Manuel Macías 2023-08-11 10:00 ` Ihor Radchenko 2023-08-11 18:52 ` Juan Manuel Macías 2023-08-12 7:56 ` Ihor Radchenko 2023-08-12 11:28 ` Juan Manuel Macías 2023-08-13 8:06 ` Ihor Radchenko 2023-08-14 20:10 ` Juan Manuel Macías 2023-08-15 10:08 ` Ihor Radchenko 2023-08-15 11:50 ` Juan Manuel Macías 2023-08-15 11:53 ` Ihor Radchenko 2023-08-15 14:25 ` Juan Manuel Macías 2023-08-16 8:10 ` Ihor Radchenko 2023-08-16 14:10 ` Juan Manuel Macías 2023-08-17 10:35 ` Ihor Radchenko 2023-08-17 20:17 ` Juan Manuel Macías 2023-08-18 8:44 ` Ihor Radchenko
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).