该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}\]
单独的align
和case
环境不共享对齐:
有没有一种合理简单的方法可以让(比如说)这两个等式最左边的等号对齐,并将条件(“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}
进行了一些小的对齐调整(例如使用额外的&
对齐说明符),以及\smash
“cases
环境”并添加[\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
(或其他构造)内部,才能使它们排列整齐。