Juan Manuel Macías <maciasch...@posteo.net> writes: >> As for {[}{]}, it is a bit difficult to implement. Especially when we >> also consider user filters and derived backends. If we have several >> transcoders of consequent elements, there is always a risk that even >> when a given filter/transcoder is generating a valid LaTeX code, >> concatenating them may still cause issues like we have with \\. > > I see. I think pandoc's solution is what Leslie Lamport recommends > (naturally, Lamport doesn't say to enclose /all/ brackets in curly > braces).
This turned out to be a lot easier than I thought. See the attached patch. >> \command >> [unrelated text] >> >> If there are, we may actually want to consider pandoc's approach >> seriously. > > In principle, any environment that takes an optional argument in a > "dangerous" position. Just do a simple test. Something like this: > > #+begin_figure > [lorem] ipsum > #+end_figure > > will throw an error like ''LaTeX Error: Unknown float option...'' > > Of course, putting an empty line after #+begin... usually solves it. But > the user may not know it. > > There are also a number of commands with an optional argument. For > example \pagebreak. Something like this will give an error: > > lorem @@latex:\pagebreak@@ [ipsum] > > \item is another typical example, but in this case org adds \relax. With the patch, I am getting the following: * This is test lorem @@latex:\pagebreak@@ [ipsum] #+begin_figure [lorem] figure #+end_figure | [foo] | 2 | | [bar] | 3 | - [bax] - [aur] exports to lorem \pagebreak {[}ipsum] \begin{figure} {[}lorem] figure \end{figure} \begin{center} \begin{tabular}{lr} {[}foo] & 2\\[0pt] {[}bar] & 3\\[0pt] \end{tabular} \end{center} \begin{itemize} \item {[}bax] \item {[}aur] \end{itemize}
>From db3fa01d6f15b3d3f499f77e342a608a822029c8 Mon Sep 17 00:00:00 2001 Message-ID: <db3fa01d6f15b3d3f499f77e342a608a822029c8.1705583005.git.yanta...@posteo.net> From: Ihor Radchenko <yanta...@posteo.net> Date: Thu, 18 Jan 2024 14:01:32 +0100 Subject: [PATCH] ox-latex: Make sure that [text] is not misinterpreted as LaTeX argument * lisp/ox-latex.el (org-latex-plain-text): Protect plain text starting from [. It might be misinterpreted as optional command argument if previous exported fragment ends with a command accepting such. * testing/lisp/test-ox-latex.el (text-ox-latex/protect-square-brackets): Add new test. Link: https://orgmode.org/list/87o7dju9vn....@posteo.net --- lisp/ox-latex.el | 9 +++++++++ testing/lisp/test-ox-latex.el | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 432f09f4e..a3505c25f 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -3094,6 +3094,15 @@ (defun org-latex-plain-text (text info) "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" (concat org-latex-line-break-safe "\n") output nil t))) + ;; Protect [foo] at the beginning of lines / beginning of the + ;; plain-text object. This prevents LaTeX from unexpectedly + ;; interpreting @@latex:\pagebreak@@ [foo] as a command with + ;; optional argument. + (setq output (replace-regexp-in-string + (rx bol (0+ space) (group "[")) + "{[}" + output + nil nil 1)) ;; Return value. output)) diff --git a/testing/lisp/test-ox-latex.el b/testing/lisp/test-ox-latex.el index 41df1b823..237ad97ec 100644 --- a/testing/lisp/test-ox-latex.el +++ b/testing/lisp/test-ox-latex.el @@ -29,6 +29,29 @@ (unless (featurep 'ox-latex) +(ert-deftest text-ox-latex/protect-square-brackets () + "Test [foo] being interpreted as plain text even after LaTeX commands." + (org-test-with-exported-text + 'latex + "* This is test +lorem @@latex:\\pagebreak@@ [ipsum] + +#+begin_figure +[lorem] figure +#+end_figure + +| [foo] | 2 | +| [bar] | 3 | + +- [bax] +- [aur] +" + (goto-char (point-min)) + (should (search-forward "lorem \\pagebreak {[}ipsum]")) + (should (search-forward "{[}lorem] figure")) + (should (search-forward "{[}foo]")) + (should (search-forward "\\item {[}bax]")))) + (ert-deftest test-ox-latex/verse () "Test verse blocks." (org-test-with-exported-text -- 2.43.0
-- 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>