\chapter{排版数学公式}\label{chap:math} \addtocontents{los}{\protect\addvspace{10pt}} \begin{intro} 准备好了!本章将见识到 \LaTeX{} 闻名的强项——排版数学公式。当然你得注意了,本章的内容只是一点皮毛, 虽然对大多数人来说已经够用了,但是如果不能解决你的问题的话也不要大惊小怪,求助于搜索引擎或者有经验的人不失为一个好办法。 \end{intro} \DeclareRobustCommand*\amscmd[1]{\textcolor{blue}{\cmd{#1}}} \DeclareRobustCommand*\amsenv[1]{\textcolor{blue}{\env{#1}}} \section{\hologo{AmS} 宏集}\label{sec:ams-bundle} \pkgindex{amsmath,amsfonts,amssymb,amsthm} 在介绍数学公式排版之前,简单介绍一下 \hologo{AmS} 宏集。\hologo{AmS} 宏集合是美国数学学会(American Mathematical Society)提供的对 \LaTeX{} 原生的数学公式排版的扩展,其核心是 \pkg{amsmath} 宏包,对多行公式的排版提供了有力的支持。 此外,\pkg{amsfonts} 宏包以及基于它的 \pkg{amssymb} 宏包提供了丰富的数学符号;\pkg{amsthm} 宏包扩展了 \LaTeX{} 定理证明格式。 本章介绍的许多命令和环境依赖于 \pkg{amsmath} 宏包,这些命令和环境将以\textcolor{blue}{蓝色}示意。以下示例都假定了导言区中写有 \begin{verbatim} \usepackage{amsmath} \end{verbatim} \section{公式排版基础}\label{sec:math-basics} \subsection{行内和行间公式}\label{subsec:math-inline-display} 数学公式有两种排版方式:其一是与文字混排,称为\textbf{行内公式};其二是单独列为一行排版,称为\textbf{行间公式}。 \pinyinindex{hangneigongshi}{行内公式} \index{^^d@\texttt\$ (\textit{数学模式})} 行内公式由一对 \texttt\$ 符号包裹: \begin{example} The Pythagorean theorem is $a^2 + b^2 = c^2$. \end{example} \envindex{equation} \cmdindex{label,ref,nonumber} \cmdindex[amsmath]{eqref,tag,notag} 单独成行的\textbf{行间公式}在 \LaTeX{} 里由 \env{equation} 环境包裹。 \env{equation} 环境为公式自动生成一个编号,这个编号可以用 \cmd{label} 和 \cmd{ref} 生成交叉引用, \pkg{amsmath} 的 \amscmd{eqref} 命令甚至为引用自动加上圆括号;还可以用 \amscmd{tag} 命令手动修改公式的编号, 或者用 \amscmd{notag} 命令取消为公式编号(与之基本等效的命令是 \cmd{nonumber})。 \begin{example} The Pythagorean theorem is: \begin{equation} a^2 + b^2 = c^2 \label{pythagorean} \end{equation} Equation \eqref{pythagorean} is called `Gougu theorem' in Chinese. \end{example} \begin{example} It's wrong to say \begin{equation} 1 + 1 = 3 \tag{dumb} \end{equation} or \begin{equation} 1 + 1 = 4 \notag \end{equation} \end{example} \cmdindex{[,]} \envindex{displaymath} \envindex[amsmath]{equation*} 如果需要直接使用不带编号的行间公式,则将公式用命令 \cmd{[} 和 \cmd{]} 包裹% \footnote{\TeX{} 原生排版行间公式的方法是用一对 \texttt{\$\$} 符号包裹,不过无法通过指定 \texttt{fleqn} 选项控制左对齐, 与上下文之间的间距也不好调整,故不太推荐使用。}, 与之等效的是 \env{displaymath} 环境。有的人更喜欢 \amsenv{equation*} 环境,体现了带星号和不带星号的环境之间的区别。 \begin{example} \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} \end{example} 我们通过一个例子展示行内公式和行间公式的对比。为了与文字相适应,行内公式在排版大的公式元素(分式、巨算符等)时显得很“局促”: \begin{example} In text: $\lim_{n \to \infty} \sum_{k=1}^n \frac{1}{k^2} = \frac{\pi^2}{6}$. In display: \[ \lim_{n \to \infty} \sum_{k=1}^n \frac{1}{k^2} = \frac{\pi^2}{6} \] \end{example} 行间公式的对齐、编号位置等性质由文档类选项控制,文档类的 \texttt{fleqn} 选项令行间公式左对齐; \texttt{leqno} 选项令编号放在公式左边。 \subsection{数学模式}\label{subsec:math-mode} \pinyinindex{shuxuemoshi}{数学模式} \cmdindex[amsmath]{text} 当用户使用 \texttt\$ 开启行内公式输入,或是使用 \cmd{[} 命令、\env{equation} 环境时,\LaTeX{} 就进入了\textbf{数学模式}。 数学模式相比于文本模式有以下特点: \begin{enumerate} \item 数学模式中输入的空格被忽略。数学符号的间距默认由符号的性质(关系符号、运算符等)决定。 需要人为引入间距时,使用 \cmd{quad} 和 \cmd{qquad} 等命令。详见 \ref{sec:math-space} 节。 \item \textbf{不允许有空行(分段)}。行间公式中也无法用 \crcmd{} 命令手动换行。排版多行公式需要用到 \ref{sec:multi-eqns} 节介绍的各种环境。 \item 所有的字母被当作数学公式中的变量处理,字母间距与文本模式不一致,也无法生成单词之间的空格。 如果想在数学公式中输入正体的文本,简单情况下可用 \ref{subsec:math-alpha} 小节中提供的 \cmd{mathrm} 命令。 或者用 \pkg{amsmath} 提供的 \amscmd{text} 命令% \footnote{\amscmd{text} 命令仅适合在公式中穿插少量文字。如果你的情况正好相反,需要在许多文字中穿插使用公式, 则应该像正常的行内公式那样用,而不是滥用 \amscmd{text} 命令。}。 \end{enumerate} \begin{example} % \usepackage{amssymb} $x^{2} \geq 0 \qquad \text{for \textbf{all} } x\in\mathbb{R}$ \end{example} \section{数学符号}\label{sec:math-symbols} \def\msym#1{$\csname #1\endcsname$ (\cmd{#1})} \pkgindex{amssymb} 本节我们将接触到形形色色的数学符号,它们是 \LaTeX{} 卓越的数学公式排版能力的基础。\LaTeX{} 默认提供了常用的数学符号, \pkg{amssymb} 宏包提供了一些次常用的符号。大多数常用的数学符号都能在本章末尾的 \ref{sec:math-tables} 节列出的各个表格里查到。 更多符号可查阅参考文献\cite{symbols}。 \subsection{一般符号}\label{subsec:math-general} \pinyinindex{xilazimu}{希腊字母 (数学符号)} \msymindex{infty} 希腊字母符号的名称就是其英文名称,如 \msym{alpha}、\msym{beta} 等等。 大写的希腊字母为首字母大写的命令,如 \msym{Gamma}、\msym{Delta} 等等。 无穷大符号为 \msym{infty}。更多符号命令可参考表 \ref{tbl:math-greek} 和 \ref{tbl:math-misc} 等。 \msymindex{dots,ldots,cdots} 省略号有 \msym{dots} 和 \msym{cdots} 两种形式。它们有各自合适的用途: \begin{example} $a_1, a_2, \dots, a_n$ \\ $a_1 + a_2 + \cdots + a_n$ \end{example} \cmd{ldots} 和 \cmd{dots} 是完全等效的,它们既能用在公式中,也用来在文本里作为省略号(详见 \ref{subsec:punct} 小节)。 除此之外,在矩阵中可能会用到竖排的 \msym{vdots} 和斜排的 \msym{ddots}。 \subsection{指数、上下标和导数}\label{subsec:math-scripts} \index{^@\texttt\textasciicircum\ (\textit{数学上标})} \index{_@\texttt\textunderscore\ (\textit{数学下标})} 在 \LaTeX{} 中用 \texttt\textasciicircum 和 \texttt\textunderscore 标明上下标。 注意上下标的内容(子公式)一般需要\textbf{用花括号包裹},否则上下标只对后面的一个符号起作用。 \begin{example} $p^3_{ij} \qquad m_\mathrm{Knuth}\qquad \sum_{k=1}^3 k $\\[5pt] $a^x+y \neq a^{x+y}\qquad e^{x^2} \neq {e^x}^2$ \end{example} \pinyinindex{daoshu}{导数符号\texttt' ($a'$)} 导数符号\texttt'(${}'$)是一类特殊的上标,可连续使用,但只能在\textbf{其后}添加其他上标: \begin{example} $f(x) = x^2 \quad f'(x) = 2x \quad f''^{2}(x) = 4$ \end{example} \subsection{分式和根式}\label{subsec:frac-sqrt} \mathindex{frac} \cmdindex[amsmath]{dfrac,tfrac} 分式使用 \cmd{frac}\marg*{分子}\marg*{分母} 来书写。分式的大小在行间公式中是正常大小,而在行内被极度压缩。 \pkg{amsmath} 提供了方便的命令 \amscmd{dfrac} 和 \amscmd{tfrac},令用户能够在行内使用正常大小的分式,或是反过来。 \begin{example} In display style: \[ 3/8 \qquad \frac{3}{8} \qquad \tfrac{3}{8} \] In text style: $1\frac{1}{2}$~hours \qquad $1\dfrac{1}{2}$~hours \end{example} \mathindex{sqrt} 一般的根式使用 \cmd{sqrt}\marg*{…};表示 $n$ 次方根时写成 \cmd{sqrt}\oarg*{\textit{n}}\marg*{…}。 \begin{example} $\sqrt{x} \Leftrightarrow x^{1/2} \quad \sqrt[3]{2} \quad \sqrt{x^{2} + \sqrt{y}}$ \end{example} \cmdindex[amsmath]{binom} 特殊的分式形式,如二项式结构,由 \pkg{amsmath} 宏包的 \amscmd{binom} 命令生成: \begin{example} Pascal's rule is \[ \binom{n}{k} =\binom{n-1}{k} + \binom{n-1}{k-1} \] \end{example} \subsection{关系符}\label{subsec:math-rel} \msymindex{ne,ge,le,approx,equiv,propto,sim} \LaTeX{} 常见的关系符号除了可以直接输入的 $=$,$>$,$<$,其它符号用命令输入,常用的有不等号 \msym{ne}、 大于等于号 \msym{ge} 和小于等于号 \msym{le}% \footnote{倾斜的关系符号 \msym{leqslant} 和 \msym{geqslant} 由 \pkg{amssymb} 提供,见表 \ref{tbl:ams-rel}。}、 约等号 \msym{approx}、等价 \msym{equiv}、正比 \msym{propto}、相似 \msym{sim} 等等。 更多符号命令可参考表 \ref{tbl:math-rel} 以及表 \ref{tbl:ams-rel}。 \mathindex{stackrel} \LaTeX{} 还提供了自定义二元关系符的命令 \cmd{stackrel},用于将一个符号叠加在原有的二元关系符之上: \begin{example} \[ f_n(x) \stackrel{*}{\approx} 1 \] \end{example} \subsection{算符}\label{subsec:math-op} \msymindex{times,div,cdot,pm,mp} \LaTeX{} 中的算符大多数是二元算符,除了直接用键盘可以输入的 $+$、$-$、$*$、$/$,其它符号用命令输入, 常用的有乘号 \msym{times}、 除号 \msym{div}、点乘 \msym{cdot}、加减号 \msym{pm} / \msym{mp} 等等。 更多符号命令可参考表 \ref{tbl:math-op} 以及表 \ref{tbl:ams-op}。 \msymindex{nabla,partial} \msym{nabla} 和 \msym{partial} 也是常用的算符,虽然它们不属于二元算符。 \pinyinindex{shuxuehanshu}{数学函数} \LaTeX{} 将数学函数的名称作为一个算符排版,字体为直立字体。其中有一部分符号在上下位置可以书写一些内容作为条件, 类似于后文所叙述的巨算符。 \begin{table}[htp] \centering \caption{\LaTeX{} 作为算符的函数名称一览}\label{tbl:math-functions} \begin{tabular}{*{5}{p{5em}}} \hline \multicolumn{5}{c}{\textbf{不带上下限的算符}} \\ \hline \cmd{sin} & \cmd{arcsin} & \cmd{sinh} & \cmd{exp} & \cmd{dim} \\ \cmd{cos} & \cmd{arccos} & \cmd{cosh} & \cmd{log} & \cmd{ker} \\ \cmd{tan} & \cmd{arctan} & \cmd{tanh} & \cmd{lg} & \cmd{hom} \\ \cmd{cot} & \cmd{arg} & \cmd{coth} & \cmd{ln} & \cmd{deg} \\ \cmd{sec} & \cmd{csc} & \\ \hline \multicolumn{5}{c}{\textbf{带上下限的算符}} \\ \hline \cmd{lim} & \cmd{limsup} & \cmd{liminf} & \cmd{sup} & \cmd{inf} \\ \cmd{min} & \cmd{max} & \cmd{det} & \cmd{Pr} & \cmd{gcd} \\ \hline \end{tabular} \end{table} \begin{example} \[ \lim_{x \rightarrow 0} \frac{\sin x}{x}=1 \] \end{example} \mathindex{bmod,pmod} 对于求模表达式,\LaTeX{} 提供了 \cmd{bmod} 和 \cmd{pmod} 命令,前者相当于一个二元运算符,后者作为同余表达式的后缀: \begin{example} $a\bmod b \\ x\equiv a \pmod{b}$ \end{example} \cmdindex[amsmath]{DeclareMathOperator} 如果表 \ref{tbl:math-functions} 中的算符不够用的话,\pkg{amsmath} 允许用户在导言区用 \amscmd{Declare\-Math\-Operator} 定义自己的算符,其中带星号的命令定义带上下限的算符: \begin{verbatim} \DeclareMathOperator{\argh}{argh} \DeclareMathOperator*{\nut}{Nut} \end{verbatim} \begin{example} \[\argh 3 = \nut_{x=1} 4x\] \end{example} \subsection{巨算符}\label{subsec:math-bigop} \msymindex{int,oint,sum,prod} 积分号 \msym{int}、求和号 \msym{sum} 等符号称为\textbf{巨算符}。巨算符在行内公式和行间公式的大小和形状有区别。 \begin{example} In text: $\sum_{i=1}^n \quad \int_0^{\frac{\pi}{2}} \quad \oint_0^{\frac{\pi}{2}} \quad \prod_\epsilon $ \\ In display: \[\sum_{i=1}^n \quad \int_0^{\frac{\pi}{2}} \quad \oint_0^{\frac{\pi}{2}} \quad \prod_\epsilon \] \end{example} \mathindex{limits,nolimits} 巨算符的上下标位置可由 \cmd{limits} 和 \cmd{nolimits} 调整,前者令巨算符类似 $\lim$ 或求和算符 $\sum$,上下标位于上下方; 后者令巨算符类似积分号,上下标位于右上方和右下方。 \begin{example} In text: $\sum\limits_{i=1}^n \quad \int\limits_0^{\frac{\pi}{2}} \quad \prod\limits_\epsilon $ \\ In display: \[\sum\nolimits_{i=1}^n \quad \int\limits_0^{\frac{\pi}{2}} \quad \prod\nolimits_\epsilon \] \end{example} \cmdindex[amsmath]{substack} \envindex[amsmath]{subarray} \pkg{amsmath} 宏包还提供了 \amscmd{substack},能够在下限位置书写多行表达式;\amsenv{subarray} 环境更进一步,令多行表达式可选择居中 (c) 或左对齐 (l): \begin{example} % \usepackage{amssymb} \[ \sum_{\substack{0\le i\le n \\ j\in \mathbb{R}}} P(i,j) = Q(n) \] \[ \sum_{\begin{subarray}{l} 0\le i\le n \\ j\in \mathbb{R} \end{subarray}} P(i,j) = Q(n) \] \end{example} \subsection{数学重音和上下括号}\label{subsec:math-accents} \maccindex{dot,ddot,vec,hat} 数学符号可以像文字一样加重音,比如求导符号 $\dot{r}$ (\cmd{dot}\marg*{r})、 $\ddot{r}$ (\cmd{ddot}\marg*{r})、 表示向量的箭头 $\vec{r}$ (\cmd{vec}\marg*{r}) 、表示单位向量的符号 $\hat{\mathbf{e}}$ (\cmd{hat}\marg*{\cmd{mathbf}\marg*{e}}) 等, 详见表 \ref{tbl:math-accents}。使用时要注意重音符号的作用区域,一般应当对某个符号而不是“符号加下标”使用重音: \begin{example} $\bar{x_0} \quad \bar{x}_0$\\[5pt] $\vec{x_0} \quad \vec{x}_0$\\[5pt] $\hat{\mathbf{e}_x} \quad \hat{\mathbf{e}}_x$ \end{example} \waccindex{overline,underline} \waccindex{widehat,overrightarrow} \LaTeX{} 也能为多个字符加重音,包括直接画线的 \cmd{overline} 和 \cmd{underline} 命令(可叠加使用)、宽重音符号 \cmd{widehat}、 表示向量的箭头 \cmd{overrightarrow} 等。后两者详见表 \ref{tbl:math-accents} 和 \ref{tbl:math-arrow-accents} 等。 \begin{example} $0.\overline{3} = \underline{\underline{1/3}}$ \\[5pt] $\hat{XY} \qquad \widehat{XY}$\\[5pt] $\vec{AB} \qquad \overrightarrow{AB}$ \end{example} \waccindex{overbrace,underbrace} \cmd{overbrace} 和 \cmd{underbrace} 命令用来生成上/下括号,各自可带一个上/下标公式。 \begin{example} $\underbrace{\overbrace{(a+b+c)}^6 \cdot \overbrace{(d+e+f)}^7} _\text{meaning of life} = 42$ \end{example} \subsection{箭头}\label{subsec:math-arrows} \msymindex{to,rightarrow,leftarrow,uparrow,downarrow} 常用的箭头包括 \cmd{rightarrow} ($\rightarrow$,或 \cmd{to})、\cmd{leftarrow}($\leftarrow$,或 \cmd{gets})等。 更多箭头详见表 \ref{tbl:math-arrows}。 \cmdindex[amsmath]{xleftarrow,xrightarrow} \pkg{amsmath} 的 \amscmd{xleft\-arrow} 和 \amscmd{xright\-arrow} 命令提供了长度可以伸展的箭头,并且可以为箭头增加上下标: \begin{example} \[ a\xleftarrow{x+y+z} b \] \[ c\xrightarrow[x 0. \end{array} \right. \] \end{example} \envindex[amsmath]{cases} 不过上述例子可以用 \pkg{amsmath} 提供的 \amsenv{cases} 环境更轻松地完成: \begin{example} \[ |x| = \begin{cases} -x & \text{if } x < 0,\\ 0 & \text{if } x = 0,\\ x & \text{if } x > 0. \end{cases} \] \end{example} \envindex[amsmath]{matrix,pmatrix,bmatrix,Bmatrix,vmatrix,Vmatrix} 我们当然也可以用 \env{array} 环境排版各种矩阵。\pkg{amsmath} 宏包还直接提供了多种排版矩阵的环境,包括不带定界符的 \amsenv{matrix}, 以及带各种定界符的矩阵 \amsenv{pmatrix}($\bigl($)、\amsenv{bmatrix}($\bigl[$)、\amsenv{Bmatrix}($\bigl\{$)、 \amsenv{vmatrix}($\bigl\vert$)、\amsenv{Vmatrix}($\bigl\Vert$)。使用这些环境时,无需给定列格式% \footnote{事实上这些矩阵内部也是用 \env{array} 环境生成的,列格式默认为 \texttt{*\{\Arg{n}\}\{c\}},\Arg{n} 默认为 10; \amsenv{cases} 内部是一个列格式为 \texttt{@\{\}l@\{\cmd{quad}\}l@\{\}} 的 \env{array} 环境。}: \begin{example} \[ \begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix} \qquad \begin{bmatrix} x_{11} & x_{12} & \ldots & x_{1n}\\ x_{21} & x_{22} & \ldots & x_{2n}\\ \vdots & \vdots & \ddots & \vdots\\ x_{n1} & x_{n2} & \ldots & x_{nn}\\ \end{bmatrix} \] \end{example} 在矩阵中的元素里排版分式时,一来要用到 \amscmd{dfrac} 等命令,二来行与行之间有可能紧贴着,这时要用到 \ref{subsec:tabular-colht} 小节的方法来调节间距: \begin{example} \[ \mathbf{H}= \begin{bmatrix} \dfrac{\partial^2 f}{\partial x^2} & \dfrac{\partial^2 f} {\partial x \partial y} \\[8pt] \dfrac{\partial^2 f} {\partial x \partial y} & \dfrac{\partial^2 f}{\partial y^2} \end{bmatrix} \] \end{example} \section{公式中的间距}\label{sec:math-space} \cmdindex{quad,qquad} \index{,@\cmd{,}} % The only one which cannot use \cmdindex, oops.. \mathindex{:,;,"!} 前文提到过,绝大部分时候,数学公式中各元素的间距是根据符号类型自动生成的,需要我们手动调整的情况极少。 我们已经认识了两个生成间距的命令 \cmd{quad} 和 \cmd{qquad}。在公式中我们可能用到的间距还包括 \cmd{,}、\cmd{:}、\cmd{;} 以及负间距 \cmd{!}% \footnote{\LaTeX{} 2020-10-01 版本之前,\cmd{:}、\cmd{;} 和 \cmd{!} 只能用于数学环境。}。 文本中的 \cmd{\textvisiblespace} 也能使用在数学公式中。 \newdimen\testdimen \testdimen=\fontdimen6\textfont2 \divide\testdimen18\relax \begin{center} \begin{tabularx}{0.9\textwidth}{*{3}{>{\raggedright\arraybackslash}X}|*{3}{>{\raggedright\arraybackslash}X}} \hline 无额外间距 & & $a a$ & \cmd{,} & \demowidth{3\testdimen} & $a\,a$ \\ \cmd{quad} & \demowidth{18\testdimen} & $a\quad a$ & \cmd{:} & \demowidth{4\testdimen} & $a\:a$ \\ \cmd{qquad} & \demowidth{36\testdimen} & $a\qquad a$ & \cmd{;} & \demowidth{5\testdimen} & $a\;a$ \\ \cmd{\textvisiblespace} & \demowidth{\fontdimen2\textfont0} & $a\ a$ & \cmd{!} & $-$\demowidth{3\testdimen} & $a\!a$ \\ \hline \end{tabularx} \end{center} 一个常见的用途是修正积分的被积函数 $f(x)$ 和微元 $\mathrm{d}x$ 之间的距离。 注意微元里的 $\mathrm{d}$ 用的是直立体: \begin{example} \[ \int_a^b f(x)\mathrm{d}x \qquad \int_a^b f(x)\,\mathrm{d}x \] \end{example} 另一个用途是生成多重积分号。如果我们直接连写两个 \cmd{int},之间的间距将会过宽,此时可以使用负间距 \cmd{!} 修正之。不过 \pkg{amsmath} 提供了更方便的多重积分号,如二重积分 \amscmd{iint}、三重积分 \amscmd{iiint} 等。 \begin{example} \newcommand\diff{\,\mathrm{d}} \begin{gather*} \int\int f(x)g(y) \diff x \diff y \\ \int\!\!\!\int f(x)g(y) \diff x \diff y \\ \iint f(x)g(y) \diff x \diff y \\ \iint\quad \iiint\quad \idotsint \end{gather*} \end{example} \section{数学符号的字体控制}\label{sec:math-fonts} \subsection{数学字母字体}\label{subsec:math-alpha} \mathindex{mathrm,mathsf,mathtt,mathit,mathbf,mathcal,mathnormal} \cmdindex[amssymb]{mathbb,mathfrak} \cmdindex[mathrsfs]{mathscr} \LaTeX{} 允许一部分数学符号切换字体,主要是拉丁字母、数字、大写希腊字母以及重音符号等。 表 \ref{tbl:math-fonts} 给出了切换字体的命令。某一些命令需要字体宏包的支持。 \begin{example} % \usepackage{amssymb} $\mathcal{R} \quad \mathfrak{R} \quad \mathbb{R}$ \[\mathcal{L} = -\frac{1}{4}F_{\mu\nu}F^{\mu\nu}\] $\mathfrak{su}(2)$ and $\mathfrak{so}(3)$ Lie algebra \end{example} \begin{table}[htp] \centering \caption{数学字母字体} \label{tbl:math-fonts} \begin{tabular}{*{3}{l}} \hline \textbf{示例} & \textbf{命令} & \textbf{依赖的宏包}\\ \hline $\mathnormal{ABCDE abcde 1234}$ & \cmd{mathnormal}\marg*{\ldots}& \\ $\mathrm{ABCDE abcde 1234}$ & \cmd{mathrm}\marg*{\ldots} & \\ $\mathit{ABCDE abcde 1234}$ & \cmd{mathit}\marg*{\ldots} & \\ $\mathbf{ABCDE abcde 1234}$ & \cmd{mathbf}\marg*{\ldots} & \\ $\mathsf{ABCDE abcde 1234}$ & \cmd{mathsf}\marg*{\ldots} & \\ $\mathtt{ABCDE abcde 1234}$ & \cmd{mathtt}\marg*{\ldots} & \\ $\CMcal{ABCDE}$ & \cmd{mathcal}\marg*{\ldots} & 仅提供大写字母 \\ \hline $\EuScript{ABCDE}$ & \cmd{mathcal}\marg*{\ldots} & \pkg{eucal} 仅提供大写字母 \\ $\mathscr{ABCDE}$ & \cmd{mathscr}\marg*{\ldots} & \pkg{mathrsfs} 仅提供大写字母\\ $\mathfrak{ABCDE abcde 1234}$ & \cmd{mathfrak}\marg*{\ldots} & \pkg{amssymb} 或 \pkg{eufrak} \\ $\mathbb{ABCDE}$ & \cmd{mathbb}\marg*{\ldots} & \pkg{amssymb} 仅提供大写字母 \\ \hline \end{tabular} \end{table} 一般来说,不同的数学字体往往带有不同的语义,如矩阵、向量等常会使用粗体或粗斜体,而数集常会使用 \cmd{mathbb} 表示。出于内容与格式分离以及方便书写的考虑,可以为它们定义新的命令。具体方法详见 \ref{subsec:newcmd} 小节。 \pkgindex{unicode-math} 如果需要为所有的数学符号切换字体,则需要直接调用数学字体宏包(见 \ref{subsec:font-pkgs} 小节)。在 \texttt{xelatex} 或者 \texttt{lualatex} 编译命令下,还可以使用基于 \pkg{fontspec} 宏包的 \pkg{unicode-math} 宏包配置 Unicode 数学字体,详见 \ref{subsec:unicode-math} 小节。 \subsection{加粗的数学符号}\label{subsec:math-bold} \cmdindex[amsmath]{boldsymbol} 表 \ref{tbl:math-fonts} 中的 \cmd{mathbf} 命令只能获得直立、加粗的字母。如果想得到粗斜体% \footnote{国内使用粗斜体符号表示矢量,见 GB/T 3102.11---1993。},可以使用 \pkg{amsmath} 宏包提供的 \amscmd{boldsymbol} 命令: \begin{example} $\mu, M \qquad \boldsymbol{\mu}, \boldsymbol{M}$ \end{example} \pkgindex{bm} \cmdindex[bm]{bm} 也可以使用 \pkg{bm} 宏包提供的 \cmd{bm} 命令: \begin{example} % \usepackage{bm} $\mu, M \qquad \bm{\mu}, \bm{M}$ \end{example} 在 \LaTeX{} 默认的数学字体中,一些符号本身并没有粗体版本,使用 \amscmd{boldsymbol} 也得不到粗体。 此时 \cmd{bm} 命令会生成“伪粗体”,尽管效果比较粗糙,但在某些时候也不失为一种解决方案。 \subsection{数学符号的尺寸}\label{subsec:math-styles} \mathindex{displaystyle,textstyle,scriptstyle,scriptscriptstyle} 数学符号按照符号排版的位置规定尺寸,从大到小包括行间公式尺寸、行内公式尺寸、上下标尺寸、次级上下标尺寸。 除了字号有别之外,行间和行内公式尺寸下的巨算符也使用不一样的大小。\LaTeX{} 为每个数学尺寸指定了一个切换的命令,见 \ref{tbl:math-size}。 \begin{table}[htp] \centering \caption{数学符号尺寸}\label{tbl:math-size} \begin{tabular}{lll} \hline \textbf{命令} & \textbf{尺寸} & \textbf{示例} \\ \hline \cmd{displaystyle} & 行间公式尺寸 & $\displaystyle\sum a $\\ \cmd{textstyle} & 行内公式尺寸 & $\textstyle\sum a $ \\ \cmd{scriptstyle} & 上下标尺寸 & $\scriptstyle a$ \\ \cmd{scriptscriptstyle} & 次级上下标尺寸 & $\scriptscriptstyle a$\\ \hline \end{tabular} \end{table} 我们通过以下示例对比行间公式和行内公式的区别。在分式中,分子分母默认为行内公式尺寸,示例中将分母切换到行间公式尺寸: \begin{example} \[ r = \frac {\sum_{i=1}^n (x_i- x)(y_i- y)} {\displaystyle \left[ \sum_{i=1}^n (x_i-x)^2 \sum_{i=1}^n (y_i-y)^2 \right]^{1/2} } \] \end{example} \section{定理环境}\label{sec:theorems} \subsection{\LaTeX{} 原始的定理环境}\label{subsec:latex-theorems} \cmdindex{newtheorem} 使用 \LaTeX{} 排版数学和其他科技文档时,会接触到大量的定理、证明等内容。 \LaTeX{} 提供了一个基本的命令 \cmd{newtheorem} 提供定理环境的定义: \begin{command} \cmd{newtheorem}\marg{theorem environment}\marg{title}\oarg{section-level} \\ \cmd{newtheorem}\marg{theorem environment}\oarg{counter}\marg{title} \end{command} \Arg{theorem environment} 为定理环境的名称。原始的\LaTeX{} 里\textbf{没有现成的定理环境}, 不加定义而直接使用很可能会出错。\Arg{title} 是定理环境的标题(“定理”,“公理”等)。 定理的序号由两个可选参数之一决定,它们\textbf{不能同时使用}: \begin{itemize} \item \Arg{section level} 为章节级别,如 \texttt{chapter}、\texttt{section} 等,定理序号成为章节的下一级序号; \item \Arg{counter} 为用 \cmd{newcounter} 自定义的计数器名称(详见 \ref{sec:counters} 节),定理序号由这个计数器管理。 \end{itemize} 如果两个可选参数都不用的话,则使用默认的与定理环境同名的计数器。 在以下示例代码中,我们定义了一个 \env{mythm} 环境,其序号设为 \texttt{section} 的下一级序号。 注意 \env{mythm} 环境的可选参数以及 \cmd{label} 的用法: \begin{example} \newtheorem{mythm}{My Theorem}[section] \begin{mythm}\label{thm:light} The light speed in vacuum is $299,792,458\,\mathrm{m/s}$. \end{mythm} \begin{mythm}[Energy-momentum relation] The relationship of energy, momentum and mass is \[E^2 = m_0^2 c^4 + p^2 c^2\] where $c$ is the light speed described in theorem \ref{thm:light}. \end{mythm} \end{example} \subsection{\pkg{amsthm} 宏包}\label{subsec:amsthm} \LaTeX{} 默认的定理环境格式为粗体标签、斜体内容、定理名用小括号包裹。如果需要修改格式, 则要依赖其它的宏包,如 \pkg{amsthm}、\pkg{ntheorem} 等等。本小节简单介绍一下 \pkg{amsthm} 的用法。 \pkgindex{amsthm} \cmdindex[amsthm]{theoremstyle} \pkg{amsthm} 提供了 \cmd{theo\-rem\-style} 命令支持定理格式的切换, 在用 \cmd{new\-theo\-rem} 命令定义定理环境之前使用。 \pkg{amsthm} 预定义了三种格式用于 \cmd{theo\-rem\-style}:\texttt{plain} 和 \LaTeX{} 原始的格式一致; \texttt{defi\-ni\-tion} 使用粗体标签、正体内容;\texttt{remark} 使用斜体标签、正体内容。 另外 \pkg{amsthm} 还支持用带星号的 \cmd{new\-theo\-rem*} 定义不带序号的定理环境: \begin{verbatim} \theoremstyle{definition} \newtheorem{law}{Law} \theoremstyle{plain} \newtheorem{jury}[law]{Jury} \theoremstyle{remark} \newtheorem*{mar}{Margaret} \end{verbatim} \theoremstyle{definition} \newtheorem{law}{Law} \theoremstyle{plain} \newtheorem{jury}[law]{Jury} \theoremstyle{remark} \newtheorem*{mar}{Margaret} 以上例子定义的 \env{jury} 环境与 \env{law} 环境共用编号,\env{mar} 环境不编号: \begin{example} \begin{law}\label{law:box} Don't hide in the witness box. \end{law} \begin{jury}[The Twelve] It could be you! So beware and see law~\ref{law:box}.\end{jury} \begin{jury} You will disregard the last statement.\end{jury} \begin{mar}No, No, No\end{mar} \begin{mar}Denis!\end{mar} \end{example} \pkg{amsthm} 还支持使用 \cmd{new\-theorem\-style} 命令自定义定理格式, 更为方便使用的是 \pkg{ntheorem} 宏包。感兴趣的读者可参阅它们的帮助文档。 \subsection{证明环境和证毕符号}\label{subsec:proof} \envindex[amsthm]{proof} \pkg{amsthm} 还提供了一个 \env{proof} 环境用于排版定理的证明过程。\env{proof} 环境末尾 自动加上一个 \qedsymbol{} 证毕符号: \begin{example} \begin{proof} For simplicity, we use \[ E=mc^2 \] That's it. \end{proof} \end{example} \cmdindex[amsthm]{qedhere} 如果行末是一个不带编号的公式,\qedsymbol{} 符号会另起一行, 这时可使用 \cmd{qedhere} 命令将 \qedsymbol{} 符号放在公式末尾: \begin{example} \begin{proof} For simplicity, we use \[ E=mc^2 \qedhere \] \end{proof} \end{example} \cmd{qedhere} 对于 \amsenv{align*} 等环境也有效: \begin{example} \begin{proof} Assuming $\gamma = 1/\sqrt{1-v^2/c^2}$, then \begin{align*} E &= \gamma m_0 c^2 \\ p &= \gamma m_0v \qedhere \end{align*} \end{proof} \end{example} 在使用带编号的公式时,建议最好\textbf{不要在公式末尾使用} \cmd{qedhere} 命令。 对带编号的公式使用 \cmd{qedhere} 命令会使 \qedsymbol{} 符号放在一个难看的位置,紧贴着公式: \begin{example} \begin{proof} For simplicity, we use \begin{equation} E=mc^2.\qedhere \end{equation} \end{proof} \end{example} 在 \amsenv{align} 等环境中使用 \cmd{qedhere} 命令会使 \qedsymbol{} 盖掉公式的编号;使用 \env{equation} 嵌套 \amsenv{aligned} 等环境时,\cmd{qedhere} 命令会将 \qedsymbol{} 直接放在公式后。这些位置都不太正常。 证毕符号 \qedsymbol{} 本身被定义在命令 \cmd{qedsymbol} 中,如果有使用实心符号作为证毕符号的需求,需要自行用 \cmd{re\-new\-comm\-and} 命令修改(用法见 \ref{subsec:newcmd} 小节)\footnote{注意,这个改法\textbf{只对 \pkg{amsthm} 宏包适用}。 其它宏包如 \pkg{ntheorem} 等须参考帮助文档里提供的修改方法。}。 我们可以利用在 \ref{subsec:rules} 小节介绍的标尺盒子来生成一个适当大小的“实心矩形”: \begin{example} \renewcommand{\qedsymbol}% {\rule{1ex}{1.5ex}} \begin{proof} For simplicity, we use \[ E=mc^2 \qedhere \] \end{proof} \end{example} \endinput