居中左对齐的“聚集”环境

居中左对齐的“聚集”环境

我知道如果您将其fleqn作为一个选项传递,则所有amsmath的环境都会变为左对齐,包括gather,但是,与此同时,它们会变为左对齐。

实际上,我试图创建的是左对齐gather环境,该环境相对于页面水平居中。这不是我所需要的,因为我想保留环境的默认行为,但我找到了一种暂时打开此选项的方法。问题是如何在不使用其他包的情况下将环境fleqn居中?leftceqetoolbox

有一个肮脏的align环境解决方法,它让我&在每一行的开头放置大量的数学方程式,这非常不方便。

在此处输入图片描述

\documentclass{article}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs=true}
\usepackage{showframe}

\makeatletter
\newenvironment{leftceq}{
\@fleqntrue%
\gather%
}{%
\endgather
}
\makeatother


\begin{document}
\verb|my environment|
\begin{leftceq}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{leftceq}\\

\verb|desired result, faked with align environment|
\begin{align}
&y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
&y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{align}\\

\verb|default gather|
\begin{gather}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{gather}

\end{document}

答案1

使用“假”但使其自动化。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentEnvironment{leftceq}{b}
 {
  \antshar_leftceq:nn { } { #1 }
 }
 {}
\NewDocumentEnvironment{leftceq*}{b}
 {
  \antshar_leftceq:nn { * } { #1 }
 }
 {}

\seq_new:N \l__antshar_leftceq_seq

\cs_new_protected:Nn \antshar_leftceq:nn
 {
  \seq_set_split:Nnn \l__antshar_leftceq_seq { \\ } { #2 }
  \begin{align#1}
  & \seq_use:Nn \l__antshar_leftceq_seq { \\ & }
  \end{align#1}
 }

\ExplSyntaxOff

\begin{document}

Numbered
\begin{leftceq}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{leftceq}

Unnumbered
\begin{leftceq*}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{leftceq*}

\end{document}

这会在将行传递到 时将环境的内容拆分在 处\\,并将 放置&在每一行的前面align

在此处输入图片描述

评论中询问了错误的版本

\ExplSyntaxOn
\NewDocumentEnvironment{leftceq}{b}
 {
  \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
  \begin{align*} & \seq_use:Nn \l_tmpa_seq { \\ & } \end{align*}
 }{}
\ExplSyntaxOff

我不建议这样做,因为如果事实证明编号版本是必要的,则必须复制代码。将用户界面与内部代码分开,除了是推荐的方法之外,还有一个优点。


如果您想要支持诸如此类的嵌套对齐cases,恐怕您必须采取一些困难的方法。

这是对代码的快速修改(并且很可能可以改进)amsmath

\documentclass{article}
\usepackage{amsmath,showframe}

\makeatletter

\newenvironment{leftceq}{%
  \start@leftceq\@ne\st@rredtrue\m@ne
}{\endalign}

\def\start@leftceq#1#2#3{%
    \let\xatlevel@#1% always \z@, \@ne, or \tw@
    \maxfields@#3\relax
    \ifnum\maxfields@>\m@ne
        \checkat@true
        \ifnum\xatlevel@=\tw@
            \xxat@true
        \fi
        \multiply\maxfields@\tw@
    \else
        \checkat@false
    \fi
    \ifingather@
        \iffalse{\fi\ifnum0=`}\fi
        \DN@{\vcenter\bgroup\savealignstate@\leftceq@#2}%
    \else
        \ifmmode
          \if@display
             \DN@{\align@recover}%
          \else
            \nomath@env
            \DN@{\@namedef{end\@currenvir}{}\@gobble}%
          \fi
        \else
            $$%
            \let\split\insplit@
            \DN@{\leftceq@#2}%
        \fi
    \fi
    \collect@body\next@
}
\def\leftceq@#1#2{%
    \inalign@true \intertext@ \Let@ \chardef\dspbrk@context\z@
    \ifingather@\else\displ@y@\fi
    \let\math@cr@@@\math@cr@@@align
    \ifxxat@\else \let\tag\tag@in@align \fi
    \let\label\label@in@display
    #1% set st@r
    \ifst@rred\else \global\@eqnswtrue \fi
    \measure@{#2}%
    \global\row@\z@
    \tabskip\eqnshift@
    \halign\bgroup
        \span\leftceq@preamble\crcr
        #2%
}
\def\leftceq@preamble{%
   &\setboxz@h{\@lign$\m@th\displaystyle{{}##}$}%
    \ifmeasuring@\savefieldlength@\fi
    \set@field
    \hfil
    \tabskip\alignsep@
}

\makeatletter

\begin{document}

\begin{leftceq}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\[2ex]
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x \\[4ex]
\begin{cases} a & x \\ b & y \end{cases} \\
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{leftceq}

\end{document}

在此处输入图片描述

答案2

经过长时间的研究和一点一点收集信息,找到了解决方案。

关键是将 改为fleqngathered然后gather将其放入 中,\[ \]这样它就会居中。但不幸的是,直接用 替换\gather ... \endgather不起作用\gathered ... \endgathered,因为gathered似乎不支持 选项fleqn。幸运的是,我找到了这个 egreg 的回答指出了如何改变它开始工作的方式。

\documentclass{article}
\usepackage{mathtools, showframe}
\mathtoolsset{showonlyrefs=true}

\makeatletter
\renewenvironment{gathered}[1][c]{%
    \RIfM@\else
        \nonmatherr@{\begin{gathered}}%
    \fi
    \null\,%
    \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup
        \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
        \spread@equation
        \ialign\bgroup
            %%% In the original there is just \hfil
            \if@fleqn\else\hfil\fi\strut@$\m@th\displaystyle##$\hfil
            \crcr
}{%
  \endaligned
}


\newenvironment{leftceq}{
\[\bgroup%
\@fleqntrue%
\begin{gathered}%
}{%
\end{gathered}\hskip1.5pt%
\egroup\]%
}

\makeatother

\begin{document}

\verb|leftceq|
\begin{leftceq}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x} \\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{leftceq}

\verb|gather|
\begin{gather}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{gather}

\verb|gathered in mathmode|
\[
\begin{gathered}
y_1 = C_1e^{-4x}+C_2e^{-5x}+C_3xe^{-5x}\\
y_2 = C_1e^{6x}+C_2e^{-9x}\cos x+C_3e^{-9x}\sin x
\end{gathered}
\]

\end{document}

在此处输入图片描述

相关内容