LaTeX1¶
LaTeX 是一种基于 TeX 的排版系统,广泛用于学术论文、书籍和其他需要高质量排版的文档。与 Markdown 相比,LaTeX 提供了更强大的排版功能,尤其是在处理复杂的数学公式和图表时。
TeX 实际上是一种语言,在1978年由高德纳(Donald E. Knuth)发明,旨在提供一种高质量的排版系统。基本的 TeX 功能仅有300个命令,晦涩难懂,一个简单的符号就需要许多命令实现。后来,人们把这些基本命令封装起来,做成了简写(宏),来实现特殊的目的,于是又出现了 Plain TeX、LaTeX 和 ConTeXt 等“宏集合”。LaTeX 是其中最流行的一个。
而有了语言,就得有编译器/解释器这种东西。而在 TeX 中,这类东西被叫做“引擎”。常见的引擎包括 pdfTeX、XeTeX 和 LuaTeX 等。不同的引擎有着不同的特点和适用场景,例如 pdfTeX 适合处理简单的英文文档,是早年间的主流引擎;XeTeX 最大的卖点在“系统字体即拿即用”、Unicode 原生支持两方面,是汉语相关文档的首选引擎; LuaTeX 则是2007年起的新一代引擎,把内部代码逐渐换成Lua脚本,目标是把TeX 从硬编码的时代解放出来,功能和XeTeX相似,但更开放、更可编程,被视为“未来的 TeX 引擎”。这些引擎配上 LaTeX 宏集合,就被相应的叫做 pdfLaTeX、XeLaTeX 和 LuaLaTeX。
为了方便用户使用,开发者们把引擎、宏集合、字体、更新机制乃至其他常用宏包都打包在一起,形成一个“发行版”。 常见的发行版有 TeX Live、MikTeX 和 MacTeX 等。TeX Live 是目前最流行的发行版,支持多种操作系统,包括 Windows、Linux 和 macOS,每年一个新版本,一次安装就能下载整个 LaTeX 全家桶;MikTeX 主要面向 Windows 用户,提供了易于使用的安装程序和更新机制,对于其他宏包是随用随下载;MacTeX 则是专为 macOS 设计的发行版,集成了 macOS 的特性和工具。
LaTeX的源文档与 Markdown 的简洁干净不同,而是充斥着许多反斜杠、大括号和宏。这表明如果直接使用 LaTeX 进行文本编辑的话会令人极度头大乃至效率降低;因此我个人建议同学们在使用上述工具时,最好是心中打好腹稿然后再进行工作。
我非常感谢张庭瑄同学的帮助,他为本章的内容提供了许多宝贵的建议和指导。
LaTeX 发行版的安装和配置¶
虽然 LaTeX 功能强大,但是其安装过程非常缓慢且困难。对于不愿意在自己电脑上本地安装这东西的读者,笔者建议使用一些线上编译器,例如著名的 Overleaf 等。PKULaTeX 也是一个线上编译器,由 LCPU 开发并维护,欢迎大家使用!
LaTeX的安装冗长且复杂,我这里以最通行的TeX Live为例,介绍其安装过程。其他发行版的安装过程大同小异,读者可以自行参考相关文档进行安装。
Windows机器¶
在安装新的 TeX Live 之前,笔者建议彻底删除任何旧版的 CTeX 套装2,以防出现各种莫名其妙的错误。然后,检查环境变量中有没有 C:\Windows\System32 。如无,请将上述路径添加回环境变量中去。
然后,检查自己的用户名是不是无空格的英文。如果不是,建议修改,这是一个一劳永逸的办法。另一个办法是执行以下命令(注意:PowerShell 用户请自行替换命令为正确的命令):
mkdir C:\temp
set TEMP=C:\temp
set TMP=C:\temp
如无意外,用户可以从最近的 CTAN 源下载 TexLive 的相关镜像(这个镜像大小高达 6GB)。当然,官网下载过程是非常缓慢的,如果实在是无法忍受其速度,可以考虑改用其他镜像站。
由于未知原因,如果计算机上提前安装了jdk、mingw或Cygwin,建议暂时先把以上软件从环境变量中剔除,等整个安装好了以后再加回去。2345 好压可能也会导致类似的错误,本人建议彻底卸载之,并从此以后不要碰相关的东西;笔者推荐使用 7z 这个压缩软件。
将下载下来的虚拟光驱镜像装载到虚拟光驱中,然后执行其中的批处理文件进行安装。安装过程中,建议选择“安装所有包”以防出现各种未知的错误。之后,在弹出的窗口中选择清华源(校外)或者北大源(校内,速度更快)并进行下载安装。安装过程可能需要较长时间,请耐心等待。
如果你不希望安装在默认的 C:\texlive 目录下,可以在安装过程中选择自定义安装路径。但是,该目录不应包含任何空格或其他非英文特殊字符3。安装完成后,建议将 TeX Live 的 bin 目录添加到系统的环境变量中,以便在命令行中直接使用 LaTeX 命令。我们不建议安装TexLive 的 GUI 前端,因为它不易于使用。
Linux: 以Ubuntu为例¶
在安装前,建议将Ubuntu源更改至国内源以提高下载速度。建议直接去找清华源或者北大源提供的现成配置文件。
然后,下载光盘镜像,并进行装载。
sudo apt install fontconfig gedit
sudo mkdir /mnt/texlive
sudo mount ./texlive2025.iso /mnt/texlive
sudo /mnt/texlive/install-tl
之后,终端会弹出大量内容,我们可以按照提示进行操作。安装完毕后,将安装镜像卸载:
sudo umount /mnt/texlive
sudo rm -r /mnt/texlive # 删除临时挂载目录
在安装完毕后,安装程序会提示用户将一些目录添加到环境变量中。用户可以按照提示进行操作。
之后,我们应当配置字体。如果用户改变了安装路径,应将path/改为自己的实际安装路径。
sudo cp path/texmf-var/fonts/conf/texlive-fontconfig.conf \
/etc/fonts/conf.d/09-texlive.conf
sudo fc-cache -fsv
其他的发行版虽然略有不同,但是也大同小异;总体上都可以大致分为从ISO镜像安装文件和配置相关环境(环境变量、字体)这两步。
LaTeX 在VS Code的配置¶
我们这里使用 XeLaTeX 作为主要的编译引擎,因为它对中文的支持最好,同时也支持Unicode,可以直接输入各种特殊符号而无需额外配置。
首先,我们应当下载并安装 VS Code 的 LaTeX Workshop 插件4。该插件提供了 LaTeX 的语法高亮、自动补全、编译和预览等功能。之后,打开你的Code的用户设置json文件,并添加以下配置:
"latex-workshop.latex.tools": [
{
"name": "xelatex",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
}
],
"latex-workshop.latex.recipes": [
{
"name": "xelatex",
"tools": [
"xelatex"
]
}
],
然后,如果没有什么问题的话,VS Code 就会使用 XeLaTeX 编译器来编译你的 LaTeX 文档了。之所以使用
我们非常建议关闭 LaTeX Workshop的自动清理功能,因为它会在每次编译后删除所有的辅助文件,这会导致目录、参考文献等相关功能难以正常工作——这些工作往往要求连续编译两次,因此辅助文件是很必要的。为了关闭这一功能,我们可以在用户设置json文件中添加以下配置:
"latex-workshop.latex.autoClean.run": "never",
如果我们不编译很长的文章的话,可以打开自动编译功能,这样每次保存文档时,VS Code 都会自动编译 LaTeX 文档。但是对于超长文档,自动编译会导致每次习惯性按下保存时都要等待许久。我们需要按需开启或关闭自动编译功能。可以在用户设置json文件中添加以下配置:
"latex-workshop.latex.autoBuild.run": "onSave",
这样每次保存文档时,VS Code 都会自动编译 LaTeX 文档。将 "onSave" 改为 "never" 则可以关闭自动编译功能。
初探 LaTeX¶
话不多说,先来一个最小运行实例:
\documentclass{article}
\title{This is a title}
\author{Your Name}
\date{\today}
begin{document}
\maketitle
Hello, \LaTeX!
end{document}
这个例子展示了一个最简单的 LaTeX 文档结构。我们从上到下依次解释各个部分的作用:
- \documentclass{article}:这行代码指定了文档的类型,这里我们选择了 article 类型,适用于短篇文章和报告。
- 3-5行:这些行定义了文档的标题、作者和日期信息。
- begin{document} 和 end{document}:这两行代码标志着文档的开始和结束,所有的正文内容都应当写在这两行代码之间。
- \maketitle:这行代码用于生成标题或标题页,根据前面定义的标题、作者和日期信息。
- Hello, \LaTeX!:这是文档的正文内容,这里我们简单地输出了一句问候语。
我们用以下命令编译这个文档:
xelatex example.tex
当然如果用的是 VS Code 的 LaTeX Workshop 插件并开启“保存时自动编译”功能的话,就不需要手动运行上述命令了。
命令和环境¶
从上文中,我们抽象出两个概念:一个是“命令”,另一个是“环境”。
命令通常以反斜杠(\)开头,后面跟着命令名称和可选的参数,用于执行特定的操作,例如设置标题、插入图片等。
对于带有必选参数的命令而言,当必选参数是1个字符或1个命令时,可以省略大括号。例如,命令 \a b 等价于 \a{b}。但是当必选参数是多个字符时,则不能省略大括号,例如 \a bc 并不等价于 \a{bc},而是等价于 \a{b}c。
除此之外,有的命令还可以带一个星号(*)作为修饰符,以改变命令的行为。例如,命令 section* 用于创建一个无编号的章节标题,而 section 则会创建一个带编号的章节标题。星号修饰符通常用于那些需要特殊处理的命令,以提供更多的灵活性和控制。
环境则是由 begin{} 和 end{} 包围的一段代码块,用于定义特定的结构或格式,例如列表、表格等。在上述begin和end后的环境名参数必须相同,否则会报错。
这两个是 LaTeX 的核心概念,理解它们对于编写 LaTeX 文档非常重要,所有的 LaTeX 文档都是由命令和环境,以及其中的文本内容组成的。
正确输入符号¶
在 LaTeX 中,大多数字符都可以直接输入,例如字母、数字和大部分标点符号。但是,有一些特殊字符在 LaTeX 中有特殊的含义,不能直接输入,否则会导致编译错误,例如# 用来在定义时指定命令参数、$ 用来表示数学模式的开始和结束、% 用来表示注释的开始等。
不能直接输入的符号都需要用一个命令来输入,大多数上述符号对应的命令都是在它的前面加上反斜杠。所以:
使用命令输入符号
| 输入 | \# | \$ | \% | \& | \_ | \{ | \} | \textbackslash |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 输出 | # | $ | % | & | _ | { | } | \ |
反斜杠比较特殊,这个东西被定义为 \textbackslash 而不是 \\,因为后者在 LaTeX 中被定义为换行命令。类似的,^虽然可以用\^输入,但在文本模式下被定义为重音符号,在一些欧洲语言中用于表示字母的变音5,例如 \^e 会输出 ê 。如果想要在文本中输入普通的符号,可以使用 \textasciicircum 命令。
类似的,波浪号(\~{})在 LaTeX 中被定义为不可断行空格,如果想要输入普通的波浪号,可以使用 \textasciitilde 命令。这个东西和数学中的\sim 是不同的,因此不能混用。
还有一些标准键盘难以输入的符号,例如英文省略号、破折号等,也有对应的命令。例如,英文省略号可以用 \dots 或 \ldots 命令6输入,破折号可以用 -- 和 --- 分别输入短破折号和长破折号。
类似的,双引号和单引号也有特殊的输入方式:双引号用两个反引号(``)与两个单引号(''),单引号用一个反引号(`)与一个单引号(')。在排版是时候不要用一对直引号来表示引号,而是要用上述的方式来输入。而中文的引号则可以直接输入,实际上在Unicode中英文引号和中文引号是一个码位的,但字体是不同的。
其他特殊符号(如\S{})在 XeLaTeX 和 LuaLaTeX 中可以直接输入,因为它们支持 Unicode 字符集。但是在 pdfLaTeX 中,仍然需要使用相应的命令来输入这些符号,例如上述的 \S 命令。类似还有 \P{}(\P)、\textbullet{}(\textbullet)等。
也可以通过Unicode编码来输入一些符号,例如 \symbol{960} 可输出π。这种输入方式仅适用于 XeLaTeX 和 LuaLaTeX,因为它们支持 Unicode 字符集。
还有的符号由宏包提供,pifont、manfnt、wasysym 等宏包都提供了大量的符号,可以根据需要进行使用。
空格、换行和分段¶
空格¶
字母之间的一个空格或多个空格在输出时都会被视为一个空格。这意味着无论你在源代码中输入多少个空格,最终输出的文档中只会显示一个空格。每一行开头的空格会被忽略掉。
而使用Tab输入的水平制表符也会被视为一个空格,多个Tab同样只会被视为一个空格。但不建议在 LaTeX 文档中使用Tab来表示空格。
在pdfLaTeX 外的任何编译方式下使用ctex来处理中文文档时,中文字符之间的空格会被忽略掉,而汉字和字母、数字之间会自动留出间距。
若确实想输出一个空格,使用\来输出一个强制的空格,这个空格允许换行。该空格经常用于在由小写字母和句点构成的缩写的后面,例如e.g.\ LaTeX会输出为e.g.\ LaTeX。这是因为小写字母的后面的句点被认为是一句话的结束,因此后面的空格会被视为句子间距而不是单词间距,从而导致排版效果不佳。使用强制空格可以避免这种情况。
如果想输出一个不可换行的空格,可以使用~来实现,该空格多用于人名。
面对更严格的需求,例如“空一个汉字的宽度”,可以使用\hspace{1em}来实现,其中1em表示当前字体大小的宽度。类似的,\hspace{2em}表示空两个汉字的宽度,依此类推。
由反斜杠和字母构成的命令后面如果直接跟一个空格的话,该空格会被忽略掉,因此如果想在命令后面输出一个空格的话,可以使用强制空格\来实现。例如,\LaTeX\ is great!会输出为LaTeX\ is great!,而不是LaTeX is great!。而更常用的写法是{\LaTeX} is great!。
另,TeX 原语 \ignorespaces 可以用来忽略命令后面的所有空格,直到遇到下一个非空格字符为止,该命令在自定义命令和环境时非常有用。
换行和分段¶
在 LaTeX 中,单个换行符不会导致输出中的换行。要在输出中插入换行,可以使用两个连续的换行符(即一个空行)来表示一个新的段落。例如:
This is the first paragraph.
This is the second paragraph.
这段代码会输出为两个段落。
而换行则通过命令\\来实现,例如:
This is the first line.\\
This is the second line.
换行和分段是两个不同的概念:换行是在同一段落内换到下一行,而分段则是开始一个新的段落。也就是说,换行的时候并没有分段。换行仅能在段落内部使用,所以不能在段落开头使用换行命令。
还有一个换行命令\linebreak,该命令会使得前一行分散对其7,并在当前位置强制换行。该命令在少数情况下用于消除连字符。
强制分页¶
有时我们需要在文档中强制分页,有三种常用的方法可以实现这一点:
- 使用命令\newpage:该命令会立即开始一个新页,无论当前页是否已满。但在多栏文档中,该命令只会结束当前栏,而不会结束当前页。
- 使用命令\clearpage:该命令总会切到新的页面。
- 使用命令\cleardoublepage:该命令会切换到下一页,并确保新页是奇数页(右侧页)。如果当前页是奇数页,则会插入一个空白页以确保新页是奇数页。该命令通常用于双面打印的文档中,以确保章节或部分总是从右侧页开始。
百分号和代码注释¶
在 LaTeX 中,百分号(%)用于表示注释的开始。任何在百分号后面的内容,直到行尾,都会被视为注释,不会被编译器处理。例如:
This is some text. % This is a comment
这段代码中,This is a comment 是注释内容,不会出现在输出的文档中。
百分号有一个妙用:能够使得LaTeX忽略百分号之后、下一行最前面的所有空格,这一功能在自定义命令和环境时非常有用。例如:
Some text here.%
More text here.
这段代码会输出为 Some text here.More text here.,而不会在 here. 和 More 之间插入空格。
LaTeX 文档结构¶
显然,一个完整的 LaTeX 文档通常由以下两个部分组成:导言区和正文区。
导言区¶
导言区位于begin{document}命令之前,用于设置文档的类型、加载宏包和定义自定义命令等。导言区中的内容不会直接出现在输出的文档中,但会影响文档的整体格式和功能。
导言区的第一行永远是\documentclass命令,用于指定文档的类型和相关选项。例如:
\documentclass[12pt,a4paper]{article}
这行代码指定了文档类型为 article,字体大小为12pt,纸张大小为A4。上述中括号内的内容被称作“文档类选项”,用于定制文档的外观和行为。
在导言区中,我们还可以使用\usepackage命令来加载宏包,以扩展 LaTeX 的功能。例如:
\usepackage{graphicx} % 用于插入图片
\usepackage{amsmath} % 用于高级数学排版
也可以在调用宏包时传递选项,例如:
\usepackage[utf8]{inputenc} % 设置输入文件的编码为UTF-8
宏包名称也可以一口气写多个,多个宏包之间用逗号分隔,例如:
\usepackage{graphicx,amsmath,hyperref}
导言区不能出现任何正文内容,否则会导致编译错误。
正文区¶
正文区位于begin{document}和end{document}命令之间,包含了文档的实际内容,如文本、图片、表格等。正文区中的内容会被编译器处理,并出现在输出的文档中。
LaTeX 标准文档类¶
LaTeX 提供了几种标准的文档类,适用于不同类型的文档,最常用的是article、report和book三种文档类,分别用于短篇、中篇和长篇文档的编写。其余的文档类往往是基于上述标准文档类进行扩展和定制的。
标题、标题页¶
标题由命令\title、\author和\date定义,然后通过命令\maketitle生成。标题页通常包含文档的标题、作者和日期等信息。 例如:
\title{My First \LaTeX Document}
\author{Alice \and Bob}
\date{\today}
begin{document}
\maketitle
end{document}
这段代码会生成一个标题页,显示文档的标题、作者和当前日期。多个作者可以使用\and命令分隔。
上述中的\date命令可以省略,如果省略的话,LaTeX 会默认使用当前日期作为文档的日期。如果不想显示日期,可以将\date命令设置为空,例如\date{}。\today命令用于插入当前日期,也可以在\date命令中使用手写的日期,例如\date{January 1, 2024}。
在 LaTeX 默认的设置中,article文档类的标题不单独占1页。而report和book文档类的标题则会单独占1页。如果想让article文档类的标题单独占1页,应这样做:
\documentclass[titlepage]{article}
类似的,report和book文档类如果不想让标题单独占1页,可以这样做:
\documentclass[notitlepage]{report}
而标准文档类也提供了titlepage环境,用于创建自定义的标题页。例如:
begin{titlepage}
\mbox{}\vfil % 占位符和垂直填充
begin{center}
{\Huge My Custom Title Page}\\[2em]
{\Large Author Name}\[1em]
{\large \today}
end{center}
end{titlepage}
上述代码会创建一个自定义的标题页,使用了\mbox{}命令作为占位符,并使用\vfil命令实现垂直居中对齐。标题、作者和日期分别使用不同的字体大小,并通过\\[length]命令调整行间距。上述代码是正文区的一部分,因此应放在begin{document}和end{document}之间,且使用了自定义的标题页就不应该再使用\maketitle命令了,否则会导致重复的标题。
titlepage的另一个特性是会把当前页的页码设置为0,下一页的页码从1开始。
摘要¶
摘要是通过abstract环境8来创建的。例如:
begin{abstract}
This is a brief summary of the document.
end{abstract}
一般的,摘要环境应放在标题页之后、目录之前的位置。如果文档没有标题页,则应放在正文的开头部分。
LaTeX 标准文档类的摘要标题是“Abstract”,如果想要更改摘要标题,可以使用\renewcommand命令重新定义\abstractname命令,例如:
\renewcommand{\abstractname}{摘要}
而如果使用了ctex中文文档类或调用了ctex宏包则无需这样做。
章节、附录、目录¶
章节层次¶
在 LaTeX 中,章节和附录是通过特定的命令来创建和管理的,而目录则是通过命令自动生成的。
章节命令和层次
| 层次 | 命令 | 说明 | 可选编号 |
| --- | --- | --- | --- |
| 最高层次 | \part | 用于划分文档的主要部分 | 是 |
| 次高层次 | chapter | 用于划分章节 | 是 |
| 中间层次 | section | 用于划分节 | 是 |
| 次低层次 | subsection | 用于划分小节 | 是 |
| 最低层次 | subsubsection | 用于划分子小节 | 是 |
| 段落 | \paragraph | 用于划分段落 | 否 |
| 子段落 | \subparagraph | 用于划分子段落 | 否 |
上述表格列出了 LaTeX 中常用的章节命令及其层次结构。需要注意的是,不同的文档类支持的章节层次可能有所不同。例如,article文档类不支持chapter命令,而book和report文档类则支持该命令;在article中subsubsection有编号,而在book和report中则没有编号。
在默认情况下,所有带编号的章节命令都会自动生成编号,并在目录中显示相应的条目。如果不想要编号,可以在命令后面加上星号(*),例如section*{Introduction}。这种无编号的章节不会出现在目录中,除非手动添加。手动添加的方式是:
section*{Introduction}
\addcontentsline{toc}{section}{Introduction} % 手动添加到目录
目录¶
目录则必须基于现有的章节命令自动生成:
\documentclass{article}
begin{document}
\tableofcontents % 生成目录
section{some}
section*{other}
section{some some}
end{document}
上述代码编译两次得到目录内容仅包括“some”和“some some”,而不包括“other”。
在book类中包括一种特殊的分割方式:\frontmatter、\mainmatter和\backmatter命令。这些命令用于划分文档的不同部分,并影响页码的格式和章节编号方式。
- \frontmatter:用于文档的前言部分,通常包括标题页、摘要和目录等。在这一部分中,页码通常使用罗马数字(i, ii, iii, ...),章节编号通常不显示。
- \mainmatter:用于文档的主体部分,包含主要内容。在这一部分中,页码通常使用阿拉伯数字(1, 2, 3, ...),章节编号会正常显示。
- \backmatter:用于文档的附录和参考文献等。在这一部分中,页码继续使用阿拉伯数字,但章节编号通常不显示。
附录¶
附录通过\appendix命令来创建,该命令会将后续的章节编号改为字母编号(A, B, C, ...)。例如:
\appendix
section{First Appendix}
section{Second Appendix}
上述代码会生成两个附录,编号分别为“Appendix A”和“Appendix B”。
标准文档类的选项¶
标准文档类有许多可选的选项,用于定制文档的外观和行为。以下是一些常用的选项:
- 纸张大小 用于设置文档的纸张大小,最常用的三种是a4paper,a5paper和b5paper,分别对应A4、A5和B5纸张大小,默认是letterpaper(美国信纸大小),但如果在TexLive安装时把“缺省纸张大小”设置为A4的话,则默认是A4纸张大小。
- 纸张方向 默认是纵向(portrait),可以使用landscape选项将纸张设置为横向(长边为宽)。
- 字体大小 用于设置文档的基本字体大小,常用的有10pt、11pt和12pt,默认是10pt。
- 双面打印 用于设置文档为双面打印格式,默认是单面打印。使用twoside选项启用双面打印,使用oneside选项启用单面打印。book是默认双面打印的,而article和report默认单面打印。
- 标题页 用于控制标题页的显示方式。使用titlepage选项使标题单独占一页,使用notitlepage选项使标题与正文在同一页显示。article默认不单独占页,而report和book默认单独占页。
- 章标题位置 仅适用于report和book文档类。使用openright选项使章节总是从右侧页开始,使用openany选项允许章节从任意页开始。默认是openright。
- 单双栏排版 用于设置文档为单栏或双栏排版。使用twocolumn选项启用双栏排版,使用onecolumn选项启用单栏排版。默认是单栏排版。
我们举个例子:
\documentclass[a4paper,12pt,twoside,titlepage]{report}
上述代码指定了文档类型为report,纸张大小为A4,字体大小为12pt,启用双面打印,并使标题单独占一页。
文档类¶
在 LaTeX 中,内容和格式是分离的,文档类决定了文档的整体结构和格式,而内容则由用户编写。因此,选择合适的文档类对于创建符合需求的文档非常重要。
除了标准的文档类(article、report和book)之外,LaTeX 还有许多其他的文档类,适用于不同类型的文档编写。对于中文文档,最惯用的三个文档类是ctexart、ctexrep和ctexbook,分别对应article、report和book文档类。这些文档类预设了中文支持和常用的中文排版设置,极大地方便了中文文档的编写。
字体、字号和行距¶
行距¶
行距极其简单,仅用一句话即可说明:在导言区使用\linespread{factor}命令来设置行距,其中factor是一个乘数,表示行距相对于默认行距的倍数。例如,\linespread{1.5}会将行距设置为1.5倍,适用于学术论文等需要较大行距的文档。
字体¶
在 LaTeX 中,有三个最基本的字体族:衬线字体(Serif)、无衬线字体(Sans Serif)和等宽字体(Monospaced)。默认情况下,正文使用衬线字体。对于这几个字体族,可以使用以下命令进行切换:
- 衬线字体:\textrm{文本} 或 {\rmfamily }
- 无衬线字体:\textsf{文本} 或 {\sffamily }
- 等宽字体:texttt{文本} 或 {\ttfamily }
在 LaTeX 中,对同一个字体族内加粗、倾斜,本质上是切换字体族内的不同字体变体。加粗和倾斜对应着字体的两个属性:字重和字形。字重表示字体的粗细程度,常见的有常规(Regular)、粗体(Bold)等;字形表示字体的样式,常见的有直立(Upright)、斜体(Italic)和倾斜体(Oblique)等。一般情况下,字重和字形之间的切换是独立的,可以任意组合,但如果不存在某个组合的字体变体,则会退化为最接近的可用变体。
- 中等字重:
\textmd{文本}或{\mdseries } - 粗体字重:
\textbf{文本}或{\bfseries } - 直立字形:
\textup{文本}或{\upshape } - 斜体字形:
\textit{文本}或{\itshape } - 倾斜体字形:
\textsl{文本}或{\slshape } - 小型大写字形:
\textsc{文本}或{\scshape }
要叠加字体属性,可以将多个命令嵌套使用,例如:
\textbf{\textit{Bold Italic Text}}
{\bfseries \itshape Bold Italic Text}
以上两种写法都会输出加粗斜体文本。
LaTeX 还提供了“一键恢复正常”的命令:\textnormal{文本} 或 {\normalfont },用于将文本恢复为默认字体样式。
Tip
在使用{\itshape }时,可能会导致斜体文本和后续的正常文本之间出现重合的问题。这是因为{\itshape }命令会影响后续文本的间距,导致斜体文本和正常文本之间的间距不正确。为了解决这个问题,可以在斜体文本后面添加一个倾斜校正命令\/,以确保斜体文本和后续文本之间的间距正确。
而在实际操作中,我们推荐使用具有实际意义的命令来设置字体样式,例如\emph{文本}用于强调文本,而不是直接使用字体属性命令。如果我们希望修改上述\emph命令的行为,可以通过重新定义该命令来实现,而不是直接使用字体属性命令。
另一种手段是自己写一个自定义命令,例如:
\newcommand{\important}[1]{\textbf{#1}}
上述代码定义了一个名为\important的新命令,用于加粗文本。使用时,只需调用该命令即可,例如\important{This is important text.}。如果之后想要修改该命令的行为,例如改为斜体,只需修改命令定义即可,而不需要在文档中逐一修改所有使用该命令的地方,提高了文档的可维护性。
如希望改变整个文档的默认字体,可以这样做:
\usepackage{fontspec} % 仅适用于XeLaTeX和LuaLaTeX
\setmainfont{Times New Roman} % 设置正文字体
\setsansfont{Arial} % 设置无衬线字体
\setmonofont{Courier New} % 设置等宽字体
但macOS中使用这类命令可能遇到一些问题,这实际上是操作系统层面的问题,你要试着找到macOS中字体的正确名称。
另一方面,无衬线或等宽字体可能看起来会比衬线字体更大。这需要通过调整字号来弥补:
\setmainfont{TeX Gyre Termes} % 衬线字体
\setsansfont{TeX Gyre Heros}[Scale=MatchLowercase] % 无衬线字体
\setmonofont{TeX Gyre Cursor}[Scale=MatchLowercase] % 等宽字体
字号¶
字号就是字体的大小。在 LaTeX 中,字号可以通过一组预定义的命令来设置,这些命令分别对应不同的字号级别。常用的字号命令如下:
- \tiny:极小字号,是本文支持的最小字号。
- \scriptsize:上下标的字号,常用于脚注和公式的上下标。
- \footnotesize:脚注字号,常用于脚注
- \small:小字号,常用于次要内容。
- \normalsize:正常字号,默认字号。
- \large:大字号
- \Large:更大字号
- \LARGE:更更大字号
- \huge:巨大字号
- \Huge:更巨大字号,是本文支持的最大字号。
即使我们在导言区设置了文档的基本字体大小(例如10pt、11pt或12pt),上述字号命令仍然会根据该基本字体大小进行相应的调整,不会出现normalsize比large还大的情况。
如不想用这些封装好的字号命令,应使用\fontsize{size}{skip}\selectfont命令来设置自定义字号,其中size是字体大小,skip是行距,推荐设置为字号的1.2倍。例如:
{\fontsize{14pt}{16pt}\selectfont ABC}
倘若使用了ctex宏包或文档类,则可以使用更方便的命令\zihao{size}来设置字号,其中size是字号级别,取值范围为-8到8。例如:
{\zihao{4} ABC} % 四号字
{\zihao{-4} ABC} % 小四号字
特殊文字效果¶
在 LaTeX 中,允许使用颜色、下划线、删除线等特殊文字效果来增强文档的视觉效果。这些效果通常通过加载相应的宏包来实现。
颜色¶
要在 LaTeX 文档中使用颜色,首先需要加载xcolor宏包:
\usepackage{xcolor}
\textcolor{red}{This text is red.} % 红色文本
上述代码会把“This text is red.”显示为红色。
xcolor宏包定义了green、blue等多种预定义颜色,基本上常见的颜色都有对应的名称。也可以反色、混色等,具体用法请参考xcolor宏包的文档。
下划线等强调效果¶
在 LaTeX 中,可以使用ulem宏包来实现下划线、删除线等强调效果。首先需要加载该宏包:
\usepackage{ulem}
\uline{This text has an underline.} % 下划线
\sout{This text has a strikethrough.} % 删除线
\uuline{This text has a double underline.} % 双下划线
\uwave{This text has a wavy underline.} % 波浪下划线
\xout{This text is crossed out.} % 更乱的删除线
\dashuline{This text has a dashed underline.} % 虚线下划线
\dotuline{This text has a dotted underline.} % 点状下划线
上述代码展示了如何使用ulem宏包提供的各种强调效果。
但是,使用该宏包会导致\emph命令的行为发生变化,默认情况下该命令会将文本设置为斜体,但加载ulem宏包后,该命令会将文本设置为下划线。如果不想改变\emph命令的行为,可以在加载ulem宏包时使用normalem选项:
\usepackage[normalem]{ulem}
汉字下边加的点较着重号,该符合则需要加载xeCJKfntef宏包(仅适用于XeLaTeX和LuaLaTeX):
\usepackage{xeCJKfntef}
\CJKunderline{这是下划线} % 汉字下划线
\CJKunderdot{这是着重号} % 汉字下点
其余命令类似于ulem宏包,只不过是要把命令名前加上前缀,且简写u应该展开为under。
该宏包还提供了一个可以在字和字之间断开的下划线用法:
\CJKunderwave-{我}\CJKunderline-{是}\CJKunderwave-{下划线} % 可断开的下划线
也可以通过在命令名后面加上星号来实现不可断开的下划线,例如\CJKunderline*{文本},该下划线不会忽略标点。
文内交叉引用¶
在 LaTeX 中,文内交叉引用是通过label{key}和ref{key}命令来实现的。首先,在需要引用的位置使用label{key}命令为该位置设置一个标签(key),然后在需要引用该位置的地方使用ref{key}命令来引用该标签。例如:
section{Introduction}label{sec:intro}
As discussed in Section~ref{sec:intro}, ...
上述代码中,label{sec:intro}为“Introduction”章节设置了一个标签,随后通过ref{sec:intro}引用该章节。类似的,还可以用\pageref{key}命令来引用标签所在的页码,用\nameref{key}命令来引用标签的名称9。
同样的,为了正确编译包含交叉引用的文档,通常需要编译两次,以确保所有引用都能正确解析。
引用超链接¶
在 LaTeX 中,可以使用hyperref宏包来创建文档中的超链接。首先需要在导言区加载该宏包:
\usepackage{hyperref}
加载该宏包后,文档中的交叉引用(如ref和\pageref)会自动转换为超链接,点击这些链接可以跳转到相应的位置。
在该宏包的默认设置下,超链接的颜色为红色,并且带有边框。如果希望自定义超链接的颜色和样式,可以使用以下选项:
\hypersetup{hidelinks, colorlinks=true, linkcolor=blue, citecolor=green, urlcolor=cyan}
上述代码中,hidelinks选项用于隐藏超链接的边框,colorlinks=true选项启用彩色链接,linkcolor、citecolor和urlcolor选项分别设置普通链接、引用链接和URL链接的颜色。其他比较常用的选项还有pdftitle、pdfauthor等,用于设置PDF文档的元数据,但都不算很常用。
为了引用超链接(网址),需要使用<网址>或[显示文本](网址)命令。例如:
url{https://www.latex-project.org/} % 直接显示网址
href{https://www.latex-project.org/}{LaTeX Project} % 显示自定义文本
上述代码会创建两个超链接,第一个显示完整的网址,第二个显示自定义的文本“LaTeX Project”。
该宏包必须在导言区的最后加载,以确保不出现兼容性问题。
参考文献¶
参考文献的管理和排版在 LaTeX 中通常通过BibTeX、BibLaTeX或natbib等宏包来实现。这里我们介绍使用BibLaTeX宏包来管理参考文献的方法,也是笔者比较习惯的方式。
为了管理参考文献,首先我们要写一个.bib文件,该文件包含了所有参考文献的条目。每个条目都有一个唯一的引用键(cite key),用于在文档中引用该条目。例如,下面是一个简单的.bib文件内容:
@book{lamport1994latex,
title={LaTeX: A Document Preparation System},
author={Lamport, Leslie},
year={1994},
publisher={Addison-Wesley}
}
上述代码定义了一个书籍类型的参考文献条目,引用键为lamport1994latex。
在文档中引用参考文献时,可以使用\cite{cite key}命令。例如:
\documentclass{article}
\usepackage[backend=biber,style=numeric]{biblatex}
\addbibresource{references.bib} % 引入.bib文件
begin{document}
This is a reference to Lamport's book \cite{lamport1994latex}.
% 下列命令常常放在文档末尾
\printbibliography % 打印参考文献列表
end{document}
编译包含参考文献的文档时,需要按照以下顺序进行编译:
xelatex mydocument.tex
biber mydocument
xelatex mydocument.tex
xelatex mydocument.tex
biblatex 的参考文献格式通过宏包选项的style参数来设置,常用的格式有numeric(数字编号)、authoryear(作者-年份)等。
也可以分别制定参考文献列表的格式和引用的格式,分别使用citestyle和bibstyle参数。例如:
\usepackage[backend=biber,citestyle=authoryear,bibstyle=numeric]{biblatex}
排版中文文档¶
排版中文文档应使用ctex宏集。该宏集包含了ctex文档类和ctex宏包两部分内容。前者用于创建中文文档,后者则可以在任何文档类中使用以支持中文排版。
ctex文档类¶
ctex文档类包括ctexart、ctexrep和ctexbook,分别对应article、report和book文档类。使用这些文档类可以方便地创建中文文档,而无需手动配置中文支持。例如:
\documentclass{ctexart}
begin{document}
你好,世界!
end{document}
上述代码创建了一个简单的中文文档,使用了ctexart文档类。
这几个文档类有着一些特定的选项,用于定制中文文档的外观和行为。例如:
- 字体设置 可以通过fontset选项来指定中文字体集,例如fontset=windows、fontset=mac等,分别对应Windows和Mac系统的默认中文字体。
- 默认字号 可以通过zihao选项来设置默认字号,例如zihao=4表示四号字,zihao=-4表示小四号字。
- 标点样式 可以通过punctstyle选项来设置中文标点的样式,例如punctstyle=kaiming表示使用开明体的标点样式。
标点样式包括quanjiao(全角标点)、kaiming(开明体标点)、banjiao(半角标点)、CCT(标点符号宽度略小于一个汉字宽度)和plain(不做任何处理)。默认是quanjiao。
ctex宏包¶
ctex宏包可以在任何文档类中使用,以支持中文排版。例如:
\documentclass{article}
\usepackage{ctex}
begin{document}
你好,世界!
end{document}
上面的代码与使用ctex文档类的效果几乎相同,会开启中文排版方案: - 默认字号为五号字; - 行距变为标准文档类默认行距的1.3倍; - 汉化文档的标题名称,例如摘要、目录等; - 设置中文标点样式为全角标点; - 章节标题后的第一段开启首行缩进。
但不会把标题格式等改为中文文档类的格式。
不使用上述功能的话,可以在调用ctex宏包时传递相应的选项来禁用这些功能。例如:
\usepackage[scheme=plain]{ctex}
上述代码禁用了ctex宏包的中文排版方案,恢复为标准文档类的默认设置。这种场景仅仅适用于输入少量汉字的英文文档。
如果希望使用中文文档类的标题格式,则应:
\usepackage[heading=true]{ctex}
但是这样不能自由的设置章节标题格式,因此更推荐使用ctex文档类。
设置标题样式¶
ctex宏集提供了多种预定义的标题样式,可以通过\ctexset命令来设置。例如:
\ctexset{section={
format+=\bfseries, % 加粗章节标题
name={第,章}, % 章节名称格式
number=\chinese{section}, % 章节编号格式为中文数字
}}
上述代码将章节标题设置为加粗,章节名称格式为“第X章”,章节编号格式为中文数字。类似的,可以设置节、小节等标题样式。
ctex中文文档类把标题分成前后两部分:名称和标题,例如“第1章 绪论”中,“第1章”是名称,“绪论”是标题。这些样式整体上由format设置,详见ctex文档。
中文字体¶
在中文文档类中,我们可以选择不同的中文字体来排版文档。ctex宏集预定义了一些常用的中文字体库,例如: - windows:适用于Windows系统,使用微软雅黑、中易宋体等字体。 - mac:适用于Mac系统,使用苹方、华文细黑等字体。 - ubuntu:适用于思源黑体、思源宋体、文鼎楷体等字体。 - adobe:适用于Adobe系统,使用Adobe的中文字体。字体需要下载。 - fandol:使用Fandol字体库,适用于跨平台的中文排版,但相当缺字。 - founder:使用方正字体库,适用于需要方正字体的文档。但字体需要下载,且部分非免费商用。 - none:不设置中文字体,使用系统默认字体。
可以通过在导言区使用\setCJKmainfont、\setCJKsansfont和\setCJKmonofont命令来分别设置中文的衬线字体、无衬线字体和等宽字体。例如:
\setCJKmainfont{SimSun} % 设置中文衬线字体为宋体
\setCJKsansfont{SimHei} % 设置中文无衬线字体为黑体
\setCJKmonofont{FangSong} % 设置中文等宽字体为仿宋
需要注意的是,如果使用上述命令设置字体,则需要确保所指定的字体已经安装在系统中,否则会导致编译错误;且需要设置宏集中的字体库为none,否则会得到一条警告信息。
\usepackage[fontset=none]{ctex}
也可以使用更多中文字体:
\newCJKfontfamily\CJKHeavy{Source Han Serif SC Heavy} % 定义一个新的中文字体命令
{\CJKHeavy 这是使用自定义字体的文本。}
-
本章由张庭瑄和臧炫懿合作完成,其中张庭瑄为主要作者。 ↩
-
CTeX套装是2015年前非常流行的一个国产整合包,但是近年来已经不再维护,且与新版TexLive冲突严重,建议卸载。 ↩
-
新版本的TexLive貌似已经支持空格了。但是老教程遍地都是,为了保险起见,依然建议不要使用空格 ↩
-
张庭瑄同志说该插件有bug,但笔者使用并未发现问题,同学们见仁见智了。 ↩
-
这个太多了,不展开讲了。 ↩
-
对于句号前出现的省略号,直接用就行。但这也会导致英文省略号在正文中的前后间距会不对称,因而推荐的解决方案是把这两个东西都用在数学模式中。 ↩
-
也就是Word中的“两端对齐”效果,上一行会被拉伸以填满整行。 ↩
-
该环境在book文档类中不可用。 ↩
-
需要加载nameref宏包。 ↩