emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Export of this table fails LuaLaTeX compilation
@ 2022-10-12  3:15 gerard.vermeulen
  2022-10-12  4:15 ` Ihor Radchenko
  0 siblings, 1 reply; 16+ messages in thread
From: gerard.vermeulen @ 2022-10-12  3:15 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1050 bytes --]

Hello,

I am regularly updating 9.6-pre from https://elpa.gnu.org/devel/ and 
yesterday
my LaTeX export stopped working.  The org-mode snippet below (attached, 
together
with the LaTeX export file) shows the problem.  The LaTeX file compiles 
after I remove
all occurrences of \relax.

Best -- Gerard

#+title: Export of this table fails LuaLaTeX compilation
#+macro: nit (eval (format "@@latex:\\colorbox{red}{\\texttt{%s}}@@" 
$1))
#+options: title:nil toc:nil
Macro {{{nit(works outside table)}}} but fails inside tables where
=\\= matters. The LaTeX export fails to compile with LuaLaTeX because
of =\\\relax= instead of =\\=:
|-----------------------------------------|
| @@latex:\colorbox{red}{\texttt{bug}}@@  |
| {{{nit(bug)}}}                          |
|-----------------------------------------|
exports to:
#+begin_src latex :exports none :results silent
   \begin{center}
   \begin{tabular}{l}
   \hline
   \colorbox{red}{\texttt{bug}}\\\relax
   \colorbox{red}{\texttt{bug}}\\\relax
   \hline
   \end{tabular}
   \end{center}
#+end_src

[-- Attachment #2: bug.tex --]
[-- Type: application/x-tex, Size: 1269 bytes --]

[-- Attachment #3: bug.org --]
[-- Type: application/octet-stream, Size: 739 bytes --]

#+title: Export of this table fails LuaLaTeX compilation
#+macro: nit (eval (format "@@latex:\\colorbox{red}{\\texttt{%s}}@@" $1))
#+options: title:nil toc:nil
Macro {{{nit(works outside table)}}} but fails inside tables where
=\\= matters. The LaTeX export fails to compile with LuaLaTeX because
of =\\\relax= instead of =\\=:
|-----------------------------------------|
| @@latex:\colorbox{red}{\texttt{bug}}@@  |
| {{{nit(bug)}}}                          |
|-----------------------------------------|
exports to:
#+begin_src latex :exports none :results silent
  \begin{center}
  \begin{tabular}{l}
  \hline
  \colorbox{red}{\texttt{bug}}\\\relax
  \colorbox{red}{\texttt{bug}}\\\relax
  \hline
  \end{tabular}
  \end{center}
#+end_src

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  3:15 Export of this table fails LuaLaTeX compilation gerard.vermeulen
@ 2022-10-12  4:15 ` Ihor Radchenko
  2022-10-12  4:45   ` Max Nikulin
  2022-10-12  4:53   ` gerard.vermeulen
  0 siblings, 2 replies; 16+ messages in thread
From: Ihor Radchenko @ 2022-10-12  4:15 UTC (permalink / raw)
  To: gerard.vermeulen; +Cc: emacs-orgmode

gerard.vermeulen@posteo.net writes:

> I am regularly updating 9.6-pre from https://elpa.gnu.org/devel/ and 
> yesterday
> my LaTeX export stopped working.  The org-mode snippet below (attached, 
> together
> with the LaTeX export file) shows the problem.  The LaTeX file compiles 
> after I remove
> all occurrences of \relax.
> ...
> #+begin_src latex :exports none :results silent
>    \begin{center}
>    \begin{tabular}{l}
>    \hline
>    \colorbox{red}{\texttt{bug}}\\\relax
>    \colorbox{red}{\texttt{bug}}\\\relax
>    \hline
>    \end{tabular}
>    \end{center}
> #+end_src

Confirmed.
But what is the problem here? Isn't \relax supposed to work in LuaTeX?

-- 
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] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  4:15 ` Ihor Radchenko
@ 2022-10-12  4:45   ` Max Nikulin
  2022-10-12  5:15     ` gerard.vermeulen
  2022-10-12  4:53   ` gerard.vermeulen
  1 sibling, 1 reply; 16+ messages in thread
From: Max Nikulin @ 2022-10-12  4:45 UTC (permalink / raw)
  To: emacs-orgmode

On 12/10/2022 11:15, Ihor Radchenko wrote:
> 
> Confirmed.
> But what is the problem here? Isn't \relax supposed to work in LuaTeX?

LuaLaTeX is irrelevant. It seems \hline is allowed only immediately 
after \\. Minimal LaTeX example:

\begin{tabular}{l}
b\\\relax
\hline
\end{tabular}




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  4:15 ` Ihor Radchenko
  2022-10-12  4:45   ` Max Nikulin
