summaryrefslogtreecommitdiff
path: root/info/lshort/chinese/src/chap/chap.01.basics.tex
blob: ef0471b0f681afc7fbc25b3a835af01993ef513e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
\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.14159265。

\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 3 工作组%
\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{document} 环境当中的内容是文档正文。

\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,book,report}
\clsindex{ctexart,ctexrep,ctexbook}
其中 \Arg{class-name} 为文档类的名称,如 \LaTeX{} 提供的 \cls{article}, \cls{book}, \cls{report},
在其基础上派生的一些文档类如支持中文排版的 \cls{ctexart} / \cls{ctexbook} / \cls{ctexrep},
或者有其它功能的一些文档类,如 \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\times11$英寸)。
可指定选项还包括 \texttt{a5paper},\texttt{b5paper},\texttt{executivepaper} 和 \texttt{legalpaper}。
\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} 为文件名,如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径,例如:
\begin{verbatim}
\include{chapters/a.tex} % 相对路径
\include{/home/Bob/file.tex} % *nix (包含 Linux、macOS(OS X))绝对路径
\include{D:/file.tex} % Windows 绝对路径,用正斜线
\end{verbatim}

\Arg{filename} 可以不带扩展名,此时默认扩展名为 \texttt{.tex}。

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

特别要注意的是,使用 \cmd{include} 和 \cmd{input} 命令载入的文件名\textbf{一定不要加空格},否则通常会出错。

\cmdindex{includeonly}
另外 \LaTeX{} 提供了一个 \cmd{includeonly} 命令来组织文件,用于\textbf{导言区},指定只载入某些文件:
\begin{command}
\cmd{includeonly}\marg*{\Arg{filename1},\Arg{filename2},\ldots}
\end{command}

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

\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},这个引擎在 \hologo{pdfTeX} 引擎基础上发展而来,
  除了支持 UTF-8 编码和对 TrueType / OpenType 字体的调用外,还支持通过 Lua 语言扩展 \TeX{} 的功能。
  \texttt{lualatex} 编译命令下的中文排版支持需要借助 \pkg{luatexja} 宏包。
\end{description}

\endinput