如何使 fleqn 的自动移位与 alignat 一起工作?

如何使 fleqn 的自动移位与 alignat 一起工作?

我使用fleqn标准mathindent设置的选项。如果方程式与右页边距相冲突,该选项会将方程式进一步向左移动。

但是alignat,使用 则不起作用。为了解决这个问题,我手动将 设置mathindent\setlength{\mathindent}{10pt},其中我需要空间,并将其重置为我发现的\setlength{\mathindent}{\dimen102}该方程后的默认值。现在对于所有后续方程,自动移位不再起作用。

\documentclass[12pt,a4paper,fleqn]{scrreprt}
\usepackage{amsmath}
\usepackage{array}

\newdimen{\oldmathindent}
\setlength{\oldmathindent}{\mathindent}

\begin{document}

Some short equation, which has the default \texttt{mathindent} due to \texttt{fleqn}:
\begin{equation}
E=mc^2.
\end{equation}
Some long equation, which automatically has a smaller \texttt{mathindent} due to its length and a collision with the right margin:
\begin{equation}
v = \left[ \begin{array}{c c c c c c c c c c c c c c c c c c c c c c c c c c c c}
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0
\end{array}\right]^\top.
\end{equation}
Now some long equation with \texttt{alignat}
\begin{alignat}{4}
\nonumber \ddot{x}_c &= -&&\frac{1}{m_c(\Delta m_c)} &&[&& F_s(x_c-x_w,u_1,\Delta m_c) + F_d(x_c-x_w,\dot(x_c)-\dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c)) + F_{Delta m_c}( \Delta m_c ) ]   \\ 
\nonumber \ddot{x}_w &= -&&\frac{1}{m_w} &&[&& F_s(x_c-x_w,u_1) + F_d(x_c-x_w,\dot(x_c)-\dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c))].
\end{alignat}
The same long equation with \emph{alignat} but manual set of \texttt{mathindent} to 0
\setlength{\mathindent}{0pt}
\begin{alignat}{4}
\nonumber \ddot{x}_c &= -&&\frac{1}{m_c(\Delta m_c)} &&[&& F_s(x_c-x_w,u_1,\Delta m_c) + F_d(x_c-x_w,\dot(x_c)-\dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c)) + F_{Delta m_c}( \Delta m_c ) ]   \\ 
\nonumber \ddot{x}_w &= -&&\frac{1}{m_w} &&[&& F_s(x_c-x_w,u_1) + F_d(x_c-x_w,\dot(x_c)-    \dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c))].
\end{alignat}\\
\setlength{\mathindent}{\oldmathindent}
And now - after setting back the \texttt{mathindent} to \texttt{oldmathindent}, the same short equation from above looks like this:
\begin{equation}
v = \left[ \begin{array}{c c c c c c c c c c c c c c c c c c c c c c c c c c c c}
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0
\end{array}\right]^\top.
\end{equation}

\end{document}

请注意,长方程的布局alignat是我想要的。如果有人知道如何在不使用 的情况下实现这一点alignat,那对我来说也很好。

谢谢!

edit_0528:我应用了建议的更改芭芭拉·比顿(如果我没记错的话)。但是,所有方程式都\setlength{\mathindent}{0pt}在最左边开始,忽略\setlength{\mathindent}{\oldmathindent}

答案1

不要保存并恢复使用:

\begingroup
\setlength{\mathindent}{0pt}
\begin{alignat}{4}
\nonumber \ddot{x}_c &= -&&\frac{1}{m_c(\Delta m_c)} &&[&& F_s(x_c-x_w,u_1,\Delta m_c) + F_d(x_c-x_w,\dot(x_c)-\dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c)) + F_{Delta m_c}( \Delta m_c ) ]   \\ 
\nonumber \ddot{x}_w &= -&&\frac{1}{m_w} &&[&& F_s(x_c-x_w,u_1) + F_d(x_c-x_w,\dot(x_c)-    \dot(x_w)) + F_f(\dot(x_c)-\dot(x_w)) + \\ &&&&&&&  +F_{fc}(\dot(x_c))].
\end{alignat}
\endgroup

答案2

尽管你已经选择了适当的\dimen,但命令的作用 \setlength{\mathindent}{0pt}重置 \dimen102.因此您不再有权访问原始值。

\mathindent因此在序言中保存的原始值:

\newdimen{\oldmathindent}
\AtBeginDocument{%
  \setlength{\oldmathindent}{\mathindent}%
}

然后,而不是 \setlength{\mathindent}{\dimen102}指定

\setlength{\mathindent}{\oldmathindent}

编辑:事实证明,它\mathindent本身直到之后才被设置 \begin{document},因此尝试\oldmathindent在前言中设置没有任何用处。

答案3

你犯了两个错误:

  1. 您应该使用\newlength{\oldmathindent}而不是\newdimen,因为\mathindent是橡胶长度。

  2. 您应该在文档开始时保存值\mathindent,而不是在前导码中保存值,那里它的值仍然为 -1sp(它不是零,以便将其用作信号)。

所以你应该这样做

\newlength{\oldmathindent}
\AtBeginDocument{\setlength{\oldmathindent}{\mathindent}}

amsmath文档开始时设置的值是29.3747pt minus 29.3747pt,并且该minus部分是必需的。

\DeclareOption{fleqn}{%
    \@fleqntrue
    \@mathmargin = -1sp
    \let\mathindent=\@mathmargin
    \AtBeginDocument{%
        \ifdim\@mathmargin= -1sp
            \@mathmargin\leftmargini minus\leftmargini
        \fi
    }%
}

如您所见,amsmath使用\@mathmargin,但fleqn选项使\mathindent等同于,但值是在稍后设置,即当知道\@mathmargin的值时。\leftmargini

当然,\mathindent集体重置是最好的办法。

相关内容