@ 2022-10-12  4:53   ` gerard.vermeulen
  1 sibling, 0 replies; 16+ messages in thread
From: gerard.vermeulen @ 2022-10-12  4:53 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: emacs-orgmode



On 12.10.2022 06:15, Ihor Radchenko wrote:
> gerard.vermeulen@posteo.net writes:
> 
>> I am regularly updating 9.6-pre from https://elpa.gnu.org/devel/ and
>> yesterday
>> my LaTeX export stopped working.  The org-mode snippet below 
>> (attached,
>> together
>> with the LaTeX export file) shows the problem.  The LaTeX file 
>> compiles
>> after I remove
>> all occurrences of \relax.
>> ...
>> #+begin_src latex :exports none :results silent
>>    \begin{center}
>>    \begin{tabular}{l}
>>    \hline
>>    \colorbox{red}{\texttt{bug}}\\\relax
>>    \colorbox{red}{\texttt{bug}}\\\relax
>>    \hline
>>    \end{tabular}
>>    \end{center}
>> #+end_src
> 
> Confirmed.
> But what is the problem here? Isn't \relax supposed to work in LuaTeX?

It does not work on my Mac with texlive-2020, so I export my org file, 
open it and replace
all occurrences of \\\relax with \\ before compiling.  I have to confirm 
this on Gentoo Linux
with texlive-2022 at work.

I think that \\ signals the end of a table row and that \relax ends up 
on the next row with
missing fields.



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  4:45   ` Max Nikulin
@ 2022-10-12  5:15     ` gerard.vermeulen
  2022-10-12  5:55       ` Max Nikulin
  0 siblings, 1 reply; 16+ messages in thread
From: gerard.vermeulen @ 2022-10-12  5:15 UTC (permalink / raw)
  To: emacs-orgmode, Emacs-orgmode



On 12.10.2022 06:45, Max Nikulin wrote:
> On 12/10/2022 11:15, Ihor Radchenko wrote:
>> 
>> Confirmed.
>> But what is the problem here? Isn't \relax supposed to work in LuaTeX?
> 
> LuaLaTeX is irrelevant. It seems \hline is allowed only immediately
> after \\. Minimal LaTeX example:
> 
> \begin{tabular}{l}
> b\\\relax
> \hline
> \end{tabular}

Your example fails on my Mac texlive-2020 with:

