1. LaTeX 的基本概念

欢迎使用 LaTeX! 本章开头用简短的篇幅介绍了 LaTeX 的来源,然后介绍了 LaTeX 源代码的写法,如何编译 LaTeX 源代码生成文档,以及理解接下来的章节所必须的一些知识。

1.1 概述

1.1.1 TeX

TeX 是高德纳(Donald E. Knuth) 开发的、以排版文字和数学公式为目的的软件。1977 年,正在编写著作《计算机程序设计艺术》的高德纳,意图扭转排版质量每况愈下的状况,以免影响他的出书,于是开始开发 TeX,以发掘当时开始用于出版工业的数字印刷设备的潜力。TeX 排版引擎发布于 1982 年,在 1989 年又加以改进以更好地支持 8-bit 字符和多语言排版。TeX 以其 卓越的稳定性、跨平台、几乎没有 bug 而著称。TeX 的版本号不断趋近于 π,当前为 3.141592653。

TeX 读作 “Tech”,其中 “ch” 的发音类似于 “h”,与汉字“泰赫”的发音相近。TeX 的拼写来自希腊词语 τεχνική (technique, 技术) 的开头几个字母。在 ASCII 字符环境,写作 TeX。

1.1.2 LaTeX

LaTeX 是一种格式(format)。为免误会,初次接触这一概念的读者可以粗略地将 LaTeX 理解成是对 TeX 的一层封装。LaTeX 使用 TeX 程序作为自己的排版引擎。LaTeX 最初的设计目标是分离内容与格式,以便作者能够无需关注版式设计,只需专注与内容创作就能得到高质量排版的作品。最初的开发者是 Leslie Lamport 博士,当前 LaTeX 由 LaTeX3 工作组维护。

LaTeX 读作 “Lah-tech” 或者 “Lay-tech”,与汉字“拉泰赫”或“雷泰赫”的发音相近。在 ACCII 字符环境写作 LaTeX。当前的 LaTeX 版本为LaTeX2ε,意思是超出了第二版,但还远未没达到第三版,在 ASCII 字符环境写作 LaTeX2e。

1.1.3 LaTeX 的优缺点

经常有人喜欢对比 LaTeX 和以 MicroSoft Office Word 为代表的“所见即所得”(What You see Is What You Get)字处理工具。这种对比是没有意义的,因为 TeX 是一个排版引擎,LaTeX 是其封装,而 Word 是字处理工具。二者的设计目标不一致,也各自有自己的适用范围。

不过,这里仍旧总结 LaTeX 的一些优点:

  • 具有专业的排版输出能力,产生的文档看上去就像“印刷品”一样。
  • 具有方便而强大的数学公式排版能力,无出其右者。
  • 绝大多数时候,用户只需专注于一些组织文档结构的基础命令,无需(或很少)操心文档 的版面设计。
  • 很容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。
  • 强大的可扩展性。世界各地的人开发了数以千计的 LaTeX 宏包用于补充和扩展 LaTeX 的功能。本手册附录中的 B.3 小节可见一瞥。
  • 能够促使用户写出结构良好的文档——而这也是 LaTeX 存在的初衷。
  • LaTeX 和 TeX 及相关软件是跨平台、免费、开源的。

LaTeX 的缺点也是显而易见的:

  • 入门门槛高。本手册的副标题叫做“110 分钟了解 LaTeX2e”,实际上 110 是本手册正文部分(包括附录)的页数。如果你以平均一页一分钟的速度看完了本手册,你只是粗窥门径而已,离学会它还很远。
  • 不容易排查错误。LaTeX 作为一个依靠编写代码工作的排版工具,其使用的宏语言比 C++ 或 Python 等程序设计语言在错误排查方面困难得多。它虽然能够 提示错误,但不提供调试的机制,有时错误提示还很难理解。
  • 不容易定制样式。LaTeX 提供了一个基本上良好的样式,为了让用户不去关注样式而专注于文档结构。但如果想要改进 LaTeX 生成的文档样式则是十分困难。
  • 相比“所见即所得”的模式有一些不便,为了查看生成文档的效果,用户总要不停地编译。

