坏位置方程数 Lualatex

坏位置方程数 Lualatex

如果数学显示太宽,则会\eqno出现在左侧的下一行,而不是应该出现在右侧。有人知道如何解决这个问题吗?这是一个例子:

\documentclass[a4paper]{article}    
\usepackage[cmex10]{amsmath}    
\usepackage{amsfonts}    
\usepackage{mathtools}    
\usepackage{mathptmx}

\newcommand{\E}{\mathbb{E}}     
\newcommand{\si}[1]{\ensuremath{\sigma_{#1}^{2}}}

\begin{document}

\begin{equation}
   C=   
\begin{bmatrix}
    {C_{11} } & {C_{12} }  \\
    {C_{21} } & {C_{22} }  \\
\end{bmatrix}=
\begin{bmatrix}
    \E\left[ {\left( {X-m_{X}} \right)^{2}} \right] & \E\left[ {\left( {X-m_{X}} \right)\left( {Y-m_{Y}} \right)} \right] \\
    \E\left[ {\left( {X-m_{X}} \right)\left( {Y-m_{Y}} \right)} \right] & \E\left[ {\left( {Y-m_{Y}} \right)^{2}} \right] 
\end{bmatrix}=
\begin{bmatrix}
    \si{X} & C_{XY} \\
    C_{XY} & \si{Y} \\
\end{bmatrix}
\end{equation}

\end{document}

由 Hendrik Vogt 添加:

普通的 LuaTeX 也会发生同样的事情。

\hsize=2cm
$$a^2+b^2=c^2\eqno(1)$$
\bye

编译后的输出luatex

左边的 eqno

编译后的输出pdftex

右边的 eqno

亲爱的朋友们:我认为下一个代码是一个可能的临时解决方案:

\usepackage{environ}

\NewEnviron{equationw}
{
\begin{equation}\begin{split}
\BODY
\end{split}\end{equation}
}

答案1

这似乎是 LuaTeX 引擎的一个错误,见下文。要解决此问题,请使用align而不是equationalign环境不依赖 TeX 引擎来放置方程编号。这解决了您的问题(但可能会影响垂直的间距更短方程式)。


思考我可以找到错误texmath.w,第 2220 行至第 2225 行。那里说

if ((eqno_box != null) && (eqno_w == 0) && !l) {
    tail_append(new_penalty(inf_penalty));
    shift_amount(eqno_box) = line_s;
    append_to_vlist(eqno_box);
    g2 = 0;
}

有趣的是第三行:包含方程编号的框的移位量为line_s,之前设置为\displayindent(通常为零)。因此,方程编号左对齐。

以下是 Knuth 的tex.web,第 22580 至 22585 行:

if (a<>null)and(e=0)and not l then
  begin tail_append(new_penalty(inf_penalty));
  shift_amount(a):=s+z-width(a);
  append_to_vlist(a);
  g2:=0;
  end;

您可以看到,这是用另一种语言编写的完全相同的代码,eqno_box != null翻译为a<>null,等等。这里,包含方程编号的框的移位量为s+z-width(a),其中与上面s相同,是线宽,是包含方程编号的框的宽度。这是使方程编号向右对齐的正确移位量!line_szwidth(a)a

也许我应该解释一下代码第一行的条件:带有方程编号的框应该是非空的,它的宽度应该是 0(!),并且我们不应该处于eft 方程编号如\leqno。宽度为什么是 0?这是之前设置的“标志”,表示该框应放在下一行,因为它不适合方程式所在的行。

相关内容