LaTeX 交叉引用系统简介
摘要
交叉引用系统是LaTeX最强大的功能之一——可以在文档的任意地方引用带编号的结构,包括标题、图形、表格、公式等,并且更重要的是可以自动更新引用编号。本文概述了交叉引用系统,并介绍一些相关的扩展宏包。
1. 简介
LaTeX 实现了 \label
和\ref
宏,进而可以引用同一文档内的绝大部分带编号对象。首先用\label
赋予唯一标识符给某个带编号的对象,然后就可以使用\ref
宏进行引用。此外,另一个不那么常用的命令是\pageref
,它可以输出被引用对象所在的页码数。
在下面的例子中,假设文档的第一节标题为“Introduction”,在该节添加了标记符sec:intro
,之后就可以在接下来的章节中使用该标记符来指代之前的节:\ref{sec:intro}
就会输出数字1。
\section{Introduction}\label{sec:intro}
% Content
\section{Methods}
In section \ref{sec:intro} on page
\pageref{sec:intro} we introduced ...
2. 指定标签或标记符
引用的标记符并没有什么格式上的限制。不过,通用的做法是使用前缀+冒号作为标记符的开头。添加前缀可以帮助作者识别被引用对象的类型。例如,引用图形的标记符可以是\label{fig:schema}
这样的形式。对于一些最常用的引用对象,下表给出了相应的前缀名建议。
对象 | 前缀 | 对象 | 前缀 |
---|---|---|---|
Chapter | ch | Figure | fig |
Section | sec | Table | tab |
Subsection | ssec | List item | itm |
Appendix | app | Equation | eqn |
当然,使用前缀是个好习惯,不过这也仅仅是建议——作者完全可以使用另一套前缀或者根本不使用。
3. 标签的位置
理想情况下,应该在被引用的计数对象之后立即放置\label
标记。而对于图形或表格这样的浮动环境,应在\caption
宏内或之后放置\label
,这是因为图形或表格的编号是由\caption
生成的。如果在编号对象之前使用\label
基本上都会导致引用错误。当然,在编号对象之后太久才使用\label
也可能会有问题。
4. 引用的生成和更新
一般来说需要两次运行排版命令才能生成引用编号。背后的原理是这样的,第一次运行排版命令时,系统会收集所有标记符信息,并写入一个辅助文件内;而再次运行排版命令时,系统会读取该辅助文件并进而更新引用。只要系统不能正确生成引用,那么在输出文档的相应位置就会生成双问号??
标记。如果再次排版后还不能更新正确的引用,可以看一下log
日志文件确定问题。下一节将介绍引用相关的警告信息。
5. 引用相关的警告信息
log
日志文件中出现与引用相关的警告并不少见。如果标识符的定义有问题,一般会出现两种警告:1. 未定义的引用(undefined references)2. 重复定义的标签(multiply-defined labels)
第一种情况是由于引用的标识符没有定义,而第二种情况是由于多次定义了同一标识符。例如,如果作者复制一些代码片段(比如图形环境)而忘记重命名其中的标识符,那么就会出现重复定义标签的问题。
6. 扩展引用功能的宏包
很多宏包都扩展了LaTeX的交叉引用系统。这里简要介绍以下几个宏包:varioref
, cleveref
, hyperref
, xr
/xr-hyper
。选择这些宏包的原因是每个宏包都在独特的方面扩展了原有的功能。大体上来说,这些宏包并没有重新定义标准引用命令的功能,而是定义了新命令。因此,标准的\label
, \ref
和\pageref
功能并不会受到影响。
6.1 varioref
宏包
varioref
宏包将基础的引用命令扩展为略微更加复杂的形式。其中,\vref
命令合并了\ref
和\pageref
的功能,会同时输出被引用对象的编号和所在的页码数。如果被引用对象位于同一页,那么会省略页码数。而\vpageref
则增加了\pageref
的功能:如果被引用对象位于同一页则输出“on this page”,否则输出所在页码数。最后,该宏包还提供了\vrefrange
和\vpagerefrange
命令,用于多重引用时输出编号也页码范围。
6.2 cleveref
宏包
很多情况下作者都会在文本中提及所引用对象的类型。例如,某个图形可以引用为“This is shown in figure 1”。而\ref
宏只会输出所引用对象的编号,因此这就是cleveref
宏包的作用。该宏包会自动识别引用对象的类型,并打印出对应的引用。为此,该宏包提供了\cref
命令。类似于varioref
宏包,本宏包也实现了输出引用对象所在页码的宏\cpageref
和页码范围的宏\cpagerefrange
。
6.3 hyperref
宏包
hyperref
宏包中涉及交叉引用的主要功能是给引用加上链接:点击该引用会转到被引用对象所在的页面。只要在导言区导入该宏包即可实现相应功能。同时,该宏包还定义了\autoref
宏,其功能类似于cleveref
宏包中的\cref
命令,即同时输出引用编号和引用类型。此外,该宏包实现了大量与交叉引用无关的其它功能,相关讨论已经超出了本文的主题范围。尽管如此,这里仍然推荐浏览一下该宏包的文档以了解该宏包的更多信息。
6.4 xr
/xr-hyper
宏包
xr
宏包(eXternal References)可以引用其它文档中的对象。这在科技论文中特别有用,因为经常要在正文之外提供补充材料。使用该宏包就可以在正文中引用补充材料中的图形和表格。要实现此功能,必须在正文的导言区内使用\externaldocument{filename}
来指定外部文档。如果外部的tex
文件位于不同文件夹下,那么也要指定相应的路径。然后就可以在正文中引用外部文档中的标识符了。另外要注意的是外部文档每次修改引用标签后都要编译一下,这样正文中才能生成正确的编号。
\documentclass{article}
\usepackage{xr}
\externaldocument{supplementary-materials}
\begin{document}
See supplementary figure \ref{fig:abc}.
\end{document}
对于这样指向外部文档的引用,如果还想要创建超链接,那么使用xr-hyper
宏包代替xr
。
6.5 宏包载入顺序
由于这些宏包都会影响引用的行为,因此,载入多个宏包可能造成冲突。所以,宏包载入时需要按照正确的顺序,即:(1) xr
/xr-hyper
, (2) varioref
, (3) hyperref
, 最后是 (4) cleveref
。
6.6 showlabels
宏包
最后要提一下showlabels
宏包,其功能是在输出的PDF文档的页边处显示标识符。因此,该宏包特别适用于在带有大量标签的长文档中追踪标识符的场合。
参考文献
cleveref
: Intelligent cross-referencing.hyperref
: Extensive support for hypertext in LATEX.showlabels
: Show label commands in the margin.varioref
:Intelligent page references.xr
: References to other LATEX documents.
说明:
- 本文翻译自Thomas Thurnherr, An introduction to the LATEX cross-referencing system, TUGboat, Volume 38 (2017), No. 1
- 遵循署名-非商业性使用-相同方式共享 4.0 国际(CC BY-SA 4.0)协议发布。因此,可以自由地对博客中内容进行分享、创作演绎直至商业性的使用,但必须在文章末尾或参考文献处注明文章的出处(文章链接)。完整的协议可以参看这里。
LaTeX 交叉引用系统简介的更多相关文章
- TeXstudio+TexLive交叉引用
LaTeX 交叉引用系统简介 https://www.cnblogs.com/wenbosheng/p/9537774.html 一般来说需要两次运行排版命令才能生成引用编号.背后的原理是这样的,第一 ...
- 第五周 Word注释与交叉引用
第五周 Word注释与交叉引用 教学时间 2013-3-26 教学课时 2 教案序号 4 教学目标 1.掌握脚注.尾注.题注的概念和应用 2.掌握交叉引用的操作方法 教学过程: 复习提问 1.如何利用 ...
- 交叉引用:Microsoft.NET标准异常 和错误代码对照表
简介 此表旨在帮助将Windows运行时应用程序错误代码交叉引用到Microsoft.NET标准异常,这些异常可以作为应用程序异常处理技术的一部分. 对照表 .NET Exception (Names ...
- "浅谈Android"第一篇:Android系统简介
近来,看了一本书,名字叫做<第一行代码>,是CSDN一名博主写的,一本Android入门级的书,比较适合新手.看了书之后,有感而发,想来进行Android开发已经有一年多了,但欠缺系统化的 ...
- CMS系统简介(从简介到使用)
CMS系统简介 1.简介 CMS是Content Management System的缩写,意为"内容管理系统". 在中国互联网的发展历程中,一直以来默默地为中国站长提供动力的CM ...
- .Net简单图片系统-简介
系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...
- C++类的交叉引用
对于C++中,两个类中相互引用对方,当然只能是在指针的基础上,于是我们知道.也就是说在A类的有一个指针引用B类的成员函数或成员对象,而B类中又有一个指针来访问A中的成员函数或对象.这就是C++中类的交 ...
- Word2013对公式处理:样式、自动编号、交叉引用
因快写毕业论文,专门研究了一下Word2013对公式的处理,有一点小心得,记在这里. 文章中公式展示的预期效果是:公式居中,尾端有编号,同时在文章中可以实现引用.实现该效果有很多方法,这里就说一种,其 ...
- 【译】Android系统简介—— Activity
续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...
随机推荐
- NUL和NULL
此处讨论C语言中的NUL和NULL 1.NUL是ASCII字符集中'\0'字符的名字,它的字节模式为全0 2.NULL指一个其值为0的指针 3.它们都是整型值,其值也相同,所以可以互换使用 4.然而, ...
- 在html中引入css、js和jQuery的方法
在html中引入css代码 在html中插入CSS样式表的方法有三种: 1.外部样式表(External style sheet):即所有的样式单独写在一个.css文件中,在html文件的head部分 ...
- httpclient新旧版本分割点4.3
从这个版本开始,httpclient的api发生了一次重大调整.主要包括如下:Release 4.3 Final ------------------- This is the first stabl ...
- Excel vba map/dictionary
今天在调整一生成java代码的工具时,要用到在不同语言间互转数据类型的逻辑,原来的代码中根据excel记录的行号来计算,再到另外一个collection中获取,个人想着这也太土鳖了,于是搜了下,在vb ...
- RMAN入门——简介
RMAN(Recovery Manager) 1.简介 RMAN(Recovery Manager)是随Oracle服务器软件一同安装的工具软件,它可以用来备份和恢复数据库文件.归档日志和控制文件 ...
- centos-6.5安装部署LNMP环境
安装部署前,确保安装了gcc和gcc-c++ 系统信息: [root@zww ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@ ...
- 2018-2019-1 20189206 《Linux内核原理与分析》第四周作业
linux内核分析学习笔记 --第三章 MenuOS的构造 计算机的"三大法宝"和操作系统的"两把宝剑" 三大法宝 程序存储计算机 即冯诺依曼体系结构,基本上是 ...
- 图片上传插件:webuploader
官网链接:https://github.com/fex-team/webuploader
- extjs使用笔记-21
yii是后台php框架 而yui是前端界面框架,是ajax框架 Extjs是建立在yui基础上的.不要搞混了. jquery的ready方法,是在文档已经加载完毕\图像完全显示后, 才载入执行的. 由 ...
- 【做题】CF388D. Fox and Perfect Sets——线性基&数位dp
原文链接https://www.cnblogs.com/cly-none/p/9711279.html 题意:求有多少个非空集合\(S \subset N\)满足,\(\forall a,b \in ...