整理一下 LaTeX 关于数学公式、数学字体以及相关的细节内容。

AMS宏包

AMS提供了一系列最常用的LaTeX数学宏包:

  1. amsmath 宏包:
    • 提供了一套增强的数学排版命令和环境,使得数学公式的编辑和排版更加灵活和方便。
    • 引入了一些新的数学环境,例如 aligngather,以便更好地控制多行公式的排版。
    • 提供了诸如 \text, \DeclareMathOperator 等命令,用于在数学模式中插入文本或定义新的运算符。
  2. amssymb 宏包:扩展了 amsmath,提供了额外的数学符号,如各种箭头、关系符号、集合符号等。
  3. amsfonts 宏包:提供了一些额外的字体,例如 \mathbb 命令用于黑板粗体字母。
  4. amsthm 宏包:提供了 theorem, lemma, proof 等定理或证明环境,方便用户在文档中定义和使用定理。

下面的数学公式绝大部分都需要这些宏包,默认已经被导入

1
\usepackage{amsmath,amssymb,amsfonts,amsthm}

这些宏包在实际使用时似乎要注意一下导入的先后顺序,例如最好先调用 amsmath 再调用 amsthm,参考LaTeX 宏包介绍(一)—— amsthm 阅读笔记

数学公式

行内公式直接使用$...$包裹即可,也可以使用\(...\)包裹,关于哪一种更好并没有统一的结论,chktex建议使用后者,但是大部分教程都建议使用前者。

本文主要关注的是行间公式,\(\TeX{}\) 默认的行间公式环境为$$...$$,这也是Markdown支持的行间公式,但是在\(\LaTeX{}\)中并不推荐使用它,虽然在大多数情况下是没有问题的,但是在某些情况下和\[\]以及其它行间公式环境的表现并不一样。

这里重点关注了编号和多行公式这两个问题,略去了其它内容,比如很多数学符号的处理。对于公式编号的基本原则是:只对必要的公式进行编号,而不是对所有行间公式进行编号。

基本使用

基本的行间公式环境为equation,例如

1
2
3
\begin{equation}
a^2 + b^2 = c^2
\end{equation}

公式自动带有编号并在右侧呈现,编号可能形如:1, 2, 3, 也可能是形如1.1, 1.2等基于章节的编号, 默认行为取决于当前文档是atricle这类小型文本或book这类大型文本,当然也可以使用命令手动更改,例如

1
2
\numberwithin{equation}{section}
\numberwithin{equation}{subsection}

可以使用\label{}结合\ref{}\eqref{}来形成交叉引用(后者是宏包提供的,区别在于引用时自动给公式编号加了括号)

1
2
3
4
5
\begin{equation}
a^2 + b^2 = c^2 \label{eq:1}
\end{equation}

Equation \eqref{eq:1} is called `Gougu theorem' in Chinese.

效果如下

还可以使用hyperref 宏包提供的 \autoref{} 命令来替代普通的 \ref{},它会自动在前面加上引用对应的计数器名称,例如 Figure XSection X 等,并且将整体作为链接。但是不建议使用它引用公式,因为它呈现的是 Equation X,看着很奇怪。

可以在行尾使用\tag{xxx}来手动修改编号,例如一个具有特殊意义的文本标记,此时行尾的编号和交叉引用都会替换为自定义的标记

1
2
3
4
5
\begin{equation}
a^2 + b^2 = c^2 \tag{aaa}\label{eq:2}
\end{equation}

Equation \eqref{eq:2} is called `Gougu theorem' in Chinese.

效果如下

注意\tag{xxx}的内部属于文本模式,如果需要在标记中使用数学公式,还需要$$包裹。还有一个与\tag非常类似的\tag*命令,区别在于后者生成的标记不会被括号包裹。

可以在行尾使用\notag来抑制当前行的公式生成编号。(这个命令更常见的情景是在多行带编号的公式中选择性关闭某些行的编号)

1
2
3
\begin{equation}
1 + 1 \neq 3 \notag
\end{equation}

使用\nonumber也可以达到一样的效果。

有时需要使用完全不带编号的公式,可以使用equation*环境,更常见的选择是\[\],它也提供了不带编号的行间公式环境,它实际上是displaymath环境的等价形式。

