我使用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
你犯了两个错误:
您应该使用
\newlength{\oldmathindent}
而不是\newdimen
,因为\mathindent
是橡胶长度。您应该在文档开始时保存值
\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
集体重置是最好的办法。