跳转至

LaTeX 进阶

本章将介绍一些更高级的 LaTeX 技巧和概念,帮助你更好地利用 LaTeX 的强大功能来创建专业的文档,例如数学公式、插入图表、自定义命令和环境等内容。

利用 LaTeX 排版数学公式1

LaTeX 中,数学公式都需要进入一个特殊的模式:数学模式(math mode)。有两种主要的数学模式:行内数学模式和行间数学模式。

为了更好地排版数学公式,建议加载 amsmath 宏包,它提供了许多增强的数学排版功能和环境。可以在导言区添加以下代码来加载该宏包:

\usepackage{amsmath}

行内公式

LaTeX 中,行内数学模式使用美元符号($)包围数学内容,例如:$E=mc^2$。这将在文本中显示为 \(E=mc^2\)。另一种方式是使用反斜杠加括号:\(E=mc^2\)

\ensuremath{} 可以确保参数始终处于数学模式,无论该命令在文本模式还是数学模式中使用。例如,定义一个命令来表示向量:

\newcommand{\vect}[1]{\ensuremath{\mathbf{#1}}}

这样,无论在文本中还是数学公式中使用 \vect{v},都能正确显示为 \(\mathbf{v}\)。但是,普通公式非常不建议用这个,仅建议在定义命令时使用。

行间公式

行间公式则是较大的、被单独展示的数学表达式。可以使用反斜杠加中括号:\[E=mc^2\],这样会将公式居中显示在单独的一行上:

\[ E=mc^2 \]

上述方法不会带行号,如果需要行号,可以使用 amsmath 宏包提供的 equation 环境:

BEGIN{equation}
E=mc^2
END{equation}

在数学模式中输入的空格会被忽略,间距由 TeX 自动控制,也就是说 $a + b$$a+b$ 效果是一样的,都会显示为 \(a+b\)

数学模式中禁用分段、汉字和中文标点。在行间公式中不允许换行。

什么时候使用数学模式

在数学模式中,LaTeX 会对输入的内容进行特殊处理,以确保数学符号和表达式的正确显示。因此,即使是最简单的数学表达式都要放在数学模式中,例如变量、运算符和函数等。例如,变量 \(x\)\(y\) 应该写成 $x$$y$,而不是直接写成 xy1+1=2 应该写成 $1+1=2$

由于数学符号之间的间距与文本中产生的间距有所不同、数学和文本的断行也不同,因此在罗列许多变量的时候要把每一个变量单独放在数学模式中,例如:$a$, $b$, $c$,而不是 a, b, c。另,如使用半角逗号分隔变量,则应该加空格。例如:$a$, $b$, $c$,而不是 $a$,$b$,$c$。全角的逗号则不需要加空格。

普通的数学符号

基本数学符号

在数学模式中,可以使用各种简单的数学符号。希腊字母使用反斜杠加字母的英文名称表示,第一个字母大写表示大写希腊字母,第一个字母小写表示小写希腊字母。例如:\alpha 显示为 \(\alpha\)\beta 显示为 \(\beta\)\Gamma 显示为 \(\Gamma\)\Delta 显示为 \(\Delta\)。部分大写字母没有被定义,例如大写的 \(A\)\(B\) 没有对应的命令,这两个分别是大写的 \(\alpha\)\(\beta\),我们完全可以用普通的字母 A 和 B 来表示它们。

也有小写希腊字母的变体,例如:\epsilon 显示为 \(\epsilon\)\varepsilon 显示为 \(\varepsilon\)

上下标

上下标分别使用 ^_,例如:$x^2$ 显示为 \(x^2\)$a_i$ 显示为 \(a_i\);一个数学符号可以同时带一个上标和一个下标,例如:$x_i^2$ 显示为 \(x_i^2\),反过来写成 $x^2_i$ 也是一样。如果上下标包含多个字符,则需要使用大括号将它们括起来,例如:$x^{n+1}$ 显示为 \(x^{n+1}\)$a_{i,j}$ 显示为 \(a_{i,j}\)

一个数学符号后面最多只能带一个上标或下标,如果需要多个上标或下标,可以使用大括号将它们括起来,例如:$x^{x^x}$ 显示为 \(x^{x^x}\)

要是想写前标,可以这么写:$^nP_r$ 显示为 \({}^nP_r\)。为了避免可能出现的间距问题,建议将数学符号连同前后上下标一起放进大括号中,例如:${^nP_r}$ 显示为 \({^nP_r}\)。更好的实践是引入 mathtools 宏包,然后使用 \prescript 命令,例如:\prescript{n}{}{P_r}

撇号

撇号可以直接利用 ASCII 撇号(')输入,例如:$f'(x)$ 显示为 \(f'(x)\)$x''$ 显示为 \(x''\)。如果需要多个撇号,可以连续输入多个撇号,例如:$f'''(x)$ 显示为 \(f'''(x)\)

角度符号

角度符号可以使用 \circ 输入,例如:$90^\circ$ 显示为 \(90^\circ\)

分式

分数和分式使用 \frac{分子}{分母} 输入,例如:$\frac{a+b}{c+d}$ 显示为 \(\frac{a+b}{c+d}\)。简单的行内公式也可以用斜杠表示分式,例如:$a/b$ 显示为 \(a/b\),但要注意此种方式的表示不要产生歧义,要在适当的位置加上括号,例如:$(a+b)/(c+d)$

二项式系数

二项式系数可以使用 \binom{n}{k} 输入,例如:$\binom{n}{k}$ 显示为 \(\binom{n}{k}\)

根号

根号使用 \sqrt{被开方数} 输入,例如:$\sqrt{x+1}$ 显示为 \(\sqrt{x+1}\)。如果需要指定根指数,可以使用 \sqrt[指数]{被开方数},例如:$\sqrt[3]{x}$ 显示为 \(\sqrt[3]{x}\)

上下划线

上划线和下划线分别使用 \overline{内容}\underline{内容} 输入,例如:$\overline{AB}$ 显示为 \(\overline{AB}\)$\underline{xy}$ 显示为 \(\underline{xy}\)。amsmath 也提供了一组在符号上下加划线的命令,例如:\overleftarrow{内容}\overrightarrow{内容}\underleftarrow{内容}\underrightarrow{内容}overrightarrow 常用于表示向量,和 \vec 效果类似;但 \vec 适合单个字符的向量表示,而 \overrightarrow 则适合多个字符的向量表示。

文本

在数学模式中插入文本时,可以使用 \text{文本} 命令,例如:$\text{速度}$。该命令会确保文本以正常的字体和大小显示,而不是数学字体。

巨算符

巨算符(large operators)是指那些在数学公式中用于表示求和、积分、极限等操作的符号。这些符号通常比普通的运算符更大,并且在行间公式中会自动调整大小以适应上下文。最常见的巨算符包括:\(\sum\)\(\prod\)\(\int\)\(\oint\)\(\lim\)\(\bigcup\)\(\bigcap\)\(\bigvee\)\(\bigwedge\) 等。

在行内数学模式中,巨算符的上下限会显示为普通的上下标形式,例如 \(\sum_{i=1}^{n} a_i\)。而在行间数学模式中,巨算符的上下限会显示在符号的上下方,例如:\[\sum_{i=1}^{n} a_i\] 显示为

\[ \sum_{i=1}^{n} a_i \]

只有积分符号的上下限始终显示在符号的旁边,无论是在行内还是行间数学模式中。

amsmath 提供了更多的巨算符,例如:\iint(二重积分)、\iiint(三重积分)、\iiiint(四重积分)和 \idotsint(多重积分)。例如:\[\iint_D f(x,y) \,dx\,dy\] 显示为

\[ \iint_D f(x,y) \,dx\,dy \]

数学模式的字体调整

在数学模式中,可以使用不同的命令来调整字体样式,以突出显示特定的数学符号或表达式。以下是一些常用的字体调整命令:

  • \mathrm{文本}:将文本设置为直立体,例如 $\mathrm{sin}(x)$ 显示为 \(\mathrm{sin}(x)\)
  • \mathbf{文本}:将文本设置为粗体,适用于表示向量或矩阵,例如 $\mathbf{v}$ 显示为 \(\mathbf{v}\)
  • \mathit{文本}:将文本设置为斜体字体,适用于变量名,例如 $\mathit{x}$ 显示为 \(\mathit{x}\)
  • \mathcal{文本}:将文本设置为花体字体,适用于表示集合,例如 $\mathcal{A}$ 显示为 \(\mathcal{A}\)
  • \mathbb{文本}:将文本设置为黑板粗体字体,适用于表示数集,例如 $\mathbb{R}$ 显示为 \(\mathbb{R}\)

图、表、浮动体

LaTeX 中,图表和其他浮动体(如表等)是通过浮动体来管理的。浮动体允许 LaTeX 根据页面布局自动调整图表的位置,以确保文档的美观和可读性。

浮动体之所以“浮动”,是因为它们并不固定在文档中的某个位置,而是可以根据页面布局和排版需求自动调整位置。这样可以避免图表被拆分到不同的页面上,或者与文本内容重叠,从而提高文档的整体质量。但这样会导致图表的位置不一定和代码中出现的位置一致,例如

文本1
浮动体
文本2

上述编译出的文档中,浮动体可能会出现在“文本1”之前、“文本1”和“文本2”之间,或者“文本2”之后,具体位置取决于页面布局。但多个浮动体在文本中的相对顺序是不会改变的。

插入图片

单一图片

LaTeX 中插入图片通常使用 graphicx 宏包。首先,在导言区添加以下代码来加载该宏包:

\usepackage{graphicx}

然后,可以使用 figure 环境来插入图片。例如:

BEGIN{figure}[htbp]
  \centering
  includegraphics[width=0.5\textwidth]{example-image}
  \caption{示例图片}
  label{fig:example}
END{figure}

上述代码中,[htbp] 是浮动体的位置参数,表示允许 LaTeX 将图片放置在此处(here)、顶部(top)、底部(bottom)或单独一页(page)。\centering 用于将图片居中显示,includegraphics 用于插入图片文件,width=0.5\textwidth 指定图片的宽度为文本宽度的一半。\caption 用于添加图片标题,label 用于为图片设置标签,以便在文档中引用。

上述浮动体的位置参数如不写,则默认为 [tbp](对,这里非常坑人,默认不包含 h 选项)。建议总是显式指定位置参数,以确保图片能够尽可能地出现在期望的位置。

如希望强制图片出现在代码中的位置,可以使用 [H] 位置参数,但需要加载 float 宏包:

\usepackage{float}

BEGIN{figure}[H]
  ...
END{figure}

需要注意的是,强制图片出现在指定位置可能会影响页面布局和排版效果,因此应谨慎使用。

includegraphics 命令支持多种图片格式,包括 PNG、JPEG、PDF 和 EPS 等。建议使用矢量图格式(如 PDF 或 EPS)以获得更好的缩放效果,尤其是在打印时。该命令有一些常用选项,例如:

  • width=宽度:指定图片的宽度,例如 width=0.5\textwidth
  • height=高度:指定图片的高度,例如 height=3cm
  • scale=比例:按比例缩放图片,例如 scale=0.8
  • angle=角度:旋转图片,例如 angle=90

最常用的莫过于设置宽度和高度,可以单独设置其中一个,另一个会按比例自动调整;也可以同时设置宽度和高度,但可能会导致图片变形。

caption 命令用于为图片添加标题,标题会自动编号,并且可以通过 label 命令设置标签,以便在文档中引用。例如,可以使用 ref{fig:example} 来引用图片。

子图

如果需要在同一个浮动体中插入多个子图,可以使用 subfigure 宏包。首先,在导言区添加以下代码来加载该宏包:

\usepackage{subfigure}

然后,可以使用 subfigure 环境来插入子图。例如:

BEGIN{figure}[htbp]
  \centering
  \subfigure[子图1标题]{
    includegraphics[width=0.4\textwidth]{example-image-a}
    label{fig:sub1}
  }
  \subfigure[子图2标题]{
    includegraphics[width=0.4\textwidth]{example-image-b}
    label{fig:sub2}
  }
  \caption{整体图片标题}
  label{fig:overall}
END{figure}

上述代码中,\subfigure 用于插入子图,并且可以为每个子图添加标题和标签。整体图片的标题和标签仍然使用 \captionlabel 命令。

插入表格

LaTeX 中插入表格通常使用 table 环境和 tabular 环境。

朴素的表格

最朴素的表格利用 tabular 环境实现,例如:

BEGIN{tabular}{|c|c|c|}
  \hline
  列1 & 列2 & 列3 \\
  \hline
  数据1 & 数据2 & 数据3 \\
  数据4 & 数据5 & 数据6 \\
  \hline
END{tabular}

tabular 不是浮动体环境,表格会出现在代码中的位置。大括号中的参数指定了表格的列格式,有几个字母就有几列,常用的字母包括 c、l、r,分别表示居中、左对齐和右对齐。竖线(|)表示列之间的竖线。

而表格中的每一行以双反斜杠(\\)结束,列与列之间使用 & 符号分隔,用于制表。例如,上述代码中的第一行表示表头,包含三列,分别是“列1”、“列2”和“列3”。第二行和第三行分别表示两行数据。\hline 命令用于添加水平线。

也可以引用 booktabs 宏包来美化表格,例如使用 \toprule\midrule\bottomrule 命令来替代 \hline,从而获得更专业的表格外观,得到基础的“三线表”效果。

但是该朴素的表格不能添加标题和标签,也不能自动调整位置,更不能跨页显示。

带标题和标签的表格

可以使用 table 环境来插入带标题和标签的表格。例如:

BEGIN{table}[htbp]
  \centering
  BEGIN{tabular}{|c|c|c|}
    ...
  END{tabular}
  \caption{示例表格}
END{table}

上述代码中的 table 是浮动体环境,允许 LaTeX 根据页面布局自动调整表格的位置。其余部分与前面介绍的 tabular 环境相同。但该表格依然不能跨页显示。

跨页表格

如果表格内容较多,可能会跨越多个页面。可以使用 longtable 宏包来创建跨页表格。首先,在导言区添加以下代码来加载该宏包:

\usepackage{longtable}

然后,可以使用 longtable 环境来插入跨页表格。例如:

BEGIN{longtable}{|c|c|c|}
    \caption{跨页表格示例} \\
    \hline
    列1 & 列2 & 列3 \\
    \hline
    ENDfirsthead
    \hline
    列1 & 列2 & 列3 \\
    \hline
    ENDhead
    数据1 & 数据2 & 数据3 \\
    数据4 & 数据5 & 数据6 \\
    ... 
END{longtable}

上述代码中,ENDfirstheadENDhead 命令用于定义表格在每一页的表头。其余部分与前面介绍的 tabular 环境基本相同,但该环境能自动处理跨页问题,也能够添加标题、标签等功能。

自定义命令和自定义环境

LaTeX 中,自定义命令和自定义环境可以帮助你简化文档的编写过程,提高代码的可读性和可维护性,类似于编程语言中的函数和类。

自定义命令

可以使用 \newcommand 命令来定义新的命令。其基本语法如下:

\newcommand{\命令名}[参数个数]{命令定义}

其中,\命令名 是你想要定义的命令名称,参数个数 是该命令接受的参数个数(可选,默认为 0),命令定义 是该命令的具体实现。例如,定义一个命令来表示向量:

\newcommand{\vect}[1]{\mathbf{#1}}

上述代码定义了一个名为 \vect 的命令,它接受一个参数,并将该参数以粗体形式显示。可以在文档中使用该命令,例如:

这是一个向量:$\vect{v}$

上述代码将在文档中显示为“这是一个向量:\(\mathbf{v}\)”。

也可以更改现有的命令,例如:

\renewcommand{\emph}[1]{\textbf{#1}}

上述代码将 \emph 命令重新定义为粗体显示,而不是斜体显示。

我们发现这些命令定义中使用了 #1 这类的符号,这是因为在自定义命令中,参数是通过 #1#2 等符号来引用的,分别对应第一个、第二个参数,以此类推。

也有一些较为特殊的用法,例如我“想重定义某命令,但还要保留其原有功能”,这时可以使用 \let 命令来实现。例如:

\let\oldemph\emph
\renewcommand{\emph}[1]{\textbf{\oldemph{#1}}}

上述代码首先使用 \let 命令将原有的 \emph 命令保存为 \oldemph,然后重新定义 \emph 命令,使其在显示为粗体的同时,仍然保留原有的斜体功能。

自定义环境

可以使用 \newenvironment 命令来定义新的环境。其基本语法如下:

\newenvironment{环境名}[参数个数]{环境开始代码}{环境结束代码}

其中,环境名 是你想要定义的环境名称,参数个数 是该环境接受的参数个数(可选,默认为 0),环境开始代码 是该环境开始时执行的代码,环境结束代码 是该环境结束时执行的代码。例如,定义一个名为 highlight 的环境,用于高亮显示文本:

\newenvironment{highlight}{BEGIN{quote}\color{red}}{END{quote}}

上述代码定义了一个名为 highlight 的环境,它将在红色引用块中显示文本。可以在文档中使用该环境,例如:

BEGIN{highlight}
这是高亮显示的文本。
END{highlight}

上述代码将在文档中显示为红色引用块中的“这是高亮显示的文本”。

同样的,环境也支持重新定义,例如:

\renewenvironment{quote}{BEGIN{itshape}}{END{itshape}}

上述代码将 quote 环境重新定义为斜体显示。

使用Beamer类制作幻灯片

LaTeX 除了可以用来排版文章、书籍等文档外,还可以制作幻灯片。Beamer 就是用于制作幻灯片的一个文档类。以下会简单介绍如何使用 Beamer 类制作幻灯片。

Beamer文档的基本结构

Beamer 类文档的基本结构和普通的 LaTeX 文档类似。然而,在正文部分,其内容并不是简单的段落,而是由多个幻灯片(frame)组成的。每个 frame 对应 PowerPoint 中的一页内容。

一个简单的 Beamer 文档示例如下:

\documentclass{beamer}
\usepackage{amsmath}
\title{我的第一篇 Beamer 幻灯片}
\author{张三}
\date{\today}
BEGIN{document}
\frame{\titlepage} % 生成标题页
BEGIN{frame}
  \frametitle{引言} % 设置帧标题
  这是我的第一篇 Beamer 幻灯片。
  我们可以在这里写一些数学公式:
  BEGIN{equation}
    E=mc^2
  END{equation}
END{frame}
END{document}

如上述代码所示,创建帧有两种方式:一种是使用 \frame{} 命令,另一种是使用 frame 环境。前者适合内容较少的帧,后者适合内容较多的帧。在帧中添加标题可以使用 \frametitle{标题} 命令,如希望添加简单文字、图片、公式等内容,可以直接在帧中编写,方法和普通的 LaTeX 文档几乎完全相同。然而,如果希望添加表格、代码等浮动内容,则需要在该帧加上 [fragile] 选项,也就是:

BEGIN{frame}[fragile]

Beamer的常用强调

经常做幻灯片的同学们都知道,在幻灯片中希望强调某些内容的时候,最好不要仅使用字体的简单变化,而是结合显隐、颜色等手段来突出重点。对于部分颜色的文字,可以使用 \textcolor{颜色名}{文本} 命令来实现。例如:

\textcolor{red}{这是红色的文本}
\textcolor{blue}{这是蓝色的文本}

另外,它也提供了一些“块”命令来强调内容,例如 blockalertblockexampleblock 等环境。例如:

BEGIN{block}{普通块}
  这是一个普通块。
END{block}
BEGIN{alertblock}{警告块}
  这是一个警告块。
END{alertblock}
BEGIN{exampleblock}{示例块}
  这是一个示例块。
END{exampleblock}

最后,Beamer 还支持显隐效果,这种显隐效果在列表的逐步显示中非常有用。一个最简单的逐步显示的例子如下:

BEGIN{itemize}
  \item<1-> 第一项
  \item<2-> 第二项
  \item<3-> 第三项
END{itemize}

上述代码中,<1-> 表示从这页的第一帧开始显示这一项,以此类推。如果只想在某一帧显示某一项,可以使用 <n> 的形式,例如 <2> 表示只在第二帧显示这一项。上述代码也可以用在其他环境中,例如段落、公式等。

除了这种简单的显隐效果外,还可以使用 \pause 命令来实现逐步显示的效果。例如:

这是第一部分内容。
\pause
这是第二部分内容。

Beamer 还支持更复杂的显隐效果,感兴趣的同学可以查阅 Beamer 的文档。

Beamer的主题

结构主题决定了幻灯片的整体风格。Beamer 提供了多种内置主题,用户可以根据需要选择合适的主题。可以使用 \usetheme{主题名} 命令来设置主题。内置的主题有许多,我们可以通过查阅 Beamer 的文档来了解这些主题的具体名称和效果。我个人比较喜欢使用 Berlin 主题,该主题简洁大方,适合大多数场合。

配色主题决定了幻灯片的配色方案。可以使用 \usecolortheme{配色主题名} 命令来设置配色主题。内置的配色主题也有许多,例如 dolphinseahorsebeetle 等。

字体主题决定了幻灯片中使用的字体样式。可以使用 \usefonttheme{字体主题名} 命令来设置字体主题。一般情况下,Beamer 使用的字体系列和常规文档(serif)不同,我们可以使用 \usefonttheme{serif} 来强制使用衬线字体。如果仅希望更改公式部分的字体,可以使用 \usefonttheme[onlymath]{serif}

另外,Beamer 允许用户创建自己的主题,或者使用第三方提供的主题包。创建自定义主题需要一定的 LaTeXBeamer 知识,建议有一定经验的用户尝试。

ctexbeamer

ctexbeamer 是类似 ctexart、ctexbook 等 ctex 系列文档类的 Beamer 版本,专门用于处理中文幻灯片。使用 ctexbeamer 可以方便地在幻灯片中输入和排版中文内容,而无需额外配置中文支持。使用 ctexbeamer 的基本方法与使用 Beamer 类类似,只需将文档类更改为 ctexbeamer 即可。例如:

\documentclass{ctexbeamer}
...

ctexbeamer 默认使用 xeCJK 宏包处理中文,因此可以直接在幻灯片中输入中文内容,而无需额外配置中文支持。除此之外,ctexbeamer 还提供了一些特定于中文幻灯片的功能和选项,例如自动调整字体大小、处理中文标点等。

使用ModernCV类制作简历

ModernCV 是一个用于制作简历的 LaTeX 文档类。它提供了多种简洁、美观的简历模板,用户可以根据需要选择合适的模板来制作自己的简历。当然,这类简历极为简洁,然而对于技术类岗位也已经绰绰有余;如希望更花哨、更复杂的简历,这个则略显平淡,可以去淘宝花几块钱买个模板(或者转行当 UI 设计师)。

以下是一个使用 ModernCV 类制作简历的简单示例:

\documentclass{moderncv}
\usepackage[UTF8]{ctex}

\moderncvtheme[blue]{casual}        % 主题选casual,颜色选忧郁蓝
\name{王小明}{摸鱼学硕士}             % 名字和头衔分开写,防止过于嚣张
\email{run@fast.com}                % 建议别用“ilovexxx@qq.com”
\social[github]{github.com/xxx}
\social[linkedin]{xxx}              % 假装有国际化人脉
\quote{Stay hungry,stay foolish}   % 乔布斯名言,HR已免疫

BEGIN{document}
\maketitle  % 生成个人信息区块

section{教育背景}
\cventry{2021--2025}{专业:理论与实操}{某大学}{寄点3.0/4.0}{}{核心课程:《咖啡因代谢学》《早八生存指南》}

section{实习经历}
\cventry{2023.06--2023.09}{首席工位守护者}{某厂}{}{}{主要成就:带薪拉屎时长部门TOP1}
END{document}

如你所见,ModernCV 的使用非常简单。我们只需在导言区加载 moderncv 宏包,并设置主题和颜色,然后使用 \name\email\social 等命令来添加个人信息。正文部分则使用 section\cventry 等命令来添加简历内容。这样就可以快速地生成一份简洁、美观的简历,免除了使用 Word 等工具排版的烦恼。

该包的另一个极为良好的特性是可以自动压缩空白区域,可以有效地避免“半页纸尴尬”。但是与其这样,感觉确实不如多整点活填满这页纸(大嘘)。所以欢迎来 LCPU 玩混项目(不是)。

以上就是 LaTeX 的相当多内容了。掌握这些内容后,你已经可以使用 LaTeX 来排版大部分常见的文档类型了。当然,LaTeX 的功能远不止于此,还有许多高级技巧和宏包可以进一步扩展其功能。希望你能继续探索 LaTeX 的世界,发现更多有趣的用法!


  1. 本章作者张庭瑄。