\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\ ,以发掘当时开始用于出版工业的数字印刷设备的潜力。 正在编写著作《计算机程序设计艺术》的高德纳,意图扭转排版质量每况愈下的状况,以免影响他的出书。 \TeX\ 排版引擎发布于 1982 年,在 1989 年又加以改进以更好地支持 8-bit 字符和多语言排版。 \TeX\ 以其卓越的稳定性、跨平台、几乎没有 Bug 而著称。\TeX\ 的版本号不断趋近于 $\pi$,当前为 3.141592653。 \TeX\ 读作 ``Tech'' ,其中 ``ch'' 的发音类似于 ``h'' ,与汉字“泰赫”的发音相近。\TeX\ 的拼写来自希腊词语 {\fontencoding{LGR}\selectfont teqnik'h} (technique,技术) 的开头几个字母。在 ASCII 字符环境,\TeX\ 写作 \texttt{TeX}。 \subsection{\LaTeX}\label{subsec:latex} \index{LaTeX@\LaTeX} \index{LaTeX2e@\LaTeXe} \LaTeX\ 为 \TeX\ 基础上的一套格式,令作者能够使用预定义的专业格式以较高质量排版和印刷他们的作品。 \LaTeX\ 的最初开发者为 Leslie Lamport 博士\cite{manual}。\LaTeX\ 使用 \TeX\ 程序作为自己的排版引擎。 当前 \LaTeX\ 由 \LaTeX 3 工作组\footnote{\url{https://www.latex-project.org}}维护。 \LaTeX\ 读作 ``Lah-tech'' 或者 ``Lay-tech'' ,与汉字“拉泰赫”或“雷泰赫”的发音相近。\LaTeX\ 在 ASCII 字符环境写作 \texttt{LaTeX}。 当前的 \LaTeX\ 版本为 \LaTeXe ,意思是超出了第二版,接近但没达到第三版,在 ASCII 字符环境写作 \texttt{LaTeX2e}。 \subsection{\LaTeX\ 的优缺点}\label{subec:advs} \LaTeX\ 总会拿来和一些“所见即所得”(What You See Is What You Get)的文字处理和排版工具比较优缺点。 笔者认为这种比较并不值得提倡,毕竟所有工具都有自己值得使用的原因。 当然笔者还是会总结一些 \LaTeX\ 的优点: \begin{itemize} \item 专业的排版输出,产生的文档看上去就像“印刷品”一样。 \item 方便而强大的数学公式排版能力,无出其右。 \item 绝大多数时候,用户只需专注于一些组织文档结构的基础命令,无需(或很少)操心文档的版面设计。 \item 很容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。 \item 强大的扩展性。世界各地的人开发了数以千计的 \LaTeX\ 宏包用于补充和扩展 \LaTeX\ 的功能。 本手册附录中的 \ref{sec:pkg-list} 小节可见一瞥。更多的宏包参考 \textit{The \LaTeX\ companion}\cite{companion}。 \item \LaTeX\ 促使用户写出结构良好的文档——而这也是 \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} \section{第一次使用 \LaTeX}\label{sec:run} 我们在此给出一个最小的 \LaTeX\ 源代码示例,见源代码 \ref{code:hello-world}。 \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} 假设将源代码 \ref{code:hello-world} 保存成 \texttt{helloworld.txt}。如果使用 \TeX works 或 \TeX studio 等编辑器, 点击编辑器提供的“编译”按钮即可。在此建议将编译命令设为 “XeLaTeX”。编译成功后生成文档 \texttt{helloworld.pdf}。 另外也可以使用命令行的方式调用程序进行编译(笔者建议尝试命令行方式,以了解背后的工作原理)。 打开 Windows 命令提示符或者 Linux / macOS(OS X)的终端,在源代码所在的目录下输入命令: \begin{verbatim} xelatex helloworld \end{verbatim} 此时命令行会闪过许多信息,如果编译成功,可以看到会生成 \texttt{helloworld.pdf} 以及一些其它文件。 \subsection{引擎、格式和编译命令}\label{subsec:concepts} \pinyinindex{paibanyinqing}{排版引擎} \index{pdfTeX@\hologo{pdfTeX}} \index{XeTeX@\hologo{XeTeX}} 在此有必要澄清几个概念: \begin{description} \item[引擎] 全称为排版引擎,是编译源代码并生成文档的程序,如 \hologo{pdfTeX}、\hologo{XeTeX} 等。有时也称为编译器。 \item[格式] 是定义了一组命令的代码集。\LaTeX\ 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 plain \TeX\ 格式, 没有定义诸如 \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{plain \TeX\ 格式} & \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{luatex-ja} 宏包。 \end{description} \section{\LaTeX\ 命令和代码结构}\label{sec:src} \LaTeX\ 的源代码为文本文件。这些文本除了文字本身,还包括各种命令, 用在排版公式、划分文档结构、控制样式等等不同的地方。 \subsection{\LaTeX\ 命令和环境}\label{subsec:cmds} \index{LaTeX macro@\LaTeX\ 命令} \LaTeX\ 命令以反斜线 \texttt{\textbackslash} 开头,为以下两种形式之一: \begin{itemize} \item 反斜线和后面的一串字母,如 \cmd{LaTeX}。它们以任意非字母符号(空格、数字、标点等)为界限。 \item 反斜线和后面的单个非字母符号,如 \cmd{\$}。 \end{itemize} 要注意 \LaTeX\ 命令是\textbf{对大小写敏感}的,比如输入 \cmd{LaTeX} 命令可以生成错落有致的 \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\ 命令需要一个或多个参数,每个参数用花括号 \texttt\{ 和 \texttt\} 包裹。 有些命令可以带一个或多个可选参数,以方括号 \texttt[ 和 \texttt] 包裹。 还有些命令在命令名称后可以带一个星号 \texttt*,带星号和不带星号的命令效果有一定差异, 可以把星号看作一种特殊的可选参数。 \index{LaTeX environment@\LaTeX\ 环境} \cmdindex{begin,end} \LaTeX\ 还引入了\textbf{环境}的用法,用以令一些效果在局部生效,或是生成特殊的文档元素。 \LaTeX\ 环境的用法为一对命令 \cmd{begin} 和 \cmd{end}: \begin{command} \cmd{begin}\marg{environment name}\marg{arguments} \\ \ldots \\ \cmd{end}\marg{environment name} \end{command} 其中 \Arg{environment name} 为环境名,\cmd{begin} 和 \cmd{end} 中填写的环境名应当一致。 \Arg{arguments} 为环境所需的参数,可能包括可选参数。环境允许嵌套使用。 \pinyinindex{fenzu}{分组} 除了 \LaTeX\ 环境之外,花括号本身也起到\textbf{分组}的作用,使命令的效果限制在分组内。 例如 \ref{subsec:fontshape} 和 \ref{subsec:fontsize} 小节中介绍的修改字体和字号的命令用法。 \subsection{\LaTeX\ 源代码结构}\label{subsec:struct} \cmdindex{documentclass} \pinyinindex{wendanglei}{文档类} \LaTeX\ 源代码以一个 \cmd{document\-class} 命令作为开头,它规定了文档使用的\textbf{文档类}: \begin{verbatim} \documentclass{...} \end{verbatim} \cmdindex{usepackage} \pinyinindex{hongbao}{宏包} 之后用 \cmd{usepackage} 命令调用\textbf{宏包}: \begin{verbatim} \usepackage{...} \end{verbatim} \envindex{document} 再接着,用 \env{document} 环境来标记正文内容范围: \begin{verbatim} \begin{document} \section{...} 正文内容…… \end{document} \end{verbatim} \pinyinindex{daoyanqu}{导言区} 在 \cmd{documentclass} 和 \cmd{begin}\marg*{document} 之间的位置称为\textbf{导言区},除了使用 \cmd{use\-package} 调用宏包之外,一些对文档的全局设置命令也在这里使用。 \section{\LaTeX\ 宏包和文档类}\label{sec:latex-pkgs} 本节将仔细解释在 \ref{subsec:struct} 小节中出现的宏包和文档类的概念以及详细用法。 \subsection{文档类}\label{subsec:classes} \pinyinindex{wendanglei}{文档类} 文档类规定了 \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} 格式的文档外,还生成相当多的辅助文件和日志。 一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件, 然后再次编译时读入辅助文件得到正确的结果,所以复杂的 \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} 当编写较大规模的 \LaTeX\ 源代码,如书籍、毕业论文等,有理由将源代码分成若干个文件,比如每章内容为一个文件, 可参考源代码 \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} % Linux/macOS 绝对路径 \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} \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} 命令即可。 \endinput