1
2
3
4
5
6
7
8
9
10
11
\begin{equation*}
a^2 + b^2 = c^2
\end{equation*}
For short:
\[
a^2 + b^2 = c^2
\]
Or if you like the long one:
\begin{displaymath}
a^2 + b^2 = c^2
\end{displaymath}

多行公式

一个常见的使用情景为罗列一组公式,按照中间的等号对齐,常用的环境为align,它基于&对多行公式进行定位,通常将&放在等号左侧,在多行公式中使用\\换行

1
2
3
4
\begin{align}
a & = b + c \\
& = d + e
\end{align}

默认情形下align环境的每一行都会产生一个编号,可以使用\notag去掉某行的编号,例如出现长公式换行时不需要两个编号。

有时也可能将&放在等号右侧,因为右侧有长公式需要换行,不能让加号和等号对齐,例如

1
2
3
4
5
6
\begin{align}
a ={} & b + c \\
={} & d + e + f + g + h + i + j + k + l \notag \\
& + m + n + o \\
={} & p + q + r + s
\end{align}

这里的使用={} &是为了产生更合适的间距。

对于多组公式的对齐,例如两行三列的公式可以如下表示,其中公式之间和等号旁都要加上&

1
2
3
4
\begin{align}
a &=1 & b &=2 & c &=3 \\
d &=-1 & e &=-2 & f &=-5
\end{align}

除了默认的多行公式环境align,还有几个常见的需求以及对应的变体,例如完全不使用编号的环境align*,还有一个情景是多行公式被打包为一个整体进行编号,此时需要使用aligned环境,例如

1
2
3
4
5
6
7
8
\begin{equation}
\begin{aligned}
a &= b + c \\
d &= e + f + g \\
h + i &= j + k \\
l + m &= n
\end{aligned}
\end{equation}

alignalign*aligned环境总是需要考虑对齐的标记放置,在使用比较麻烦,而且某些情况下的排版不够美观。 还有一组使用更简单的多行公式环境:gathergather*gathered环境,它们的行为比较简单,将多行自动居中对齐, 在某些情况下的排版比align更加美观。

1
2
3
4
\begin{gather}
a + b + c = b + a \\
1 + 2 = 2 + 1
\end{gather}

如果需要分段函数之类的情况,cases环境也是很好的选择,例如

1
2
3
4
5
6
\begin{equation}
D(x)=\begin{cases}
1, & \text{if} x \in \mathbb{Q};\\
0, & \text{if} x \in \mathbb{R}\setminus\mathbb{Q}
\end{cases}
\end{equation}

括号与定界符

Latex 提供了多种定界符(主要是括号)表示公式块的边界,包括最基本的三种括号:

  • 小括号()
  • 中括号 []
  • 大括号 \{\}(大括号使用的{}需要转义)。

此外还有常用于表示内积的尖括号\langle\rangle(不是<>),常用于表示范数的单竖线|(或\vert)和双竖线\|(或\Vert)。 常见的定界符如下图

如果定界符的高度不能盖住内部的公式块,看起来非常不舒服,可以使用 \left\right 命令可以在排版时自动调整括号(定界符)的大小,例如

1
\left(\frac{1}{2x}\right)

需要注意的是:

  • \left\right 必须成对使用,但是我们确实需要单独一个定界符的情况,此时不需要的部分用\left.\right.代替。
  • \left\right 包裹的公式块是不允许出现\\断行的。(但是aligned等环境虽然内部有换行,但是在外部不被视作断行)
  • 为了和\left\right命令搭配,对内部的竖线需要使用\middle|命令,否则竖线的尺寸无法进行自适应调整。

有时我们对自动生成的定界符大小不满意,或者公式块必须要换行,可以使用 \big\bigg\Big\bigg 等命令进行手动调节,这些命令只作用于一个定界符,不需要成对。

箭头

LaTeX提供了大量的箭头相关的命令,amsmath又为其提供了更多支持,如下表。

符号上下标

下图整理了常见的在字母正上方和正下方所采用的特殊标记。

