陷入同样的麻烦amsmath 的 multline 和 fleqn,我想知道是否可以启用amsmath
选项fleqn
(全局,没有其他选择)但为multline
环境禁用它(好吧,这不是理想的,但无论如何)?
答案1
在内部,该fleqn
选项设置了一个标志\if@fleqn
,因此您只需将其关闭即可。最简单的方法是使用\preto
使用电子工具箱包裹:
\documentclass[fleqn]{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\makeatletter
\preto\multline{\@fleqnfalse}% disable fleqn inside multline environments
\makeatother
\begin{document}
\begin{multline}
1+2+3+4+5+6+7+8+9+10+11+12 \\
+13+14+15+16+17+18+19+20+21+22 \\
+23+24+25+26+27+28+29+30+31
\end{multline}
\end{document}
得出的结果为:
第二种选择是定义一个通用环境,如下所示nofleqn
,它允许您随时关闭fleqn
。此环境的工作方式是它接受一个参数,即您真正想要使用的环境的名称(例如multine
,,align
align*
),然后您可以像往常一样添加环境的内容。使用代码,它使用环境包中,下面的 MWE 生成:
为了方便参考,multline
还提供了一个未经修改的环境。代码如下:
\documentclass[fleqn]{article}
\usepackage{amsmath}
\usepackage{environ}
\makeatletter
\NewEnviron{nofleqn}[1]{\@fleqnfalse\begin{#1}\BODY\end{#1}}
\makeatother
\begin{document}
Without fleqn:
\begin{nofleqn}{multline}
1+2+3+4+5+6+7+8+9+10+11+12 \\
+13+14+15+16+17+18+19+20+21+22 \\
+23+24+25+26+27+28+29+30+31
\end{nofleqn}
With fleqn:
\begin{multline}
1+2+3+4+5+6+7+8+9+10+11+12 \\
+13+14+15+16+17+18+19+20+21+22 \\
+23+24+25+26+27+28+29+30+31
\end{multline}
\end{document}
当然,您可以用完全相同的方式定义无 fleqn 版本的环境multline
。事实上,如果您知道正在使用的环境的名称,那么您不需要environ
:
\newenvironment{Multline}{\@fleqnfalse\multline}{\endmultline}
在所有情况下,都必须将定义代码括在内,\makeatletter....\makeatother
否则 LaTeX 会抱怨 ythe @
in \if@fleqn
。我认为这应该可以正常工作,但我还没有彻底测试过,所以可能会有意想不到的副作用。
答案2
这里重新定义了multline
和multline*
环境,其中第一行之后的行缩进两次\mathindent
(如果您喜欢不同的间距,您可以轻松找到操作位置)。
\documentclass[fleqn]{article}
\usepackage{amsmath}
\usepackage{xparse,environ}
\usepackage{lipsum}
\ExplSyntaxOn
% save the original environments
\cs_set_eq:NN \db_multline_start: \multline
\cs_set_eq:NN \db_multline_end: \endmultline
\cs_set_eq:Nc \db_multline_star_start: {multline*}
\NewDocumentEnvironment{amsmathmultline}{}
{\db_multline_start:}
{\db_multline_end:}
\NewDocumentEnvironment{amsmathmultline*}{}
{\db_multline_star_start:}
{\db_multline_end:}
% redefine them
\RenewEnviron{multline}
{
\db_multline:nV {multline} \BODY
}
\RenewEnviron{multline*}
{
\db_multline:nV {multline*} \BODY
}
\seq_new:N \l_db_multline_seq
\cs_new_protected:Nn \db_multline:nn
{
\seq_set_split:Nnn \l_db_multline_seq { \\ } { #2 }
\begin{amsmath#1}
\seq_use:Nn \l_db_multline_seq { \multlineaddspace } \hfill
\end{amsmath#1}
}
\cs_generate_variant:Nn \db_multline:nn { nV }
\ExplSyntaxOff
\NewDocumentCommand{\multlineaddspace}{o}{%
\IfValueTF{#1}{\\[#1]}{\\}\hspace{\mathindent}%
}
\begin{document}
\lipsum*[3]
\begin{multline}
1+2+3+4+5+6+7+8+9+10+11+12 \\[2ex]
+13+14+15+16+17+18+19+20+21+22 \\[2ex]
+23+24+25+26+27+28+29+30+31
\end{multline}
\lipsum*[4]
\begin{multline*}
1+2+3+4+5+6+7+8+9+10+11+12 \\
+13+14+15+16+17+18+19+20+21+22 \\
+23+24+25+26+27+28+29+30+31
\end{multline*}
\lipsum[5]
\end{document}