* [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] @ 2021-11-10 16:16 Stewart Thomas 2021-11-13 14:57 ` Max Nikulin 0 siblings, 1 reply; 7+ messages in thread From: Stewart Thomas @ 2021-11-10 16:16 UTC (permalink / raw) To: emacs-orgmode (Apologies for sending this from gmail, my mail setup was not working with the -Q option in emacs.) A table in which a first column begins with square brackets is not compiling. The square bracket is interpreted by latex as an argument to the preceding line break. Example org table: | Input | Output | |--------+--------| | [1, 2] | {3, 4} | | [5, 6] | null | When exported to a PDF ( C-c C-e l o), I expect that the PDF to be rendered with the brackets in the table as shown in org. Instead, the result is a latex compilation error. The brackets are being interpreted as length arguments to the preceding line break. This is a relevant Stack Exchange issue (for pure latex) which suggests some possible solutions. [[https://tex.stackexchange.com/questions/34466/error-with-square-bracket-in-table][Error with square bracket in table]] To test, emacs was started with =emacs -q= to not load an init file. Emacs : GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30, cairo version 1.15.12) of 2021-10-27 Package: Org mode version 9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/) current state: ============== (setq org-link-elisp-confirm-function 'yes-or-no-p org-bibtex-headline-format-function #[257 "\300%1\236A\207" [:title] 3 "\n\n(fn ENTRY)"] org-export-before-parsing-hook '(org-attach-expand-links) org-archive-hook '(org-attach-archive-delete-maybe) org-odt-format-inlinetask-function 'org-odt-format-inlinetask-default-function org-ascii-format-drawer-function #[771 "%1\207" [] 4 "\n\n(fn NAME CONTENTS WIDTH)"] org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers org-cycle-show-empty-lines org-optimize-window-after-visibility-change) org-mode-hook '(#[0 "\300\301\302\303\304$\207" [add-hook change-major-mode-hook org-show-all append local] 5] #[0 "\300\301\302\303\304$\207" [add-hook change-major-mode-hook org-babel-show-result-all append local] 5] org-babel-result-hide-spec org-babel-hide-all-hashes) org-latex-format-drawer-function #[514 "\207" [] 3 "\n\n(fn _ CONTENTS)"] org-latex-format-headline-function 'org-latex-format-headline-default-function org-confirm-shell-link-function 'yes-or-no-p org-html-format-drawer-function #[514 "\207" [] 3 "\n\n(fn NAME CONTENTS)"] outline-isearch-open-invisible-function 'outline-isearch-open-invisible org-odt-format-headline-function 'org-odt-format-headline-default-function org-agenda-before-write-hook '(org-agenda-add-entry-text) org-src-mode-hook '(org-src-babel-configure-edit-buffer org-src-mode-configure-edit-buffer) org-confirm-elisp-link-function 'yes-or-no-p org-speed-command-hook '(org-speed-command-activate org-babel-speed-command-activate) org-html-format-inlinetask-function 'org-html-format-inlinetask-default-function org-ascii-format-inlinetask-function 'org-ascii-format-inlinetask-default org-odt-format-drawer-function #[514 "\207" [] 3 "\n\n(fn NAME CONTENTS)"] org-latex-format-inlinetask-function 'org-latex-format-inlinetask-default-function org-tab-first-hook '(org-babel-hide-result-toggle-maybe org-babel-header-arg-expand) org-link-shell-confirm-function 'yes-or-no-p org-babel-pre-tangle-hook '(save-buffer) org-agenda-loop-over-headlines-in-active-region nil org-occur-hook '(org-first-headline-recenter) org-metadown-hook '(org-babel-pop-to-session-maybe) org-link-parameters '(("attachment" :follow org-attach-follow :complete org-attach-complete-link) ("id" :follow org-id-open) ("eww" :follow org-eww-open :store org-eww-store-link) ("rmail" :follow org-rmail-open :store org-rmail-store-link) ("mhe" :follow org-mhe-open :store org-mhe-store-link) ("irc" :follow org-irc-visit :store org-irc-store-link :export org-irc-export) ("info" :follow org-info-open :export org-info-export :store org-info-store-link) ("gnus" :follow org-gnus-open :store org-gnus-store-link) ("docview" :follow org-docview-open :export org-docview-export :store org-docview-store-link) ("bibtex" :follow org-bibtex-open :store org-bibtex-store-link) ("bbdb" :follow org-bbdb-open :export org-bbdb-export :complete org-bbdb-complete-link :store org-bbdb-store-link) ("w3m" :store org-w3m-store-link) ("doi" :follow org-link-doi-open :export org-link-doi-export) ("file+sys") ("file+emacs") ("shell" :follow org-link--open-shell) ("news" :follow #[514 "\301\300\302%4Q%2\"\207" ["news" browse-url ":"] 6 "\n\n(fn URL ARG)"] ) ("mailto" :follow #[514 "\301\300\302%4Q%2\"\207" ["mailto" browse-url ":"] 6 "\n\n(fn URL ARG)"] ) ("https" :follow #[514 "\301\300\302%4Q%2\"\207" ["https" browse-url ":"] 6 "\n\n(fn URL ARG)"] ) ("http" :follow #[514 "\301\300\302%4Q%2\"\207" ["http" browse-url ":"] 6 "\n\n(fn URL ARG)"] ) ("ftp" :follow #[514 "\301\300\302%4Q%2\"\207" ["ftp" browse-url ":"] 6 "\n\n(fn URL ARG)"] ) ("help" :follow org-link--open-help :store org-link--store-help) ("file" :complete org-link-complete-file) ("elisp" :follow org-link--open-elisp)) org-html-format-headline-function 'org-html-format-headline-default-function org-metaup-hook '(org-babel-load-in-session-maybe) ) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2021-11-10 16:16 [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] Stewart Thomas @ 2021-11-13 14:57 ` Max Nikulin 2022-10-07 8:31 ` [PATCH] " Ihor Radchenko 0 siblings, 1 reply; 7+ messages in thread From: Max Nikulin @ 2021-11-13 14:57 UTC (permalink / raw) To: Stewart Thomas, emacs-orgmode On 10/11/2021 23:16, Stewart Thomas wrote: > > A table in which a first column begins with square brackets is not > compiling. The square bracket is interpreted by latex as an argument > to the preceding line break. Confirmed Thank you for reporting the issue. Example of a workaround ---- >8 ---- #+macro: tr @@latex:\relax @@ | one | | {{{tr}}}[2] | Ref \\ {{{tr}}} [2] ---- 8< ----- To fix the bug newline (in tables and paragraphs) should be exported as "\\\relax" or "\\{}". I do not suggest curly brackets in the beginning of line to avoid issues with spurious spaces. Percent character (comment) at the end of line should be considered for a fix since it is usually used in the opposite way: to suppress newline character and spaces at the beginning of next source line. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2021-11-13 14:57 ` Max Nikulin @ 2022-10-07 8:31 ` Ihor Radchenko 2022-10-07 11:34 ` Max Nikulin 0 siblings, 1 reply; 7+ messages in thread From: Ihor Radchenko @ 2022-10-07 8:31 UTC (permalink / raw) To: Max Nikulin, Daniel Fleischer; +Cc: Stewart Thomas, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 845 bytes --] Max Nikulin <manikulin@gmail.com> writes: > On 10/11/2021 23:16, Stewart Thomas wrote: >> >> A table in which a first column begins with square brackets is not >> compiling. The square bracket is interpreted by latex as an argument >> to the preceding line break. > > Confirmed > > To fix the bug newline (in tables and paragraphs) should be exported as > "\\\relax" or "\\{}". I do not suggest curly brackets in the beginning > of line to avoid issues with spurious spaces. Percent character > (comment) at the end of line should be considered for a fix since it is > usually used in the opposite way: to suppress newline character and > spaces at the beginning of next source line. I am attaching a tentative patch to fix this. However, I am not sure if I replaced \\ with \\\relax in the right places. Daniel, can you please check? [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ox-latex-Protect-.-after-to-be-interpreted-as-LaTeX-.patch --] [-- Type: text/x-patch, Size: 6875 bytes --] From 43d643197883e10a6c6551489d37053c2c89b4dd Mon Sep 17 00:00:00 2001 Message-Id: <43d643197883e10a6c6551489d37053c2c89b4dd.1665131437.git.yantar92@gmail.com> From: Ihor Radchenko <yantar92@gmail.com> Date: Fri, 7 Oct 2022 16:24:32 +0800 Subject: [PATCH] ox-latex: Protect [...] after \\ to be interpreted as LaTeX argument * lisp/ox-latex.el (org-latex-linebreak-safe): New constant holding safe version of LaTeX line break. (org-latex-table-matrix-macros): (org-latex-clock): (org-latex-line-break): (org-latex-plain-text): (org-latex-planning): (org-latex--org-table): (org-latex--math-table): (org-latex-table-row): (org-latex-verse-block): Use the new constant. * testing/lisp/test-org-table.el (test-org-table/to-latex): Update tests. Reported-by: Stewart Thomas <sjt015@bucknell.edu> Link: https://orgmode.org/list/ce760fc3-5aae-144d-2d02-7dea215f73fc@gmail.com --- lisp/ox-latex.el | 47 ++++++++++++++++++++++++---------- testing/lisp/test-org-table.el | 6 ++--- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 34ff52b81..127637ccf 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -278,10 +278,23 @@ (defconst org-latex-language-alist - `:lang-name' the actual name of the language.") +(defconst org-latex-linebreak-safe "\\\\\\relax" + "Linebreak protecting the following [...]. -(defconst org-latex-table-matrix-macros '(("bordermatrix" . "\\cr") +Without \"\\relax\" it would be interpreted as an optional argument to +the \\\\. + +This constant, for example, makes the below code not err: + +\\begin{tabular}{c|c} + [t] & s\\\\\\relax + [I] & A\\\\\\relax + [m] & kg +\\end{tabular}") + +(defconst org-latex-table-matrix-macros `(("bordermatrix" . "\\cr") ("qbordermatrix" . "\\cr") - ("kbordermatrix" . "\\\\")) + ("kbordermatrix" . ,org-latex-linebreak-safe)) "Alist between matrix macros and their row ending.") (defconst org-latex-math-environments-re @@ -2062,7 +2075,7 @@ (defun org-latex-clock (clock _contents info) (concat (org-timestamp-translate (org-element-property :value clock)) (let ((time (org-element-property :duration clock))) (and time (format " (%s)" time))))) - "\\\\")) + org-latex-linebreak-safe)) ;;;; Code @@ -2659,7 +2672,7 @@ ;;;; Line Break (defun org-latex-line-break (_line-break _contents _info) "Transcode a LINE-BREAK object from Org to LaTeX. CONTENTS is nil. INFO is a plist holding contextual information." - "\\\\\n") + (concat org-latex-linebreak-safe "\n")) ;;;; Link @@ -3005,7 +3018,9 @@ (defun org-latex-plain-text (text info) ;; Handle break preservation if required. (when (plist-get info :preserve-breaks) (setq output (replace-regexp-in-string - "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n" output nil t))) + "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" + (concat org-latex-linebreak-safe "\n") + output nil t))) ;; Return value. output)) @@ -3041,7 +3056,7 @@ (defun org-latex-planning (planning _contents info) (format (plist-get info :latex-active-timestamp-format) (org-timestamp-translate scheduled))))))) " ") - "\\\\")) + org-latex-linebreak-safe)) ;;;; Property Drawer @@ -3821,11 +3836,11 @@ (defun org-latex--org-table (table contents info) (format "\\begin{%s}%s{%s}\n" table-env width alignment) (and above? (org-string-nw-p caption) - (concat caption "\\\\\n")) + (concat caption org-latex-linebreak-safe "\n")) contents (and (not above?) (org-string-nw-p caption) - (concat caption "\\\\\n")) + (concat caption org-latex-linebreak-safe "\n")) (format "\\end{%s}" table-env) (and fontsize "}")))) (t @@ -3910,7 +3925,7 @@ (defun org-latex--math-table (table info) (lambda (cell) (substring (org-element-interpret-data cell) 0 -1)) (org-element-map row 'table-cell #'identity info) "&") - (or (cdr (assoc env org-latex-table-matrix-macros)) "\\\\") + (or (cdr (assoc env org-latex-table-matrix-macros)) org-latex-linebreak-safe) "\n"))) (org-element-map table 'table-row #'identity info) ""))) (concat @@ -3982,7 +3997,7 @@ (defun org-latex-table-row (table-row contents info) ;; hline was specifically marked. (and booktabsp (not (org-export-get-previous-element table-row info)) "\\toprule\n") - contents "\\\\\n" + contents org-latex-linebreak-safe "\n" (cond ;; Special case for long tables. Define header and footers. ((and longtablep (org-export-table-row-ends-header-p table-row info)) @@ -3990,9 +4005,9 @@ (defun org-latex-table-row (table-row contents info) (org-export-get-parent-table table-row) info)))) (format "%s \\endfirsthead -\\multicolumn{%d}{l}{%s} \\\\ +\\multicolumn{%d}{l}{%s} \\\\\\relax %s -%s \\\\\n +%s \\\\\\relax\n %s \\endhead %s\\multicolumn{%d}{r}{%s} \\\\ @@ -4092,8 +4107,12 @@ (defun org-latex-verse-block (verse-block contents info) (replace-regexp-in-string "^[ \t]*\\\\\\\\$" "\\vspace*{1em}" (replace-regexp-in-string - "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n" - contents nil t) nil t) nil t) linreset) + "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" + (concat org-latex-linebreak-safe "\n") + contents nil t) + nil t) + nil t) + linreset) info) ;; Insert footnote definitions, if any, after the environment, so ;; the special formatting above is not applied to them. diff --git a/testing/lisp/test-org-table.el b/testing/lisp/test-org-table.el index 76fe41630..3e7f18a10 100644 --- a/testing/lisp/test-org-table.el +++ b/testing/lisp/test-org-table.el @@ -1635,11 +1635,11 @@ (ert-deftest test-org-table/to-generic () (ert-deftest test-org-table/to-latex () "Test `orgtbl-to-latex' specifications." (should - (equal "\\begin{tabular}{l}\na\\\\\n\\end{tabular}" + (equal "\\begin{tabular}{l}\na\\\\\\relax\n\\end{tabular}" (orgtbl-to-latex (org-table-to-lisp "| a |") nil))) ;; Test :environment parameter. (should - (equal "\\begin{tabularx}{l}\na\\\\\n\\end{tabularx}" + (equal "\\begin{tabularx}{l}\na\\\\\\relax\n\\end{tabularx}" (orgtbl-to-latex (org-table-to-lisp "| a |") '(:environment "tabularx")))) ;; Test :booktabs parameter. @@ -1648,7 +1648,7 @@ (ert-deftest test-org-table/to-latex () "\\toprule" (orgtbl-to-latex (org-table-to-lisp "| a |") '(:booktabs t)))) ;; Handle LaTeX snippets. (should - (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\n\\end{tabular}" + (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}" (orgtbl-to-latex (org-table-to-lisp "| $x$ |") nil))) ;; Test pseudo objects and :raw parameter. (should -- 2.35.1 [-- Attachment #3: Type: text/plain, Size: 224 bytes --] -- 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 related [flat|nested] 7+ messages in thread
* Re: [PATCH] Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2022-10-07 8:31 ` [PATCH] " Ihor Radchenko @ 2022-10-07 11:34 ` Max Nikulin 2022-10-08 5:17 ` [PATCH v2] " Ihor Radchenko 0 siblings, 1 reply; 7+ messages in thread From: Max Nikulin @ 2022-10-07 11:34 UTC (permalink / raw) To: emacs-orgmode On 07/10/2022 15:31, Ihor Radchenko wrote: > > I am attaching a tentative patch to fix this. > However, I am not sure if I replaced \\ with \\\relax in the right > places. Ihor, thank you for looking into this issue. I have not read your patch with enough attention to check that regular paragraphs, list entries and other elements are handled as well. Just a couple of notes: > +(defconst org-latex-linebreak-safe "\\\\\\relax" Is there a reason why you did not add \n at the end? It could help to avoid a lot of `concat' calls. > - (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\n\\end{tabular}" > + (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}" May be left as is since the line next to \\ does not start from square brackets. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2022-10-07 11:34 ` Max Nikulin @ 2022-10-08 5:17 ` Ihor Radchenko 2022-10-10 16:30 ` Max Nikulin 0 siblings, 1 reply; 7+ messages in thread From: Ihor Radchenko @ 2022-10-08 5:17 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 816 bytes --] Max Nikulin <manikulin@gmail.com> writes: >> +(defconst org-latex-linebreak-safe "\\\\\\relax" > > Is there a reason why you did not add \n at the end? It could help to > avoid a lot of `concat' calls. Mostly because there are a couple of places where we need the version without newline. I though that `concat' is better than `replace-regexp-in-string' or introducing two constants with/without newline. I guess, we can introduce the two constants. It might be slightly more optimal. See the updated version of the patch. >> - (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\n\\end{tabular}" >> + (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}" > > May be left as is since the line next to \\ does not start from square > brackets. Nope. It can't. These are ERT tests for the ox-latex output. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: v2-0001-ox-latex-Protect-.-after-to-be-interpreted-as-LaT.patch --] [-- Type: text/x-patch, Size: 7074 bytes --] From 14dceebeff73ff49e197f18b8235a40497bdbf55 Mon Sep 17 00:00:00 2001 Message-Id: <14dceebeff73ff49e197f18b8235a40497bdbf55.1665206183.git.yantar92@gmail.com> From: Ihor Radchenko <yantar92@gmail.com> Date: Fri, 7 Oct 2022 16:24:32 +0800 Subject: [PATCH v2] ox-latex: Protect [...] after \\ to be interpreted as LaTeX argument * lisp/ox-latex.el (org-latex-linebreak-safe): New constant holding safe version of LaTeX line break. (org-latex-linebreak-safe-newline): New constant holding `org-latex-linebreak-safe' with newline appended. (org-latex-table-matrix-macros): (org-latex-clock): (org-latex-line-break): (org-latex-plain-text): (org-latex-planning): (org-latex--org-table): (org-latex--math-table): (org-latex-table-row): (org-latex-verse-block): Use the new constants. * testing/lisp/test-org-table.el (test-org-table/to-latex): Update tests. Reported-by: Stewart Thomas <sjt015@bucknell.edu> Link: https://orgmode.org/list/ce760fc3-5aae-144d-2d02-7dea215f73fc@gmail.com --- lisp/ox-latex.el | 50 ++++++++++++++++++++++++---------- testing/lisp/test-org-table.el | 6 ++-- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 34ff52b81..d340b9c95 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -278,10 +278,26 @@ (defconst org-latex-language-alist - `:lang-name' the actual name of the language.") +(defconst org-latex-linebreak-safe "\\\\\\relax" + "Linebreak protecting the following [...]. -(defconst org-latex-table-matrix-macros '(("bordermatrix" . "\\cr") +Without \"\\relax\" it would be interpreted as an optional argument to +the \\\\. + +This constant, for example, makes the below code not err: + +\\begin{tabular}{c|c} + [t] & s\\\\\\relax + [I] & A\\\\\\relax + [m] & kg +\\end{tabular}") + +(defconst org-latex-linebreak-safe-newline (concat org-latex-linebreak-safe "\n") + "`org-latex-linebreak-safe' with newline.") + +(defconst org-latex-table-matrix-macros `(("bordermatrix" . "\\cr") ("qbordermatrix" . "\\cr") - ("kbordermatrix" . "\\\\")) + ("kbordermatrix" . ,org-latex-linebreak-safe)) "Alist between matrix macros and their row ending.") (defconst org-latex-math-environments-re @@ -2062,7 +2078,7 @@ (defun org-latex-clock (clock _contents info) (concat (org-timestamp-translate (org-element-property :value clock)) (let ((time (org-element-property :duration clock))) (and time (format " (%s)" time))))) - "\\\\")) + org-latex-linebreak-safe)) ;;;; Code @@ -2659,7 +2675,7 @@ ;;;; Line Break (defun org-latex-line-break (_line-break _contents _info) "Transcode a LINE-BREAK object from Org to LaTeX. CONTENTS is nil. INFO is a plist holding contextual information." - "\\\\\n") + org-latex-linebreak-safe-newline) ;;;; Link @@ -3005,7 +3021,9 @@ (defun org-latex-plain-text (text info) ;; Handle break preservation if required. (when (plist-get info :preserve-breaks) (setq output (replace-regexp-in-string - "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n" output nil t))) + "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" + org-latex-linebreak-safe-newline + output nil t))) ;; Return value. output)) @@ -3041,7 +3059,7 @@ (defun org-latex-planning (planning _contents info) (format (plist-get info :latex-active-timestamp-format) (org-timestamp-translate scheduled))))))) " ") - "\\\\")) + org-latex-linebreak-safe)) ;;;; Property Drawer @@ -3821,11 +3839,11 @@ (defun org-latex--org-table (table contents info) (format "\\begin{%s}%s{%s}\n" table-env width alignment) (and above? (org-string-nw-p caption) - (concat caption "\\\\\n")) + org-latex-linebreak-safe-newline) contents (and (not above?) (org-string-nw-p caption) - (concat caption "\\\\\n")) + org-latex-linebreak-safe-newline) (format "\\end{%s}" table-env) (and fontsize "}")))) (t @@ -3910,7 +3928,7 @@ (defun org-latex--math-table (table info) (lambda (cell) (substring (org-element-interpret-data cell) 0 -1)) (org-element-map row 'table-cell #'identity info) "&") - (or (cdr (assoc env org-latex-table-matrix-macros)) "\\\\") + (or (cdr (assoc env org-latex-table-matrix-macros)) org-latex-linebreak-safe) "\n"))) (org-element-map table 'table-row #'identity info) ""))) (concat @@ -3982,7 +4000,7 @@ (defun org-latex-table-row (table-row contents info) ;; hline was specifically marked. (and booktabsp (not (org-export-get-previous-element table-row info)) "\\toprule\n") - contents "\\\\\n" + contents org-latex-linebreak-safe-newline (cond ;; Special case for long tables. Define header and footers. ((and longtablep (org-export-table-row-ends-header-p table-row info)) @@ -3990,9 +4008,9 @@ (defun org-latex-table-row (table-row contents info) (org-export-get-parent-table table-row) info)))) (format "%s \\endfirsthead -\\multicolumn{%d}{l}{%s} \\\\ +\\multicolumn{%d}{l}{%s} \\\\\\relax %s -%s \\\\\n +%s \\\\\\relax\n %s \\endhead %s\\multicolumn{%d}{r}{%s} \\\\ @@ -4092,8 +4110,12 @@ (defun org-latex-verse-block (verse-block contents info) (replace-regexp-in-string "^[ \t]*\\\\\\\\$" "\\vspace*{1em}" (replace-regexp-in-string - "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n" - contents nil t) nil t) nil t) linreset) + "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" + org-latex-linebreak-safe-newline + contents nil t) + nil t) + nil t) + linreset) info) ;; Insert footnote definitions, if any, after the environment, so ;; the special formatting above is not applied to them. diff --git a/testing/lisp/test-org-table.el b/testing/lisp/test-org-table.el index 76fe41630..3e7f18a10 100644 --- a/testing/lisp/test-org-table.el +++ b/testing/lisp/test-org-table.el @@ -1635,11 +1635,11 @@ (ert-deftest test-org-table/to-generic () (ert-deftest test-org-table/to-latex () "Test `orgtbl-to-latex' specifications." (should - (equal "\\begin{tabular}{l}\na\\\\\n\\end{tabular}" + (equal "\\begin{tabular}{l}\na\\\\\\relax\n\\end{tabular}" (orgtbl-to-latex (org-table-to-lisp "| a |") nil))) ;; Test :environment parameter. (should - (equal "\\begin{tabularx}{l}\na\\\\\n\\end{tabularx}" + (equal "\\begin{tabularx}{l}\na\\\\\\relax\n\\end{tabularx}" (orgtbl-to-latex (org-table-to-lisp "| a |") '(:environment "tabularx")))) ;; Test :booktabs parameter. @@ -1648,7 +1648,7 @@ (ert-deftest test-org-table/to-latex () "\\toprule" (orgtbl-to-latex (org-table-to-lisp "| a |") '(:booktabs t)))) ;; Handle LaTeX snippets. (should - (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\n\\end{tabular}" + (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}" (orgtbl-to-latex (org-table-to-lisp "| $x$ |") nil))) ;; Test pseudo objects and :raw parameter. (should -- 2.35.1 [-- Attachment #3: Type: text/plain, Size: 224 bytes --] -- 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 related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2022-10-08 5:17 ` [PATCH v2] " Ihor Radchenko @ 2022-10-10 16:30 ` Max Nikulin 2022-10-11 3:36 ` Ihor Radchenko 0 siblings, 1 reply; 7+ messages in thread From: Max Nikulin @ 2022-10-10 16:30 UTC (permalink / raw) To: emacs-orgmode Ihor, I have tried your patch (v2). With a tiny test file it works as expected. I have not managed to add some text immediately after \relax to break this command. On 08/10/2022 12:17, Ihor Radchenko wrote: > Max Nikulin writes: > >>> +(defconst org-latex-linebreak-safe "\\\\\\relax" >> >> Is there a reason why you did not add \n at the end? It could help to >> avoid a lot of `concat' calls. > > Mostly because there are a couple of places where we need the version > without newline. I though that `concat' is better than > `replace-regexp-in-string' or introducing two constants with/without > newline. > > I guess, we can introduce the two constants. It might be slightly more > optimal. See the updated version of the patch. Reading with more attention, I do not think that second constant really makes the code more clear. I had a hope that it is enough to introduce a single constant, but it seems it is not the case. I did not expect that newline should not be added e.g. planning export handler. Perhaps it is better to commit v1. >>> - (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\n\\end{tabular}" >>> + (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}" >> >> May be left as is since the line next to \\ does not start from square >> brackets. > > Nope. It can't. These are ERT tests for the ox-latex output. My bad. I am sorry. > @@ -2659,7 +2675,7 @@ ;;;; Line Break > (defun org-latex-line-break (_line-break _contents _info) > "Transcode a LINE-BREAK object from Org to LaTeX. > CONTENTS is nil. INFO is a plist holding contextual information." > - "\\\\\n") > + org-latex-linebreak-safe-newline) A minor naming inconsistency: "line-break" and "linebreak". ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Re: [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] 2022-10-10 16:30 ` Max Nikulin @ 2022-10-11 3:36 ` Ihor Radchenko 0 siblings, 0 replies; 7+ messages in thread From: Ihor Radchenko @ 2022-10-11 3:36 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: > Ihor, I have tried your patch (v2). With a tiny test file it works as > expected. I have not managed to add some text immediately after \relax > to break this command. > ... > Reading with more attention, I do not think that second constant really > makes the code more clear. I had a hope that it is enough to introduce a > single constant, but it seems it is not the case. I did not expect that > newline should not be added e.g. planning export handler. Perhaps it is > better to commit v1. > ... > A minor naming inconsistency: "line-break" and "linebreak". Thanks for testing! I applied the version 1 of the patch onto main changing the org-latex-linebreak-safe to org-latex-line-break-safe. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=3f60acff7717e472d06833e9cf9fff6ca3d59337 Fixed. -- 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] 7+ messages in thread
end of thread, other threads:[~2022-10-11 3:49 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-11-10 16:16 [BUG] Tables with square brackets do not compile in PDF (latex) export [9.5 (release_9.5-59-g52e6f1 @ /home/sjt015/repo/emacs/lisp/org/)] Stewart Thomas 2021-11-13 14:57 ` Max Nikulin 2022-10-07 8:31 ` [PATCH] " Ihor Radchenko 2022-10-07 11:34 ` Max Nikulin 2022-10-08 5:17 ` [PATCH v2] " Ihor Radchenko 2022-10-10 16:30 ` Max Nikulin 2022-10-11 3:36 ` 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).