通过最小工作示例描述问题
我将描述两个实验:“对照”和“处理”。我将首先描述一个“对照”实验,该实验展示了我认为的正常行为。然后,我将描述第二个“处理”实验,该实验表现出与第一个案例中观察到的行为不同的行为。第二个实验中表现出的行为是我认为有问题的行为。
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 查看器中打开时,文件显示如下。(我仅截取了显示的相关部分。)
请注意,方程式位于文本区域的中心,并且文本间内容左对齐。
2.治疗
重复第一个实验,但要在通过包设置语言的希伯来语文档中重复babel
。换句话说,在上面的代码中取消注释两行注释掉的行,并将命令的参数\intertext
(即and
)替换为\foreignlanguage{hebrew}{and}
。PDF 输出现在是
注意
- 这些方程式是右对齐的。
- 互文是左对齐的。
考虑到希伯来语是一种从右到左的语言,其中数学被视为嵌入的英语(因此从左到右)文本,因此此输出不正确。正确的行为应该是方程式居中,如在“控制”实验中一样,单词“and”右对齐。
问题
- 为什么方程式没有在希伯来语文档中居中?如何纠正?
- 为什么希伯来语文档中的互文没有右对齐?如何纠正?
评论
~/Test.log
希伯来语实验结束时没有发现任何警告。希伯来语实验中的方程式右对齐即使在没有互文的情况下也会发生。但是,在这种情况下有一个解决方法:用具有嵌入环境的环境替换
alignat*
环境:equation*
alignedat
\begin{equation*} \begin{alignedat}{2} a&=b&&+c\\ d&=e&&+f\\ x&=y&&+z \end{alignedat} \end{equation*}
这将产生正确的输出:
但是,该
\intertext
命令不能嵌入到alignedat
环境中。但即使没有命令\intertext
,我也不想采用equation*
变通方法;我希望alignat*
环境的行为与在英文文档中的行为一样。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!
与环境相反
alignat*
,alignat
环境(没有星号)在没有互文的情况下可以正常工作:\begin{alignat}{2} a&=b&&+c\\ d&=e&&+f\\ x&=y&&+z \end{alignat}
生产
然而,希伯来语互文仍然对齐错误:
\begin{alignat}{2} a&=b&&+c\\ d&=e&&+f\\ \intertext{\foreignlanguage{hebrew}{and}} x&=y&&+z \end{alignat}
生产
环境
align*
表现正常。例如以下代码\begin{align*} a&=b&&+c\nonumber\\ d&=e&&+f\nonumber\\ \intertext{\foreignlanguage{hebrew}{and}} x&=y&&+z\nonumber \end{align*}
生产
相比之下,
align
环境使方程式和互文都右对齐。
答案1
注意力 以下内容并非完整的解决方案,仅作为进一步调查的提示。
alignat*
内部是表格(\halign
TeX 语言中的 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}