制表源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
\begin{table}
\centering
\begin{tabular}{|c|c|c|c|}
\hline
\textbf{功能} & \textbf{命令} & \textbf{示例} \\
\hline
横线 & \verb|\bar{a}| & $\bar{a}$ \\
长横线(上) & \verb|\overline{xyz}| & $\overline{xyz}$ \\
长横线(下) & \verb|\underline{xyz}| & $\underline{xyz}$ \\
波浪线 & \verb|\tilde{a}| & $\tilde{a}$ \\
长波浪线 & \verb|\widetilde{xyz}| & $\widetilde{xyz}$ \\
帽子 & \verb|\hat{a}| & $\hat{a}$ \\
长帽子 & \verb|\widehat{xyz}| & $\widehat{xyz}$ \\
一个点 & \verb|\dot{a}| & $\dot{a}$ \\
两个点 & \verb|\ddot{a}| & $\ddot{a}$ \\
向量箭头 & \verb|\vec{a}| & $\vec{a}$ \\
自定义符号 & \verb|\overset{x}{a}| & $\overset{\sim}{a}$ \\
\hline
\end{tabular}
\end{table}

公式细节

  • \(\ell\)\ell)是一个手写体的小写字母 l (L小写),通常用于数学公式中替代 l (L小写) 作为下标使用,防止与 1 (数字1) 和 I (大写i) 的混淆。
  • 在本身就是斜体的定理环境的公式环境里,可能\text{xxx}无法起到正体的效果,可以改成使用\mathrm{xxx}
  • 使用\dots而非连续的...,也可以具体指定\ldots\cdots\cdots会自动调整显示效果。
  • 使用\mid而非直接的|,它提供更合适的间距,例如在集合的定义中使用。
  • 对于行内公式,尽量不要包括标点符号,把标点符号放在行内公式的外面;对于行间公式,则需要包括标点符号。
  • 使用\times\cdot表示乘法,不要直接使用x*
  • 对于小于等于号有很多写法,例如\le,\leq,\leqslant,最后一个不等号的横线是倾斜的。

关于矩阵的转置以及相关的记号,并没有一个统一的实现方式,常见的做法及效果如下

参考What is the best symbol for vector/matrix transpose?

在长等式的一部分下面使用长括号(例如标记为(A)):\underbrace{......}_{(A)}

在等号上面加一点符号(例如问号)可以使用\overset,例如

1
\overset{?}{=}

在等号上下加入更多文字,可以使用\xlongequal[]包裹的内容在等号下方,{}包裹的内容在等号上方,等号会根据上下标的长度自动调整长度

1
\xlongequal[aaa]{bbb}

与之类似的,还有支持上下标的箭头,可以使用\xleftarrow\xrightarrow实现,例如

1
\xleftarrow[aaa]{bbb}

在一些排版考究的情况下,一个积分公式需要注意两处细节:dx的字体以及dx前面的小间距,例如

1
\int_a^b f(x)\,\mathrm{d}x

虚数单位除了直接使用 i,也可以使用正体的 \mathrm{i} ,后者是一种看起来更正式的做法。

数学字体

下面几个命令是LaTeX默认支持的数学环境中的字体:

  • \mathnormal{}:数学环境的默认字体,与正文中相比,字母的间距更大一些,其它几个字体的间距则与正文基本一致(但没有连字),例如 $xyz$$\mathit{xyz}$ 的间距不同。
  • \mathrm{}:罗马体
  • \mathit{}:意大利体(italic),通常是斜体
  • \mathbf{}:粗体(bold),通常是直立的粗体,不支持希腊字母
  • \mathsf{}:无衬线体
  • \mathtt{}:打字机体
  • \mathcal{}:手写体(花体),注意默认情形仅支持大写英文字母,某些大写希腊字母不支持
  • \mathbb{}:(需要amssymb宏包或amsfonts)黑板粗体(blackboard bold),注意仅支持大写字母

关于加粗:

  • \mathbf{} 提供的是加粗直立的大写字母,不包括希腊字母;\boldsymbol{} 支持对希腊字母加粗。这两种方案的底层原理都是通过改变字体系列来加粗,但是并不是所有符号都有粗体版本。
  • 更好的方案是使用 bm 宏包提供的 \bm{} 命令来获得加粗符号,它通过更底层的 TeX 低级命令动态构造加粗字形,因此能对任意符号、表达式、上下标都正确加粗。

