LaTeX 公式语法速成

LaTeX 公式语法速成

说明:本页面从原来的「学研部排版路线中摘出」,主要针对在 Markdown 中使用 LaTeX 公式的需求。

原则上,针对学辅的资料编写工作而言,Markdown 所提供的「有限」功能已经绰绰有余,足以让我们编写出高质量、有内涵的作品。然而,有一项功能,Markdown 自身并不支持——数学公式与符号的编排、显示。

在 Markdown 中,数学公式必须引入外部的插件来实现。一般,我们采用 LaTeX 公式语法 来撰写公式的内容,而利用 MathJax 引擎将公式代码转换为真正的符号与式子。

LaTeX(正规的排版方式应该为 )是一种文档排版代码/引擎,负责一整个文档的内容与排版。详细内容,可以参考学辅技术讲座中的相关内容。这里仅涉及其中的公式功能,原因是:LaTeX 的整个系统以难学、难用著称,但 LaTeX 公式系统却被广泛使用,几乎成为各种文档环境中公式排版的第一或唯一方式。

换句话说:LaTeX 难学,没有需求时可先搁置一旁;但 LaTeX 的公式,却值得现在就花一点时间「速成」。

1 命令与环境

在编排公式时,先应几个来自于 LaTeX 的基本概念:

  1. 命令:有如一般编程语言中的「函数」,以反斜杠 \ 开头,后接一串字母;整个命令直到一个非字母的字符截止。许多命令后往往还需要附带参数,它们通常会用一对花括号 {} 包围。
  2. 环境:有如一般编程语言中的「函数体」或「语句体」,通常由一对命令 \begin{xxx}\end{xxx} 包围起来,其中 xxx 就是这个环境的名称。除此之外,一些特殊的字符也应被视为环境的定界符,例如由一对美元号 $...$ 括起来的内容也是一个环境。
  3. 字符:LaTeX 对于不同的字符有非常详尽的处理方法,在公式的代码中一般有这样几类字符:
    • 特殊字符:如命令开头的反斜杠 \、标识环境的 $,以及 _^& 等。它们有特殊的功能,不会以它们本身的样子显示在最终的公式中。
    • 定界符:主要是花括号 {} 和环境命令 \begin{xxx}...\end{xxx},它们决定了不同命令生效的范围,同样不会以本身的样子显示在最终的公式中。
    • 空白字符(如空格与换行):在 LaTeX 公式中,一般字符间的空白字符不会显示在最终的公式中。
    • 一般字符:除了以上几类之外的其他字符,它们会原样显示在公式中(样式、位置、尺寸等则会有差异)。

例如,我们来看下面的一段 LaTeX 公式代码:

$ I(x) = \int_a^b f(x) \mathrm{d} x $

其最终将生成公式 。依照上面所提的几条基本概念,我们对这一串看似复杂的代码进行拆解:

  • 代码中共出现了两个反斜杠 \,因此其中共计两个命令,分别是 \int\mathrm,后者还紧跟着一个用花括号包围的参数 d。其实,\int 是积分(integral)号命令,能够生成一个积分号();\mathrm 则是数学正体(mathematical roman style)命令,将其后的字符 从公式默认的斜体(italic style)改为正体()。
  • 整个公式为一对美元号所包围,说明其被正常地包裹在「数学环境」之中。否则,代码将不会被渲染为公式。
  • 除开确定环境的 $ 符号,公式中还出现了两个特殊字符 _^,它们分别表示「下标」与上标,并附属于之前的积分号命令 \int_ 号紧跟的字符 a 成为了积分号的下标(下限),而 ^ 号紧跟的字符 b 成为了积分号的上标(上限)。另外,如果你希望生成 这样上标与下标不止一个字符的公式,则应在 _^ 后将参数用花括号包起来:\int_{12}^{24}
  • 除开以上分析的特殊字符,其余的字符都将原样展示在公式中——正如我们所看到的那样。代码中的空格被忽略掉,渲染引擎会帮我们留出合适的间隙——在一般情况下。

2 常用命令与环境

LaTeX 公式排版的难点有二:

  1. 如何确定用哪一类命令、环境排版公式;
  2. 这些命令和环境怎么写(具体的名称、参数表等比较难记)。

