我想为论文排版一个方程。在计算机科学领域,我们可以定义一个依赖于其参数之一形式的方程。我想用 LaTeX & 排版这个方程amsmath
。
我可能会在程序中按如下方式编写它,我使用一个熟悉的例子:
fib 0 = 1
fib 1 = 1
fib X = (fib (X - 1)) + (fib (X - 2))
可以将其排版为如下形式:
fib X = { 1 if X < 2
{ (fib (X - 1)) + (fib (X - 2)) otherwise
我知道如何使用 amsmath 的 align 和 case 环境来实现这一点。但我更希望模式匹配或保护出现在等式的左侧,就像它们在上面的程序中一样。有人能告诉我该怎么做吗?
这是我目前使用 \begin{array}{llcl} 得到的,但间距看起来不正确。这是我尝试排版的实际方程式,fibs 只是一个熟悉的例子。
$$
\begin{array}{llcl}
\operatorname{prodtime}\,V & X = Y &=& 0 \\
\operatorname{prodtime}\,V & X = f(\ldots) &=& 0 \\
\operatorname{prodtime}\,V & p(X_1,\,\ldots,\,X_n) &=&
\operatorname{prodtime}\,V\,(\operatorname{body}\,p) \\
\operatorname{prodtime}\,V & V = \,f(X_1,\,\ldots,\,X_n) &=&
\operatorname{prodtime}\,V\,(\operatorname{body}\,f) \\
\operatorname{prodtime}\,V & X_0(X_1,\,\ldots,\,X_n) &=& time\_of\_call \\
\operatorname{prodtime}\,V & m(X_1,\,\ldots,\,X_n) &=& time\_of\_call \\
\operatorname{prodtime}\,V & foreign(\ldots) &=& 0 \\
\operatorname{prodtime}\,V & G_{head},\,G_{tail}
\end{array}
$$
答案1
如果没有确切地知道您想要的排版方式的图像,就很难确定,但也许其中之一就是您正在寻找的:
也许:
\documentclass{book}
\usepackage{amsmath}
\newcommand{\fib}{\mathrm{fib}}
\begin{document}
\begin{align*}
&\text{if } x < 2 & \fib X &= 1 \\
&\text{otherwise } & \fib X &= (\fib (X - 1)) + (\fib (X - 2))
\end{align*}
Another option is:
\begin{align*}
\fib X = \begin{cases}
\text{if } x < 2 & = 1 \\
\text{otherwise } & = (\fib (X - 1)) + (\fib (X - 2))
\end{cases}
\end{align*}
\end{document}
您可以通过以下方式修改给定的 MWE 以获得更好的间距:
笔记:
@{}
用于消除列间距- 我
{}
在之前添加了=
以获得适当的数学间距。 - 我将 替换
$$ ... $$
为\[ ... \]
。请参阅为什么 \[ ... \] 比 $$ ... $$ 更可取?更多细节。 根据 egreg 的建议进行更改:
\mathit{foreign}
,\mathit{time\_of\_call}
并使\mathrm{head}
公式看起来更好。\,
后被删除\prodtime
,以及的其他用途\operatorname
。
代码:
\documentclass{article}
\usepackage{amsmath}
\newcommand{\prodtime}{\operatorname{prodtime}}
\begin{document}
\[
\begin{array}{l l @{}l}
\prodtime V & X = Y &{}= 0 \\
\prodtime V & X = f(\ldots) &{}= 0 \\
\prodtime V & p(X_1,\,\ldots,\,X_n) &{}= \prodtime V\,(\operatorname{body} p) \\
\prodtime V & V = \,f(X_1,\,\ldots,\,X_n) &{}= \prodtime V\,(\operatorname{body} f) \\
\prodtime V & X_0(X_1,\,\ldots,\,X_n) &{}= \mathit{time\_of\_call} \\
\prodtime V & m(X_1,\,\ldots,\,X_n) &{}= \mathit{time\_of\_call} \\
\prodtime V & \mathit{foreign}(\ldots) &{}= 0 \\
\prodtime V & G_\mathrm{head},\,G_\mathrm{tail}
\end{array}
\]
\end{document}
答案2
环境cases
amsmath
允许在左侧支撑:
\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\newcommand{\fib}{\mathrm{fib}}
\begin{document}
\begin{gather*}
\fib\,X = \begin{cases}
1 & \text{if } X<2 \\
\fib(X-1)+\fib(X-2) & \text{otherwise}
\end{cases}
\end{gather*}
\end{document}
的内容与 的内容cases
非常相似array
。事实上,如果您想要更好地控制元素放置,以下代码会产生等效的输出:
\begin{gather*}
\fib\,X = \left\{\begin{array}{@{}l@{\quad}l}
1 & \text{if } X<2 \\[\jot]
\fib(X-1)+\fib(X-2) & \text{otherwise}
\end{array}\right.
\end{gather*}
现在您甚至可以更改括号或对齐方式。