1.2 第一次使用 LaTeX

源代码 1.1 是一份最短的 LaTeX 源代码示例。

\documentclass{article}
\begin{document}
"Hello World!" from \LaTeX
\end{document}

源代码 1.1:LaTeX 的一个最简单的源代码示例。

这里首先介绍如何编译使用这份源代码,在后续小节中再介绍源代码的细节。

你可以将这份源代码保存为 helloworld.tex,而后编译。具体来说:

  • 如果使用 TeXworks! 或 TeXstudio 等编辑器,你可以使用编辑器提供的“编译”按钮或者 “排版”按钮。建议将编译命令设置为 “XeLaTeX”。
  • 如果使用命令行方式进行编译,则需打开 Windows 命令提示符或者 Linux/MacOS 的终端,在源代码所在的目录下输入命令:

xelatex helloworld

如果编译成功,可以在 helloworld.tex 所在的目录,看到生成的 helloworld.pdf 以及一些其它文件。

1.3 LaTeX 命令和代码结构

LaTeX 的源代码为文本文件。这些文本除了文字本身,还包括各种命令,用在排版公式、划 分文档结构、控制样式等等不同的地方。

1.3.1 LaTeX 命令和环境

LaTeX 中命令以反斜线 \ 开头,为以下两种形式之一:

  • 反斜线和后面的一串字母,如 \LaTeX。它们以任意非字母符号(空格、数字、标点等)为界限。
  • 反斜线和后面的单个非字母符号,如$。

要注意 LaTeX 命令是对大小写敏感的,比如输入 \LaTeX 命令可以生成错落有致的 LaTeX 字母组合,但输入 \Latex 或者 \LaTex 什么都得不到,还会报错;它们与 \LaTeX 是不同的命令。

字母形式的 LaTeX 命令忽略其后的所有连续空格。如果要人为引入空格,需要在命令后面加一对花括号阻止其忽略空格:

Shall we call our ourselves
\TeX users

or \TeX{} users?

一些 LaTeX 命令可以接收一些参数,参数的内容会影响命令的效果。LaTeX 的参数分为可选参数和必选参数。可选参数以方括号 [ 和 ] 包裹;必选参数一般以花括号 { 和 } 包裹。还有些命令可以带一个星号 *,带星号和不带星号的命令效果有一定差异。初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数。

LaTeX 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素。LaTeX 环境的用法为一对命令 \begin 和 \end:

\begin{(environment name)} [(optional arguments)]{(mandatory arguments)}

...

\end{(environment name)}

其中 (environment name) 为环境名,\begin 和 \end 中填写的环境名应当一致。类似命令, {(mandatory arguments)} 和 [(optional arguments)] 为环境所需的必选和可选参数。LaTeX 环境可能需要一个或多个必选/可选参数,也可能完全不需要参数。部分环境允许嵌套使用。

有些命令(如 \bfseries)会对其后所有内容产生作用。若要限制其作用范围,则需要使用 分组。LaTeX 使用一对花括号 { 和 } 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容。上文 提到的 LaTeX 环境隐含了一个分组,在环境中的命令被包裹在分组内。 5.1.1 和 5.1.2 小节中介绍的修改字体和字号的命令用法,即属此类。

1.3.2 LaTeX 源代码结构

LaTeX 源代码以一个 \documentclass 命令作为开头,它指定了文档使用的文档类:

\documentclass{...}

\documentclass 命令有一个可选参数。可选参数会传递给相应的文档类,作为文档类的参数(见1.4.1)

document 环境当中的内容是文档正文。

\begin{document}
\section{...}
正文内容...
\end{document}

在 \documentclass 和 \begin{document} 之间的位置称为导言区。在导言区中一般会使用 \usepackage 调用宏包,以及会进行对文档的全局设置。

1.4 宏包和文档类

本节将仔细解释在 1.3.2 小节中出现的宏包和文档类的概念以及详细用法。

1.4.1 文档类

文档类规定了 LaTeX 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简 历等等。LaTeX 源代码的开头须用 \documentclass 指定文档类:

