跳至内容
Topos Uranos

摘要

本课讲解如何进入数学模式、如何有分寸地离开它。课程说明数学模式与文本相比有哪些变化:字母作为变量以斜体排版,源代码中的空格不起作用,引擎按每个符号的类别计算间距,空行被禁止,有些符号只存在于两种模式之一;说明为什么变量不用 \textit 书写,以及在 LuaLaTeX 中写在其模式之外的数学符号会发生什么。课程介绍行内公式,用 $…$ 和 \(…\) 书写,其高度受限、公式内部的断行、波浪号与标点;行间公式,用 \[…\] 以及 equation 和 equation* 环境书写,它们是句子的一部分,同样要加标点,并说明为什么不用 $$…$$,也不在其前留空行;编号,用 \label、\eqref、\numberwithin 和 \tag;公式中的文字,用 \text 和 \mathrm,以及显式空白;数学模式中的小数点与逗号,以及处理数字和单位的 siunitx 宏包。最后列出日志文件中所写的典型错误,以及最好避免的做法。

学习目标

  1. 说明数学模式与文本相比有哪些变化,并预测在错误模式中写下的变量、单词或符号会得到什么结果。
  2. 在行内公式和行间公式之间作出选择,并把每一种都作为句子的一部分来写,带有其标点,不留不当的空行。
  3. 用 equation 为行间公式编号,用 \eqref 引用它们,并预测 \numberwithin 和 \tag 产生的编号。
  4. 按照中文科技文献的惯例书写小数和带单位的量,了解数学模式如何处理小数点和逗号。
  5. 根据日志文件诊断“Missing $ inserted”“Bad math environment delimiter”和“Missing character”等错误,并在源代码中找到其原因。

两种排版模式

到目前为止,引擎排版的是文本:由空格分隔的单词,分布到各行和各段中。公式遵循另一套规则,因此 LaTeX 在一个独立的数学模式中排版公式,用定界符进入和离开这个模式。进入之后变化很多,值得在讨论定界符之前先一一列出,因为本课几乎所有的建议都由此推出。

  • 字母以专用的斜体排版,即变量的斜体,其宽度和间距是为了让人把它们当作符号而不是单词来读的。
  • 源代码中的空格不起作用:$x=a-b$ 和 $x = a - b$ 得到完全相同的结果。间距由引擎按每个符号的类别计算:普通符号(字母、数字)、二元运算符(+、-)、关系符(=、<)、标点(逗号)、开符号和闭符号(括号)。
  • 不允许出现空行:空行结束段落,而公式不能在段落结束时仍然开着。
  • 有些符号只存在于两种模式之一:构成上标和下标的 ^ 和 _,以及 \alpha 之类的希腊字母,属于数学模式;带重音的拉丁字母(如 é)属于文本。汉字在 luatexja 下两种模式都能排出,但在数学模式中它们仍然不是变量。
例题引擎按类别为符号安排间距
LaTeX 代码
作为文本:x=a-b, y=-b.​在数学模式中:$x=a-b$,$y=-b$。​源代码中换一种空格:$x   =   a-   b$,$y = - b$。
结果
结果

第二行和第三行完全相同,尽管它们的源代码不同。在 $x=a-b$ 中,减号是二元的,因为两边各有一个运算对象,于是得到中等间距;在 $y=-b$ 的等号之后,减号左边没有运算对象,被当作一元符号处理,紧贴着 b。第一行作为文本排版,什么也不区分:连字符就是连字符,等号两边没有间距。

为什么变量不用 textit 书写

由上可知,文本的斜体和数学模式的斜体不是一回事。\textit{x} 得到的是文本斜体中的一个字母,没有引擎赋予符号的间距;而在数学模式中写下的拉丁字母单词并不是单词,而是一串相乘的变量,每个都有自己的间距。

例题文本斜体、作为公式的单词与正确写法
LaTeX 代码
用 textit:\textit{f}(\textit{x}) = \textit{x} + 1,若 \textit{x} > 0。​作为公式:$f(x) = x + 1$,若 $x > 0$。​数学模式中的缩写:$GDP = C + I + G$。​作为文本:$\text{GDP} = C + I + G$。
结果
结果

第一行中的间距只是作者敲入的空格,符号来自正文字体;字母也是文本斜体,字形与公式中的不同。在公式中,引擎则在等号和大于号两侧各加上关系符的间距。第三行中的“GDP”被读成三个变量的乘积,字母间距不匀。汉字的情况不同:luatexja 会把数学模式中的汉字照常排出,所以 $成本 = 价格 - 折扣$ 看上去并无异样;但这只是 luatexja 的便利,不是数学模式本身的行为,公式中的文字仍应放在 \text 中。来自 amsmath 宏包的 \text 命令将在本课后面讲解。

在模式之外的数学符号

在 pdfLaTeX 中,把 \alpha 写在正文里会产生错误“Missing $ inserted”。在本课程使用的引擎 LuaLaTeX 中则不会:希腊字母不报错地排出,但结果难以预料。如果文档中还没有排过任何公式,它就消失;如果已经排过公式,它就出现,取自数学字体,并且由于命令后的空格被吞掉,与后面的文字紧贴在一起。

例题同一个希腊字母,出现三次
LaTeX 代码
第一:角 \alpha 是锐角。​第二:角 $\alpha$ 是锐角。​第三:角 \alpha 是锐角。
结果
结果

第一句毫无可见警告地丢掉了这个字母;第三句碰巧保留了它,紧贴着“是”,没有公式与汉字之间应有的间距。唯一的痕迹在日志文件中,而且只有第一句的:

编译日志
Missing character: There is no ^^K (U+000B) in font nullfont!

源代码中 \alpha 后面的空格结束了命令名,随即被吞掉;这个空格不能省略,因为在 LuaLaTeX 中汉字也算字母,\alpha是 会被读成一个未定义的命令名。由此可见,在 LuaLaTeX 中,写在模式之外的数学符号不会被报告:必须始终把它写在定界符之间,并且在认定文档完成之前,最好在日志中搜索“Missing character”。