使用 LuaLaTeX 时,如果数学方向设置为从右到左,align*
环境的内容将左对齐而不是居中。为什么会发生这种情况?我该如何修复?
\documentclass{article}
\usepackage{amsmath}
\luatexmathdir TRT
\begin{document}
\begin{equation}
1+2=3
\end{equation}
\begin{align}
1+2&=3\nonumber\\
4+5&=6
\end{align}
\begin{align*}
1+2&=3\\
4+5&=6
\end{align*}
\end{document}
更新:类似的问题,但这次是 LTR 数学:
\documentclass{article}
\usepackage{amsmath}
\luatexpagedir TRT
\luatexbodydir TRT
\begin{document}
\begin{equation}
1+2=3
\end{equation}
\begin{align}
1+2&=3\nonumber\\
4+5&=6
\end{align}
\begin{align*}
1+2&=3\\
4+5&=6
\end{align*}
\end{document}
我只对第二种情况感兴趣,因为我从未真正排版过 RTL 数学或需要实现它;如果\pagedir
和\bodydir
基元在数学模式下没有效果,那就很好了(我不确定这应该称为错误还是功能)。无论如何,我想我最好不要使用\bodydir
和\pagedir
基元。它们的问题多于用处。
与选项multline
一起使用的环境还存在另一个问题:fleqn
\documentclass[fleqn]{article}
\usepackage{amsmath,lipsum}
\luatexpagedir TRT
\luatexbodydir TRT
\begin{document}
\lipsum[1]
\begin{equation}
1+2=3
\end{equation}
\begin{multline}
a+b+c+d+e+f\\
+i+j+k+l+m+n
\end{multline}
\lipsum[1]
\end{document}
这会产生错误的边距;要修复它,我们只需使用\z@skip
for\tabskip
即可\@mathmargin
:
\documentclass[fleqn]{article}
\usepackage{amsmath,lipsum}
\luatexpagedir TRT
\luatexbodydir TRT
\makeatletter
\def\multline@#1{%
\Let@
\@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}%
\chardef\dspbrk@context\z@
\restore@math@cr
\let\tag\tag@in@align
\global\tag@false \global\let\raise@tag\@empty
\mmeasure@{#1}%
\let\tag\gobble@tag \let\label\@gobble
% \tabskip \if@fleqn \@mathmargin \else \z@skip \fi
\tabskip \z@skip
\totwidth@\displaywidth
\if@fleqn
\advance\totwidth@-\@mathmargin
\fi
\halign\bgroup
\hbox to\totwidth@{%
\if@fleqn
\hskip \@centering \relax
\else
\hfil
\fi
\strut@
$\m@th\displaystyle{}##\endmultline@math
\hfil
}%
\crcr
\if@fleqn
\hskip-\@mathmargin
\def\multline@indent{\hskip\@mathmargin}% put it back
\else
\hfilneg
\def\multline@indent{\hskip\multlinegap}%
\fi
\iftagsleft@
\iftag@
\begingroup
\ifshifttag@
\rlap{\vbox{%
\normalbaselines
\hbox{%
\strut@
\make@display@tag
}%
\vbox to\lineht@{}%
\raise@tag
}}%
\multline@indent
\else
\setbox\z@\hbox{\make@display@tag}%
\dimen@\@mathmargin \advance\dimen@-\wd\z@
\ifdim\dimen@<\multlinetaggap
\dimen@\multlinetaggap
\fi
\box\z@ \hskip\dimen@\relax
\fi
\endgroup
\else
\multline@indent
\fi
\else
\multline@indent
\fi
#1%
}
\makeatother
\begin{document}
\lipsum[1]
\begin{equation}
1+2=3
\end{equation}
\begin{multline}
a+b+c+d+e+f\\
+i+j+k+l+m+n
\end{multline}
\lipsum[1]
\end{document}
答案1
此解决方案\place@tag
适用于align*
环境,其中\iftag@
为 false。据我测试,这种方法一切正常。
\documentclass{article}
\usepackage{amsmath}
\luatexmathdir TRT
\makeatletter
\def\math@cr@@@align{%
\ifst@rred\nonumber\fi
\if@eqnsw \global\tag@true \fi
\global\advance\row@\@ne
\add@amps\maxfields@
\omit
\kern-\alignsep@
% \iftag@
% \setboxz@h{\@lign\strut@{\make@display@tag}}%
% \place@tag
% \fi
\iftag@
\setboxz@h{\@lign\strut@{\make@display@tag}}%
\place@tag
\else
\place@tag
\fi
\ifst@rred\else\global\@eqnswtrue\fi
\global\lineht@\z@
\cr
}
\makeatother
\begin{document}
\begin{equation}
1+2=3
\end{equation}
\begin{align}
1+2&=3\nonumber\\
4+5&=6
\end{align}
\begin{align*}
1+2&=3\\
4+5&=6
\end{align*}
\end{document}