超链接 (hyperref)

hyperref 会把交叉引用、引用、目录项和 URL 变成 PDF 中可点击的链接,还会设置书签(PDF 大纲)以及标题等元数据。加载它只需要一行 \usepackage{hyperref},但有一条铁律:几乎最后加载。本页会依次说明这条规则、链接颜色和边框、用 \href\url 创建链接,以及如何正确处理日文书签。

加载方式与顺序

用法本身很简单:只要在导言区写 \usepackage{hyperref}。从那以后,交叉引用(\ref)、引用(\cite)、目录项、脚注等都会 自动变成链接;在 PDF 阅读器中点击即可跳到目标位置。也就是说,即使不做任何设置,文档中的各种引用也已经是可用链接。

需要注意的是 加载位置hyperref 会在内部 重新定义 很多命令(如 \ref\cite\section 等)以便把它们变成链接。因此,如果它没有在其他会修改这些命令的宏包 之后 加载,辛苦做好的重定义就会被覆盖。经验规则很明确:hyperref 放在导言区几乎最后的位置,也就是大多数宏包之后。

不过,“最后”也有 少数例外。典型例子是 cleveref:它通过检测 hyperref 的定义来工作,因此 必须放在 hyperref 之后。如果还同时使用 varioref,顺序应为 variorefhyperrefcleveref。顺序错了,引用有时会在日志没有警告的情况下坏掉(cleveref 的细节见交叉引用页面)。

latex
% プリアンブルのほぼ最後で読み込む / load almost last
\usepackage{graphicx}
\usepackage{amsmath}
% ... 他のパッケージ ... / ... other packages ...
\usepackage{hyperref}   % ほぼ最後 / almost last
\usepackage{cleveref}   % hyperref の後(数少ない例外)/ after hyperref (an exception)

默认情况下,链接会通过在文字周围画一个 彩色框(边框) 来显示。在屏幕上容易看出,但打印时边框会被打印出来而链接本身并不会,这通常不好看,所以很多场合并不希望这样显示。外观可以在加载时用选项控制,也可以更灵活地用 \hypersetup{...},把 key=value 对用逗号分隔列出。\hypersetup 可以写在导言区的任何位置。

最常用的选项是 colorlinks=true,它会 去掉边框,改为给链接文字本身上色(打印时不会破坏版面,屏幕上也易读)。颜色可以按类型设置:linkcolor(像 \ref 这样的内部链接)、citecolor(文献引用)、urlcolor(来自 \url/\href 的 URL)、以及 filecolor(打开本地文件的链接)。默认颜色依次是红、绿、洋红和青色。

用于打印时,hidelinks 很方便:它 既不加颜色也不加边框,链接在外观上完全消失,但仍然可以点击。反过来,如果保留方框显示(colorlinks=false)并想一次性更改所有边框颜色,allbordercolors 可以统一设置所有边框颜色。

选项效果
colorlinks=true去掉边框,改为给链接文字上色
hidelinks无颜色、无边框;仍可点击(适合打印)
linkcolor内部链接(如 \ref)的颜色(默认:红色)
citecolor文献引用的颜色(默认:绿色)
urlcolorURL 链接的颜色(默认:洋红)
filecolor指向本地文件的链接颜色(默认:青色)
allbordercolors一次性设置所有边框颜色

