\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
