LaTeX/标签和交叉引用
在 LaTeX 中,您可以轻松地引用几乎所有可以编号的内容,并让 LaTeX 在需要时自动更新编号。可以引用的对象包括章节、部分、小节、脚注、定理、方程式、图形和表格[1]。要使用的命令不依赖于您要引用的是什么,它们是
\label{标记}
- 用于为要引用的对象提供一个标记 - 一个以后可以用来引用该对象的名称。
\ref{标记}
- 用于引用具有指定标记的对象。这将打印分配给该对象的数字。
\pageref{标记}
- 用于打印包含指定标记对象的页面编号。
LaTeX 将为文档中的对象计算正确的编号;您用来标记对象的标记不会在文档中的任何位置显示。相反,LaTeX 将用分配给该对象的正确数字替换字符串“\ref{标记}
”。如果您引用一个不存在的标记,文档的编译将成功,但 LaTeX 将返回一个警告
LaTeX Warning: There were undefined references.
并且它将用“??”替换“\ref{未知标记}
” - 这样在文档中更容易找到。
如您所见,这种交叉引用方式是一个两步过程:首先编译器必须将标签与要用于引用的正确数字存储起来,然后它必须用正确数字替换\ref
。
因此,您必须编译您的文档两次才能看到具有正确编号的输出。如果您只编译一次,那么 LaTeX 将使用之前编译中收集的旧信息(可能已过时),并且编译器将在编译结束时打印以下消息,通知您
- LaTeX 警告:标签可能已更改。重新运行以使交叉引用正确。
使用命令\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:我的图形}
,等等。您没有义务使用这些前缀,实际上可以使用任何字符串作为\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}
Figure~\ref{fig:gull} shows a photograph of a gull.
|
当在浮动环境中声明标签时,\ref{...}
将返回相应的图形/表格编号,但它必须出现在标题之后。当在外部声明时,它将给出节编号。为了完全安全,任何图片或表格的标签都可以放在\caption{}
命令中,如下所示
\caption{Close-up of a gull\label{fig:gull}}
有关更多信息,请参阅关于figure
和相关环境的浮动体、图形和标题 部分。
命令\label
必须出现在\caption
之后(或内部)。否则,它将拾取当前节或列表编号,而不是预期内容。
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{gull}
\caption{Close-up of a gull} \label{fig:gull}
\end{figure}
由 hyperref 处理的表格和图形链接问题
[edit | edit source]如果您使用 hyperref
包来创建 PDF 文件,指向表格或图片的链接将指向其标题,标题始终位于表格或图片下方[2]。 因此,如果表格或图片位于指针上方,则表格或图片将不可见,这意味着需要向上滚动一些内容。 如果您希望链接指向图像的顶部,您可以为 caption
包提供 hypcap
选项[3]。
\usepackage{caption} % hypcap is true by default so [hypcap=true] is optional in \usepackage[hypcap=true]{caption}
公式
[edit | edit source]以下示例演示如何引用公式
\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
[edit | edit source]amsmath
包添加了一个新的命令来引用公式; 它是 \eqref{}
。 它与 \ref{}
的工作方式完全相同,但会添加括号,因此它不会打印一个简单的数字,例如 5,而是会打印 (5)。 这对于帮助读者区分公式和其他内容很有用,无需在任何引用之前重复“公式”一词[4]。 它的输出可以根据需要进行更改; 有关更多信息,请参阅 amsmath
文档。
tag
[edit | edit source]\tag{eqnno}
命令用于手动设置公式编号,其中 eqnno 是您要显示的文本字符串,而不是通常的公式编号。 通常最好使用标签,但有时硬编码的公式编号可能提供一个有用的解决方法 - 例如您想要重复之前已经使用过的公式的情况(例如 \tag{\ref{eqn:before}}
)。
numberwithin
[edit | edit source]amsmath
包添加了 \numberwithin{countera}{counterb}
命令,它用更复杂的 counterb.countera
替换了简单的 countera
。 例如,在序言中使用 \numberwithin{equation}{section}
将在所有公式编号之前加上节编号。
cases
[edit | edit source]cases
包添加了 \numcases
和 \subnumcases
命令,它们分别生成带单独公式编号和带单独公式编号加字母的多案例公式,每个案例一个。
该varioref包
[edit | edit source]varioref
包引入了名为 \vref{}
的新命令。 此命令的使用方式与基本的 \ref
完全相同,但它根据上下文具有不同的输出。 如果要引用的对象在同一页面上,它就像 \ref
一样工作; 如果该对象距离很远,它将打印类似“第 25 页的 5”的内容,即它会自动添加页码。 如果该对象很近,它可以根据上下文和文档类自动使用更精细的句子,例如“在下一页”或“在对面页”。
此命令必须非常谨慎地使用。 它输出多个单词,因此它的输出可能出现在两个不同的页面上。 在这种情况下,算法可能会感到困惑并导致循环。
例如,您可以在第 23 页上标记一个对象,并且 \vref
的输出可能恰好在第 23 页和第 24 页之间。 如果它在第 23 页上,它将像基本的 ref
一样打印; 如果它在第 24 页上,它将打印“在上一页”,但它在这两页上,这可能会导致编译时出现一些奇怪的错误,这些错误可能很难修复。
对于小型文档,这些情况可能很少发生,但对于跨越数百个引用的长文档,这些情况发生的可能性更大。 在文档准备期间避免这些问题的一种方法是首先始终使用标准 ref
,在文档接近最终版本时将所有内容转换为 vref
- 在进行调整以修复任何可能的问题之前。
该hyperref包
[edit | edit source]autoref
[edit | edit source]hyperref
包引入了另一个有用的命令; \autoref{}
。 此命令创建带有对应于目标类型的附加文本的引用,所有这些都将是超链接。 例如,命令 \autoref{sec:intro}
将创建一个指向 \label{sec:intro}
命令的超链接,无论它在哪里。 假设该标签指向一个节,超链接将包含文本“第 3.4 节”,或类似内容(默认名称的完整列表可以在 这里 找到)。 请注意,虽然有一个 \autoref*
命令可以生成未链接的前缀(如果标签与引用在同一页面上,这很有用),但没有定义替代的 \Autoref
命令来生成大写版本(例如,在句首有用); 但由于 autoref 名称的大写由包作者选择,您可以通过重新定义 \typeautorefname
为您想要的前缀来自定义前缀文本,例如
\def\sectionautorefname{Section}
当然,这种重命名技巧也可以用于其他目的。
- 如果您希望拥有一个没有
\autoref{}
提供的预定义文本的超链接引用,那么您可以使用类似\hyperref[sec:intro]{Appendix~\ref*{sec:intro}}
的命令来更改它。 请注意,您可以在hyperref
中禁用超链接的创建,只需使用这些命令来创建自动文本。
- 请记住,
\label
必须放置在带计数器的环境中,例如表格或图片。 否则,不仅数字将引用当前节(如 上面 所述),而且该名称也可能引用具有计数器的先前环境。 例如,如果您在关闭图片后放置一个标签,该标签仍然会显示“图片 n”,其中 n 是当前节号。
nameref
[edit | edit source]hyperref
包还会自动包含 nameref
包和一个同名命令。 它类似于 \autoref{}
,但会插入对应于节名称的文本,例如。
输入
\section{MyFirstSection} \label{sec:marker}
\section{MySecondSection}
In section~\nameref{sec:marker} we defined...
输出
在“MyFirstSection”节中,我们定义了...
锚点手动定位
[edit | edit source]当您在图片、表格或其他浮动对象之外定义 \label
时,该标签指向当前节。 在某些情况下,这种行为并非您想要的行为,您希望生成的链接指向定义 \label
的行。 这可以通过 \phantomsection
命令来实现,例如
%The link location will be placed on the line below.
\phantomsection
\label{the_label}
该cleveref包
[edit | edit source]cleveref
包引入了新的命令 \cref{}
,它像 \autoref{}
一样包含引用对象的类型。 替代的 \labelcref{}
命令更类似于标准的 \ref{}
。 \cpageref{}
命令处理对页面的引用。
- 使用
\crefrange{}{}
和\cpagerefrange{}
命令以任意顺序使用起始和结束标签,并提供自然语言(启用babel
)范围。 - 使用
\cref{}
命令进行多个或单个引用(在单行上),它会自动按顺序对它们进行排序并分组到非常方便的格式中,例如 ` item 2 to 4 and 6 to 19.`.[5] - 在数字是标签的引用并且 [排序] 输出与上一段中一样的情况下使用
\labelcref{}
可以在序言中指定格式。
因为varioref
、hyperref
和cleveref
重新定义了相同的命令,所以当它们在序言中以错误的顺序使用\usepackage
命令时,可能会产生意想不到的结果。例如,使用hyperref
、varioref
,然后是cleveref
会导致\vref{}
失败,就好像标记未定义一样。[6] 以下顺序通常似乎有效
varioref
hyperref
cleveref
[6]
- ↑ LaTeX 的优势 - 自动编号和强大的引用系统
- ↑ http://www.ctan.org/tex-archive/macros/latex/contrib/hyperref/README
- ↑
caption
包的文档 - 6.5hyperref
- ↑ TeX StackExchange - \eqref 和 \ref 之间的区别是什么?
- ↑ TeX 博客 - Cleveref,一种在 LaTeX 中进行引用的巧妙方法
- ↑ a b 在报告类下进行的测试 http://tex.stackexchange.com/questions/139459/vref-and-input-command