\chapter{\LaTeX{} 的基本概念}\label{chap:basics} \addtocontents{los}{\protect\addvspace{10pt}} \begin{intro} 欢迎使用 \LaTeX{}!本章开头用简短的篇幅介绍了 \LaTeX{} 的来源, 然后介绍了 \LaTeX{} 源代码的写法,编译 \LaTeX{} 源代码生成文档的方法,以及理解接下来的章节的一些必要知识。 \end{intro} \section{概述}\label{sec:intro} \subsection{\protect\TeX}\label{subsec:tex} \index{Knuth@Knuth, Donald E. (\textit{高德纳})} \index{TeX@\TeX} \TeX{} 是高德纳 (Donald E.~Knuth) 为排版文字和数学公式而开发的软件\cite{texbook}。 1977 年,正在编写《计算机程序设计艺术》的高德纳意识到每况愈下的排版质量将影响其著作的发行, 为扭转这种状况,他着手开发 \TeX{},发掘当时刚刚用于出版工业的数字印刷设备的潜力。 1982 年,高德纳发布 \TeX{} 排版引擎,而后在 1989 年又为更好地支持 8-bit 字符和多语言排版而予以改进。 \TeX{} 以其卓越的稳定性、跨平台能力和几乎没有 bug 的特性而著称。 它的版本号不断趋近于 $\pi$,当前为 3.141592653。 \TeX{} 读作“Tech”,与汉字“泰赫”的发音相近,其中“ch” 的发音类似于“h”。\TeX{} 的拼写来自希腊词语 τεχνική (technique,技术) 开头的几个字母,在 ASCII 字符环境中写作 \texttt{TeX}。 \subsection{\LaTeX}\label{subsec:latex} \index{LaTeX@\LaTeX} \index{LaTeX2e@\LaTeXe} \LaTeX{} 是一种使用 \TeX{} 程序作为排版引擎的格式(format),可以粗略地将它理解成是对 \TeX{} 的一层封装。 \LaTeX{} 最初的设计目标是分离内容与格式,以便作者能够专注于内容创作而非版式设计,并能以此得到高质量排版的作品。 \LaTeX{} 起初由 Leslie Lamport 博士\cite{manual}开发,目前由 \LaTeX{} 工作组% \footnote{\url{https://www.latex-project.org}}进行维护。 \LaTeX{} 读作“Lah-tech” 或者“Lay-tech”,与汉字“拉泰赫”或“雷泰赫”的发音相近,在 ASCII 字符环境写作 \texttt{LaTeX}。 \LaTeXe{} 是 \LaTeX{} 的当前版本,意思是超出了第二版,但还远未达到第三版,在 ASCII 字符环境写作 \texttt{LaTeX2e}。 \subsection{\LaTeX{} 的优缺点}\label{subec:advs} 经常有人喜欢对比 \LaTeX{} 和以 Microsoft Office Word 为代表的“所见即所得”% (What You See Is What You Get)字处理工具。 这种对比是没有意义的,因为 \TeX{} 是一个排版引擎,\LaTeX{} 是其封装,而 Word 是字处理工具。 二者的设计目标不一致,也各自有自己的适用范围。 不过,这里仍旧总结 \LaTeX{} 的一些优点: \begin{itemize} \item 具有专业的排版输出能力,产生的文档看上去就像“印刷品”一样。 \item 具有方便而强大的数学公式排版能力,无出其右者。 \item 绝大多数时候,用户只需专注于一些组织文档结构的基础命令,无需(或很少)操心文档的版面设计。 \item 很容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。 \item 强大的可扩展性。世界各地的人开发了数以千计的 \LaTeX{} 宏包用于补充和扩展 \LaTeX{} 的功能。 一些常用宏包列在了本手册附录中的 \ref{sec:pkg-list} 小节。更多的宏包参考 \textit{The \LaTeX{} companion}\cite{companion}。 \item 能够促使用户写出结构良好的文档——而这也是 \LaTeX{} 存在的初衷。 \item \LaTeX{} 和 \TeX{} 及相关软件是跨平台、免费、开源的。 无论用户使用的是 Windows,macOS(OS X),GNU/Linux 还是 FreeBSD 等操作系统,都能轻松获得和使用这一强大的排版工具,并且获得稳定的输出。 \end{itemize} \LaTeX{} 的缺点也是显而易见的: \begin{itemize} \item 入门门槛高。本手册的副标题叫做“\pageref{lshort-minutes}~分钟了解 \LaTeXe”, 实际上“\pageref{lshort-minutes}”是本手册正文部分(包括附录)的页数。如果真的以平均一页一分钟的速度看完了本手册, 你只是粗窥门径而已,离学会它还很远。 \item 不容易排查错误。\LaTeX{} 作为一个依靠编写代码工作的排版工具,其使用的宏语言比 C++ 或 Python 等程序设计语言在错误排查方面困难得多。 它虽然能够提示错误,但不提供调试的机制,有时错误提示还很难理解。 \item 不容易定制样式。\LaTeX{} 提供了一个基本上良好的样式,为了让用户不去关注样式而专注于文档结构。 但如果想要改进 \LaTeX{} 生成的文档样式则是十分困难的。 \item 相比“所见即所得”的模式有一些不便,为了查看生成文档的效果,用户总要不停地编译。 \end{itemize} \subsection{命令行基础} \LaTeX{} 和 \TeX{} 及相关软件大多仅提供了命令行接口,而不像 Word、Adobe InDesign 一样有图形用户界面。 命令行程序的结构往往比较简单,它们接受用户输入,读取相关文件,进行一些操作和运算后输出目标文件, 有时还会将提示信息、运行结果显示在屏幕上。在 Windows 系统上,如需进入命令行,可在开始菜单中搜索 “命令提示符”,也可在“运行”窗口中输入 \texttt{cmd} 打开;Linux 或 macOS 等 *nix % \footnote{类 Unix 操作系统,包含 Linux、macOS(OS X)。} 系统中可搜索“Terminal”打开终端。部分系统也提供了一些快捷方式,具体请参考相关手册。 与常规软件类似,命令行程序也都是可执行程序,在 Windows 上后缀名为 \texttt{.exe},而在类 Unix 系统上 则需要带有 \texttt{x} 权限。在大多数命令行环境中,系统会根据\textbf{环境变量} \texttt{PATH} 中存储 的路径来搜索可供执行的程序。因此在运行之前,需确保 \LaTeX 、\TeX{} 及相关程序所在路径已包含在 \texttt{PATH} 中。 在命令行中运行程序时,需要先输入程序名,其后可加一系列用空格分隔的参数,并按下 Enter 键执行。 一般情况下,命令行程序执行完毕会自行退出。若遇到错误或中断,可输入 Ctrl+C 以强制结束。 使用命令行程序输入、输出文件时,需确保文件路径正确。通常需要先切换到文件所在目录,再执行有关程序。 切换路径可以执行 \begin{command} \verb|cd| \Arg{path} \end{command} 注意 \Arg{path} 中的多级目录在 Windows 系统上使用反斜线 \verb|\| 分隔,而在类 Unix 系统上使用正斜线 \verb|/| 分隔。如果 \Arg{path} 中带有空格,则需加上引号 \verb|"|。此外,在 Windows 系统上如果要切换 到其他分区,还需加上 \verb|/d| 选项,例如 \verb|cd /d "C:\Program Files (x86)\"|。 许多用户会使用 TeXworks 或 TeXstudio 等编辑器来编写 \LaTeX{} 文档。这些编辑器提供的编译功能, 实际上只是对特定命令行程序的封装,而并非魔法。 \section{第一次使用 \LaTeX}\label{sec:run} 源代码~\ref{code:hello-world}~是一份最短的 \LaTeX{} 源代码示例。 \begin{sourcecode}[htp] \begin{Verbatim} \documentclass{article} \begin{document} ``Hello world!'' from \LaTeX. \end{document} \end{Verbatim} \caption{\LaTeX{} 的一个最简单的源代码示例。}\label{code:hello-world} \end{sourcecode} 这里首先介绍如何编译使用这份源代码,在后续小节中再介绍源代码的细节。 你可以将这份源代码保存为 \texttt{helloworld.tex},而后编译。具体来说: \begin{itemize} \item 如果使用 TeXworks 或 TeXstudio 等编辑器,你可以使用编辑器提供的“编译”按钮或者“排版” 按钮。建议使用 \hologo{pdfLaTeX} 或 \hologo{XeLaTeX} 作为默认的编译方式(不同编译方式的差别, 见~\ref{sec:concepts}~节)。 \item 如果使用命令行方式进行编译,则需打开 Windows 命令提示符或者 *nix 的终端, 在源代码所在的目录下输入: \begin{verbatim} pdflatex helloworld \end{verbatim} 或者 \begin{verbatim} xelatex helloworld \end{verbatim} \end{itemize} 如果编译成功,可以在 \texttt{helloworld.tex} 所在目录看到生成的 \texttt{helloworld.pdf} 以及一些其它文件。 源代码~\ref{code:hello-world-chinese}~是在 \LaTeX{} 排版中文的一个最简示例。 编译的方式与上一份源代码相同,但需使用 \hologo{XeLaTeX} 编译方式% \footnote{注意两个问题:1. 文档保存为 UTF-8 编码;2. 某些发行版需要补充安装较多宏包(如 \hologo{MiKTeX})。}。 中文支持的详细内容见 \ref{sec:chinese} 节。 \begin{sourcecode}[htp] \begin{Verbatim} \documentclass{ctexart} \begin{document} “你好,世界!”来自 \LaTeX{} 的问候。 \end{document} \end{Verbatim} \caption{在\LaTeX{} 中排版中文的最简源代码示例。}\label{code:hello-world-chinese} \end{sourcecode} \section{\LaTeX{} 命令和代码结构}\label{sec:src} \LaTeX{} 的源代码为文本文件。这些文本除了文字本身,还包括各种命令, 用在排版公式、划分文档结构、控制样式等等不同的地方。 \subsection{\LaTeX{} 命令和环境}\label{subsec:cmds} \index{LaTeX macro@\LaTeX{} 命令} \LaTeX{} 中命令\footnote{也叫作控制序列(control sequence)。}以反斜线 \texttt{\textbackslash} 开头,为以下两种形式之一: \begin{itemize} \item 反斜线和后面的一串字母,如 \cmd{LaTeX}。它们以任意非字母符号(空格、数字、标点等)为界限。 \item 反斜线和后面的单个非字母符号,如 \cmd{\$}。 \end{itemize} 要注意 \LaTeX{} 命令是\textbf{对大小写敏感}的,比如输入 \cmd{LaTeX} 命令可以生成错落有致的 \LaTeX{} 字母组合, 但输入 \cmd{Latex} 或者 \cmd{LaTex} 什么都得不到,还会报错;它们与 \cmd{LaTeX} 是不同的命令。 字母形式的 \LaTeX{} 命令忽略其后的所有连续空格。 如果要人为引入空格,需要在命令后面加一对花括号阻止其忽略空格% \footnote{另外也可以在命令后面紧跟一个 \cmd{\textvisiblespace} 命令(反斜线加空格),代表插入一个间距。 比如 \cmd{TeX}\cmd{\textvisiblespace}\texttt{user} 的输出效果就是 \TeX{} user。}: \begin{example} Shall we call ourselves \TeX users or \TeX{} users? \end{example} \pinyinindex{canshu}{参数} 一些 \LaTeX{} 命令可以接收一些参数,参数的内容会影响命令的效果。 \LaTeX{} 的参数分为可选参数和必选参数。 可选参数以方括号 \texttt[ 和 \texttt] 包裹;必选参数一般以花括号 \texttt\{ 和 \texttt\} 包裹% \footnote{以单个字符作为命令的参数时,可以不加括号。例如,在数学环境下, \cmd{frac}\texttt{12} 和 \cmd{frac}\texttt{\{1\}\{2\}} 的效果是一样的。}。 还有些命令可以带一个星号 \texttt*,带星号和不带星号的命令效果有一定差异。 初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数。 \index{LaTeX environment@\LaTeX{} 环境} \cmdindex{begin,end} \LaTeX{} 中还包括\textbf{环境},用以令一些效果在局部生效,或是生成特殊的文档元素。 \LaTeX{} 环境的用法为一对命令 \cmd{begin} 和 \cmd{end}: \begin{command} \cmd{begin}\marg{environment name}\oarg{optional arguments}\marg{mandatory arguments} \\ \ldots \\ \cmd{end}\marg{environment name} \end{command} 其中 \Arg{environment name} 为环境名,\cmd{begin} 和 \cmd{end} 中填写的环境名应当一致。 类似命令,\marg{mandatory arguments} 和 \oarg{optional arguments} 为环境所需的必选和可选参数。 \LaTeX{} 环境可能需要一个或多个必选/可选参数,也可能完全不需要参数。 部分环境允许嵌套使用。 \pinyinindex{fenzu}{分组} 有些命令(如 \cmd{bfseries})会对其后所有内容产生作用。若要限制其作用范围,则需要使用\textbf{分组}。 \LaTeX{} 使用一对花括号 \verb|{| 和 \verb|}| 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容% \footnote{个别命令在分组内仍然会产生全局作用,例如第 \ref{sec:counters} 节介绍的 \cmd{setcounter} 等命令。}。 上文提到的 \LaTeX{} 环境隐含了一个分组,在环境中的命令被包裹在分组内。 \ref{subsec:fontshape} 和 \ref{subsec:fontsize} 小节中介绍的修改字体和字号的命令用法,即属此类。 \subsection{\LaTeX{} 源代码结构}\label{subsec:struct} \cmdindex{documentclass} \envindex{document} \pinyinindex{wendanglei}{文档类} \pinyinindex{hongbao}{宏包} \LaTeX{} 源代码以一个 \cmd{document\-class} 命令作为开头,它指定了文档使用的\textbf{文档类}。 \env{doc\-u\-ment} 环境当中的内容是文档正文。 \cmdindex{usepackage} \pinyinindex{daoyanqu}{导言区} 在 \cmd{documentclass} 和 \cmd{begin}\marg*{document} 之间的位置称为\textbf{导言区}。 在导言区中常会使用 \cmd{use\-package} 命令调用\textbf{宏包},还会进行文档的全局设置。 \begin{verbatim} \documentclass{...} % ... 为某文档类 % 导言区 \begin{document} % 正文内容 \end{document} % 此后内容会被忽略 \end{verbatim} \section{\LaTeX{} 宏包和文档类}\label{sec:latex-pkgs} 本节将仔细解释在 \ref{subsec:struct} 小节中出现的宏包和文档类的概念以及详细用法。 \subsection{文档类}\label{subsec:classes} \pinyinindex{wendanglei}{文档类} \textbf{文档类}规定了 \LaTeX{} 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、 个人简历等等。\LaTeX{} 源代码的开头须用\cmd{document\-class}指定文档类: \begin{command} \cmd{documentclass}\oarg{options}\marg{class-name} \end{command} \clsindex{article,report,book} \clsindex{ctexart,ctexrep,ctexbook} 其中 \Arg{class-name} 为文档类的名称,如 \LaTeX{} 提供的 \cls{article}、\cls{report}、\cls{book}, 在其基础上派生的一些文档类,如支持中文排版的 \cls{ctexart}、\cls{ctexrep}、\cls{ctexbook}, 或者有其它功能的一些文档类,如 \cls{moderncv}、\cls{beamer} 等。 \LaTeX{} 提供的基础文档类见表 \ref{tbl:ltx-classes},其中前三个习惯上称为“标准文档类”。 \begin{table}[htp] \centering \caption{\LaTeX{} 提供的基础文档类}\label{tbl:ltx-classes} \begin{tabular}{lp{30em}} \hline \cls{article} & 文章格式的文档类,广泛用于科技论文、报告、说明文档等。\\ \cls{report} & 长篇报告格式的文档类,具有章节结构,用于综述、长篇论文、简单的书籍等。\\ \cls{book} & 书籍文档类,包含章节结构和前言、正文、后记等结构。\\ \hline \cls{proc} & 基于 \cls{article} 文档类的一个简单的学术文档模板。\\ \cls{slides} & 幻灯格式的文档类,使用无衬线字体。\\ \cls{minimal} & 一个极其精简的文档类,只设定了纸张大小和基本字号, 用作代码测试的最小工作示例(Minimal Working Example)。 \\ \hline \end{tabular} \end{table} \pinyinindex{xuanxiang}{选项(宏包/文档类)} 可选参数 \Arg{options} 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。 比如调用 \cls{article} 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版: \begin{verbatim} \documentclass[11pt,twoside,a4paper]{article} \end{verbatim} \LaTeX{} 的三个标准文档类可指定的选项包括: \begin{description} \item[\texttt{10pt, 11pt, 12pt}] \quad 指定文档的基本字号。默认为 \texttt{10pt}。 \item[\texttt{a4paper, letterpaper, \ldots}] \quad 指定纸张大小,默认为美式信纸 \texttt{letterpaper} ($8.5\,\text{in}\times11\,\text{in}$,大约相当于 $21.6\,\text{cm}\times28.0\,\text{cm}$)。 可指定选项还包括 \texttt{a5paper},\texttt{b5paper},\texttt{executivepaper} 和 \texttt{legalpaper}。 有关纸张大小的更多细节,请参考 \ref{subsec:geometry} 小节。 \item[\texttt{twoside, oneside}] \quad 指定单面/双面排版。双面排版时,奇偶页的页眉页脚、页边距不同。 \cls{article} 和 \cls{report} 默认为 \texttt{oneside},\cls{book} 默认为 \texttt{twoside}。 \item[\texttt{onecolumn, twocolumn}] \quad 指定单栏/双栏排版。默认为 \texttt{onecolumn}。 \item[\texttt{openright, openany}] \quad 指定新的一章 \cmd{chapter} 是在奇数页(右侧)开始,还是直接紧跟着上一页开始。 \cls{report} 默认为 \texttt{openany},\cls{book} 默认为 \texttt{openright}。对 \cls{article} 无效。 \item[\texttt{landscape}] \quad 指定横向排版。默认为纵向。 \item[\texttt{titlepage, notitlepage}] 指定标题命令 \cmd{maketitle} 是否生成单独的标题页。 \cls{article} 默认为 \texttt{notitlepage},\cls{report} 和 \cls{book} 默认为 \texttt{titlepage}。 \item[\texttt{fleqn}] \quad 令行间公式左对齐。默认为居中对齐。 \item[\texttt{leqno}] \quad 将公式编号放在左边。默认为右边。 \item[\texttt{draft, final}] \quad 指定草稿/终稿模式。 草稿模式下,断行不良(溢出)的地方会在行尾添加一个黑色方块;插图、超链接等功能也会受这一组选项影响,具体见后文。默认为 \texttt{final}。 \end{description} \subsection{宏包}\label{subsec:packages} \cmdindex{usepackage} \pinyinindex{hongbao}{宏包} \pinyinindex{xuanxiang}{选项(宏包/文档类)} 在使用 \LaTeX{} 时,时常需要依赖一些扩展来增强或补充 \LaTeX{} 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等。 这些扩展称为\textbf{宏包}。调用宏包的方法非常类似调用文档类的方法: \begin{command} \cmd{usepackage}\oarg{options}\marg{package-name} \end{command} \cmd{usepackage}~可以一次性调用多个宏包,在 \Arg{package-name} 中用逗号隔开。这种用法一般不要指定选项% \footnote{使用多个宏包时指定选项,相当于给每个宏包指定同样的选项。如果有某个宏包不能识别指定的选项,则会出错。}: \begin{verbatim} % 一次性调用三个排版表格常用的宏包 \usepackage{tabularx, makecell, multirow} \end{verbatim} 附录 \ref{sec:pkg-list} 汇总了常用的一些宏包。我们在手册接下来的章节中,也会穿插介绍一些最常用的宏包的使用方法。 在使用宏包和文档类之前,一定要首先确认它们是否安装在你的计算机中,否则 \cmd{use\-package} 等命令会报错误。 详见附录 \ref{sec:pkg-manager}。 宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 \LaTeX{} 已有的命令和环境。 它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档: \begin{command} \texttt{texdoc} \Arg{pkg-name} \end{command} 其中 \Arg{pkg-name} 是宏包或者文档类的名称。更多获得帮助的方法见附录 \ref{sec:texdoc}。 \section{\LaTeX{} 用到的文件一览}\label{sec:latex-files} 除了源代码文件 \texttt{.tex} 以外,我们在使用 \LaTeX{} 时还可能接触到各种格式的文件。 本节简单介绍一下在使用 \LaTeX{} 时能够经常见到的文件。 每个宏包和文档类都是带特定扩展名的文件,除此之外也有一些文件出现于 \LaTeX{} 模板中: \begin{description} \item[\texttt{.sty}] 宏包文件。宏包的名称与文件名一致。 \item[\texttt{.cls}] 文档类文件。文档类名称与文件名一致。 \item[\texttt{.bib}] \hologo{BibTeX} 参考文献数据库文件。 \item[\texttt{.bst}] \hologo{BibTeX} 用到的参考文献格式模板。详见 \ref{subsec:bibtex-use} 小节。 \end{description} \LaTeX{} 在编译过程中除了生成 \texttt{.dvi} 或 \texttt{.pdf} 格式的文档外% \footnote{\hologo{XeLaTeX} 还可能生成 \texttt{.xdv} 文件。},还可能会生成相当多的辅助文件和日志。 一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件, 然后再次编译时读入辅助文件得到正确的结果,所以复杂的 \LaTeX{} 源代码可能要编译多次: \begin{description} \item[\texttt{.log}] 排版引擎生成的日志文件,供排查错误使用。 \item[\texttt{.aux}] \LaTeX{} 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等。 \item[\texttt{.toc}] \LaTeX{} 生成的目录记录文件。 \item[\texttt{.lof}] \LaTeX{} 生成的图片目录记录文件。 \item[\texttt{.lot}] \LaTeX{} 生成的表格目录记录文件。 \item[\texttt{.bbl}] \hologo{BibTeX} 生成的参考文献记录文件。 \item[\texttt{.blg}] \hologo{BibTeX} 生成的日志文件。 \item[\texttt{.idx}] \LaTeX{} 生成的供 makeindex 处理的索引记录文件。 \item[\texttt{.ind}] makeindex 处理 \texttt{.idx} 生成的用于排版的格式化索引文件。 \item[\texttt{.ilg}] makeindex 生成的日志文件。 \item[\texttt{.out}] \pkg{hyperref} 宏包生成的 PDF 书签记录文件。 \end{description} \section{文件的组织方式}\label{sec:latex-multi-files} 当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难。 将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作。 可参考源代码 \ref{code:book-struct} 的写法。 \cmdindex{include} \LaTeX{} 提供了命令 \cmd{include} 用来在源代码里插入文件: \begin{command} \cmd{include}\marg{filename} \end{command} \Arg{filename} 为文件名(不带 \texttt{.tex} 扩展名)% \footnote{\LaTeX{} 2020-10-01 版本之后允许添加扩展名。}, 如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径,例如: \begin{verbatim} \include{chapters/file} % 相对路径 \include{/home/Bob/file} % *nix(包含 Linux、macOS)绝对路径 \include{D:/file} % Windows 绝对路径,用正斜线 \end{verbatim} \cmdindex{input} 值得注意的是 \cmd{include} 在读入 \Arg{filename} 之前会另起一页。有的时候我们并不需要这样,而是用 \cmd{input} 命令,它纯粹是把文件里的内容插入: \begin{command} \cmd{input}\marg{filename} \end{command} 当导言区内容较多时,常常将其单独放置在一个 \texttt{.tex} 文件中,再用 \cmd{input} 命令插入。 复杂的图、表、代码等也会用类似的手段处理。 \cmdindex{includeonly} \LaTeX{} 还提供了一个 \cmd{includeonly} 命令来组织文件,用于\textbf{导言区},指定只载入某些文件。 导言区使用了 \cmd{includeonly} 后,正文中不在其列表范围的 \cmd{include} 命令不会起效: \begin{command} \cmd{includeonly}\marg*{\Arg{filename1},\Arg{filename2},\ldots} \end{command} 需要注意的是,使用 \cmd{include} 和 \cmd{input} 命令载入的文件名最好不要加空格和特殊字符,也尽量 避免使用中文名,否则很可能会出错% \footnote{\LaTeX{} 在 2019 到 2020 年间做出了一系列更新,文件名中包含操作系统所允许的字符时 均不再出错。但保险起见,仍然建议使用拉丁字母、数字、连字符等较为安全的字符组成文件名。}。 \pkgindex{syntonly} 最后介绍一个实用的工具宏包 \pkg{syntonly}。加载这个宏包后,在导言区使用 \cmd{syntaxonly} 命令, 可令 \LaTeX{} 编译后不生成 DVI 或者 PDF 文档,只排查错误,编译速度会快不少: \begin{verbatim} \usepackage{syntonly} \syntaxonly \end{verbatim} 如果想生成文档,则用 \texttt\% 注释掉 \cmd{syntaxonly} 命令即可。 \section{\LaTeX{} 和 \TeX{} 相关的术语和概念}\label{sec:concepts} \pinyinindex{paibanyinqing}{排版引擎} \index{pdfTeX@\hologo{pdfTeX}} \index{XeTeX@\hologo{XeTeX}} 在本章的最后有必要澄清几个概念: \begin{description} \item[引擎] 全称为排版引擎,是编译源代码并生成文档的程序,如 \hologo{pdfTeX}、\hologo{XeTeX} 等。有时也称为编译器。 \item[格式] 是定义了一组命令的代码集。\LaTeX{} 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 \hologo{plainTeX} 格式, 没有定义诸如 \cmd{document\-class} 和 \cmd{section} 等等命令。 \item[编译命令] 是实际调用的、结合了引擎和格式的命令。如 \texttt{xelatex} 命令是结合 \hologo{XeTeX} 引擎和 \LaTeX{} 格式的一个编译命令。 \end{description} 常见的引擎、格式和编译命令的关系总结于表 \ref{tbl:engine-format-command}。 \begin{table}[htp] \centering \caption{\TeX{} 引擎、格式及其对应的编译命令。} \label{tbl:engine-format-command} \begin{tabular}{cccc} \hline & \textbf{文档格式} & \textbf{\hologo{plainTeX} 格式} & \textbf{\LaTeX{} 格式} \\ \hline \TeX{} 引擎 & DVI & \texttt{tex} & N/A \\ \hologo{pdfTeX} 引擎 & DVI & \texttt{etex} & \texttt{latex} \\ & PDF & \texttt{pdftex} & \texttt{pdflatex} \\ \hologo{XeTeX} 引擎 & PDF & \texttt{xetex} & \texttt{xelatex} \\ \hologo{LuaTeX} 引擎 & PDF & \texttt{luatex} & \texttt{lualatex} \\ \hline \end{tabular} \end{table} \texttt{latex} 编译命令和 \LaTeX{} 格式往往容易混淆,在讨论关于 \LaTeX{} 的时候需要明确。 为避免混淆,本手册中的 \LaTeX{} 一律指的是\textbf{格式},\textbf{编译命令}则用等宽字体 \texttt{latex} 表示。 在此介绍一下几个编译命令的基本特点: \begin{description} \item[\texttt{latex}] 虽然名为 \texttt{latex} 命令,底层调用的引擎其实是 \hologo{pdfTeX}。 该命令生成 \texttt{dvi}(Device Independent)格式的文档, 用 \texttt{dvipdfmx} 命令可以将其转为 \texttt{pdf}。 \item[\texttt{pdflatex}] 底层调用的引擎也是 \hologo{pdfTeX},可以直接生成 \texttt{pdf} 格式的文档。 \item[\texttt{xelatex}] 底层调用的引擎是 \hologo{XeTeX},支持 UTF-8 编码和对 TrueType/OpenType 字体的调用。 当前较为方便的中文排版解决方案基于 \texttt{xelatex},详见 \ref{sec:chinese} 节。 \item[\texttt{lualatex}] 底层调用的引擎是 \hologo{LuaTeX}\footnote{从 \TeX{} Live 2020 开始,\texttt{lualatex} 调用的 引擎变为 LuaHB\TeX。LuaHB\TeX{} 是 \hologo{LuaTeX} 与 HarfBuzz 库的结合,对复杂语言的支持更好。}, 这个引擎在 \hologo{pdfTeX} 引擎基础上发展而来, 除了支持 UTF-8 编码和对 TrueType/OpenType 字体的调用外,还支持通过 Lua 语言扩展 \TeX{} 的功能。 \texttt{lualatex} 编译命令下的中文排版支持需要借助 \pkg{luatexja} 宏包。 \end{description} \endinput