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}
具有相同的效果,但会使文本链接文本成为一个完整的链接。两者可以结合使用。如果标记为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分别是目标位置和链接位置显示的文本。
另请注意,如果放置了超目标,当点击指向该超目标的链接时,它实际上可能会指向超目标后的行,这并非我们期望的结果。因此,如果发生这种情况,可以报告错误并参考此处以获取解决方案。
还可以获取指向超目标的外部URL,方法是在文件的URL后面添加#label,或者右键单击指向目标的超链接之一并复制URL,或者从PDF侧边栏的标题中获取链接,或者通过从查看中推断的过程(例如,子子节11.5.1将具有标签subsubsection.11.5.1)。这对于学术和教学目的很有用。如果你在浏览器中启用与PDF 1.5兼容的PDF查看器(例如Chrome或Chromium浏览器的PDF查看器和Firefox的无PDF下载),则该URL将指向目标;在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大列表
变量 | 值 | 注释 |
---|---|---|
书签 | =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}等[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链接周围边框的颜色 |
请注意,只有边框颜色(如linkbordercolor等)才允许显式RGB规范,而其他颜色只能分配给命名颜色(可以自定义自己的颜色,请参阅颜色)。为了加快自定义过程,这里列出了带有默认值的变量。将其复制到文档中并进行所需的更改。在变量旁边,是对其含义的简要说明
\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
,则公式标识符会出现此问题。在这种情况下,请改用带星号的形式,例如\begin{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}
|
当使用hyperref的\listoffigures
时,对于长标题或长标题存在问题。当标题(或标题)的长度超过页面宽度(根据你的设置大约7-9个单词)时,就会发生这种情况。要解决此问题,你需要在首次声明时使用选项breaklinks
\usepackage[breaklinks]{hyperref}
|
然后,这将导致\listoffigures
中的链接正确换行。
当你包含hyperref包时,latex生成的一些辅助文件的格式会发生变化。因此,可能会遇到类似以下错误
! Argument of \Hy@setref@link has an extra }.
当文档第一次使用hyperref排版并且这些文件已存在时。解决此问题的方法是删除latex用于获取正确引用并重新排版的所有文件。
请参阅相关部分。
使用命令
\hyperref[some_label]{some text}
|
当指向标签时会发生错误。点击后,用户不会被发送到所需的标签,而是会被发送到第一个框架。存在一个简单的解决方法;不要使用
\phantomsection\label{some_label}
|
来标记你的框架,而是使用
\hypertarget{some_label}{}
|
并用
\hyperlink{some_label}{some text}
|
警告!请注意,如果您在 \documentclass 声明中启用了“草稿”选项,则超链接将不会显示在目录中,或者任何其他地方!
可以通过在包含包之后,在 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 的超链接页面