On Tue, Mar 21, 2023 at 9:40 PM Scott Kostyshak <skost...@lyx.org> wrote: > > On Tue, Mar 21, 2023 at 12:50:06PM +0100, Jürgen Spitzmüller wrote: > > Am Dienstag, dem 21.03.2023 um 11:27 +0000 schrieb Udicoudco: > > > Hello all, > > > > > > Attached a LyX file and its export to LaTeX code. > > > When compiling with XeLaTeX the exported code > > > I get the warning: > > > > > > \endL or \endR problem (0 missing, 1 extra) in paragraph at lines > > > 26--27 > > > > Interestingly, I don't get this warning with your example file. This is > > with TeXLive 2023. > > I can reproduce on both TeXLive 2022 and TeXLive 2023. Note that the word > "warning" is not used in the log file for this message. I get the same > message as Udi except that the line numbers are different: > > \endL or \endR problem (0 missing, 1 extra) in paragraph at lines 28--29 > > Scott
I've been reading e-TeX's and bidi's manuals, and done some experiments To understand what is the meaning of this message, and why it is present. It seems that the primitives \beginR and \beginL does not have to end with \endR or \endL when used in horizontal mode (not restricted horizontal mode), and if this is the case, e.g we started \beginR without ending it, all subsequent text will be typeset in a RTL paragraph, and the behaviour is restored to the default at the start of the next paragraph. If there is a \endL without \beginL at the paragraph level, we get a message of the form \endL or \endR problem (0 missing, 1 extra) in paragraph at lines.... inside \hbox the message will be a bit different. The bidi package patches \everypar such that if the conditional \if@RTL is true then \beginR is inserted at the start of the paragraph, otherwise \beginL is inserted. The command \LRE from the bidi package sets the conditional \if@RTL to false. In addition, this macro does not really have an argument, it basically expands to something of the form \LRE{Hello} -> {\beginL Hello}\endL (the \endL is outside of the group intentionally) Hence there will be no error if the "argument" contains several paragraphs, even though \LRE is not \long, but it is not meant to be used with such an "argument". Now, when we do \LRE{ \begin{lstlisting} Hello \end{lstlisting} } We basically have \@RTLfalse\beginL{ \begin{lstlisting} Hello \end{lstlisting} }\endL Since the lstlisting start and end with \par, if we will discard anything not important we will remain with \@RTLfalse\beginL{ \par Hello \par }\endL Since all the primitives \beginL, \beginR, \endL, \endR are horizontal commands, they start a paragraph. So the line "}\endL" started a paragraph, outside of the scope where \if@RTL is false, hence the paragrpah started with \beginR, and so the \endL does not match any \beginL. I think in the case of where forceLTR insets will have multiple paragraphs, it is better to use \begin{RTL}...\end{RTL}, which basically only issues \par and sets the RTL related conditionals to be false. Regards, Udi > -- > lyx-devel mailing list > lyx-devel@lists.lyx.org > http://lists.lyx.org/mailman/listinfo/lyx-devel -- lyx-devel mailing list lyx-devel@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-devel