这些问题会难住一些初学者,但读者应记住:只要花一段时间熟悉常见的命令与环境,并努力锻练打字能力,公式的排版将变得异常轻松。下面简单介绍一些最常用的命令、环境,之后会提供一些可供查阅的完整表格。

2.1 符号命令分类

公式中所需要的命令,无非两种:特殊数学符号(占绝大多数,如之前的 \int)、个别的样式调整(像之前的 \mathrm 一样)。前者又可进一步举例细分为如下几类:

  • 希腊字母:出现频率很高。你只需要记得这些希腊字母的英文拼法就行,例如 \alpha 将显示为 ,而 \Gamma 将生成 。你可以在百度百科的对应页面中查找不同希腊字母的「字母名称」,这就是紧跟在 \ 后的命令名。(一些情景下已经支持直接输入 Unicode 希腊字符,例如在这个页面上的 $α$ 代码可直接生成 。)

  • 加减乘除:如果你的键盘上有,你可以直接打出;注意我们常用的乘号 应该用命令 \times,而除号 用命令 \div(divide)敲出(这两个符号在大学中是不常用的)。

  • 点号:一般可用垂直居中的 \cdot,center dot)表示。如果需要将它们连成三个表示省略,则可以用 \cdots) 与 \ldots,lower dots),后者靠在下方。垂直三点 \vdots(vertical dots),对角线排列的三点 \ddots(diagonal dots)。

  • 比较符号:等号、大于号、小于号可直接打出,大于等于(greater or equivalent)可用 \geq)或 \geqslant,slant 表示一横的倾斜)两种风格,小于等于(less or equivalent)号类似:\leq\leqslant。不等于号为 \neq)。近似可用 \sim,similar)或 \approx,approximate)等符号表示。

  • 集合关系:常用的有被包含 \subset,subset 表「子集」)与包含 \supset,super set 表「超集」)、真子集 \nsubseteq,not equivalent subset),属于 \in)和不属于 \notin)、并 \cup,cup 表「杯子」形容了此符号的形状)、交 \cap,cap 表「帽子」,与前者恰好方向相反)。

  • 「大符号」:往往指那些纵向尺度较大、常有上下标的符号,包括积分号 \int)、求和号 \sum)、连乘号 \prod,production)、集族并集号 \bigcup,与 \cup 的区别是它较大且可以有上下标)、集族交集号 \bigcap)等。

  • 定界符:通俗来说就是各种「括号」。圆括号、方括号可以直接用对应键打出。花括号 {} 被用于包藏参数、确定命令的作用范围,因此其不会显示在公式之中;如果要将其打出,则应使用 \{\},这里的反斜杠起到了「转义」的作用(像在很多编程语言中一样)。其他可用的还有:绝对值界 | 可直接打出;范数界 \|,其效果好于直接打两条竖线 ||);尖括号 \langle\rangle,left angle 与 right angle)、上取整 \lceil\rceil,ceil 即「天花板」)、下取整 \lfloor\rfloor,floor 即「地板」)。

  • 算子:一般是用若干字母排列而成的函数名称,例如三角函数(\sin\cos\tan)、指数对数函数(\exp\log\ln)、最大值 \max 与最小值 \min、极限 \lim 等等。它们的共同特点是:命令中的字符,会以数学正体的形式显示出来,如 \sin 将显示为 。它们都支持上下标。

  • 带参命令:即必须指定参数的命令,最常用的包括:

    • 分数(fraction)命令 \frac{a+b}{c+d} 生成 ,其中第一个参数为分子,第二个参数为分母。
    • 组合数(binominal number,二项式系数)命令 \binom{a+b}{c+d} 生成 ,结构与分数类似。
    • 根式(square root,平方根——但此命令不限于平方根)命令:\sqrt[n]{x} 生成 ,第一个用方括号包围的是次数(可以省略,此时表示平方根),第二个参数为被开根的内容。

几乎所有的符号命令,都可以归入以上的几个类别之中。读者如果能熟记以上所提到的这些符号,则可以在不查表的情况下应付 90% 的符号了。至于像无穷大号 \infty,infinity)等这种常用而不能归类的孤例,读者除了记住之外,也可以时常查阅以下给出的一些「符号表」

