简介
在 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)依赖于这些元息。以下是一些示例:

  • ch: 章节

  • sec: 节

  • subsec: 子节

  • fig: 图形

  • tab: 表格

  • eq: 公式

  • lst: 代码清单

  • itm: 枚举列表项

  • alg: 算法

  • app: 附录子节

按照这个约定,一个图形的标签可能会是 \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 的交互
由于 variorefhyperrefcleveref 重定义了相同的命令,当它们的 \usepackage 命令出现在错误的顺序时,可能会产生意外的结果。例如,使用 hyperrefvariorefcleveref 的顺序会导致 \vref{} 失败,就像标记未定义一样。以下顺序通常有效:

  • varioref

  • hyperref

  • cleveref


Last modified: Monday, 21 April 2025, 9:47 AM