\documentclass[(options)]{(class-name)}

其中(class-name) 为文档类的名称,如 LaTeX 提供的 article, book, report ,在其基础上派生的一些文档类如支持中文排版的 ctexart / ctexbook / ctexrep 或者有其它功能的一些文档类, 如 moderncv / beamer 等。LaTeX 提供的基础文档类见表 1.1,其中前三个习惯上称为“标准文档类”。

表 1.1 LaTeX 提供的基础文档类。

article 文章格式的文档类,广泛用于科技论文、报告、说明文档等。
report 长篇报告格式的文档类,具有章节结构,用于综述、长篇论文、简单的书籍等。
book 书籍文档类,包含章节结构和前言、正文、后记等结构。
proc 基于 article 文档类的一个简单的学术文档模板。
slides 幻灯格式的文档类,使用无衬线字体。
minimal 一个极其精简的文档类,只设定了纸张大小和基本字号,用作代码测试的最小工作示例(Minimal Working Example)。

可选参数 (options) 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版:

\documentclass[11pt,twoside,a4paper]{article}

LaTeX 的三个标准文档类可指定的选项包括:

10pt, 11pt, 12pt 指定文档的基本字号。默认为 10pt。

a4paper, letterpaper, … 指定纸张大小,默认为美式信纸 letterpaper (8.5 × 11 英寸)。 可指定选项还包括 a5paper,b5paper,executivepaper 和 legalpaper。

twoside, onside 指定单面/双面排版。双面排版时,奇偶页的页眉页脚、页边距不同。article 和 report 默认为 oneside,book 默认为 twoside。

onecolumn, twocolumn 指定单栏􏳋双栏排版。默认为 onecolumn。

openright, openany 指定新的一章 \chaper 是在奇数页(右侧)开始,还是直接紧跟着上一页开始。report 默认为 openany,book 默认为 openright。对 article 无效。

landscape 指定横向排版。默认为纵向。

titlepage, notitlepage 指定标题命令 \maketitle 是否生成单独的标题页。article 默认为 notitlepage,report 和 book 默认为 titlepage。

flegn 令行间公式左对齐。默认为居中对齐。

leqno 将公式编号放在左边。默认为右边。

draft, final 指定草稿/终稿模式。草稿模式下,断行不良的地方会在行尾添加一个黑色方块。默认为 final。

1.4.2 宏包

在使用 LaTeX 时,时常需要依赖一些扩展来增强或补充 LaTeX 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等。这些扩展称为宏包。调用宏包的方法非常类似调用文档类的方法:

\usepackage[(options)]{(package-name)}

\usepackage 可以一次性调用多个宏包,在 (package-name) 中用逗号隔开。这种用法一般不要指定选项:

% 一次性调用三个排版表格常用的宏包
\usepackage{tabularx, makecell, multirow}

附录 B.3 汇总了常用的一些宏包。我们在手册接下来的章节中,也会穿插介绍一些最常用的宏包的使用方法。

在使用宏包和文档类之前,一定要首先确认它们是否安装在你的计算机中,否则 \usepackage 等命令会报错误。详见附录 A.2。

宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 LaTeX 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档:

texdoc (pkg-name)

其中 (pkg-name) 是宏包或者文档类的名称。更多获得帮助的方法见附录 B.2。

1.5 LaTeX 用到的文件一览

除了源代码文件 .tex 以外,我们在使用 LaTeX 时还可能接触到各种格式的文件。本节简单介绍一下在使用 LaTeX 时能够经常见到的文件。

每个宏包和文档类都是带特定扩展名的文件,除此之外也有一些文件出现于 LaTeX 模板中:

.sty 宏包文件。宏包的名称与文件名一致。

.cls 文档类文件。文档类名称与文件名一致。

.bib BiBTeX 参考文献数据库文件。

.bst 用到的参考文献格式模板。详见 6.1.4 小节。

LaTeX 在编译过程中除了生成 .dvi 或 .pdf 格式的文档外,还可能会生成相当多的辅助文件和日志。一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然 后再次编译时读入辅助文件得到正确的结果,所以复杂的 LaTeX 源代码可能要编译多次:

