LaTeX
简介
在 LaTeX 中,你可以轻松地引用几乎任何可以编号的内容,并且每当需要时,LaTeX 会自动更新这些编号。可以被引用的对象包括章节、节、子节、脚注、定理、公式、图形和表格[1]。使用的命令不依赖于你引用的对象,它们是:
-
\label{marker}
用于给你想要引用的对象标记——这是一个可以在稍后引用该对象的名称。 -
\ref{marker}
用于引用具有指定标记的对象。它将打印分配给该对象的编号。 -
\pageref{marker}
用于打印包含指定标记的对象的页码。
LaTeX 会计算文档中对象的正确编号;你用来标记对象的标记不会在文档中显示。相反,LaTeX 会将字符串 \ref{marker}
替换为分配给该对象的正确编号。如果你引用了一个不存在的标记,文档的编译将成功,但 LaTeX 会返回一个警告:
LaTeX Warning: There were undefined references.
并将 \ref{unknown-marker}
替换为 "??" —— 这样你可以更容易地在文档中找到它。
如你所见,这种交叉引用方式是一个两步过程:首先,编译器必须存储带有正确编号的标签以供引用;然后,它必须将 \ref
替换为正确的编号。
因此,你需要编译文档两次,以查看带有正确编号的输出。如果只编译一次,LaTeX 将使用以前编译时收集的旧信息(可能已经过时),并且编译器将在编译结束时打印以下信息:
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
使用命令 \pageref{}
可以通过提供包含该对象的页码来帮助读者找到被引用的对象。例如:
See figure~\ref{fig:test} on page~\pageref{fig:test}.
由于你可以使用完全相同的命令来引用几乎任何内容,随着引用数量的增多,你可能会感到有些困惑。LaTeX 用户通常在标签中添加几个字母来描述你正在引用的内容。一些包(如 fancyref
)依赖于这些元信息。以下是一些示例:
按照这个约定,一个图形的标签可能会是 \label{fig:my_figure}
,等等。你不必强制使用这些前缀,实际上可以使用任何字符串作为 \label{...}
的参数,但随着文档的增长,这些前缀会变得越来越有用。
另一个建议:尽量避免在标签中使用数字。更好的做法是描述对象的内容。这样,如果你改变对象的顺序,你就不需要重命名所有的标签和它们的引用。
如果你想在输出文档中看到你使用的标记,可以使用 showkeys
包;在你开发文档时,这非常有用。更多信息请参见包部分。
示例
以下是一些实用示例,但你会注意到它们都是一样的,因为它们使用的是相同的命令。
节
\section{Greetings}
\label{sec:greetings}
Hello!
\section{Referencing}
I greeted in section~\ref{sec:greetings}.
你可以将标签放在节的任何位置;然而,为了避免混淆,最好将其放在节的开头之后。注意标记以 sec:
开头,正如之前建议的那样。然后,在不同的节中引用该标签,波浪号 (~) 表示不间断空格。
图片引用
你可以通过在图形浮动环境中插入图片来引用一张图片:
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{gull}
\caption{Close-up of a gull}
\label{fig:gull}
\end{figure}
图~\ref{fig:gull} 显示了一只海鸥的照片。
当标签在浮动环境内声明时,\ref{...}
将返回相应的图形/表格编号,但它必须出现在标题之后。如果标签声明在外部,它会给出节的编号。为了完全安全,任何图片或表格的标签都可以放在 \caption{}
命令内,如下所示:
\caption{Close-up of a gull\label{fig:gull}}
有关更多内容,请参阅《浮动、图形和标题》部分中的图形和相关环境。
修复错误的标签
\label
命令必须在(或内部)\caption
之后出现。否则,它会捕获当前的节或列表编号,而不是预期的对象。
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{gull}
\caption{Close-up of a gull} \label{fig:gull}
\end{figure}
处理通过 hyperref
创建的图形和表格链接的问题
如果你使用 hyperref
包来创建 PDF,链接到表格或图形时会指向其标题,而不是图形或表格本身,这意味着如果图形或表格位于链接的上方,点击链接时它将不可见。为了解决这个问题,可以将 hypcap
选项添加到 caption
包中:
\usepackage{caption} % hypcap 默认为 true,所以 [hypcap=true] 在 \usepackage[hypcap=true]{caption} 中是可选的
公式的引用
这是引用公式的一个示例:
\begin{equation} \label{eq:solve}
x^2 - 5 x + 6 = 0
\end{equation}
\begin{equation}
x_1 = \frac{5 + \sqrt{25 - 4 \times 6}}{2} = 3
\end{equation}
\begin{equation}
x_2 = \frac{5 - \sqrt{25 - 4 \times 6}}{2} = 2
\end{equation}
and so we have solved equation~\eqref{eq:solve}
请注意,标签中的 eq:
前缀——并且标签紧随数学模式的开始。要引用公式,必须使用带有计数器的环境。通常,你会使用 equation
环境,因为它通常是单行公式的最佳选择,无论是否使用 amsmath
。
eqref
amsmath
包为公式引用添加了一个新命令:\eqref{}
。它的工作方式与 \ref{}
完全相同,但会添加括号,因此它会显示为 (5)
而不是仅仅显示为 5
。这可以帮助读者区分公式和其他内容,而不需要在任何引用前重复“公式”这个词。
tag
\tag{eqnno}
命令用于手动设置公式编号,其中 eqnno
是你希望显示的文本字符串,而不是通常的公式编号。通常,最好使用标签,但有时硬编码的公式编号可能提供有用的解决方法——例如,当你想要重复之前使用过的公式时(例如,\tag{\ref{eqn:before}}
)。
numberwithin
amsmath
包添加了 \numberwithin{countera}{counterb}
命令,它将简单的 countera
替换为更复杂的 counterb.countera
。例如,\numberwithin{equation}{section}
在前导中会将节号添加到所有公式编号前面。
cases
cases
包添加了 \numcases
和 \subnumcases
命令,分别为每个案例生成带有单独公式编号的多案例公式,以及带有字母的公式编号。
varioref 包
varioref
包引入了一个新的命令:\vref{}
。这个命令与基本的 \ref
相同,但它根据上下文提供不同的输出。如果引用的对象在同一页,它与 \ref
一样工作;如果对象较远,它会自动添加页面号,例如“5 on page 25”。如果对象很近,它会自动使用更细致的表达方式,如“在下一页”或“在对面页面”——根据上下文和文档类自动调整。
hyperref 包
autoref
hyperref
包引入了另一个有用的命令:\autoref{}
。这个命令创建一个带有额外文本的引用,文本与目标的类型相对应,且所有内容都将成为超链接。例如,命令 \autoref{sec:intro}
将创建一个指向 \label{sec:intro}
的超链接(无论它在哪里)。如果该标签指向一个节,超链接将包含文本“section 3.4”,或者类似的内容。
nameref
hyperref
包还自动包含 nameref
包,并提供了一个同名的命令。它与 \autoref{}
类似,但插入与节名称相对应的文本。例如:
\section{MyFirstSection} \label{sec:marker}
\section{MySecondSection}
In section~\nameref{sec:marker} we defined...
锚点手动定位
当你在图形、表格或其他浮动对象之外定义一个 \label
时,标签指向当前节。在某些情况下,这种行为并不是你想要的,你更希望生成的链接指向定义 \label
的行。可以通过命令 \phantomsection
实现,如下所示:
%链接位置将被放置在下面的行。
\phantomsection
\label{the_label}
cleveref 包
cleveref
包引入了新命令 \cref{}
,它像 \autoref{}
一样包含了引用对象的类型。替代的 \labelcref{}
命令更像标准的 \ref{}
。对于页面的引用,可以使用 \cpageref{}
命令。
使用 \crefrange{}
和 \cpagerefrange{}
命令,可以为开始和结束标签提供自然语言(babel 启用)的范围,并以非常方便的格式自动对它们进行排序并分组,例如 item 2 to 4 and 6 to 19.
。
varioref,hyperref 和 cleveref 的交互
由于 varioref
、hyperref
和 cleveref
重定义了相同的命令,当它们的 \usepackage
命令出现在错误的顺序时,可能会产生意外的结果。例如,使用 hyperref
、varioref
和 cleveref
的顺序会导致 \vref{}
失败,就像标记未定义一样。以下顺序通常有效:
-
varioref
-
hyperref
-
cleveref