对齐普通的“align”和“case”?

对齐普通的“align”和“case”?

cases环境非常适合枚举大左括号内的案例。我希望能够将其与环境结合起来align,以便等号和条件也能对齐:

\item \begin{align*}
T_{in\ general}\left(n\right)&=aT\left(\frac{n}{b}\right) + n^{c},\   &a\geq1, b\geq1, c>0
 \end{align*}

\[T_{cases}\left(n\right)= 
   \begin{cases}
   \Theta\left(n^{\log_{b}a}\right) &a>b^{c}\\
   \Theta\left(n^{c}\log_{b}n\right) &a=b^{c}\\
   \Theta\left(n^{c}\right) &a<b^{c}
   \end{cases}\]

单独的aligncase环境不共享对齐:

在此处输入图片描述

有没有一种合理简单的方法可以让(比如说)这两个等式最左边的等号对齐,并将条件(“a…”)与它们分开?

答案1

cases当通过定义自己的“环境”时,对齐两个方程以及它们的变量域是相当基本的array

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\begin{document}
\begin{align*}
  T_{\text{in general}}\left(n\right) &= aT\left(\frac{n}{b}\right) + n^{c}, && a\geq 1, b\geq 1, c>0 \\
  & && a>b^{c} \\
  T_{\text{cases}}\left(n\right) &= 
    \smash{\left\{\begin{array}{@{}l@{}}
      \Theta\left(n^{\log_{b}a}\right) \\[\jot]
      \Theta\left(n^{c}\log_{b}n\right) \\[\jot]
      \Theta\left(n^{c}\right)
    \end{array}\right.} && a=b^{c} \\
  & && a<b^{c}
\end{align*}
​\end{document}​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

进行了一些小的对齐调整(例如使用额外的&对齐说明符),以及\smashcases环境”并添加[\jot]行跳过。\smash从它的参数中删除了任何垂直高度,而是由 LaTeX 提供的\jot特定跳过。3pt

从排版角度来看,请注意下标中的使用\text{...}。此宏由amsmath并允许以常规方式排版文本,同时仍根据位置调整字体的相对大小。

答案2

通过谨慎使用\phantom命令系列,您还可以获得方程式内部和外部的正确对齐cases(即等式的第二部分):

在此处输入图片描述

这是我经常使用的通用解决方案,并且适用于不同的环境。我们为方程式的各个部分固定大小,并使用\makebox该文本设置指定的固定宽度。您可以按如下方式指定此固定宽度:

\newcommand{\FixedSize}[1]{\makebox[1.5in][l]{\ensuremath{#1}}}%

这样,您可以轻松调整此宽度以获得所需的方程式适当部分的显示。

更好的解决方案是使用以下方法自动计算所需宽度calc包的 \widthof命令。为此,我们选择需要容纳的最宽部分,然后计算其宽度。您可以在一行中完成所有操作,但为了便于阅读,我\WidestPart单独定义了它,并使用它来计算宽度。

在这个特定情况下,一个轻微的复杂因素是 的左括号cases。为了调整它,我定义了\PhantomBrace,它会产生一个水平空间,相当于三行情况下使用的括号的宽度,并将其包括在第一个方程的调整中。

我添加了一个\quad来分隔这两个部分,但这里可以使用任何值。

\documentclass{article}
\usepackage{calc}
\usepackage{amsmath}

\newcommand{\WidestPart}{\ensuremath{aT\left(\frac{n}{b}\right) + n^{c},}}%
\newcommand{\FixedSize}[1]{\makebox[\widthof{\WidestPart}][l]{\ensuremath{#1}}}%
\newcommand{\PhantomBrace}{\hphantom{\left\{\vphantom{\begin{cases}\\\\\end{cases}}\right.}}%

\begin{document}
\begin{align*}
T_{in\ general}\left(n\right)&=\FixedSize{aT\left(\frac{n}{b}\right) + n^{c},}\PhantomBrace\qquad a\geq1, b\geq1, c>0\\
T_{cases}\left(n\right) &= 
   \begin{cases}
   \FixedSize{\Theta\left(n^{\log_{b}a}\right)}  \qquad a>b^{c}\\
   \FixedSize{\Theta\left(n^{c}\log_{b}n\right)} \qquad a=b^{c}\\
   \FixedSize{\Theta\left(n^{c}\right)}          \qquad a<b^{c}
   \end{cases}
 \end{align*}
\end{document}

答案3

您可以将两个方程式合并到一个align环境中,即将其嵌套在环境cases内部align

\begin{align*}
T_{in\ general}\left(n\right)&=aT\left(\frac{n}{b}\right) + n^{c},\ &a\geq1, b\geq1, c>0\\
T_{cases}\left(n\right)&= 
\begin{cases}
\Theta\left(n^{\log_{b}a}\right) &a>b^{c}\\
\Theta\left(n^{c}\log_{b}n\right) &a=b^{c}\\
\Theta\left(n^{c}\right) &a<b^{c}
\end{cases}
\end{align*}

结果是:

在此处输入图片描述

编辑:&如果您将之前第一个方程中的 删除a\geq1, b\geq1, c>0\\,并将其替换为 ,则\hspace{0.4cm}应该会得到所需的结果,即条件也正确排列。如果您有不同的方程,显然您必须修改水平空间的数量。

我猜你需要这种解决方法的原因是case当你返回到适当的环境时,环境内的 & 符号会超出范围align,并且不会与后者包含的 & 符号交互。

答案4

如果您不想使用手动调整(以纯文本形式):

\def\mathcolstyle{\mathsurround0pt\mathstrut\displaystyle}% re-usable style def.
\def\quadcol#1{$\vcenter{\openup-1\jot\halign{% negate the \jot from \mymathalign
  \quad$\mathcolstyle{}##\hfil$\crcr#1\crcr}}$}
\def\mymathalign#1{\vcenter{\openup1\jot\halign{$\hfil\mathcolstyle{}##$&
  $\mathcolstyle{}{}##\hfil$&
  ##\crcr#1\crcr}}}
$$
  \mymathalign{
    % first row:
    T_{\rm in~general}(n) & % first column
      = aT\Big({n\over b}\Big)+n^c, & % second column
      \quadcol{ a\geq 1, b\geq 1, c > 0 } % third column
    \cr
    % second row:
    T_{\rm cases}(n) & % first column
      = \cases{ % second column
        \Theta(n^{\log_b a}) \cr
        \Theta(n^c \log_b n) \cr
        \Theta(n^c) \cr
      } &
      \quadcol{ % third column
        a > b^c \cr
        a = b^c \cr
        a < b^c \cr
      }
    \cr
    % third row just to show the column boundaries:
    \omit\llap{\smash{\vrule height 15ex}}&
      \omit\llap{\smash{\vrule height 15ex}}&
      \omit\llap{\smash{\vrule height 15ex}}\cr
  }
$$
\bye

好像:
在此处输入图片描述

基本上,第二列\cases必须设置在其外部,另一个\halign(或其他构造)内部,才能使它们排列整齐。

相关内容