LaTeX
本教程的目的
本教程旨在帮助你熟悉 LaTeX 的基础知识。
在开始之前,请确保你已经在计算机上安装了 LaTeX(有关所需安装的详细说明,请参见安装章节)。
我们将首先介绍 LaTeX 语法。 接着,我们将创建我们的第一个 LaTeX 文档。 然后,我们将指导你如何通过 LaTeX 系统处理该文件,以生成高质量的输出,如 PostScript 或 PDF。 最后,我们将了解文件名和文件类型。
LaTeX 语法
使用 LaTeX 时,你编写一个纯文本文件,描述文档的结构和排版。LaTeX 会将这些源文本与标记结合,转换为排版文档。为了类比,网页的工作方式类似:HTML 用来描述文档,浏览器将其渲染为屏幕输出,显示不同的颜色、字体、大小等。
你可以使用任何文本编辑器创建 LaTeX 输入文件。一个最简单的示例如下所示(命令将在后面解释):
\documentclass{article}
\begin{document}
Hello world!
\end{document}
空格
LaTeX 会标准化其输入文件中的空格字符,因此空格或制表符等字符会统一视为一个空格。多个连续空格被视为一个空格,行首的空格通常会被忽略,一个换行也会产生一个空格。多个换行(空行)定义一个段落的结束。以下是这些规则应用的示例:左侧显示用户输入(.tex 文件),右侧显示渲染输出(.dvi、.pdf、.ps 文件)。
你输入一个或多个空格都没有关系:
enter one or several spaces
一个空行开始一个新段落:
An empty line starts a new
paragraph.
保留字符
以下符号是 LaTeX 中的保留字符,它们要么有特殊的意义,要么在所有字体中都不可用。如果你直接在文本中输入这些字符,它们通常不会打印,而是会让 LaTeX 执行你不希望发生的操作。
# $ % ^ & _ { } ~ \
如你所见,通过在这些字符前添加反斜杠 \
,你仍然可以在文档中使用它们:
\# \$ \% \^{} \& \_ \{ \} \~{} \textbackslash{}
在某些情况下,方括号 [ ]
也被视为保留字符,因为它们用于为某些命令提供可选参数。如果你想在某个命令后直接输出这些字符,如在这种情况中:\command [text]
,它会失败,因为 [text]
会被视为传递给 \command
的选项。你可以通过以下方式获得正确的输出:\command {} [text]
。
反斜杠字符 \
不能通过在前面添加另一个反斜杠 \\
来输入;这个序列用于换行。为了在数学模式中引入反斜杠,可以使用 \backslash
。
命令 \~
和 \^
分别生成波浪符和帽符,这些符号会放置在后面的字母上。例如,\~n
生成 ñ
。这就是为什么你需要使用大括号来指定没有字母作为参数的情况。你也可以使用 \textasciitilde
和 \textasciicircum
来输入这些字符,或者使用其他命令。
如果你想插入可能包含多个特殊符号的文本(如 URI),可以考虑使用 \verb
命令,稍后会在格式化章节中讨论。对于源代码,参见源代码列表。
小于 <
和大于 >
字符是唯一不会正确打印的可见 ASCII 字符(不是保留字符)。详见特殊字符部分,了解解释和解决方法。
对于大多数非 ASCII 字符(例如重音符号、变音符号),可以直接输入。但你必须正确配置文档。其他符号和更多字符可以通过特殊命令打印,例如在数学公式中或作为重音符号。我们将在特殊字符部分详细讨论这个问题。
LaTeX 组
有时某些状态应当保持局部有效,换句话说,其作用范围应当有限。这可以通过将需要局部改变的部分用大括号括起来来实现。在某些情况下,使用大括号将无法实现局部作用。LaTeX 提供了 \bgroup
和 \egroup
来分别开始和结束一个组。
\documentclass{article}
\begin{document}
normal text {\itshape walzing \bfseries Wombat} more normal text
normal text \bgroup\itshape walzing \bfseries Wombat\egroup{} more normal text
\end{document}
环境隐式地形成一个组。
LaTeX 环境
在 LaTeX 中,环境的作用与命令类似,但它们通常会对文档的更大部分产生影响。它们的语法是:
\begin{environmentname}
text to be influenced
\end{environmentname}
在 \begin
和 \end
之间,你可以放置其他命令和嵌套的环境。环境的内部机制定义了一个组,这使得它的使用是安全的(不会影响文档的其他部分)。一般来说,环境也可以接受参数,但这一特性不常用,因此将在文档的更高级部分讨论。
LaTeX 中的所有内容都可以通过命令和环境来表示。
LaTeX 命令
LaTeX 命令是区分大小写的,通常有以下两种格式:
-
它们以反斜杠
\
开始,然后是由字母组成的命令名。 -
命令名以空格、数字或其他非字母字符为结束标志。
一些命令需要一个参数,该参数必须放在命令名后面的大括号 {}
中。有些命令支持可选参数,这些可选参数放在命令名后的方括号 []
中。一般语法如下:
\commandname[option1,option2,...]{argument1}{argument2}...
许多 LaTeX 格式化命令是成对出现的:
-
参数形式命令,其中一个参数是要格式化的文本。
-
范围形式命令,格式化将应用于命令后的所有文本,直到当前作用域结束。也就是直到当前组或环境结束。此形式有时也称为切换命令。范围形式命令可能仍然有参数,但格式化的文本不是参数。此形式几乎不应在任何作用域外部调用,否则它将作用于文档的其余部分。
混淆参数形式命令和对应的范围形式命令是一个非常常见的错误!
参数形式命令的参数比其对应的范围形式命令多一个,额外的参数是命令作用的文本。
示例:
强调文本:\emph
是一个参数形式命令,带有一个参数,即要强调的文本。\em
是对应的范围形式命令,没有参数。
\emph{emphasized text}, this part is normal % 正确
{\em emphasized text}, this part is normal % 正确
\emph emphasized text, this part is normal % 错误:命令没有参数
\em{emphasized text}, this part is normal % 错误:范围命令有参数
\em emphasized text, this part is normal % 危险:在任何环境外部使用范围命令
为文本着色:此示例要求你使用 \usepackage{xcolor}
。\textcolor
是一个参数形式命令,带有两个参数:颜色和要着色的文本。\color
是对应的范围形式命令,只有一个参数,即颜色。
By default, this text is black. \textcolor{red}{This is red text.} Back to black.
By default, this text is black. {\color{red}This is red text.} Back to black.
注释
当 LaTeX 在处理输入文件时遇到 %
字符时,它会忽略当前行的其余部分、换行符以及下一行开头的所有空白字符。
这可以用来在输入文件中写注释,这些注释不会显示在打印版本中。
This is an % stupid
% Better: instructive <----
example: Supercal%
ifragilist%
icexpialidocious
我们的第一个文档
现在我们可以创建我们的第一个文档了。我们将创建一个最基本的示例,足以生成一些输出;“Hello World!”方法非常适合这里。
打开你喜欢的文本编辑器。vim、emacs、Notepad++ 等文本编辑器都可以帮助你编写文件,并且提供语法高亮功能。
复制以下文本到你的编辑器中。这是 LaTeX 源代码:
% hello.tex - Our first LaTeX example!
\documentclass{article}
\begin{document}
Hello World!
\end{document}
保存文件为 hello.tex
。
确保文件名使用 .tex
扩展名。
这意味着什么?
-
% hello.tex - Our first LaTeX example!:这一行是注释,因为它以百分号符号(
%
)开头;当 LaTeX 看到它时,会忽略这一行。注释对于标注源文件的某些部分非常有用。例如,你可以在注释中写上作者和日期的信息,或者其他任何你希望添加的内容。 -
\documentclass{article}:这一行是一个命令,告诉 LaTeX 使用
article
文档类。文档类文件定义了排版的标准,在此例中是通用的文章格式。期刊、大学部门等可以提供这些文件,以确保符合出版标准。在许多情况下,相同的文档内容可以通过替换所需的文档类文件重新格式化,以便提交给不同的出版商。如果没有提供,可以选择许多通用的文档类文件。 -
\begin{document}:这一行开始了一个名为
document
的环境,告诉 LaTeX 文档内容即将开始。此命令之前的任何内容通常属于文档的前言部分。 -
Hello World!:这是唯一包含实际内容的行——我们希望在页面上显示的文本。
-
\end{document}:文档环境在这里结束,告诉 LaTeX 文档源代码已完成,之后的内容将被忽略。
如前所述,LaTeX 的每个命令都以反斜杠 \
开始。这是 LaTeX 的标记方式,当它看到反斜杠时,就会期望接收到某些命令。注释不被视为命令,因为它们只是告诉 LaTeX 忽略该行。只要在百分号前没有空格,注释永远不会影响文档的输出。
构建文档
接下来,我们将输入文件提交给 LaTeX 引擎,这是一个生成最终文档的程序。
现代有多个 LaTeX 引擎:lualatex
、xelatex
和 pdflatex
。这三者之间有一些重要区别,但我们将在其他地方讨论它们——任何一个都能用于构建我们的第一个文档。
生成文档
LaTeX 本身没有图形用户界面(GUI),尽管某些 LaTeX 安装可能包含一个图形前端,你可以通过点击来编译输入文件。假设你没有使用这样的工具:
-
打开终端,并导航到包含
.tex
文件的目录。 -
输入命令:
xelatex hello.tex
(虽然.tex
扩展名不是必须的,但你可以加上它)。 -
会显示关于 LaTeX 及其进度的各种信息。如果一切顺利,控制台最后两行将显示:
Output written on hello.pdf (1 page). Transcript written on hello.log.
这意味着你的源文件已经被处理,生成的文档名为
hello.pdf
。你可以使用系统上安装的任何 PDF 查看器来查看它。
由于文件的简洁性,这里只需要运行 LaTeX 命令一次。然而,如果你开始创建更复杂的文档,包括参考文献和交叉引用等,LaTeX 需要多次执行以解决引用问题。有关更多内容,将在之后的部分讨论。
自动构建系统
当你开始处理更复杂的文档时,编译可能变得非常棘手。有一些程序可以自动读取 LaTeX 文档,并运行相应的编译器多次。例如,latexmk
可以简单地从大多数 LaTeX 文件生成 PDF:
$ latexmk -pdf file.tex
请注意,大多数编辑器会为你处理这些任务。
历史版本的 LaTeX
LaTeX 和 TeX 创建的年代要早于可移植文档格式(PDF)的出现,因此,传统的 LaTeX 引擎 latex
会输出 DVI 格式,这是由 Donald Knuth 为设备无关的 TeX 输出设计的格式。虽然这种格式已经不再广泛使用,但你可以使用 LaTeX 发行版中的程序将其转换为更常见的输出格式:
-
dvips
将.dvi
文件转换为.ps
(PostScript)。 -
dvipdf
将.dvi
文件转换为.pdf
(dvipdfm
是改进版)。
你还可以发现 Ghostscript,这是一个免费且开源的工具集,用于处理 PostScript 文件。它的 ps2pdf
可以将 .ps
文件转换为 .pdf
,而 pdf2ps
则可以执行相反的操作。
LaTeX 源代码与可生成的格式之间的关系
下图展示了 LaTeX 源代码与可以从中生成的格式之间的关系:
框中的红色文本表示文件格式,箭头上的蓝色文本表示你需要使用的命令,框下的小深绿色文本表示支持的图像格式。每次你经过一个箭头时,你会丢失一些信息,这可能会降低文档的功能性。因此,你应该选择最短的路径以达到目标格式。这可能是获取所需格式输出的最方便的方式。从 LaTeX 源代码开始,最佳方式是仅使用 latex
生成 DVI 输出,或者仅使用 pdflatex
生成 PDF 输出,只有在需要打印文档时才将其转换为 PostScript。
请注意,使用 latex
生成 DVI 输出将无法使用 PDF 特有的功能,例如超链接和嵌入字体。
《导出为其他格式》章节将详细讨论如何将 LaTeX 源代码导出为其他文件格式。
文件
选择合适的文件名
绝对不要使用包含空格的目录(文件夹)或文件名。虽然你的操作系统可能支持空格,但有些系统不支持,它们只会给 TeX 带来麻烦。文件名可以根据需要设置得短或长,但必须避免使用空格。尽量使用小写字母(不带重音符的 a-z)、数字 0-9、连字符(-),以及仅使用一个句点(.)来分隔文件扩展名(有点类似于好的 Web URL 命名规范):这将让你更容易在 Web 上引用 TeX 文件,并使你的文件更具可移植性。某些操作系统区分大小写字母,而有些则不区分。因此,最好避免混合使用大小写字母。
附加文件
TeX 编译器是单次处理的过程。这意味着编译器无法跳过文档中的某些部分,这对目录和引用来说是非常有用的。事实上,编译器无法预测特定章节将打印到哪一页,因此当目录在即将到来的章节之前被打印时,它无法设置页码。
为了解决这个问题,许多需要跳转的 LaTeX 命令使用附加文件,这些文件通常与当前文档有相同的文件名,但扩展名不同。它将临时数据存储到这些文件中,并在下一次编译时使用它们。因此,要保持目录的最新状态,你需要编译文档两次。如果没有章节移动,则无需重新编译。
例如,目录数据的临时文件是 filename.toc
。
这些文件中没有无法恢复的信息。这意味着你可以安全地删除它们,重新编译时会自动重新生成它们。
LaTeX 中常见的文件扩展名
在使用 LaTeX 的各种功能(索引、词汇表、参考文献等)时,你很快会发现自己陷入了各种文件和扩展名的迷宫,可能还不清楚这些文件的作用。以下列表解释了在使用 TeX 时可能遇到的最常见文件类型:
-
.aux:一个传递信息的文件,用于将一个编译过程的信息传递到下一个过程。除了其他用途,.aux 文件用于存储与交叉引用相关的信息。
-
.bbl:由 BiBTeX 输出的参考文献文件,并由 LaTeX 使用。
-
.bib:参考文献数据库文件(用于存储完整的参考文献引用列表)。
-
.blg:BiBTeX 日志文件(记录错误)。
-
.bst:BiBTeX 样式文件。
-
.cls:类文件定义文档的外观。通过
\documentclass
命令选择。 -
.dtx:文档化 TeX 文件,这是 LaTeX 样式文件的主要分发格式。如果你处理一个 .dtx 文件,你将得到包含在 .dtx 文件中的 LaTeX 宏代码的文档。
-
.ins:匹配 .dtx 文件的安装程序。如果你从网上下载 LaTeX 包,通常会得到一个 .dtx 文件和一个 .ins 文件。运行 LaTeX 来解压 .dtx 文件。
-
.dvi:设备无关文件(Device Independent File)。这是使用
latex
编译的 LaTeX 编译过程的主要结果。你可以使用 DVI 预览程序查看它的内容,或者通过dvips
或类似应用将其发送到打印机。 -
.pdf:可移植文档格式(Portable Document Format)。这是使用
pdflatex
编译的 LaTeX 编译过程的主要结果。你可以使用任何 PDF 查看器查看或打印它。 -
.log:记录上次编译过程的详细信息。
-
.toc:存储所有章节标题。它将在下次编译过程中被读取,并用于生成目录。
-
.lof:类似于 .toc,但用于图表列表。
-
.lot:同样的功能,但用于表格列表。
-
.idx:如果文档包含索引,LaTeX 会将所有进入索引的单词存储在此文件中。使用
makeindex
处理该文件。 -
.ind:处理过的 .idx 文件,准备在下一次编译周期中包含到文档中。
-
.ilg:日志文件,记录
makeindex
做了什么。 -
.sty:LaTeX 宏包文件。你可以通过
\usepackage
命令将其加载到 LaTeX 文档中。 -
.tex:LaTeX 或 TeX 输入文件,可以使用
latex
编译。 -
.out:hyperref 包文件,仅适用于主文件。
那接下来呢?
常见元素
参见《文档结构》和《常见元素》部分,了解适用于每种文档类型的所有常见功能。
非英语文档和特殊字符
LaTeX 提供了一些优秀的功能来支持世界上大多数语言。你可以告诉 LaTeX 遵循目标语言的排版规则,简化特殊字符的输入,等等。详情请参见《特殊字符》和《国际化》。
模块化文档
参见《模块化文档》部分,了解如何将大型项目组织成多个文件的好建议。
问题和解决方法
如果你遇到关于基本功能的问题,或者想阅读一些基本建议,我们强烈建议你阅读常见问题解答(FAQ)。对于更具体的问题和解决方法,请参见《技巧与窍门》页面。
为了最高效的使用宏
LaTeX 的全部功能依赖于宏。它们使文档变得非常动态和灵活。请参阅专门的部分。
团队协作
参见《LaTeX 文档协作写作》章节。