本文内容来自一份 (不太) 简短的 LATEX2ε 介绍

本章对 TeX 与 LaTeX 的基本概念和整体结构作了简要介绍。首先说明了 TeX 与 LaTeX 的来源和优缺点。随后通过一个简单的 Hello, World 示例,展示了 LaTeX 文档的基本组成形式。

在此基础上,进一步介绍了 LaTeX 中的命令与环境,以及源代码在逻辑和结构上的组织方式。同时,对文档类与宏包的作用进行了说明,并列举了 LaTeX 编译过程中涉及的常见文件类型与文件组织方式。最后,对 TeX / LaTeX 中常见的术语和相关概念进行了集中说明。

本章旨在帮助读者对 LaTeX 建立整体性的认识,为后续章节中更深入的排版细节与宏包使用奠定基础。


概述

$\TeX{}$

$\TeX{}$是高德纳 (Donald E.~Knuth)为排版文字和数学公式而开发的软件。

$\LaTeX{}$

$\LaTeX{}$ 是一种使用 $\TeX{}$ 程序作为排版引擎的格式,可以粗略地将它理解成是对 $\TeX{}$ 的一层封装。 $\LaTeX{}$ 最初的设计目标是分离内容与格式,以便作者能够专注于内容创作而非版式设计,并能以此得到高质量排版的作品。$\LaTeX{}$ 起初由 Leslie Lamport 博士开发,目前由 $\LaTeX{}$ 工作组1进行维护。

$\LaTeX{}$ 的优缺点

优点:

  • 好看。
  • 具有方便而强大的数学公式排版能力。
  • 用户只需专注于组织文档结构的基础命令,无需操心文档的版面设计。
  • 容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。
  • 强大的可扩展性。数以千计的 $\LaTeX{}$ 宏包用于补充和扩展 $\LaTeX{}$ 的功能。
  • 能够促使用户写出结构良好的文档。
  • $\LaTeX{}$ 和 $\TeX{}$ 及相关软件是跨平台、免费、开源的。

缺点:

  • 入门门槛高。
  • 不容易排查错误。
  • 不容易定制样式。
  • 相比“所见即所得”的模式需要编译查看文档效果。

Hello, World

\documentclass{article}
\begin{document}
``Hello world!'' from \LaTeX.
\end{document}

这里首先介绍如何编译使用这份源代码,在后续小节中再介绍源代码的细节。可以将这份源代码保存为 helloworld.tex,而后编译。具体来说:

  • 如果使用 TeXworks 或 TeXstudio 等编辑器,可以使用编辑器提供的“编译”或“排版”按钮。建议使用 pdfLaTeXXeLaTeX 作为默认的编译方式。

  • 如果使用命令行方式进行编译,打开终端,在源代码所在的目录下输入:

    pdflatex helloworld
    

    或者

    xelatex helloworld
    

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

下面是排版中文的一个最简示例。编译的方式与上一份源代码相同,但需使用 XeLaTeX 编译方式。

\documentclass{ctexart}
\begin{document}
“你好,世界!”来自\LaTeX{} 的问候。
\end{document}

$\LaTeX{}$ 命令和代码结构

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

$\LaTeX{}$ 命令和环境

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

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

  • 反斜线和后面的单个非字母符号,如 \$

注意 $\LaTeX{}$ 命令对大小写敏感,比如输入 \{LaTeX} 命令可生成错落有致的 $\LaTeX{}$ 字母组合,但输入 \{Latex}\{LaTex} 什么都得不到,还会报错。

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

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

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

\begin{<environment name>}[<optional arguments>]{<mandatory arguments>}
...
\end{<environment name>}

有些命令(如 \bfseries)会对其后所有内容产生作用。若要限制其作用范围,则需要使用分组。$\LaTeX{}$ 使用一对花括号{ } 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容3。上文提到的环境隐含了一个分组,在环境中的命令被包裹在分组内。

$\LaTeX{}$ 源代码结构

$\LaTeX{}$ 源代码以一个 \{documentclass} 命令作为开头,它指定了文档使用的文档类document 环境当中的内容是文档正文。 在 \documentclass\begin{document} 之间的位置称为导言区。 在导言区中常会使用 \usepackage{} 命令调用宏包,还会进行文档的全局设置。

\documentclass{...}  % ... 为某文档类
% 导言区
\usepackage{comment}
\begin{document}
% 正文内容
\end{document}
% 此后内容会被忽略

$\LaTeX{}$ 宏包和文档类

文档类

文档类规定了 $\LaTeX{}$ 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等。$\LaTeX{}$ 源代码的开头须用\documentclass指定文档类: \documentclass[<options>]{<class-name>} 其中<class-name>为文档类的名称,如 $\LaTeX{}$ 提供的 articlereportbook,在其基础上派生的一些文档类,如支持中文排版的 ctexartctexrepctexbook,或者有其它功能的文档类,如 moderncvbeamer 等。$\LaTeX{}$ 提供的基础文档类见下表,其中前三个习惯上称为“标准文档类”。

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

可选参数 <options> 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版: \documentclass[11pt,twoside,a4paper]{article}

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

