摘要
本课讲解如何进入数学模式、如何有分寸地离开它。课程说明数学模式与文本相比有哪些变化:字母作为变量以斜体排版,源代码中的空格不起作用,引擎按每个符号的类别计算间距,空行被禁止,有些符号只存在于两种模式之一;说明为什么变量不用 \textit 书写,以及在 LuaLaTeX 中写在其模式之外的数学符号会发生什么。课程介绍行内公式,用 $…$ 和 \(…\) 书写,其高度受限、公式内部的断行、波浪号与标点;行间公式,用 \[…\] 以及 equation 和 equation* 环境书写,它们是句子的一部分,同样要加标点,并说明为什么不用 $$…$$,也不在其前留空行;编号,用 \label、\eqref、\numberwithin 和 \tag;公式中的文字,用 \text 和 \mathrm,以及显式空白;数学模式中的小数点与逗号,以及处理数字和单位的 siunitx 宏包。最后列出日志文件中所写的典型错误,以及最好避免的做法。
学习目标
- 说明数学模式与文本相比有哪些变化,并预测在错误模式中写下的变量、单词或符号会得到什么结果。
- 在行内公式和行间公式之间作出选择,并把每一种都作为句子的一部分来写,带有其标点,不留不当的空行。
- 用
equation为行间公式编号,用\eqref引用它们,并预测\numberwithin和\tag产生的编号。 - 按照中文科技文献的惯例书写小数和带单位的量,了解数学模式如何处理小数点和逗号。
- 根据日志文件诊断“
Missing $ inserted”“Bad math environment delimiter”和“Missing character”等错误,并在源代码中找到其原因。
两种排版模式
到目前为止,引擎排版的是文本:由空格分隔的单词,分布到各行和各段中。公式遵循另一套规则,因此 LaTeX 在一个独立的数学模式中排版公式,用定界符进入和离开这个模式。进入之后变化很多,值得在讨论定界符之前先一一列出,因为本课几乎所有的建议都由此推出。
- 字母以专用的斜体排版,即变量的斜体,其宽度和间距是为了让人把它们当作符号而不是单词来读的。
- 源代码中的空格不起作用:
$x=a-b$和$x = a - b$得到完全相同的结果。间距由引擎按每个符号的类别计算:普通符号(字母、数字)、二元运算符(+、-)、关系符(=、<)、标点(逗号)、开符号和闭符号(括号)。 - 不允许出现空行:空行结束段落,而公式不能在段落结束时仍然开着。
- 有些符号只存在于两种模式之一:构成上标和下标的
^和_,以及\alpha之类的希腊字母,属于数学模式;带重音的拉丁字母(如 é)属于文本。汉字在 luatexja 下两种模式都能排出,但在数学模式中它们仍然不是变量。
第二行和第三行完全相同,尽管它们的源代码不同。在 $x=a-b$ 中,减号是二元的,因为两边各有一个运算对象,于是得到中等间距;在 $y=-b$ 的等号之后,减号左边没有运算对象,被当作一元符号处理,紧贴着 b。第一行作为文本排版,什么也不区分:连字符就是连字符,等号两边没有间距。
为什么变量不用 textit 书写
由上可知,文本的斜体和数学模式的斜体不是一回事。\textit{x} 得到的是文本斜体中的一个字母,没有引擎赋予符号的间距;而在数学模式中写下的拉丁字母单词并不是单词,而是一串相乘的变量,每个都有自己的间距。
第一行中的间距只是作者敲入的空格,符号来自正文字体;字母也是文本斜体,字形与公式中的不同。在公式中,引擎则在等号和大于号两侧各加上关系符的间距。第三行中的“GDP”被读成三个变量的乘积,字母间距不匀。汉字的情况不同:luatexja 会把数学模式中的汉字照常排出,所以 $成本 = 价格 - 折扣$ 看上去并无异样;但这只是 luatexja 的便利,不是数学模式本身的行为,公式中的文字仍应放在 \text 中。来自 amsmath 宏包的 \text 命令将在本课后面讲解。
在模式之外的数学符号
在 pdfLaTeX 中,把 \alpha 写在正文里会产生错误“Missing $ inserted”。在本课程使用的引擎 LuaLaTeX 中则不会:希腊字母不报错地排出,但结果难以预料。如果文档中还没有排过任何公式,它就消失;如果已经排过公式,它就出现,取自数学字体,并且由于命令后的空格被吞掉,与后面的文字紧贴在一起。
第一句毫无可见警告地丢掉了这个字母;第三句碰巧保留了它,紧贴着“是”,没有公式与汉字之间应有的间距。唯一的痕迹在日志文件中,而且只有第一句的:
Missing character: There is no ^^K (U+000B) in font nullfont!源代码中 \alpha 后面的空格结束了命令名,随即被吞掉;这个空格不能省略,因为在 LuaLaTeX 中汉字也算字母,\alpha是 会被读成一个未定义的命令名。由此可见,在 LuaLaTeX 中,写在模式之外的数学符号不会被报告:必须始终把它写在定界符之间,并且在认定文档完成之前,最好在日志中搜索“Missing character”。
正在加载内容…
已完成
登录账户以保存您的进度