外部 URL 链接用两个命令创建。\href{URL}{display text} 会把链接附到任意显示文字上(写 \href{https://www.ctan.org/}{CTAN} 时,“CTAN”这个词就成为链接)。相比之下,\url{URL}把 URL 本身用等宽字体排出,同时把它做成链接。想在正文中显示 URL 时用 \url,想把它藏在其他文字后面时用 \href

URL 中经常含有 %#~_ 等 LaTeX 特殊字符;\url\href 的优点是 在 URL 部分可以直接写这些字符(无需转义,尽管 \url 的参数有少量限制)。如果只想用等宽样式显示 URL,但不想创建链接,请使用 \nolinkurl{URL}(排版效果与 \url 相同,但没有超链接)。

latex
詳しくは\href{https://www.ctan.org/pkg/hyperref}{hyperref のページ}を参照。
% 「hyperref のページ」がリンクになる / the words become the link

ダウンロードは \url{https://www.ctan.org/} から。
% URL がそのまま組版され、かつリンクになる / URL is typeset and linked

リンクなしで URL を見せる: \nolinkurl{https://example.com/a_b#c}
% 等幅で表示、リンクは張らない / monospaced, no link

PDF 元数据

hyperref 还会设置 PDF 的 文档信息(元数据),也就是 PDF 阅读器“文档属性”中显示、并会被搜索和文献库工具使用的字段。通过 \hypersetup 指定这些键:pdftitle(标题)、pdfauthor(作者)、pdfsubject(主题)、以及 pdfkeywords(关键词)。

如果值中包含逗号或等号,会与键值分隔符冲突,因此最安全的做法是 用花括号 {} 包住每个值(例如 pdftitle={Foundations of Linear Algebra})。注意它与文档自身的 \title 是分开的,\title 不会自动复制到元数据中;若要保持一致,需要手动写同一字符串,或使用 pdfusetitle 之类的机制。

书签(PDF 大纲)

书签(大纲)是 PDF 阅读器在页面旁显示的可折叠标题列表,对于浏览长文档非常重要。hyperref根据文档中的标题自动生成书签(章、节等;bookmarks=true 是默认值)。若要在书签中包含章节编号,请使用 bookmarksnumbered=true;若要一开始就展开树形结构,请使用 bookmarksopen=true

为了更可靠地处理书签,可以配合使用 bookmark 宏包(在 hyperref 之后加载)。它会替换 hyperref 较旧的书签生成代码,允许设置书签的 样式和颜色,并让 .out 辅助文件的处理更稳定。可以用 \bookmarksetup{...} 细调行为。复杂文档中书签出问题时,这是常用的处理方法。

日文书签与避免乱码

书签和元数据会作为 PDF 内部字符串写入,因此 包含日文(CJK)时可能出现乱码。关键是 以 Unicode 写出。在现代引擎(LuaLaTeX / XeLaTeX)中,unicode 默认启用,所以通常不需要额外设置,日文书签也能正确输出。若要显式指定,可以加载 \usepackage[unicode]{hyperref},或设置 \hypersetup{unicode}

在传统的 pLaTeX / upLaTeX + dvipdfmx 环境中,标准做法是像 \usepackage[dvipdfmx]{hyperref} 这样加载 hyperref,再加入 pxjahyper 宏包。pxjahyper 正是为在 (u)pLaTeX 环境中无乱码地生成日文书签而存在,并随 TeX Live 提供。根据引擎不同,它会辅助把输出按内部汉字编码转换为 Unicode(类似 pdfencoding=auto 所做的工作)。

pdfencoding=auto 是一个自动判断选项:如果字符串能落在 ASCII 范围内(使用 Unicode 引擎时也是 ASCII 范围内),就保持原样;否则切换到 Unicode(主要面向 pdfTeX 系列;Unicode 引擎默认已经是 Unicode,通常不需要)。拿不准时,只要记住:LuaLaTeX 不需要额外设置;(u)pLaTeX 加 pxjahyper

document.tex
% --- pLaTeX / upLaTeX + dvipdfmx の場合 / for pLaTeX-upLaTeX + dvipdfmx ---
\usepackage[dvipdfmx]{hyperref}
\usepackage{pxjahyper}   % 日本語しおりの文字化けを防ぐ / fix Japanese bookmarks

% --- LuaLaTeX の場合は unicode が既定 / on LuaLaTeX, unicode is the default ---
% \usepackage{hyperref}

hyperref 添加的引用命令 — \autoref 与 \nameref

加载 hyperref 后,还会得到两个辅助交叉引用的命令。\autoref{key} 可代替 \ref 使用:它会根据引用目标的类型 自动加上对应词语,如 “section 3.4”、“Figure 3”等,并把整体做成链接。前置词可以通过重新定义 \figureautorefname\sectionautorefname 等来修改,日文化也是用这种方式完成的。

另一个命令 \nameref{key} 插入的不是编号,而是目标的 标题文字本身(引用 \section{Introduction} 上的标签时,会输出 “Introduction”)。当你想按题名而不是编号引用时使用它。引用类命令的整体图景(\ref\eqref\cref 等)会在交叉引用页面中详细介绍。

完整配置示例

实践中常用的一套配置如下。它用 colorlinks=true 关闭边框并给文字上色,按类型设置不同颜色,用 bookmarksnumbered 生成带编号的书签,并填写元数据。如果文档主要用于打印,把 colorlinks=true 那一行替换为 hidelinks,链接就会在外观上消失,但仍可点击。

latex
\usepackage{hyperref}
\hypersetup{
  colorlinks=true,        % 枠ではなく文字に色 / color text, not boxes
  linkcolor=blue,         % 内部リンク / internal links
  citecolor=teal,         % 文献引用 / citations
  urlcolor=magenta,       % URL
  bookmarksnumbered=true, % しおりに節番号 / numbered bookmarks
  pdftitle={線形代数の基礎},
  pdfauthor={山田 太郎},
  pdfsubject={講義ノート},
  pdfkeywords={LaTeX, 線形代数, ベクトル空間},
}
% 印刷向けなら colorlinks の行を hidelinks に置き換える
% for print, swap the colorlinks line for: hidelinks