英文字母

英文大小写字母的常见字体效果如图

\mathcal{} 是 LaTeX 直接提供的花体命令,而 mathrsfs 宏包提供了一套略微不同的花体,使用\mathscr{}命令即可,它提供的花体更花哨复杂一些。

除此之外,还有一种可读性最差的哥特体(mathfrak),并不需要额外的宏包,直接使用\mathfrak{}命令即可

希腊字母

LaTeX对希腊字母的默认支持不完整,有的字母有大小写,有的字母只有小写,有的甚至完全不支持(omicron), 有的还有var开头的变体,如下表。希腊字母通常不会使用花体之类的变形。如果使用额外的字体宏包,则可能支持的范围更大一些。

omicron在LaTeX中没有对应的符号\omicron,因为它的大小写和英文字母Oo完全一样。 同理也没有大写的\Alpha\Beta,因为和英文字母AB完全一样。

快捷命令

可以用自定义命令定义不同字体的字符,使得数学公式的编写更加简洁,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
\newcommand{\cA}{\mathcal{A}}
\newcommand{\cB}{\mathcal{B}}
\newcommand{\cC}{\mathcal{C}}
\newcommand{\cD}{\mathcal{D}}
\newcommand{\cE}{\mathcal{E}}
\newcommand{\cF}{\mathcal{F}}
\newcommand{\cG}{\mathcal{G}}
\newcommand{\cH}{\mathcal{H}}
\newcommand{\cI}{\mathcal{I}}
\newcommand{\cJ}{\mathcal{J}}
\newcommand{\cK}{\mathcal{K}}
\newcommand{\cL}{\mathcal{L}}
\newcommand{\cM}{\mathcal{M}}
\newcommand{\cN}{\mathcal{N}}
\newcommand{\cO}{\mathcal{O}}
\newcommand{\cP}{\mathcal{P}}
\newcommand{\cQ}{\mathcal{Q}}
\newcommand{\cR}{\mathcal{R}}
\newcommand{\cS}{\mathcal{S}}
\newcommand{\cT}{\mathcal{T}}
\newcommand{\cU}{\mathcal{U}}
\newcommand{\cV}{\mathcal{V}}
\newcommand{\cW}{\mathcal{W}}
\newcommand{\cX}{\mathcal{X}}
\newcommand{\cY}{\mathcal{Y}}
\newcommand{\cZ}{\mathcal{Z}}

\newcommand{\RR}{\mathbb{R}}
\newcommand{\CC}{\mathbb{C}}
\newcommand{\QQ}{\mathbb{Q}}

自定义命令

在这里补充几个便于快速排版数学公式的命令。

快速定义和使用矩阵集合

1
2
\NewDocumentCommand{\mat}{>{\SplitArgument{1}{,}}m}{\mataux#1}
\NewDocumentCommand{\mataux}{mm}{\mathbb{R}^{#1 \times #2}}

\DeclareMathOperator命令可以个性化运算符以罗马字体而不是斜体显示,例如

1
2
3
4
5
\DeclareMathOperator{\re}{Re}
\DeclareMathOperator{\im}{Im}
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{argmax}
\DeclareMathOperator*{\argmin}{argmin}

这里第一个参数是命令名称,第二个参数是显示的文本,如果加上*则它的上下标会在运算符的正上方和正下方显示,否则会显示在右上角和右下角。

我们可以用自定义的实部虚部符号替换默认的花体的实部虚部符号\(\Re\)\(\Im\)

1
2
3
4
\DeclareMathOperator{\myRe}{Re}
\DeclareMathOperator{\myIm}{Im}
\let\Re\myRe
\let\Im\myIm

我们可以用倾斜的不等号 \(\leqslant\) 完全替换默认的不等号 \(\le\)

1
2
3
4
\renewcommand{\le}{\leqslant}
\renewcommand{\leq}{\leqslant}
\renewcommand{\ge}{\geqslant}
\renewcommand{\geq}{\geqslant}

可以定义下面的命令来实现转置和Hermite转置

1
2
\newcommand{\trans}{\mathsf{T}}
\newcommand{\hermite}{\mathsf{H}}