! Misplaced \noalign.
\hline ->\noalign
                   {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth 
\futurelet...

l.40 \hline

It compiles when I remove \hline


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  5:15     ` gerard.vermeulen
@ 2022-10-12  5:55       ` Max Nikulin
  2022-10-12  7:26         ` Ihor Radchenko
  2022-10-12  9:17         ` Export of this table fails LuaLaTeX compilation gerard.vermeulen
  0 siblings, 2 replies; 16+ messages in thread
From: Max Nikulin @ 2022-10-12  5:55 UTC (permalink / raw)
  To: emacs-orgmode

On 12/10/2022 12:15, gerard.vermeulen wrote:
> On 12.10.2022 06:45, Max Nikulin wrote:
>>
>> LuaLaTeX is irrelevant. It seems \hline is allowed only immediately
>> after \\. Minimal LaTeX example:
>>
>> \begin{tabular}{l}
>> b\\\relax
>> \hline
>> \end{tabular}
> 
> Your example fails on my Mac texlive-2020 with:
> 
> ! Misplaced \noalign.
> \hline ->\noalign
>                    {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth 
> \futurelet...
> 
> l.40 \hline
> 
> It compiles when I remove \hline

Gerard, we forgot to post the reason why \relax has been added after \\. 
The intention was to  prevent errors in the case of

| a   |
| [b] |

or

- item \\
   [2022-10-12]

Stewart Thomas. [BUG] Tables with square brackets do not compile in PDF 
(latex) export. Wed, 10 Nov 2021 11:16:10 -0500. 
https://list.orgmode.org/CAO12V+wB18nAN0FuDPAeN94GHdt_2nbdJtc4u7n4W3HAZbaZsA@mail.gmail.com

I can not figure out an easy way to separate \\ from [b] text but to 
prevent the problem you have discovered. I am unsure if

     \\[0pt]

has no negative consequences and safe enough. I expect that LaTeX 
sources are not easy to read when fragile sequences of tokens are involved.

I just have realized that some users might take advantage of earlier 
behavior as a feature:

- item \\
   [1cm]
- item

I think that [1cm] should be treated as text, however I have no idea how 
to allow users to specify amount of vertical space and to not limit line 
break to LaTeX only. @@latex:\\[1cm]@@ is not suitable when the same 
text should be exported to ascii, html, etc.




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  5:55       ` Max Nikulin
@ 2022-10-12  7:26         ` Ihor Radchenko
  2022-10-12  8:20           ` Max Nikulin
  2022-10-12  9:17         ` Export of this table fails LuaLaTeX compilation gerard.vermeulen
  1 sibling, 1 reply; 16+ messages in thread
From: Ihor Radchenko @ 2022-10-12  7:26 UTC (permalink / raw)
  To: Max Nikulin; +Cc: emacs-orgmode

Max Nikulin <manikulin@gmail.com> writes:

> Gerard, we forgot to post the reason why \relax has been added after \\. 
> The intention was to  prevent errors in the case of
>
> | a   |
> | [b] |
>
> or
>
> - item \\
>    [2022-10-12]
>
> Stewart Thomas. [BUG] Tables with square brackets do not compile in PDF 
> (latex) export. Wed, 10 Nov 2021 11:16:10 -0500. 
> https://list.orgmode.org/CAO12V+wB18nAN0FuDPAeN94GHdt_2nbdJtc4u7n4W3HAZbaZsA@mail.gmail.com
>
> I can not figure out an easy way to separate \\ from [b] text but to 
> prevent the problem you have discovered. I am unsure if
>
>      \\[0pt]
>
> has no negative consequences and safe enough. I expect that LaTeX 
> sources are not easy to read when fragile sequences of tokens are involved.

What about adding \relax in front of table rows instead of at the end?
The hlines are transcoded separately.

All other instances of \\\relax may remain.

-- 
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] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  7:26         ` Ihor Radchenko
@ 2022-10-12  8:20           ` Max Nikulin
  2022-10-13  2:44             ` Ihor Radchenko
  0 siblings, 1 reply; 16+ messages in thread
From: Max Nikulin @ 2022-10-12  8:20 UTC (permalink / raw)
  To: emacs-orgmode

On 12/10/2022 14:26, Ihor Radchenko wrote:
> Max Nikulin writes:
>>
>> I can not figure out an easy way to separate \\ from [b] text but to
>> prevent the problem you have discovered. I am unsure if
>>
>>       \\[0pt]
>>
>> has no negative consequences and safe enough. I expect that LaTeX
>> sources are not easy to read when fragile sequences of tokens are involved.
> 
> What about adding \relax in front of table rows instead of at the end?
> The hlines are transcoded separately.
> 
> All other instances of \\\relax may remain.

If you see a way to implement it, you may try. Do not forget a space 
after it. Spaces at the beginning of line are insignificant, so 
insertion of \relax should not cause more ignored spaces than it was 
before. I would consider skipping "\relax " in the beginning of rows 
where first cell starts from an export snippet.

I am considering \noalign{} instead of \relax. I was never aware of its 
effect, but accordingly to The TeXbook it should keep TeX in vertical 
mode without any action due to empty argument. (Actually I surprised 
that \relax causes any change of internal state besides parser.) 
Unfortunately \noalign{} just as \relax will not allow @@latex:[1cm]@@ 
on the next line, perhaps @@latex:\noalign{\vskip 1cm}@@ is a workaround 
to introduce additional vertical space.

     \\[0pt]

causes insertion of some code for negative vertical skip (of zero height 
this case). It should not be really harmful, but I would avoid this hack.

I never used \\* or \\*[10pt] variants of the command. Current stable 
release should has problems when the line next to \\ starts from * that 
is not bold marker, besides square brackets.




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  5:55       ` Max Nikulin
  2022-10-12  7:26         ` Ihor Radchenko
@ 2022-10-12  9:17         ` gerard.vermeulen
  2022-10-12 16:21           ` Max Nikulin
  1 sibling, 1 reply; 16+ messages in thread
From: gerard.vermeulen @ 2022-10-12  9:17 UTC (permalink / raw)
  To: emacs-orgmode, Emacs-orgmode



On 12.10.2022 07:55, Max Nikulin wrote:
> On 12/10/2022 12:15, gerard.vermeulen wrote:
>> On 12.10.2022 06:45, Max Nikulin wrote:
>>> 
>>> LuaLaTeX is irrelevant. It seems \hline is allowed only immediately
>>> after \\. Minimal LaTeX example:
>>> 
>>> \begin{tabular}{l}
>>> b\\\relax
>>> \hline
>>> \end{tabular}
>> 
>> Your example fails on my Mac texlive-2020 with:
>> 
>> ! Misplaced \noalign.
>> \hline ->\noalign
>>                    {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth 
>> \futurelet...
>> 
>> l.40 \hline
>> 
>> It compiles when I remove \hline
> 
> Gerard, we forgot to post the reason why \relax has been added after
> \\. The intention was to  prevent errors in the case of
> 
> | a   |
> | [b] |
> 
> or
> 
> - item \\
>   [2022-10-12]
> 
> Stewart Thomas. [BUG] Tables with square brackets do not compile in
> PDF (latex) export. Wed, 10 Nov 2021 11:16:10 -0500.
> https://list.orgmode.org/CAO12V+wB18nAN0FuDPAeN94GHdt_2nbdJtc4u7n4W3HAZbaZsA@mail.gmail.com
> 
> I can not figure out an easy way to separate \\ from [b] text but to
> prevent the problem you have discovered. I am unsure if
> 
>     \\[0pt]
> 
> has no negative consequences and safe enough. I expect that LaTeX
> sources are not easy to read when fragile sequences of tokens are
> involved.
> 
> I just have realized that some users might take advantage of earlier
> behavior as a feature:
> 
> - item \\
>   [1cm]
> - item
> 
> I think that [1cm] should be treated as text, however I have no idea
> how to allow users to specify amount of vertical space and to not
> limit line break to LaTeX only. @@latex:\\[1cm]@@ is not suitable when
> the same text should be exported to ascii, html, etc.

Max, thanks for the background information.

For your info:
1. I also need to remove \relax in the LaTeX export using Gentoo 
texlive-2022 to compile.
2. On my systems ws-butler removes the trailing whitespace.
3. I edited your example with nano to add the trailing space after 
\relax, but it still does not compile.



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  9:17         ` Export of this table fails LuaLaTeX compilation gerard.vermeulen
@ 2022-10-12 16:21           ` Max Nikulin
  2022-10-13  5:03             ` gerard.vermeulen
  0 siblings, 1 reply; 16+ messages in thread
From: Max Nikulin @ 2022-10-12 16:21 UTC (permalink / raw)
  To: emacs-orgmode

On 12/10/2022 16:17, gerard.vermeulen@posteo.net wrote:
> 
> 
> On 12.10.2022 07:55, Max Nikulin wrote:
>> On 12/10/2022 12:15, gerard.vermeulen wrote:
>>> On 12.10.2022 06:45, Max Nikulin wrote:
>>>>
>>>> LuaLaTeX is irrelevant. It seems \hline is allowed only immediately
>>>> after \\. Minimal LaTeX example:
>>>>
>>>> \begin{tabular}{l}
>>>> b\\\relax
>>>> \hline
>>>> \end{tabular}
>>>
>>> Your example fails on my Mac texlive-2020 with:
>>>
>>> ! Misplaced \noalign.
>>> \hline ->\noalign
>>>                    {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth 
>>> \futurelet...
>>>
>>> l.40 \hline
>>>
>>> It compiles when I remove \hline
>>
>> Gerard, we forgot to post the reason why \relax has been added after
>> \\. The intention was to  prevent errors in the case of
>>
>> | a   |
>> | [b] |
>>
>> or
>>
>> - item \\
>>   [2022-10-12]
>>
>> Stewart Thomas. [BUG] Tables with square brackets do not compile in
>> PDF (latex) export. Wed, 10 Nov 2021 11:16:10 -0500.
>> https://list.orgmode.org/CAO12V+wB18nAN0FuDPAeN94GHdt_2nbdJtc4u7n4W3HAZbaZsA@mail.gmail.com
>>
>> I can not figure out an easy way to separate \\ from [b] text but to
>> prevent the problem you have discovered. I am unsure if
>>
>>     \\[0pt]
>>
>> has no negative consequences and safe enough. I expect that LaTeX
>> sources are not easy to read when fragile sequences of tokens are
>> involved.
>>
>> I just have realized that some users might take advantage of earlier
>> behavior as a feature:
>>
>> - item \\
>>   [1cm]
>> - item
>>
>> I think that [1cm] should be treated as text, however I have no idea
>> how to allow users to specify amount of vertical space and to not
>> limit line break to LaTeX only. @@latex:\\[1cm]@@ is not suitable when
>> the same text should be exported to ascii, html, etc.
> 
> Max, thanks for the background information.
> 
> For your info:
> 1. I also need to remove \relax in the LaTeX export using Gentoo 
> texlive-2022 to compile.

Adding \relax is my fault, I did not expect that it may break \hline. 
Such behavior should be stable over decades. The question is how to 
allow users to have square brackets in the beginning of the line 
following \\ and not break some use case.

> 2. On my systems ws-butler removes the trailing whitespace.
> 3. I edited your example with nano to add the trailing space after 
> \relax, but it still does not compile.

Sorry, I did not get your point with trailing space. LaTeX ignores 
spaces after commands (e.g. "a\relax b" becomes "ab") and in the 
beginning of the line. What I am afraid of is unintentionally introduce 
white space at the beginning of the line, e.g. if
| a |
| b |
|---|
is exported as
{} a \\
{} b \\
\hline
then cell contents will be " a" and " b", not "a" and "b".
\relax a \\
\relax b \\
\hline
has no such problem.





^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12  8:20           ` Max Nikulin
@ 2022-10-13  2:44             ` Ihor Radchenko
  2022-10-13  4:59               ` Max Nikulin
  0 siblings, 1 reply; 16+ messages in thread
From: Ihor Radchenko @ 2022-10-13  2:44 UTC (permalink / raw)
  To: Max Nikulin; +Cc: emacs-orgmode

Max Nikulin <manikulin@gmail.com> writes:

> On 12/10/2022 14:26, Ihor Radchenko wrote:
>> Max Nikulin writes:
>>>
>>> I can not figure out an easy way to separate \\ from [b] text but to
>>> prevent the problem you have discovered. I am unsure if
>>>
>>>       \\[0pt]
>>>
>>> has no negative consequences and safe enough. I expect that LaTeX
>>> sources are not easy to read when fragile sequences of tokens are involved.
>> 
>> What about adding \relax in front of table rows instead of at the end?
>> The hlines are transcoded separately.
>> 
>> All other instances of \\\relax may remain.
>
> If you see a way to implement it, you may try. Do not forget a space 
> after it. Spaces at the beginning of line are insignificant, so 
> insertion of \relax should not cause more ignored spaces than it was 
> before. I would consider skipping "\relax " in the beginning of rows 
> where first cell starts from an export snippet.
>
> I am considering \noalign{} instead of \relax. I was never aware of its 
> effect, but accordingly to The TeXbook it should keep TeX in vertical 
> mode without any action due to empty argument. (Actually I surprised 
> that \relax causes any change of internal state besides parser.) 

If \noalign has less side effects compared to \relax, I'd prefer
\noalign. Can you confirm this?

I was also surprised that \relax does anything except escaping.

> Unfortunately \noalign{} just as \relax will not allow @@latex:[1cm]@@ 
> on the next line, perhaps @@latex:\noalign{\vskip 1cm}@@ is a workaround 
> to introduce additional vertical space.
>
>      \\[0pt]

What you are talking about appears to be abusing our exporter. We give
no guarantees about how \\ is going to be exported internally into
LaTeX. We should have no obligation to keep use-cases like this.

> causes insertion of some code for negative vertical skip (of zero height 
> this case). It should not be really harmful, but I would avoid this hack.
>
> I never used \\* or \\*[10pt] variants of the command. Current stable 
> release should has problems when the line next to \\ starts from * that 
> is not bold marker, besides square brackets.

I feel like I am missing what you are talking about here.

-- 
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] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-13  2:44             ` Ihor Radchenko
@ 2022-10-13  4:59               ` Max Nikulin
  2022-10-13 14:27                 ` Leo Butler
  0 siblings, 1 reply; 16+ messages in thread
From: Max Nikulin @ 2022-10-13  4:59 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 3062 bytes --]

On 13/10/2022 09:44, Ihor Radchenko wrote:
> Max Nikulin writes:
> 
>> I am considering \noalign{} instead of \relax. I was never aware of its
>> effect, but accordingly to The TeXbook it should keep TeX in vertical
>> mode without any action due to empty argument. (Actually I surprised
>> that \relax causes any change of internal state besides parser.)
> 
> If \noalign has less side effects compared to \relax, I'd prefer
> \noalign. Can you confirm this?

My understanding of TeX is not solid enough to confirm this. From The 
TeXbook I have an impression that \noalign is added specially for 
table-like blocks to be used immediately after \cr (low level command 
similar to \\). So I would not use it outside of tables however it may 
be safe. I am not aware of problems with \\\noalign{} in tables. The 
exact effect of \relax is not clear to me yet. I do not have an example 
of negative effect of \relax similar to \hline but outside of tables.

I can try to ask for a better suggestion at stackexchange, but I am 
unsure if the question will be noticed by some person from a TeX engine 
or core LaTeX developers or at least with better understanding of TeX 
internals.

>> Unfortunately \noalign{} just as \relax will not allow @@latex:[1cm]@@
>> on the next line, perhaps @@latex:\noalign{\vskip 1cm}@@ is a workaround
>> to introduce additional vertical space.
> 
> What you are talking about appears to be abusing our exporter. We give
> no guarantees about how \\ is going to be exported internally into
> LaTeX. We should have no obligation to keep use-cases like this.

On the other hand LaTeX backend was transparent to such hacks, so the 
change might be breaking to some users. That is why conditionally adding 
\noalign{} or \relax if \\ is not followed by an export snippet may be a 
better solution.

>> I never used \\* or \\*[10pt] variants of the command. Current stable
>> release should has problems when the line next to \\ starts from * that
>> is not bold marker, besides square brackets.
> 
> I feel like I am missing what you are talking about here.

The rabbit hole is deeper than I thought. The \\ command has its star 
counterpart \\* to prevent page break at this point, and both of them 
allow optional [<LENGTH>] argument. In vanilla LaTeX2e space is allowed 
between \\ and *. However \usepackage{amsmath} redefines \\ command. It 
still can recognize following *, but only on the same line. Unsure if it 
is a bug or feature. So before your commit the following is not a 
problem in *default* Org configuration:

Star\\
@@ignore:@@* on the next line.

Star and brackets\\
*[1em] on the next line.

| Star |
| * in the next row. |
|-|
| Star and brackets |
| *[1em] in the next row. |

However it might be if someone changes list of default packages. Adding 
\noalign{} and \relax should fix the issue just for square brackets.

So at least as a temporary fix \noalign{} should be used for tables 
instead of \relax to mitigate negative effect of the recent patch.

P.S. Packages like longtable might bring more surprises.

[-- Attachment #2: doublebackslash.tex --]
[-- Type: text/x-tex, Size: 937 bytes --]

\documentclass{article}
%\usepackage{amsmath}
\begin{document}
\section{Regular usage}

Just\\
line break.

Brackets\\[1em]
on the same line.

Star\\*
on the same line.

Star and brackets\\*[1em]
on the same line.

\begin{tabular}{l}
tabular\\
\hline
Two\\
rows\\
\hline
Brackets \\[1em]
in the same row\\[1pt]
\hline
Star \\*
in the same row\\*
\hline
Start and brackets\\*[1em]
in the same row\\*[1pt]
\hline
\end{tabular}

\section{Problems}
Brackets and starts disappear in the beginning of
lines and table rows.

Brackets\\
[1em] on the next line.

\begin{tabular}{l}
tabular\\
\hline
Brackets \\
[1em] in the next row\\
[1pt]
\hline
\end{tabular}

\section{Problems when usepackage\{amsmath\} absent}

Star\\
* on the next line.

Star and brackets\\
*[1em] on the next line.

\begin{tabular}{l}
tabular\\
\hline
Star\\
* in the next row. \\
\hline
Star and brackets\\
*[1em] in the next row. \\
\hline
\end{tabular}
\end{document}

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-12 16:21           ` Max Nikulin
@ 2022-10-13  5:03             ` gerard.vermeulen
  0 siblings, 0 replies; 16+ messages in thread
From: gerard.vermeulen @ 2022-10-13  5:03 UTC (permalink / raw)
  To: emacs-orgmode, Emacs-orgmode



On 12.10.2022 18:21, Max Nikulin wrote:
[...]
>>> Stewart Thomas. [BUG] Tables with square brackets do not compile in
>>> PDF (latex) export. Wed, 10 Nov 2021 11:16:10 -0500.
>>> https://list.orgmode.org/CAO12V+wB18nAN0FuDPAeN94GHdt_2nbdJtc4u7n4W3HAZbaZsA@mail.gmail.com
>>> 
>>> I can not figure out an easy way to separate \\ from [b] text but to
>>> prevent the problem you have discovered. I am unsure if
>>> 
>>>     \\[0pt]
>>> 
>>> has no negative consequences and safe enough. I expect that LaTeX
>>> sources are not easy to read when fragile sequences of tokens are
>>> involved.
>>> 
>>> I just have realized that some users might take advantage of earlier
>>> behavior as a feature:
>>> 
>>> - item \\
>>>   [1cm]
>>> - item
>>> 
>>> I think that [1cm] should be treated as text, however I have no idea
>>> how to allow users to specify amount of vertical space and to not
>>> limit line break to LaTeX only. @@latex:\\[1cm]@@ is not suitable 
>>> when
>>> the same text should be exported to ascii, html, etc.
[...]
> Adding \relax is my fault, I did not expect that it may break \hline.
> Such behavior should be stable over decades. The question is how to
> allow users to have square brackets in the beginning of the line
> following \\ and not break some use case.
> 
>> 2. On my systems ws-butler removes the trailing whitespace.
>> 3. I edited your example with nano to add the trailing space after 
>> \relax, but it still does not compile.
> 
> Sorry, I did not get your point with trailing space. LaTeX ignores
> spaces after commands (e.g. "a\relax b" becomes "ab") and in the
> beginning of the line. What I am afraid of is unintentionally
> introduce white space at the beginning of the line, e.g. if
> | a |
> | b |
> |---|
> is exported as
> {} a \\
> {} b \\
> \hline
> then cell contents will be " a" and " b", not "a" and "b".
> \relax a \\
> \relax b \\
> \hline
> has no such problem.

Sorry, I have misread or misunderstood what \relax does with spaces.
Thank you for your patient explanation -- Gerard


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Export of this table fails LuaLaTeX compilation
  2022-10-13  4:59               ` Max Nikulin
@ 2022-10-13 14:27                 ` Leo Butler
  2022-10-13 15:18                   ` [PATCH] ox-latex: Use \empty instead of \relax after \\ Max Nikulin
  0 siblings, 1 reply; 16+ messages in thread
From: Leo Butler @ 2022-10-13 14:27 UTC (permalink / raw)
  To: Max Nikulin; +Cc: emacs-orgmode@gnu.org

On Thu, Oct 13 2022, Max Nikulin <manikulin@gmail.com> wrote:

> On 13/10/2022 09:44, Ihor Radchenko wrote:
>> Max Nikulin writes:
>> 
>>> I am considering \noalign{} instead of \relax. I was never aware of its
>>> effect, but accordingly to The TeXbook it should keep TeX in vertical
>>> mode without any action due to empty argument. (Actually I surprised
>>> that \relax causes any change of internal state besides parser.)
>> If \noalign has less side effects compared to \relax, I'd prefer
>> \noalign. Can you confirm this?
>
> My understanding of TeX is not solid enough to confirm this. From The
> TeXbook I have an impression that \noalign is added specially for 
> table-like blocks to be used immediately after \cr (low level command
> similar to \\). So I would not use it outside of tables however it may 
> be safe. I am not aware of problems with \\\noalign{} in tables. The
> exact effect of \relax is not clear to me yet. I do not have an
> example of negative effect of \relax similar to \hline but outside of
> tables.
>
> I can try to ask for a better suggestion at stackexchange, but I am
> unsure if the question will be noticed by some person from a TeX
> engine or core LaTeX developers or at least with better understanding
> of TeX internals.
>
>>> Unfortunately \noalign{} just as \relax will not allow @@latex:[1cm]@@
>>> on the next line, perhaps @@latex:\noalign{\vskip 1cm}@@ is a workaround
>>> to introduce additional vertical space.
>> What you are talking about appears to be abusing our exporter. We
>> give
>> no guarantees about how \\ is going to be exported internally into
>> LaTeX. We should have no obligation to keep use-cases like this.
>
> On the other hand LaTeX backend was transparent to such hacks, so the
> change might be breaking to some users. That is why conditionally
> adding \noalign{} or \relax if \\ is not followed by an export snippet
> may be a better solution.
>
>>> I never used \\* or \\*[10pt] variants of the command. Current stable
>>> release should has problems when the line next to \\ starts from * that
>>> is not bold marker, besides square brackets.
>> I feel like I am missing what you are talking about here.
>
> The rabbit hole is deeper than I thought. The \\ command has its star
> counterpart \\* to prevent page break at this point, and both of them 
> allow optional [<LENGTH>] argument. In vanilla LaTeX2e space is
> allowed between \\ and *. However \usepackage{amsmath} redefines \\
> command. It still can recognize following *, but only on the same
> line. Unsure if it is a bug or feature. So before your commit the
> following is not a problem in *default* Org configuration:
>
> Star\\
> @@ignore:@@* on the next line.
>
> Star and brackets\\
> *[1em] on the next line.
>
> | Star |
> | * in the next row. |
> |-|
> | Star and brackets |
> | *[1em] in the next row. |
>
> However it might be if someone changes list of default
> packages. Adding \noalign{} and \relax should fix the issue just for
> square brackets.
>
> So at least as a temporary fix \noalign{} should be used for tables
> instead of \relax to mitigate negative effect of the recent patch.
>
> P.S. Packages like longtable might bring more surprises.

Maybe Org should not use \\ to end lines in a latex-exported table?
The fact that it has many variations argues against its use in Org, IMO.

My suggestion is to use the TeX command \cr.

Or, define a command in the exported latex, something like

\newcommand{\orgcr}{\cr}

and end rows in a table with \orgcr.

Someone who really wants \\ with its variations can redefine \orgcr and
everyone else can just enjoy the simplicity of Org.

Leo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] ox-latex: Use \empty instead of \relax after \\
  2022-10-13 14:27                 ` Leo Butler
@ 2022-10-13 15:18                   ` Max Nikulin
  2022-10-14  2:32                     ` Ihor Radchenko
  0 siblings, 1 reply; 16+ messages in thread
From: Max Nikulin @ 2022-10-13 15:18 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 786 bytes --]

On 13/10/2022 21:27, Leo Butler wrote:
> 
> Maybe Org should not use \\ to end lines in a latex-exported table?
> The fact that it has many variations argues against its use in Org, IMO.
> 
> My suggestion is to use the TeX command \cr.

Various LaTeX packages may redefine \\, so low level \cr might be not 
enough. Actually I do not like that \\ does not have a robust 
counterpart with no optional arguments.

> Or, define a command in the exported latex, something like
> 
> \newcommand{\orgcr}{\cr}

It is better to make `org-latex-line-break-safe' a user option instead 
of a constant.

For a record. Unlike \\, \newline does not have optional argument, but
{\centering a\\b\par} and {\centering a\newline b\par} are not equivalent.

I hope, \empty will behave better than \relax.

[-- Attachment #2: 0001-ox-latex-Use-empty-instead-of-relax-after.patch --]
[-- Type: text/x-patch, Size: 3627 bytes --]

From d79da60e6dcfb2f3d7c0a1f5abf9ee2bc684a15c Mon Sep 17 00:00:00 2001
In-Reply-To: <87wn93re80.fsf@t14.reltub.ca>
References: <87wn93re80.fsf@t14.reltub.ca>
From: Max Nikulin <manikulin@gmail.com>
Date: Thu, 13 Oct 2022 22:08:29 +0700
Subject: [PATCH] ox-latex: Use \empty instead of \relax after \\

* lisp/ox-latex.el (org-latex-line-break-safe, org-latex-table-row):
* testing/lisp/test-org-table.el (test-org-table/to-latex): Use \empty
instead of \relax to prevent interpreting following "*" and "[" as
optional parts of \\*[LENGTH] command.

Fix regression introduced by 3f60acff77. \\\relax\hline caused
misaligned \noalign error. Org markup:

    | a |
    |---|

\hline is allowed only immediately after \cr while \relax has some side
effects. Hope, \empty just expands to nothing.

Those who used \\ optional argument to adjust amount of space between
lines may add the following tricks:

    First,\\
    @@latex:{\vskip1em}@@second.

    | First                               |
    | @@latex:\noalign{\vskip1em}@@second |

Reported in
gerard.vermeulen, Wed, 12 Oct 2022 03:15:49 +0000.
https://list.orgmode.org/784cf8be450b7d676ddd60214cc847db@posteo.net
---
 lisp/ox-latex.el               | 12 ++++++------
 testing/lisp/test-org-table.el |  6 +++---
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index eed5dc898..aff90f611 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -278,17 +278,17 @@ list can be:
 
 - `:lang-name' the actual name of the language.")
 
-(defconst org-latex-line-break-safe "\\\\\\relax"
+(defconst org-latex-line-break-safe "\\\\\\empty"
   "Linebreak protecting the following [...].
 
-Without \"\\relax\" it would be interpreted as an optional argument to
+Without \"\\empty\" 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
+    [t] & s\\\\\\empty
+    [I] & A\\\\\\empty
     [m] & kg
 \\end{tabular}")
 
@@ -4005,9 +4005,9 @@ a communication channel."
 			      (org-export-get-parent-table table-row) info))))
 	   (format "%s
 \\endfirsthead
-\\multicolumn{%d}{l}{%s} \\\\\\relax
+\\multicolumn{%d}{l}{%s} \\\\\\empty
 %s
-%s \\\\\\relax\n
+%s \\\\\\empty\n
 %s
 \\endhead
 %s\\multicolumn{%d}{r}{%s} \\\\
diff --git a/testing/lisp/test-org-table.el b/testing/lisp/test-org-table.el
index 3e7f18a10..722c37ea4 100644
--- a/testing/lisp/test-org-table.el
+++ b/testing/lisp/test-org-table.el
@@ -1635,11 +1635,11 @@ See also `test-org-table/copy-field'."
 (ert-deftest test-org-table/to-latex ()
   "Test `orgtbl-to-latex' specifications."
   (should
-   (equal "\\begin{tabular}{l}\na\\\\\\relax\n\\end{tabular}"
+   (equal "\\begin{tabular}{l}\na\\\\\\empty\n\\end{tabular}"
 	  (orgtbl-to-latex (org-table-to-lisp "| a |") nil)))
   ;; Test :environment parameter.
   (should
-   (equal "\\begin{tabularx}{l}\na\\\\\\relax\n\\end{tabularx}"
+   (equal "\\begin{tabularx}{l}\na\\\\\\empty\n\\end{tabularx}"
 	  (orgtbl-to-latex (org-table-to-lisp "| a |")
 			   '(:environment "tabularx"))))
   ;; Test :booktabs parameter.
@@ -1648,7 +1648,7 @@ See also `test-org-table/copy-field'."
     "\\toprule" (orgtbl-to-latex (org-table-to-lisp "| a |") '(:booktabs t))))
   ;; Handle LaTeX snippets.
   (should
-   (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\relax\n\\end{tabular}"
+   (equal "\\begin{tabular}{l}\n\\(x\\)\\\\\\empty\n\\end{tabular}"
 	  (orgtbl-to-latex (org-table-to-lisp "| $x$ |") nil)))
   ;; Test pseudo objects and :raw parameter.
   (should
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH] ox-latex: Use \empty instead of \relax after \\
  2022-10-13 15:18                   ` [PATCH] ox-latex: Use \empty instead of \relax after \\ Max Nikulin
@ 2022-10-14  2:32                     ` Ihor Radchenko
  0 siblings, 0 replies; 16+ messages in thread
From: Ihor Radchenko @ 2022-10-14  2:32 UTC (permalink / raw)
  To: Max Nikulin; +Cc: emacs-orgmode

Max Nikulin <manikulin@gmail.com> writes:

> It is better to make `org-latex-line-break-safe' a user option instead 
> of a constant.

I am not sure. It is so subtle that I doubt that users can safely
customize it without high chances of breaking export. If really needed,
it is anyway possible to setq constant in Elisp anyway. With
unpredictable consequences, of course.

> I hope, \empty will behave better than \relax.
> From d79da60e6dcfb2f3d7c0a1f5abf9ee2bc684a15c Mon Sep 17 00:00:00 2001
> In-Reply-To: <87wn93re80.fsf@t14.reltub.ca>
> References: <87wn93re80.fsf@t14.reltub.ca>
> From: Max Nikulin <manikulin@gmail.com>
> Date: Thu, 13 Oct 2022 22:08:29 +0700
> Subject: [PATCH] ox-latex: Use \empty instead of \relax after \\

Thanks!
Applied onto main.
https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=892df429f4ff861c8e2b7861702f97f97a4987ab

I consider this bug resolved.
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] 16+ messages in thread

end of thread, other threads:[~2022-10-14  2:33 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-12  3:15 Export of this table fails LuaLaTeX compilation gerard.vermeulen
2022-10-12  4:15 ` Ihor Radchenko
2022-10-12  4:45   ` Max Nikulin
2022-10-12  5:15     ` gerard.vermeulen
2022-10-12  5:55       ` Max Nikulin
2022-10-12  7:26         ` Ihor Radchenko
2022-10-12  8:20           ` Max Nikulin
2022-10-13  2:44             ` Ihor Radchenko
2022-10-13  4:59               ` Max Nikulin
2022-10-13 14:27                 ` Leo Butler
2022-10-13 15:18                   ` [PATCH] ox-latex: Use \empty instead of \relax after \\ Max Nikulin
2022-10-14  2:32                     ` Ihor Radchenko
2022-10-12  9:17         ` Export of this table fails LuaLaTeX compilation gerard.vermeulen
2022-10-12 16:21           ` Max Nikulin
2022-10-13  5:03             ` gerard.vermeulen
2022-10-12  4:53   ` gerard.vermeulen

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).