两个不同项目中的方程式之间共享对齐

两个不同项目中的方程式之间共享对齐

在以下最小示例中,我在一个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}

Ryan 的结果

你能看出来吗?“现在”和“然后”与“这里和那里”和“来来回回”不一致。我们能解决这个问题吗?:)

答案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: 为了能够处理一般情况,您可以对函数的每个元素分别使用上面显示的技术:

  1. 函数名称
  2. 案例价值
  3. 案例文本

然后,每个部分都会被放置在固定宽度的框中,并且所有内容都会精确排列,即使是更复杂的表达式:

在此处输入图片描述

下面,我有三个宏,它们将用于每个部分。我[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抱怨。如你所见,其他的都可以。

示例输出:

跨 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}} \\

相关内容