'alignat*' 环境不会将其方程式置于通过 'babel' 设置的希伯来语文档的中心。并且错误地对齐了互文

'alignat*' 环境不会将其方程式置于通过 'babel' 设置的希伯来语文档的中心。并且错误地对齐了互文

通过最小工作示例描述问题

我将描述两个实验:“对照”和“处理”。我将首先描述一个“对照”实验,该实验展示了我认为的正常行为。然后,我将描述第二个“处理”实验,该实验表现出与第一个案例中观察到的行为不同的行为。第二个实验中表现出的行为是我认为有问题的行为。

1. 控制

我在文件中保存了以下 LaTeX 代码~/Test.tex

\documentclass{article}
%\usepackage[bidi=basic,hebrew,provide=*]{babel}
%\babelfont{rm}[Renderer=HarfBuzz]{FreeSerif}
\usepackage{amsmath}
\usepackage{lipsum}
\begin{document}
\lipsum[1-1][1-2]

\begin{alignat*}{2}
a&=b&&+c\\
d&=e&&+f\\
ֿ\intertext{and}
x&=y&&+z
\end{alignat*}

\lipsum[1-1][3-4]
\end{document}

然后我在终端中执行了以下命令。

> cd ~
> lualatex Test

这导致文件~/Test.pdf被创建。在 PDF 查看器中打开时,文件显示如下。(我仅截取了显示的相关部分。)

英文文档中的 alignat*

请注意,方程式位于文本区域的中心,并且文本间内容左对齐。

2.治疗

重复第一个实验,但要在通过包设置语言的希伯来语文档中重复babel。换句话说,在上面的代码中取消注释两行注释掉的行,并将命令的参数\intertext(即and)替换为\foreignlanguage{hebrew}{and}。PDF 输出现在是

希伯来语文档中的 alignat*

注意

  1. 这些方程式是右对齐的。
  2. 互文是左对齐的。

考虑到希伯来语是一种从右到左的语言,其中数学被视为嵌入的英语(因此从左到右)文本,因此此输出不正确。正确的行为应该是方程式居中,如在“控制”实验中一样,单词“and”右对齐。

问题

  1. 为什么方程式没有在希伯来语文档中居中?如何纠正?
  2. 为什么希伯来语文档中的互文没有右对齐?如何纠正?

评论

  1. ~/Test.log希伯来语实验结束时没有发现任何警告。

  2. 希伯来语实验中的方程式右对齐即使在没有互文的情况下也会发生。但是,在这种情况下有一个解决方法:用具有嵌入环境的环境替换alignat*环境:equation*alignedat

     \begin{equation*}
        \begin{alignedat}{2}
        a&=b&&+c\\
        d&=e&&+f\\
        x&=y&&+z
        \end{alignedat}
     \end{equation*}
    

    这将产生正确的输出:

    希伯来语文档中的 alignedat

    但是,该\intertext命令不能嵌入到alignedat环境中。但即使没有命令\intertext,我也不想采用equation*变通方法;我希望alignat*环境的行为与在英文文档中的行为一样。

  3. adjustbox我尝试用下列方法将方程式置于中心。

     ...
     \usepackage{adjustbox}
     ...
     \begin{document}
     ...
     \begin{adjustbox}{center}
     \begin{alignat*}{2}
        a&=b&&+c\\
        d&=e&&+f\\
        x&=y&&+z
     \end{alignat*}
     \end{adjustbox}{center}
    ...
    

    但这导致编译失败,并出现以下消息~/Test.log

     ! Missing \endgroup inserted.
     <inserted text> 
     \endgroup 
     l.17 \end{alignat*}
    
     ? 
     ! Emergency stop.
     <inserted text> 
     \endgroup 
     l.17 \end{alignat*}
    
     End of file on the terminal!
    
  4. 与环境相反alignat*alignat环境(没有星号)在没有互文的情况下可以正常工作:

     \begin{alignat}{2}
        a&=b&&+c\\
        d&=e&&+f\\
        x&=y&&+z
     \end{alignat}
    

    生产

    希伯来语文档中的 alignat

    然而,希伯来语互文仍然对齐错误:

     \begin{alignat}{2}
        a&=b&&+c\\
        d&=e&&+f\\
        \intertext{\foreignlanguage{hebrew}{and}}
        x&=y&&+z
     \end{alignat}
    

    生产

    与希伯来语文档中的互文对齐

  5. 环境align*表现正常。例如以下代码

     \begin{align*}
         a&=b&&+c\nonumber\\
         d&=e&&+f\nonumber\\
         \intertext{\foreignlanguage{hebrew}{and}}
         x&=y&&+z\nonumber
     \end{align*}
    

    生产

    与希伯来语文档中的互文对齐*

    相比之下,align环境使方程式和互文都右对齐。

答案1

注意力 以下内容并非完整的解决方案,仅作为进一步调查的提示。

alignat*内部是表格(\halignTeX 语言中的 a)。amsmath 首先测量宽度,然后计算行上的可用空间,将其除以 2,并将结果作为制表符添加到左边第一列。在从左到右模式下,这可以正常工作,但在从右到左模式下,它会失败,因为在那里你需要在正确的表格(或其最后一列)的大小。未加星号的版本可以正常工作,因为右侧列的大小已经正确。

即使了解发生了什么,修复也并非易事。amsmath 在环境之间共享代码,因此更改某些内容也会影响其他环境。此外,对于每个更改,都必须测试各种组合(带星号/不带星号、在 TLT 中、在 TRT 中、有无 fleqn、使用 pdflatex、xelatex 和其他引擎等...)。这意味着以下内容可以工作,但在某些尚未测试的情况下也可能失败...

\documentclass{article}

\usepackage{amsmath}
\usepackage{lipsum}
\usepackage[bidi=basic,hebrew,provide=*]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSerif}
\makeatletter
\newcommand\bidiendalignat{%
   \ifst@rred
    \kern\eqnshift@ % additional kern
  \fi 
  \math@cr \black@\totwidth@
  \egroup    
  \ifingather@
    \restorealignstate@
    \egroup
    \nonumber
    \ifnum0=`{\fi\iffalse}\fi
  \else
    $$%
  \fi  
  \ignorespacesafterend}
  
\renewenvironment{alignat*}{%
  \start@align\z@\st@rredtrue
}{%
  \bidiendalignat
}


\def\intertext@{%
  \def\intertext##1{%
    \ifvmode\else\\\@empty\fi
    \noalign{%
      \penalty\postdisplaypenalty\vskip\belowdisplayskip      
      \vbox{\normalbaselines 
        \textdir TRT \pardir TRT %wrong in TLT, so test for bidi needed ...
        \ifdim\linewidth=\columnwidth
        \else \parshape\@ne \@totalleftmargin \linewidth
        \fi
        \noindent\ignorespaces##1\par}%
      \penalty\predisplaypenalty\vskip\abovedisplayskip%
    }%
}}

\makeatother

\begin{document}
\lipsum[1]

\begin{alignat*}{2}
a&=b&&+c\\
d&=e&&+f\\
ֿ\intertext{and}
x&=y&&+z
\end{alignat*}


\begin{alignat}{2}
a&=b&&+c\\
d&=e&&+f\\
ֿ\intertext{and}
x&=y&&+z
\end{alignat}

\end{document}

在此处输入图片描述

相关内容