我想要一个方程式列表(最好使用 enumitem 的枚举环境),例如按等号对齐。有办法实现吗?
下面生成了未对齐的方程式列表:
\begin{enumerate} \item $a=b$ \item $c+d=e$ \end{enumerate}
我希望它们对齐
\begin{align*} a &= b \\ c+d &= e \end{align*}
但编号与 产生的标签间距相同
enumerate
。如果可能的话,我还想知道如何让它们尽可能地靠左(而不是由
align*
环境产生的居中)。在上面的例子中,这意味着第二个等式(即“c+d=e”)的排版将与使用时完全一致enumerate
,并且第一个等式将与其对齐。最后,尽管有些不谦虚,但我希望能够在内联样式和显示样式之间进行选择。
答案1
我建议使用提供的功能eqparbox
。具体来说,\eqparbox[<tag>][<align>]{<stuff>}
将设置<stuff>
在一个具有最大宽度的框中<tag>
,并附加一个<align>
ment 规范(l
eft、c
enter/default 或r
ight)。经过轻微修改以适应数学模式,\eqmathbox
下面定义的操作相同:
\documentclass{article}
\usepackage{amsmath,eqparbox}
% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
\IfValueTF{#1}
{\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}}
{\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}}
\mathpalette\eqmathbox@{#3}
}
\makeatother
\begin{document}
\begin{enumerate}
\item
$\eqmathbox[LHS][r]{a} = b$
\item
$\eqmathbox[LHS]{c + d} = e$
\end{enumerate}
\end{document}
背后的原理是在处理整个文档后eqparbox
存储文件中最大元素的宽度。然后在后续编译期间读取该宽度,将元素设置在适当大小(最大)的框内。由于它使用for 处理,因此每次更改 的最宽元素时都需要至少两次编译。.aux
.aux
.aux
<tag>
答案2
该解决方案(受到 TeXbook 附录 D 中的代码启发)首先使用 排版公式\halign
,然后解包\hbox
这样生成的 es,将每个\hbox
内容放在 之后\item
:
\def\itemize{\unskip\setbox0=\lastbox
\ifhbox0{\itemize}\item\unhbox0 \fi}
\begin{enumerate}
\vbox{\halign{\hfil$#$&${}#$\hfil\cr
a&=b\cr
c+d&=e\cr
}\itemize}
\end{enumerate}
这\vbox
是必需的,因为\lastbox
不能在主垂直列表上使用。
为了实现displaystyle,将\halign
第四行的模板替换为\hfil$\displaystyle#$&$\displaystyle{}#$\hfil