我知道如果您将其fleqn
作为一个选项传递,则所有amsmath
的环境都会变为左对齐,包括gather
,但是,与此同时,它们会变为左对齐。
实际上,我试图创建的是左对齐gather
环境,该环境相对于页面水平居中。这不是我所需要的,因为我想保留环境的默认行为,但我找到了一种暂时打开此选项的方法。问题是如何在不使用其他包的情况下将环境fleqn
居中?leftceq
etoolbox
有一个肮脏的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
经过长时间的研究和一点一点收集信息,找到了解决方案。
关键是将 改为fleqn
,gathered
然后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}