2.9 交叉引用
同样在论文写作中, 我们在前文或者后文会提到某一个公式或定理, 但是如果我们用手敲定理对应的编号时, 一旦编号被前后移动了, 那么改动起来就会很麻烦, LaTeX中交叉引用解决了这个问题.
2.9.1 书签与引用
LaTeX提供了三条交叉引用的命令, 名称与说明如下
在这里我们用一个简单的例子来说明如何使用交叉引用:
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\section{勾股定理}
\newcounter{TH}[section] %定义新计数器TH
\renewcommand{\theTH}{\thesection.\arabic{TH}} %重新定义计数器命令\theTH的显示形式
\newcommand{\Theorem}[1][]{\par\textbf{定理}\refstepcounter{TH}\textbf{\theTH}(#1)\quad} %新定义定理命令
\Theorem[勾股定理]\label{thm:gougu} 勾股定理是一个基本的几何定理,指直角三角形的两条直角边的平方和等于斜边的平方……
\newpage %新起一页
在第\pageref{thm:gougu}页的定理\ref{thm:gougu}中, 我们知道了……
\end{document}
为了节约空间, 我把两页的内容粘到了一页, 我们在想要引用的地方加上\label{书签名}
命令, 在后面想要引用它的时候再使用命令\ref{书签名}
将\the计数器
中的数字显示出来, 而对于书签名, 也不要随便的去起, 应该做到有规律, 易区分.
2.9.2 书签名的样式
给一个对象加书签的时候不能胡乱的, 按照自己当时想到的东西去加, 一般来说, 书签名的形式是类型:内容
, 比如在上例中我使用的是thm:gougu
, 即类型是定理(Theorem), 内容是勾股定理, 这样给出的书签会更容易引用, 而且不要使用thm:1.1
这样的书签名, 这样的书签名会使你的交叉引用变成无用功, 因为这样还不如手动去打上定理1.1
, 而且很重要的一点是今天的1.1可能会变成明天的2.3, 这对于作者(也就是我们自己)来说是很不愉快的一件事. 那么下面我们就给出通常使用的类型的简称:
缩写 | 全称 | 缩写 | 全称 |
---|---|---|---|
part |
部分(part) | fig |
图(figure) |
chap |
章(chapter) | tab |
表(table) |
sec |
节(section) | eq |
公式(equation) |
subsec |
小节(subsection) | fn |
脚注(footnote) |
subsubsec |
小小节(subsubsection) | item |
项目(item) |
para |
段(paragraph) | thm |
定理 |
subpara |
小段(subparagraph) | algo |
算法(algorithm) |
2.9.3 更多交叉引用
有了上面的说明我们已经会了基本的交叉引用的知识了, 但是好像不是那么自动, 能不能让LaTeX自行判断被引用的内容是什么, 从而自动生成类似"图1"之类的引用呢?答案是可以的, 我们需要调用hyperref
宏包或着在ctex
中添加可选参数hyperref
, 然后使用命令\autoref{书签名}
, LaTeX就可以根据被加书签的对象而选择前缀, 如section
, equation
等等.
\documentclass{article}
\usepackage[hyperref,UTF8]{ctex}
\begin{document}
\section{\LaTeXe 简介}\label{sec:prelatex}
在\autoref{sec:prelatex}中, 我们有……
\end{document}
同时我们可以发现在引用处出现了一个彩色的框, 用鼠标点击引用可以直接跳转到对应的书签处, 这也是hyperref
宏包的另一个好处:超链接. 但是我们会发现引用出来的是section 1
这样的英文, 与我们的文档不搭, 不过问题不大, hyperref
宏包给我们提供了一个可以修改\autoref
出现的文字, 用下面的命令:
\renewcommand{\sectionautorefname}{节}
将引用部分变为节1
. 但是好像还是有那么点不对, 这种引用说"第一节"会更舒服一点, 当然我们可以自定义一个引用命令\newcommand{\secref}[1]{第 #1 节}
其中必要参数是书签名, 来完成上述操作, 或者, prettyref
宏包给我们提供了修改引用名称的命令:
\newrefformat{类型}{显示方法}
这里就要求我们的书签名使用类型:内容
的形式了, 同样的刚才的文档, 我们用prettyref
宏包重新实现一次:
\documentclass{article}
\usepackage[UTF8]{ctex}
\usepackage{prettyref}
\begin{document}
\newrefformat{myref}{第\ref{#1} 节}
\section{\LaTeXe 简介}\label{myref:prelatex}
在\prettyref{myref:prelatex}中, 我们有……
\end{document}
注意在上述\newrefformat{myref}{第\ref{#1} 节}
命令中, 不需要设置参数数量[1]
, 如果同时使用hyperref
宏包, 引用的超链接依然可以使用. 那能不能更进一步, 在引用处出现被引用的章节, 图的名称呢?当然可以, 宏包nameref
为我们提供了命令\nameref
来实现这个功能. 下面给出图例, 代码略去.
2.9.4 网址链接
虽然打印可能是pdf文件的最终归宿, 但是电子阅读也是必不可少的, 对于一些网站的链接, 我们也可以插入到LaTeX文档中, 以便直接点击. 同样是hyperref
宏包, 为我们提供了两个较实用的命令:
\url{链接地址} %地址中的#, /正常输入即可, 不需要转义
\href{链接地址}{显示名称} %地址中的#, /正常输入即可, 不需要转义
注 使用交叉引用的tex文档都需要编译两次, 第一次将引用信息写入辅助文件.aux
, 第二次编译再将引用信息从辅助文件.aux
写入文档, 即当引用处出现??
时, 可能是书签名错误, 也可能是只编译了一次, 出现第一种错误时自行寻找正确的书签名, 出现第二种错误时只需要再编译一次即可.
注 使用TeXstudio编译的时候会在消息里发现
即自动的完成了两次编译, WinEdt中也同样, 也就是说不需要我们手动进行两次编译.