LaTeX/超链接
LaTeX 允许排版超链接,当结果格式为 PDF 时非常有用,超链接可以被点击。它使用 hyperref 包来实现。
hyperref[1] 包为 LaTeX 提供了在文档中创建超链接的能力。它适用于 pdflatex 以及与 dvips 和 ghostscript 或 dvipdfm 一起使用的标准 “latex” 来构建 PDF 文件。如果你加载它,你将有可能包含交互式外部链接,所有内部引用都将转换为超链接。编译器 pdflatex 使得可以直接从 LaTeX 源代码创建 PDF 文件,而 PDF 比 DVI 支持更多功能。特别是 PDF 支持超链接。此外,PDF 可以包含有关文档的其他信息,例如标题、作者等,这些信息可以使用同一个包进行编辑。
使用标准设置的基本用法很简单。只需在序言中加载该包即可
\usepackage{hyperref}
|
这将自动将所有内部引用转换为超链接。它不会影响编写文档的方式:只需继续使用标准的 \label
-\ref
系统(在关于 标签和交叉引用 的章节中讨论);使用 hyperref,这些 “连接” 将变成链接,你就可以点击它们来跳转到正确的页面。此外,目录、图/表列表和索引也将由超链接组成。如果你在草稿模式下工作,超链接将不会显示出来。
该包提供了一些有用的命令,用于插入指向文档外部的链接。
用法
\hyperref[label_name]{''link text''}
|
这将与 \ref{label_name}
的效果相同,但它将使文本 link text 变成一个完整的链接。两者可以结合使用。如果标记为 mainlemma 的引理编号为 4.1.1,则以下示例将得到
We use \hyperref[mainlemma]{lemma \ref*{mainlemma} }.
|
我们使用引理 4.1.1。 |
并得到预期的超链接。注意 \ref
后面的 "*" 用于避免嵌套超链接。
用法
\url{<my_url>}
|
它将使用等宽字体显示 URL,如果你点击它,你的浏览器将打开并指向它。
用法
\href{<my_url>}{<description>}
|
它将使用标准文档字体显示字符串 description,但如果你点击它,你的浏览器将打开并指向 my_url。这里有一个例子
\url{https://www.wikibooks.org}
\href{https://www.wikibooks.org}{Wikibooks home}
|
两者都指向同一个页面,但第一个示例会显示 URL,而第二个示例会隐藏 URL。请注意,如果你打印你的文档,使用 \href
存储的链接将不会在文档中的任何地方显示。
除了上面讨论的链接到网站之外,hyperref 可以用于提供 mailto 链接、链接到本地文件以及链接到 PDF 输出文件中的任何地方。
插入电子邮件链接的一种可能方法是
\href{mailto:my_[email protected]}{my\_[email protected]}
|
它只会显示你的电子邮件地址(以便人们即使在纸上打印文档也能知道它),但如果读者点击它,他/她可以轻松地给你发送电子邮件。或者,要将 url 包的格式化和换行功能整合到显示的文本中,请使用[2]
\href{mailto:my_[email protected]}{\nolinkurl{my_[email protected]} }
|
使用此形式时,请注意 \nolinkurl
命令很脆弱,如果超链接在移动参数内部,则必须在其前面加上 \protect
命令。
也可以使用 url 或 href 命令链接文件。你只需要在链接字符串的开头添加字符串 run:
\url{run:/path/to/my/file.ext}
\href{run:/path/to/my/file.ext}{text displayed}
|
根据 http://tex.stackexchange.com/questions/46488/link-to-local-pdf-file 使用的版本url并不总是有效,但href有效。
可以使用相对路径来链接当前文档位置附近的文档;为此,请使用标准的类 Unix 符号(./是当前目录,../是上一级目录,等等)。
示例
\href{run:D:/my_folder/my_subfolder/my_file.txt}{Windows, absolute path}
\href{run:my_subfolder/my_file.txt}{Windows, relative path}
\href{run:./my_subfolder/my_file.txt}{Windows, relative path, variant}
\href{run:/my_folder/my_subfolder/my_file.txt}{Linux, absolute path}
\href{run:./my_subfolder/my_file.txt}{Linux, relative path}
|
还可以创建文档中的任何位置的锚点(带或不带标题),并链接到它。要创建锚点,请使用
\hypertarget{label}{target caption}
|
要链接到它,请使用
\hyperlink{label}{link caption}
|
其中 target caption 和 link caption 分别是在目标位置和链接位置显示的文本。
还要注意,如果你放置了超目标,单击链接到该超目标时,它实际上可能会指向超目标后的行,这并不理想。因此,如果发生这种情况,你可以报告错误并参考 此处 以了解解决方案。
你还可以通过将 #label 附加到文件的 URL 来获取超目标的外部链接,或者右键单击指向目标的超链接之一并复制 URL,或者从 PDF 侧边栏中的标题获取链接,或者通过从查看中推断的过程(例如,子节 11.5.1 将具有标签 subsubsection.11.5.1)。这在学术和教学目的中非常有用。如果你在浏览器中启用与 PDF 1.5 兼容的 PDF 查看器,例如 Chrome 或 Chromium 浏览器的 PDF 查看器 和 Firefox 的 No PDF Download;以及在 Android 上,Xodo 应用程序最适合使用链接,因为它使用与 PDF 桌面程序相同的正确边框渲染它们,其次是 Foxit PDF 应用程序,它使用灰色突出显示渲染链接(而在其他应用程序中,链接可能也适用,但没有任何特殊渲染,例如 Dropbox PDF 查看器应用程序;而另一些则不适用于链接,例如 Drive PDF 查看器、PDF 阅读器和 Google PDF 查看器)。你可能需要在新标签页中打开指向 PDF 的 URL,否则它可能会提示下载它(也就是说,如果你点击 URL,不要左键单击,右键单击并选择在新标签页中打开它)。
标准设置应该适合大多数用户,但如果你想更改某些内容,这也是可能的。有几个变量和两种方法将它们传递给包。选项可以在加载包时作为参数传递(包的工作标准方式),或者可以使用 \hypersetup
命令,如下所示
\hypersetup{<option1> [, ...]}
|
你可以传递任意多个选项;用逗号分隔它们。选项必须采用以下形式
variable_name=new_value
|
在加载包时将这些选项传递给包时,必须使用完全相同的格式,如下所示
\usepackage[<option1, option2>]{hyperref}
|
以下是你可以更改的可能变量列表(有关完整列表,请参阅官方文档)。默认值以直立字体书写
查看 tug.org 上的 hyperref-manual 中的 3.8 大列表
变量 | 值 | 评论 |
---|---|---|
bookmarks | =true,false | 显示或隐藏显示文档时的书签栏 |
unicode | =false,true | 允许在 Acrobat 的书签中使用非拉丁语系字符 |
pdfborder | ={RadiusH RadiusV Width [Dash-Pattern]} | 设置链接周围边框的样式。前两个参数(RadiusH、RadiusV)在大多数 pdf 查看器中没有效果。Width 定义边框的粗细。Dash-Pattern 是由空格分隔并用方括号括起来的数字序列。它是一个可选参数,用于指定虚线图案中每条线和间隙的长度。例如,{0 0 0.5 [3 3]} 应该绘制一个宽度为 0.5 的正方形框(没有圆角)和一个虚线图案,该图案的虚线长度为 3,间隙长度为 3。关于不同的 pdf 查看器是否/如何渲染虚线图案,并没有统一性。 |
pdftoolbar | =true,false | 显示或隐藏 Acrobat 的工具栏 |
pdfmenubar | =true,false | 显示或隐藏 Acrobat 的菜单 |
pdffitwindow | =true,false | 调整文档窗口大小以适合文档大小 |
pdfstartview | ={FitH},{FitV},etc[3]. | 将页面的宽度调整为窗口大小 |
pdftitle | ={text} | 定义在 Acrobat 的“文档信息”窗口中显示的标题 |
pdfauthor | ={text} | PDF 作者的姓名,它与上面的工作方式相同 |
pdfsubject | ={text} | 文档的主题,它与上面的工作方式相同 |
pdfcreator | ={text} | 文档的创建者,它与上面的工作方式相同 |
pdfproducer | ={text} | 文档的生产者,它与上面的工作方式相同 |
pdfkeywords | ={text} | 用逗号分隔的关键字列表,示例如下 |
pdfnewwindow | (=true,false) | 定义当链接超出当前文档时是否应该打开新的 PDF 窗口。注意:如果链接指向 http/https 地址,则此选项将被忽略。 |
pagebackref | (=false,true) | 激活参考文献内部。必须在\usepackage{}语句中指定。 |
colorlinks | (=false,true) | 用彩色框架包围链接(false)或用颜色对链接的文本进行着色(true)。可以使用以下选项配置这些链接的颜色(默认颜色如下所示) |
hidelinks | 隐藏链接(删除颜色和边框) | |
linkcolor | =red | 内部链接(部分、页面等)的颜色 |
linktoc | =none,section,page,all | 定义目录条目中哪一部分被制成链接 |
citecolor | =green | 引文链接(参考文献)的颜色 |
filecolor | =cyan | 文件链接的颜色 |
urlcolor | =magenta | URL 链接(邮件、网络)的颜色 |
linkbordercolor | ={1 0 0} | 内部链接周围框架的颜色(如果colorlinks=false) |
citebordercolor | ={0 1 0} | 引文周围框架的颜色 |
urlbordercolor | ={0 1 1} | URL 链接周围框架的颜色 |
请注意,显式 RGB 规范仅适用于边框颜色(如 linkbordercolor 等),而其他颜色只能分配给命名颜色(你可以定义自己的颜色,请参阅 Colors)。为了加快自定义过程,以下列出了带默认值的变量。将它复制到你的文档中并进行你想要的更改。变量旁边是对其含义的简短说明
\hypersetup{
bookmarks=true, % show bookmarks bar?
unicode=false, % non-Latin characters in Acrobat’s bookmarks
pdftoolbar=true, % show Acrobat’s toolbar?
pdfmenubar=true, % show Acrobat’s menu?
pdffitwindow=false, % window fit to page when opened
pdfstartview={FitH}, % fits the width of the page to the window
pdftitle={My title}, % title
pdfauthor={Author}, % author
pdfsubject={Subject}, % subject of the document
pdfcreator={Creator}, % creator of the document
pdfproducer={Producer}, % producer of the document
pdfkeywords={keyword1, key2, key3}, % list of keywords
pdfnewwindow=true, % links in new PDF window
colorlinks=false, % false: boxed links; true: colored links
linkcolor=red, % color of internal links (change box color with linkbordercolor)
citecolor=green, % color of links to bibliography
filecolor=cyan, % color of file links
urlcolor=magenta % color of external links
}
|
如果你不需要如此高的自定义程度,以下是一些较小但有用的示例。在创建用于打印的 PDF 时,彩色链接不是一件好事,因为它们最终会在最终输出中变为灰色,难以阅读。你可以使用彩色框架,这些框架不会被打印
\usepackage{hyperref}
\hypersetup{colorlinks=false}
|
或使链接变为黑色
\usepackage[hidelinks]{hyperref}
|
或使用 \usepackage{hyperref} \hypersetup{hidelinks}
当你只想为 PDF 文件的“文档信息”部分提供信息,以及启用参考文献内部时
\usepackage[pdfauthor={Author's name},%
pdftitle={Document Title},%
pagebackref=true,%
pdftex]{hyperref}
|
默认情况下,URL 使用等宽字体打印。如果你不喜欢它,并希望它们以与文本其余部分相同的样式打印,可以使用以下方法
\urlstyle{same}
|
出现以下消息
! pdfTeX warning (ext4): destination with the same identifier (name{ equation.1.7.7.30}) has been already used, duplicate ignored
当你执行以下操作时会发生
\begin{eqnarray}a=b\nonumber\end{eqnarray}
|
如果你使用此形式,错误会消失
\begin{eqnarray*}a=b\end{eqnarray*}
|
注意,显示的行号通常与错误行完全不同。
可能的解决方案:将 amsmath 包放在 hyperref 包之前。
出现以下消息
! Runaway argument? {\@firstoffive }\fi ), Some text from your document here (\ref {re\ETC. Latex Error: Paragraph ended before \Hy@setref@link was complete.
当你使用 \label
在 align
环境中时会出现。
可能的解决方案:在你的前言中添加以下内容
\AtBeginDocument{\let\textlabel\label}
|
注意:如果你使用冒号“:
”作为标签的一部分,例如 \label{lst:program01}
,也会出现相同的错误。替换它将有所帮助。
出现以下消息
! pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has been already used, duplicate ignored
当计数器被重新初始化时会出现问题,例如使用book文档类提供的命令 \mainmatter
。它在书的第一章之前将页码计数器重置为1。但由于书籍的前言也有页码1,所以所有指向“第1页”的链接将不再是唯一的,因此会出现“重复项已被忽略”的提示。解决方法是在 hyperref 选项中添加 plainpages=false
。不幸的是,这只能解决页码计数器的问题。一个更彻底的解决方法是使用选项 hypertexnames=false
,但这样会导致索引中的页面链接无法正常工作。
最佳解决方案是使用 \pagenumbering
命令为每个页面赋予一个唯一的名称
\pagenumbering{alph} % a, b, c, ...
... titlepage, other front matter ...
\pagenumbering{roman} % i, ii, iii, iv, ...
... table of contents, table of figures, ...
\pagenumbering{arabic} % 1, 2, 3, 4, ...
... beginning of the main matter (chapter 1) ...
|
另一个解决方法是在命令 \maketitle
之前使用 \pagenumbering{alph}
,这将为标题页提供标签 page.a。由于页码被隐藏,所以对输出结果不会产生任何影响。
通过在计数器重置之前每次更改页码,每个页面都会获得一个唯一的名称。在这种情况下,页面将被编号为 a, b, c, i, ii, iii, iv, v, 1, 2, 3, 4, 5, ...
如果你不想让页码可见(例如,在前言部分),请使用 \pagestyle{empty} ... \pagestyle{plain}
。重要的是,尽管数字不可见,但每个页面都将拥有一个唯一的名称。
另一个更灵活的方法是将计数器设置为负数
\setcounter{page}{-100}
... titlepage, other front matter ...
\pagenumbering{roman} % i, ii, iii, iv, ...
... table of contents, table of figures, ...
\pagenumbering{arabic} % 1, 2, 3, 4, ...
... beginning of the main matter (chapter 1) ...
|
这将为前几页提供一个唯一的负数页码。
问题也可能出现在算法包中:因为每个算法都使用相同的行号方案,所以第二个及后续算法的行标识符将与第一个算法的重复。
如果在 eqnarray 环境的每一行上都使用 \nonumber
,就会出现方程式标识符的问题。在这种情况下,请使用带星号的形式,例如 \{eqnarray*} ... \end{eqnarray*}
(这是一个无编号的方程式数组),并删除现在不再需要的 \nonumber
命令。
如果你的 url 太长,导致超出页面范围,请尝试使用breakurl包将 url 分割到多行。这在多列环境中尤其重要,因为在这种环境下行宽会大大缩短。
书签显示的文本并不总是如你预期的那样。因为书签只是“文本”,所以书签可用的字符比正常的 LaTeX 文本要少得多。Hyperref 通常会注意到此类问题并发出警告
Package hyperref Warning: Token not allowed in a PDFDocEncoded string:
现在你可以通过提供一个书签的文本字符串来解决此问题,该字符串将替换有问题的文本
\texorpdfstring{''TEX text''}{''Bookmark Text''}
|
数学表达式是此类问题的典型例子
\section{ \texorpdfstring{$E=mc^2$}{E=mc2} }
|
它将 \section{$E=mc^2$}
转换为E=mc2书签区域。颜色更改也不会很好地传播到书签中
\section{ \textcolor{red}{Red !} }
|
生成字符串“redRed!”。命令 \textcolor
被忽略,但它的参数(red)被打印出来。如果你使用
\section{ \texorpdfstring{\textcolor{red}{Red !}}{Red\ !} }
|
结果会更清晰易懂。
如果你用 unicode 编写文档,并且在 hyperref 包中使用 unicode 选项,你可以在书签中使用 unicode 字符。这将为你提供更多可供选择的字符,用于 \texorpdfstring
。
由 hyperref 创建的链接指向浮动环境中创建的标签,正如 之前所述,该标签必须始终在标题之后设置。由于标题通常位于图形或表格下方,所以点击链接时,图形或表格本身将不可见[4]。可以通过使用包 hypcap [2] 来解决此问题,并使用
\usepackage[all]{hypcap}
|
确保在加载 hyperref 之后调用此包。
如果你使用 wrapfig 包[5](如“浮动、图形和标题”章节的“将文本环绕图形”部分中所述),或者其他类似的定义了自己的环境的包,你需要在这些环境中手动包含 \capstart
,例如
\begin{wrapfigure}{R}{0.5\textwidth}
\capstart
\begin{center}
\includegraphics[width=0.48\textwidth]{filename}
\end{center}
\caption{\label{labelname}a figure}
\end{wrapfigure}
|
在使用 \listoffigures
和 hyperref 时,如果标题过长或标题过长,就会出现问题。这种情况发生在标题(或标题)的长度超过页面宽度(根据你的设置,大约 7-9 个单词)。为了解决这个问题,你需要在第一次声明时使用选项 breaklinks
\usepackage[breaklinks]{hyperref}
|
这将导致 \listoffigures
中的链接正确换行。
当包含 hyperref 包时,latex 生成的某些辅助文件的格式会发生变化。因此,当第一次使用 hyperref 排版文档时,如果这些文件已经存在,则可能会遇到类似以下的错误。
! Argument of \Hy@setref@link has an extra }.
解决方法是删除 latex 用于获取正确引用而使用的所有文件,然后重新排版。
请参阅 相关部分。
使用命令
\hyperref[some_label]{some text}
|
指向标签时会出错。点击时,用户不会被发送到目标标签,而是会被发送到第一帧。有一个简单的解决方法;不要使用
\phantomsection\label{some_label}
|
为你的框架添加标签,请使用
\hypertarget{some_label}{}
|
并用它作为参考
\hyperlink{some_label}{some text}
|
警告! 请注意,如果您在 \documentclass 声明中启用了“draft”选项,则超链接将不会显示在目录或其他任何地方!
通过在包含包之后立即使用 hyperref 包的以下初始化中的“final=true”选项,可以重新启用超链接
\usepackage{hyperref}
\hypersetup{final=true}
|
可以在此处找到 hyperref 包的更多选项的良好来源 [6].
- ↑ CTAN 中的 Hyperref 包网页
- ↑ "使用 hyperref、url 包的电子邮件链接". comp.text.tex 用户组.
{{cite web}}
: 未知参数|accessmonthday=
被忽略 (帮助); 未知参数|accessyear=
被忽略 (|access-date=
建议) (帮助) - ↑ 其他可能的值在hyperref 手册中定义
- ↑ http://www.ctan.org/tex-archive/macros/latex/contrib/hyperref/README
- ↑ CTAN 中的 Wrapfig 包网页
- ↑ [1]Hyperref - 使用 LaTeX 的超链接页面