排版模式匹配方程

排版模式匹配方程

我想为论文排版一个方程。在计算机科学领域,我们可以定义一个依赖于其参数之一形式的方程。我想用 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 的建议进行更改:

    1. \mathit{foreign}\mathit{time\_of\_call}并使\mathrm{head}公式看起来更好。
    2. \,后被删除\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

环境casesamsmath允许在左侧支撑:

在此处输入图片描述

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

现在您甚至可以更改括号或对齐方式。

相关内容