这类表格大多数情况下没有用,少数情况下你要用——但找不到想要的符号。所以,百度、Google 等搜索引擎无疑是最大赢家、幕后黑手。

  • The Comprehensive LaTeX Symbol List:包含了整个 LaTeX 系统中的特殊符号,数学符号仅为其一子集;所有需要的符号一定在这里,但你需要事先翻阅,弄清其复杂的结构.
  • LaTeX Mathematical Symbols:仅涉及常用的符号,基本够用。内容丰富。
  • Codecogs 公式编辑器:一个在线编辑器,提供若干按钮,便于你通过图形化的页面找到所需的符号。境外网站,加载速度可能较慢。

2.2 样式调整命令

另一类命令是样式调整命令。

字体样式调整命令. 使用这些命令时,必须用花括号将待调整的内容包围——哪怕只有一个字符。

  • \mathrm 可能是最常用的一个,因为我们经常需要在默认为斜体的公式中插入正体字符(对单位、下标、自定义算子等)。不过,更推荐使用的是 \text;这个命令的机制并非单纯调整样式,但可以视为与 \mathrm 等价的命令,且比其更好用。

  • 要打出表示数集的 等镂空粗体(blackboard bold)字符,应使用 \mathbb 命令。

  • 一般的粗体(bold font shape),可以用 \mathbf 命令打出,只不过该命令对字母和数字以外的字符无效。如有需要,可以尝试 \boldsymbol\bm 等命令。

  • 其他的特殊字体还有花体(calligraphical) \mathcal 与文本体(script) \mathscr 等,它们都在数学中常用,表示较高级别的范畴(如集族、映射族等等)。

以上这些命令,不一定在所有情况下都能使用。在 LaTeX 中,这涉及到宏包的问题;在其他场合下,则取决于所用的渲染工具是否支持相应的命令。

定界符调整命令. 定界符的大小一般是固定的,这时我们可能会碰到这样的情况:输入代码

$ f(x) = ( \frac{a^x}{b} ) $

将得到

很显然这里的括号太小了。为此,我们可以用一些命令来调整定界符的大小。精细的做法是采用不同等级的调整命令,例如

$ f(x) = \Bigl( \frac{a^x}{b} \Bigr) $

这里用一对命令 \Bigl\Bigr 吸附在左右括号之前,调整了其大小。就像下面这样,令人满意。

这样的命令有很多,依次排成一个级别序列:\big\biggBig\Bigg 等。如果你对此不感兴趣,则可以在各种情况下都使用自动调整的 \left\right 命令:

$ f(x) = \left( \frac{a^x}{b} \right) $

这一对通用命令可以在大部分情况下解决你的问题,但有时会产生偏差。

2.3 数学环境

所有命令都必须在数学环境之中才能被渲染为公式。一般而言,有两大类环境:

  1. 行内环境(inline):顾名思义,指那些出现在文本行内的短小公式或符号。例如这里的公式 便由行内数学环境所容纳。
  2. 行间环境(block 或 displayed):较大的公式,从段落中分离出来独占一行,居中显示。例如以下的

(你可以比较这个公式跟第一个例子的显示效果有何差别。)

行内环境与行间环境的使用,取决于具体需要。下面给出了一些行内与行间环境的例子;此处不再絮叨这些环境的具体用法,但给出相应的链接供读者查看。

环境特性 命令或定界符 参考或备注
行内环境 $...$\(...\) 最简单的一种
行间环境,不标号 $$ ... $$\[\] 不能换行
行间环境,标号 \begin{equation} ... \end{equation} 不能换行
行间可换行,标号,不对齐 \begin{gather} ... \end{gather} 此博文的「8.8.2. 公式组」
行间可换行,标号,对齐 \begin{align} ... \end{align} 此博文的「8.8.2. 公式组」
行间内嵌对齐环境 \begin{aligned} ... \end{aligned} 必须嵌在已有的行间环境内;参考此博文的「8.8.1.2. 对齐」
行间内嵌条件环境(左侧自带一花括号) \begin{cases} ... \end{cases} 必须嵌在已有的行间环境内;参考此博文的「8.8.3. 分段函数」

一般的,在某一数学环境中,如果可能的话,& 将表示「从此处开始与上下对齐」,而 \\ 将表示「在此处换行」。