options含义
10pt, 11pt, 12pt指定文档的基本字号。默认为 10pt
a4paper,letterpaper指定纸张大小
twoside, oneside指定单面/双面排版。双面排版时,奇偶页的页眉页脚、页边距不同。articlereport 默认为 onesidebook 默认为 twoside
onecolumn, twocolumn指定单栏/双栏排版。默认为 onecolumn
openright, openany指定新的一章 chapter 是在奇数页(右侧)开始,还是直接紧跟着上一页开始。report 默认为 openanybook 默认为 openright。对 article 无效
landscape指定横向排版。默认为纵向
titlepage, notitlepage指定标题命令 \maketitle 是否生成单独的标题页。article默认为 notitlepagereportbook 默认为 titlepage
fleqn令行间公式左对齐。默认为居中对齐
leqno将公式编号放在左边。默认为右边
draft, final指定草稿/终稿模式。默认为 final

宏包

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

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

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

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

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

texdoc <pkg-name>

其中 <pkg-name}> 是宏包或者文档类的名称。


$\LaTeX{}$ 用到的文件一览

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

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

.sty宏包文件。宏包的名称与文件名一致
.cls文档类文件。文档类名称与文件名一致
.bib参考文献数据库文件
.bst用到的参考文献格式模板

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

中间文件作用
.log排版引擎生成的日志文件,供排查错误使用
.aux生成的主辅助文件,记录交叉引用、目录、参考文献的引用等
.toc生成的目录记录文件
.lof生成的图片目录记录文件
.lot生成的表格目录记录文件
.bblBibTeX生成的参考文献记录文件
.blgBibTeX生成的日志文件
.idx生成的供 makeindex 处理的索引记录文件
.indmakeindex 处理 .idx 生成的用于排版的格式化索引文件
.ilgmakeindex 生成的日志文件
.outhyperref 宏包生成的 PDF 书签记录文件

文件的组织方式

当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难。将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作。 $\LaTeX{}$ 提供了命令 \include 用来在源代码里插入文件:

\include{<filename>}

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

\include{chapters/file} % 相对路径
\include{/home/Bob/file} % *nix(包含 Linux、macOS)绝对路径
\include{D:/file} % Windows 绝对路径,用正斜线

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

\input{<filename>}

当导言区内容较多时,常常将其单独放置在一个 .tex 文件中,再用 \input 命令插入。复杂的图、表、代码等也会用类似的手段处理。

$\LaTeX{}$ 还提供了一个 \includeonly 命令来组织文件,用于导言区,指定只载入某些文件。导言区使用了 \includeonly 后,正文中不在其列表范围的 \include 命令不会起效:

\includeonly{<filename1>,<filename2>,...}

需要注意的是,使用 \include\input 命令载入的文件名最好不要加空格和特殊字符,也尽量避免使用中文名,否则很可能会出错

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

\usepackage{syntonly}
\syntaxonly

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


$\LaTeX{}$ 和 $\TeX{}$ 相关的术语和概念

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

  • 引擎 全称为排版引擎,是编译源代码并生成文档的程序,如 pdfTeXXeTeX等 。有时也称为编译器
  • 格式 是定义了一组命令的代码集(类似于库函数)。$\LaTeX{}$ 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 plain TeX 格式,没有定义诸如 \documentclass\section 等命令。
  • 编译命令 是实际调用的、结合了引擎和格式的命令。如 xelatex 命令是结合 XeTeX引擎和 $\LaTeX{}$ 格式的一个编译命令(类似于编译并链接库函数的过程)。

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

文档格式plain TeX 格式LaTeX 格式
TeX 引擎DVItexN/A
pdfTeX 引擎DVIetexlatex
PDFpdftexpdflatex
XeTeX 引擎PDFxetexxelatex
LuaTeX 引擎PDFluatexlualatex

latex 编译命令和 $\LaTeX{}$ 格式往往容易混淆,在讨论关于 $\LaTeX{}$ 的时候需要明确。

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

编译命令解释
latex虽然名为 latex 命令,底层调用的引擎其实是 pdfTeX。 该命令生成 dvi 格式的文档, 用 dvipdfmx 命令可以将其转为 pdf
pdflatex底层调用的引擎也是 pdfTeX,可以直接生成 pdf 格式的文档
xelatex底层调用的引擎是 XeTeX,支持 UTF-8 编码和对 TrueType/OpenType 字体的调用。当前较为方便的中文排版解决方案基于 xelatex
lualatex底层调用的引擎是 LuaTeX。这个引擎在 pdfTeX 引擎基础上发展而来,除了支持 UTF-8 编码和对 TrueType/OpenType 字体的调用外,还支持通过 Lua 语言扩展 $\TeX{}$ 的功能。 lualatex 编译命令下的中文排版支持需要借助 luatexja宏包

  1. https://www.latex-project.org ↩︎

  2. 以单个字符作为命令的参数时,可以不加括号。例如,在数学环境下,\frac12\frac{1\}\{2} 的效果是一样的。 ↩︎

  3. 个别命令在分组内仍然会产生全局作用,例如\setcounter 等命令。 ↩︎

  4. 使用多个宏包时指定选项,相当于给每个宏包指定同样的选项。如果有某个宏包不能识别指定的选项,则会出错。 ↩︎

  5. $\LaTeX{}$ 2020-10-01 版本之后允许添加扩展名。 ↩︎