禁用多线环境的 fleqn 选项吗?

禁用多线环境的 fleqn 选项吗?

陷入同样的​​麻烦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,,alignalign*),然后您可以像往常一样添加环境的内容。使用代码,它使用环境包中,下面的 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

这里重新定义了multlinemultline*环境,其中第一行之后的行缩进两次\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}

在此处输入图片描述

相关内容