.log 排版引擎生成的日志文件,供排查错误使用。

.aux LaTeX 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等。

.toc LaTeX 生成的目录记录文件。

.lof LaTeX 生成的图片目录记录文件。

.lot LaTeX 生成的表格目录记录文件。

.bbl BiBTeX 生成的参考文献记录文件。

.blg LaTeX 生成的日志文件。

.idx LaTeX 生成的供 makeindex 处理的索引记录文件。

.ind LaTeX 处理 .idx 生成的用于排版的格式化索引文件。

.ilg makeindex 生成的日志文件。

.out hyperref 宏包生成的 PDF 书签记录文件。

1.6 文件的组织方式

当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难。将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对 的工作。可参考源代码 3.1 的写法。

LaTeX 提供了命令 \include 用来在源代码里插入文件:

\include{(filename)}

(filename) 为文件名,如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径,例如:

\include{chapera/a.tex} % 相对路径
\include{/hone/Bob/file.tex} % Linux / macOS 绝对路径
\include{D:/file.tex} % Windows 绝对路径,用正斜线

(filename) 可以不带扩展名,此时默认扩展名为 .tex。

值得注意的是 \include 在读入 (filename) 之前会另起一页。有的时候我们并不需要这样, 而是用 \input 命令,它纯粹是把文件里的内容插入:

\input{(filename)}

另外 LaTeX 提供了一个 \includeonly 命令来组织文件,用于导言区,指定只载入某些文件:

\includeonly{(filename1), (filename2), ...}

导言区使用了 \includeonly 后,正文中不在其列表范围的 \include 命令不会起效。

最后介绍一个实用的工具宏包 syntonly 。加载这个宏包后,在导言区使用 \syntonly 命令,可令 LaTeX 编译后不生成 DVI 或者 PDF 文档,只排查错误,编译速度会快不少:

\usepackage{syntonly}
\syntaxonly

如果想生成文档,则用 % 注释掉 \syntaxonly 命令即可。

1.7 LaTeX 和 TeX 相关的术语和概念

在本章的最后有必要澄清几个概念:

引擎 全称为排版引擎,是编译源代码并生成文档的程序,如 pdfTeX、XeTeX 等。有时也称为编译器。

格式 是定义了一组命令的代码集。LaTeX 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 plain TeX 格式,没有定义诸如 \documentclass 和 \section 等等命令。

编译命令 是实际调用的、结合了引擎和格式的命令。如 xelatex 命令是结合 xetex 引擎和 LaTeX 格式的一个编译命令。

常见的引擎、格式和编译命令的关系总结于表 1.2。

表 1.2 TeX 引擎、格式及其对应的编译命令。

文档格式 plain TeX 格式 LaTeX 格式
TeX 引擎 DVI tex N/A
pdfTeX 引擎 DVI etex latex
PDF pdftex pdflatex
XeTeX 引擎 PDF xetex xelatex
LuaTeX 引擎 PDF luatex lualatex

latex 编译命令和 LaTeX 格式往往容易混淆,在讨论关于 LaTeX 的时候需要明确。为避免混淆,本手册中的 LaTeX 一律指的是格式,编译命令则用等宽字体 latex 表示。

在此介绍一下几个编译命令的基本特点:

latex 虽然名为 latex 命令,底层调用的引擎其实是 pdfTeX。该命令生成 dvi (Device Independent) 格式的文档,用 dvipdfmx 命令可以将其转为 pdf。

pdflatex 底层调用的引擎也是 pdfTeX,可以直接生成 pdf 格式的文档。

xelatex 底层调用的引擎是 xetex,支持 UTF-8 编码和 TrueType / OpenType 字体。当前较为方便的中文排版解决方案基于 xelatex,详见 2.2 节。

lualatex 底层调用的引擎是 LuaTeX,这个引擎在 pdfTeX 引擎基础上发展而来,除了支持 UTF-8 编码和 TrueType / OpenType 字体外,还支持通过 Lua 语言扩展 TeX 的功能。 lualatex 编译命令下的中文排版支持需要借助 luatex-js 宏包。