以上这些公式环境,都是针对在 LaTeX 系统之外使用 LaTeX 公式而言的。部分引擎可能不支持以上的一些写法,或要求所有环境都要包在某一类定界符(如一对 $)下,请读者留意。

2.4 矩阵

矩阵是一类特殊的内嵌数学环境。通用的写法是

\begin{matrix}
a & b & c\\
d & e & f
\end{matrix}

注意这里的 matrix 环境要放在一个行间环境中。以上命令将生成

通常当我们使用矩阵时,都需要指定一个定界符。固然,我们可以用 matrix 环境外加两侧的自动定界符 \left\right 等实现,但这过于繁琐。简要的方法是使用一些预定义、自带定界符的环境,包括:

  • 自带圆括号 pmatrix 环境;
  • 自带方括号 bmatrix 环境;
  • 自带花括号 Bmatrix 环境;
  • 自带绝对值界的 vmatrix 环境与自带范数界的 Vmatrix

只需要将上面的 matrix 替换即可。此外,若要在行间打印小矩阵(如 ,则可使用 smallmatrix 环境(定界符必须自己添加)。

2.5 上下标

上下标是除开特殊符号外最常用的一类操作,无处不在。在第一个公式样例中,我们已经说明:

  • _ 符号后紧跟一个字符(或用一对 {} 包起来的若干内容),将为其之前的命令或符号添加对应下标;
  • ^ 与之机制类似,不过生成的是上标。

一般而言,这样两类对象会经常用到下标:

  • 单个字符()、定界符 – 包括矩阵的定界符();

  • 「大符号」()、算子()。

这里分为两类的依据是:前者的上下标通常在主体符号的斜上方、斜下方,而后者的上下标通常在主体的正上方、正下方(「大符号」中的积分号除外,大多数人倾向于用侧旁的上下标)。这些符号在配置上下标时,通常会有一个默认设置,该设置与符号本身、所处环境类别(行内或行间)都有关,例如默认的行间求和号用的却是斜侧上下标:,并不雅观。

你可以在主体符号后紧跟一个 \limits 命令(不要放在别的位置),使上下标切换至正上方、正下方;反之,紧跟一个 \nolimits 命令,将使它们切换至侧旁位置。

\limits 可以理解为:按照极限号通常的写法()来组织上下标。

3 用「拆解法」处理公式

在掌握各种公式、环境之后,编写公式就已经是小 case 了,几乎不需要再做练习。以下提供一种名为「拆解法」的思路,供读者参考;它代表了排版一个公式时的一般思路,可以无障碍的复制到其他情形之下。

例如,考虑以下一个公式,它来自于对流体力学中 Navier-Stokes 基本方程的研究:

让我们依次来拆解这个公式,确定其代码。

  1. 环境:易见这是一个行间公式,并且有一个对齐的换行(对齐了二重积分号 \iint)。所以应该采用这样的环境包围公式:
     $$ \begin{aligned}
     & \\
     &
     \end{aligned} $$
    

    即行间公式嵌入对齐子环境。

  2. 层级结构:细数第一行(第二行类似)的定界符,发现最多只有两层:一组花括号包裹一组圆括号,并伴有一些求和号。由于定界符内有分数结构 \partial,故需用 \left\right 命令调整定界符大小。在花括号外,左侧有一个双重积分号 \iint,右侧有两个微元 \mathrm{d}x\mathrm{d}t。那么,可以初步写出两公式的层级结构:
     $$ \begin{aligned}
       & \iint \left\{ - \sum \frac{}{} - \sum \left( \frac{}{} \right) \right\} \mathrm{d}x \mathrm{d}t \\
     = & \iint \left\{ \sum \left( \frac{}{} \right) +\left( \sum \frac{}{} \right) \right\} \mathrm{d}x \mathrm{d}t
     \end{aligned} $$
    
  3. 填入符号:除开定界符、「大符号」之外,还有一些必要的普通符号。依次填入,并同时补上所有的上下标——在 LaTeX 中,上下标「顺水推舟」地附属于之前的符号,不需要专门规划其结构。
     $$ \begin{aligned}
       & \iint_{ \mathbb{R} \times (0, +\infty) } \left\{ - \sum_{i=1}^3 u_i \frac{\partial \theta_i}{\partial t} - \sum_{i,j=1}^3 u_i u_j\left( \frac{\partial \theta_i}{\partial x_j} \right) \right\} \mathrm{d}x \mathrm{d}t \\
     = & \iint_{ \mathbb{R} \times (0, +\infty) } \left\{ \nu \sum_{i,j=1}^3 \left( \frac{\partial^2}{\partial x_j^2} \theta_i \right) u_i +\left( \sum_{i=1}^3 \frac{\partial \theta_i}{\partial x_i} p \right) \right\} \mathrm{d}x \mathrm{d}t
     \end{aligned} $$
    

    由此即完成了公式的编写。这里的各个符号命令(如偏微分算子 \partial、各个希腊字母、二重积分号 \iint),都属于最常用的命令,读者应该在浏览过几次命令表格后将它们熟记。

以上这种分层拆解的方法,有利于初学者快速弄清一个复杂公式的代码结构,以尽可能少的错误、重复工作来完成公式的编写。待读者技术熟练之后,则不需要再这样从外至内的分层编写,而可以用一种「大江东去浪涛尽」的宏伟气势从头写到尾,中间基本上不会碰到什么问题——除了括号未配对、拼写错误、少打个别字符等。

在编写技术相对熟练之后,一种提高效率的手段是:压缩空格与大括号的数量(如上面一段代码中的空格大多可以去掉)。具体细节在此不详述,读者可以自行尝试——当然,提高效率的同时,会影响之后对公式代码的复查。

4 MathJax 引擎的使用

在 LaTeX 系统之外的地方(例如本页面上),如何渲染 LaTeX 公式代码呢?在种种其他的应用场景之中,网页(包括 Markdown 文档)是最为重要的一个,因此网页端的 LaTeX 渲染最值得我们关注。

早先,仿照着已经大获成功的 HTML、XML 等文档格式标准,万维网联盟(W3C)指定了「数学标记语言」MathML。其「条理清晰、逻辑严密」,只可惜格式过于复杂,难以自行撰写。例如,对于二次方程的求根公式:

我们知道 LaTeX 代码中只需一小段代码就能解决,而 MathML 却需要这样实现:

<math mode="display" xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo form="prefix">&#x2212;<!-- − --></mo>
        <mi>b</mi>
        <mo>&#x00B1;<!-- &PlusMinus; --></mo>
        <msqrt>
          <msup>
            <mi>b</mi>
            <mn>2</mn>
          </msup>
          <mo>&#x2212;<!-- − --></mo>
          <mn>4</mn>
          <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
          <mi>a</mi>
          <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
          <mi>c</mi>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
  <annotation encoding="TeX">
     x=\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
  </annotation>
  <annotation encoding="StarMath 5.0">
     x={-b plusminus sqrt {b^2 - 4 ac}} over {2 a}
  </annotation>
</math>

换句话说:这种格式是给机器看的,不是给人看、给人用的。它实现了很多额外功能,例如加入了 (La)TeX、StarMath 等公式系统中的对应代码,但我们对此并不感兴趣。

鉴于 W3C 对于 XML 格式的这种执念,许多替代方案衍生出来,目前最通行的便是由美国数学学会(AMS,早先他们也曾对 LaTeX 的公式系统做出过巨大贡献)维护的 MathJax 引擎。与标记语言 MathML 不同,MathJax 并不打算重新设计公式的编码,而是直接将页面上的 LaTeX 公式代码渲染成可以显示在网页上的公式对象

在网页上引入 MathJax 的脚本、配置之后,其将自动执行「翻译」LaTeX 代码的功能,无需再多操心。目前,大多数 Markdown 编译器都采用 MathJax 引擎渲染公式。

总之,对于读者而言,只需记住:在支持 MathJax 的系统下,可以像在 LaTeX 系统中一样输入公式,没有太大差别。

在个别情况下,MathJax 可能只能识别特定类型的数学环境。例如,本网页开发时所用的 Jekyll,配置了名为 Kramdown 的 Markdown 编译引擎,在其下只能识别用双美元号 $$ ... $$ 包围的公式(但其可以自动判断公式是行内还是行间环境)。详见本网站项目的技术文档

参与讨论