align* 环境与 LuaTeX 和 RTL 数学方向左对齐

align* 环境与 LuaTeX 和 RTL 数学方向左对齐

使用 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@skipfor\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}

相关内容