在以下最小示例中,我在一个itemize
环境中有两个方程,每个方程都有一个。每个方程都在其自己的环境 item
中定义。equation
\documentclass{article}
\usepackage{amstext}
\begin{document}
\begin{itemize}
\item Lorem ipsum dolor sit amet, consectetur adipiscing elit:
\begin{equation}
f(x) = \left\{
\begin{array}{l l}
1 & \text{ nisl justo, hendrerit} \\
0 & \text{ sagittis condimentum}\\
\end{array} \right.
\end{equation}
\item Duis magna nunc, ultrices at fringilla non, feugiat sed massa:
\begin{equation}
g(x) = \left\{
\begin{array}{l l}
-1 & \text{ fermentum fringilla mauris eget} \\
0 & \text{ gravida ipsum vitae}\\
\end{array} \right.
\end{equation}
\end{itemize}
\end{document}
然而,每个方程都有自己的排列,得出以下结果:
如果两个方程式能够以相同的方式对齐,那就太好了(我认为),就像这样:
这可能吗?
注意:如果该解决方案也可以应用于不同段落中的方程式,那就太好了。
更新:
瑞安提出了一个非常好的解决方案,目前是获得最多赞同的,但效果不太好:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
This is a list.
\begin{itemize}
\item First item.
\begin{align*}
f(x) &= \begin{cases} 0 & \text{now} \\ 1 & \text{then} \end{cases}
\intertext{\item Second item.}
g(x) &= \begin{cases} 0 & \text{here and there} \\ -1 & \text{to and fro} \end{cases}
\end{align*}
\end{itemize}
After the list.
\end{document}
你能看出来吗?“现在”和“然后”与“这里和那里”和“来来回回”不一致。我们能解决这个问题吗?:)
答案1
我经常遇到这种情况,下面的方法可以适用于几乎所有情况。与 Barbara 的解决方案类似,这涉及确定最大的文本是什么,并使用\makebox
将类型设置为等于最大字符串宽度的框。
如果还插入几个\phantoms
以获得精确对齐的情况。
\documentclass{article}
\usepackage{amstext}
\newcommand*{\LongestText}{fermentum fringilla mauris }%
\newlength{\LargestSize}%
\settowidth{\LargestSize}{\LongestText}%
\newcommand*{\MakeBox}[1]{\makebox[\LargestSize][l]{#1}}%
\newcommand*{\MakeBoxText}[1]{\text{\MakeBox{#1}}}%
\begin{document}
\begin{itemize}
\item Lorem ipsum dolor sit amet, consectetur adipiscing elit:
\begin{equation}
f(x) = \left\{
\begin{array}{l l}
1\phantom{-} & \MakeBoxText{ nisl justo, hendrerit} \\
0\phantom{-} & \MakeBoxText{ sagittis condimentum}
\end{array} \right.
\end{equation}
\item Duis magna nunc, ultrices at fringilla non, feugiat sed massa:
\begin{equation}
g(x) = \left\{
\begin{array}{l l}
-1 & \MakeBoxText{ fermentum fringilla mauris eget} \\
\phantom{-}0 & \MakeBoxText{ gravida ipsum vitae}
\end{array} \right.
\end{equation}
\end{itemize}
\end{document}
更新:2011-09-23: 为了能够处理一般情况,您可以对函数的每个元素分别使用上面显示的技术:
- 函数名称
- 案例价值
- 案例文本
然后,每个部分都会被放置在固定宽度的框中,并且所有内容都会精确排列,即使是更复杂的表达式:
下面,我有三个宏,它们将用于每个部分。我[r]
为函数名称选择了对齐方式,[l]
为案例值和案例文本选择了对齐方式。
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\LongestName}{\ensuremath{h(x)+g(x)}}% function name
\newcommand*{\LongestValue}{\ensuremath{-1}}% function value
\newcommand*{\LongestText}{fermentum fringilla mauris }%
\newlength{\LargestNameSize}%
\newlength{\LargestValueSize}%
\newlength{\LargestTextSize}%
\settowidth{\LargestNameSize}{\LongestName}%
\settowidth{\LargestValueSize}{\LongestValue}%
\settowidth{\LargestTextSize}{\LongestText}%
% Choose alignment of the various elements here: [r], [l] or [c]
\newcommand*{\MakeBoxName}[1]{{\makebox[\LargestNameSize][r]{\ensuremath{#1}}}}%
\newcommand*{\MakeBoxValue}[1]{\ensuremath{\makebox[\LargestValueSize][l]{\ensuremath{#1}}}}%
\newcommand*{\MakeBoxText}[1]{\makebox[\LargestTextSize][l]{#1}}%
\begin{document}
\begin{itemize}
\item Lorem ipsum dolor sit amet, consectetur adipiscing elit:
\begin{equation}
\MakeBoxName{f(x)} = \left\{
\begin{array}{l l}
\MakeBoxValue{1} & \MakeBoxText{ nisl justo, hendrerit} \\
\MakeBoxValue{0} & \MakeBoxText{ sagittis condimentum}
\end{array} \right.
\end{equation}
\item Duis magna nunc, ultrices at fringilla non, feugiat sed massa:
\begin{equation}
\MakeBoxName{g(x)} = \left\{
\begin{array}{l l}
\MakeBoxValue{-1} & \MakeBoxText{ fermentum fringilla mauris eget}\\
\MakeBoxValue{\phantom{-}0} & \MakeBoxText{ gravida ipsum vitae}
\end{array} \right.
\end{equation}
\item Duis magna nunc, ultrices at fringilla non, feugiat sed massa:
\begin{equation}
\MakeBoxName{h(x)+g(x)} = \left\{
\begin{array}{l l}
\MakeBoxValue{\sin x} & \MakeBoxText{ fermentum fringilla mauris eget} \\
\MakeBoxValue{0} & \MakeBoxText{ gravida ipsum vitae}
\end{array} \right.
\end{equation}
\end{itemize}
\end{document}
不确定您希望如何对齐函数值,但这就是我一直对齐它们的方式。您可以删除\phantom{-}
和并根据需要调整对齐方式。
答案2
这绝对是疯狂的,但它确实有效:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
This is a list.
\begin{itemize}
\item First item.
\begin{align*}
f(x) &= \begin{cases} 0 & \text{now} \\ 1 & \text{then} \end{cases}
\intertext{\item Second item.}
g(x) &= \begin{cases} 0 & \text{here and there} \\ 1 & \text{to and fro} \end{cases}
\end{align*}
\end{itemize}
After the list.
\end{document}
amsmath
对齐环境允许在\intertext
不退出的情况下插入非对齐的非数学文本。插入后对齐会保留,这正是您想要的。
警告:第一个\item
必须不是是\intertext
,否则就会\itemize
抱怨。如你所见,其他的都可以。
示例输出:
答案3
让我提交第二个答案,它也解决了跨段落对齐的问题。这同样很疯狂...
\documentclass{article}
% \usepackage{showframe}
\usepackage{amsmath}
% It's like {align}, but simple!
\newenvironment{SimpleAlign}
{%
\let\\=\cr
\tabskip 0pt plus 1fil\relax
\halign\bgroup
&\hfil$\displaystyle ##$\tabskip 0pt\relax
&$\displaystyle {}##$\hfil\tabskip 0pt plus 1fil\relax\cr
}
{%
\crcr\egroup
}
% Saves its contents typeset like SimpleAlign. You can give it a name.
\newenvironment{AlignAgain}[1][AlignBox]
{%
\expandafter\let\expandafter\AlignAgainBox\csname #1\endcsname
\setbox\AlignAgainBox=\vbox\bgroup\SimpleAlign
}
{%
\endSimpleAlign\egroup
\ReBox\AlignAgainBox
}
\newbox\AlignBox
% Prints the lines from {AlignAgain} one-by-one, with or without equation numbers as starred. If you named the {AlignAgain}, use it here.
\makeatletter
\newcommand\ALineAgain{%
\@ifstar
{\AlignAgainStartrue\@ALineAgain}
{\AlignAgainStarfalse\@ALineAgain}%
}
\newcommand\@ALineAgain[1][AlignBox]{%
\expandafter\let\expandafter\AlignAgainBox\csname #1\endcsname
\begin{equation*}
\PutFirstBox\ifAlignAgainStar\AlignAgainBox
\end{equation*}
}
\makeatother
\newif\ifAlignAgainStar
% Reboxes a box in the format: {[1][2]...[n]} -> {[1]{[2]{...}[n]}}
% {...} = \hbox
\newcommand{\ReBox}[1]
{%
% To enter internal vertical mode, where \lastbox is valid
\setbox0=\vbox{%
\unvbox#1\relax
\global\setbox#1=\hbox{\hbox{}}
\loop
\unskip
%\box0 is the box currently at the end of #1
\setbox0=\lastbox
\ifvoid0\relax
\else
\global\setbox#1=\hbox{\box0\box#1}%
\repeat
}%
}
% Puts the first box in a nested-box list into the display, saving the rest back in #1
% Optionally places an equation number
\newcommand{\PutFirstBox}[2]{%
\hbox to \displaywidth{%
\unhbox#2\relax
\global\setbox#2=\lastbox
\setbox0=\lastbox
\unhbox0%
#1\else\refstepcounter{equation}\llap{(\theequation)}\fi
}%
}
\begin{document}
\begin{AlignAgain}
a &= b & c &= d \\
f(x) &= g(x) & h(x) &= e^{-1/x^2}
\end{AlignAgain}
This is a paragraph with a lot of redundant words whose only purpose is to extend it onto a new line or two so it's dramatic when I display this equation:
\ALineAgain*
and then follow it with a bunch more text.
And also a new paragraph, just for good measure. I wonder if the two equations will line up? I sure hope so!
\ALineAgain
This is sort of fun.
\end{document}
我的第一个想法是将结果拆分开{align}
,然后将这些行逐行分配到您想要的任何位置。唉,这{align}
会产生一个相当复杂的列表,不值得花精力去解开它(如果可能的话)。
因此我创建了自己的对齐环境,据我所知,它能{align*}
完成您想要的功能,但会生成一个非常简单的列表。然后我的宏\ALineAgain
会将该列表拆分开,并按照您的要求逐行删除。
因为实际给出对齐的位置不会打印行,所以使用 是没有意义的{AlignAgain*}
;它从不打印方程编号。相反,该\ALineAgain
宏采用星号来抑制方程编号的添加。
答案4
这绝对是一个临时解决方案,它需要知道哪一位是最长的,但它应该可以完成工作。对于最短情况下的第一位文本,不要只输入要打印的文本,而是使用幻像来强制宽度并定位\rlap
打印文本:
1 & \text{\rlap{ nisl justo, hendrerit}\phantom{ fermentum fringilla mauris eget}} \\