ハイパーリンク(hyperref)

ほとんどの LaTeX パッケージは自分の持ち場だけを守ります。hyperref は違います。\ref\cite、見出し、目次を PDF 上のクリックできるリンクに変えるために、LaTeX 自身の命令をかなりの数、内側から定義し直しているからです。この一点が、hyperref にまつわるほとんど全てを説明します——マニュアルが「読み込みは最後に」と念を押す理由も、cleveref だけがその後ろに来なければならない理由も、そして多くの人が真っ先に消しにかかる リンクを囲む赤い枠 の存在理由も。このページでは、リンクの見た目、\href\url、PDF のメタデータとしおり、そして数式入りの見出しで必ず出るあの警告までを扱います。

プリアンブルに \usepackage{hyperref} と書くだけで、設定を一切しなくても文書中の参照はすべてリンクになります。\ref\pageref\cite による文献引用、目次・図目次・表目次の各項目、脚注記号、そして索引の項目まで、行き先が特定できるものはひととおり対象です。PDF ビューアでクリックすれば該当箇所へ飛びますし、URL は外部ブラウザで開きます。もっとも、リンクにしたくない場面もあります。参照命令には 星付きの形 が用意されていて、\ref*{key}\pageref*{key}\autoref*{key} はリンクを張らずに番号だけを出します。

なぜ hyperref は最後に読み込むのか、そして唯一の例外

hyperref はプリアンブルの ほぼ最後 に置きます。理由は冒頭で述べた通り、この パッケージ の仕事が LaTeX の命令を大量に再定義することだからです。同じ命令に手を入れる別のパッケージを後から読み込めば、その再定義は上書きされ、リンクやしおりが黙って壊れます。hyperref 自身のマニュアルもこの助言をはっきり書いており、しかもそこに脚注を付けて、再定義の数と読み込み順への依存を減らす作業が始まっていると断っています。つまりこれは恒久的な法則ではなく、現時点での回避策です(パッケージの読み込み順そのものは文書クラスとプリアンブルのページで扱っています)。

「最後」の例外は実質一つ、cleveref です。cleverefhyperref が定義したものを検出して自分の参照命令を組み立てるため、逆順では成立しません。これは黙って壊れるのではなく、TeX Live 2024 同梱の cleveref.sty\begin{document} の時点で順序を検査し、! Package cleveref Error: cleveref must be loaded after hyperref! と言って止まります。varioref も使うなら varioref → hyperref → cleveref の順です。もう一つ、マニュアルが明確に禁じている書き方があります。hyperref\AtBeginDocumentbegindocument フックの中で読み込んではいけません(hyperrefnameref 自身がそのフックを使うため、実行順が壊れます)。読み込みを遅らせたい場合に使うのは begindocument/before フックです。

latex
\usepackage{graphicx}
\usepackage{amsmath}
% ... every other package ...
\usepackage{hyperref}   % almost last
\usepackage{cleveref}   % the exception: after hyperref

% With varioref in play, the prescribed order is:
%   varioref -> hyperref -> cleveref

既定の hyperref はリンクを 色付きの枠 で囲んで示します(colorlinks の既定値は false)。画面では確かに分かりやすいのですが、紙に刷ると困ったことになります。枠だけが印刷され、リンクとしての機能は紙の上に存在しない からです。何のためにあるのか読者には分からない赤い四角が本文に散らばることになり、これが「hyperref を入れたら見た目が壊れた」という感想の正体です。設定は読み込み時のオプションでも、あとから \hypersetup{...}キー=値 をカンマで並べても行えます。\hypersetup はプリアンブルのどこに書いてもかまいません。

実務でまず打つのが colorlinks=true です。枠をやめ、リンクの文字そのものに色 を付けるので、印刷しても崩れず画面でも読めます。色は種類ごとに分かれていて、既定は linkcolor が赤、citecolor が緑、urlcolor がマゼンタ、filecolor がシアン。これは画面で区別するための設定であって、そのまま論文に出すと少々にぎやかです。落ち着かせたいなら全部同じ色にする allcolors が手早く、印刷主体なら hidelinks が答えです。hidelinks は色も枠も付けず、リンクは見た目に完全に消えますが クリックできる機能は残ります——PDF で配って紙でも読む文書に、これがいちばん向いています。

オプション効果既定
colorlinks枠をやめ、リンクの文字に色を付けるfalse
hidelinks色も枠もなし。クリックだけは有効(印刷向け)
linkcolor\ref などの内部リンクの色red
citecolor\cite による文献引用の色green
urlcolor\url\href の URL の色magenta
filecolorローカルファイルを開くリンクの色cyan
allcolors上のリンク色をまとめて一色に揃える
allbordercolors枠表示のときの全ボーダー色を一括指定
bookmarksnumberedしおりの項目に節番号を含めるfalse
bookmarksopenしおりのツリーを最初から開いた状態にするfalse

\href\url — 外の世界へのリンク

外部 URL へのリンクは二つの命令で作ります。\href{URL}{表示文字列} は好きな語にリンクを張り、\url{URL}URL そのものを等幅で組版し、同時にリンクにします。URL を本文に見せたいなら \url、別の語の背後に隠したいなら \href という使い分けです。ここで効いてくるのが引数の扱い方で、URL に混じりがちな %#~_ といった LaTeX の特殊文字を、URL の部分ではエスケープせずそのまま書けます\url の引数にはいくつか制約が残ります)。等幅の見た目だけほしくてリンクは不要なら \nolinkurl{URL} です。

latex
See \href{https://www.ctan.org/pkg/hyperref}{the hyperref page on CTAN}.
% the words carry the link; the address is not shown

Download from \url{https://www.ctan.org/}.
% the address is typeset AND linked

\nolinkurl{https://example.com/a_b#c}
% monospaced, no link; underscore and hash need no escaping

Token not allowed in a PDF string\texorpdfstring

見出しに数式を入れた瞬間、hyperref はほぼ確実にこの警告を出します。原因は、見出しの文字列が 二つの行き先 を持つことにあります。一つは組版された本文の見出し、もう一つは PDF のしおりに入る ただの文字列 です。しおりは PDF の仕様上ただのテキストなので、$^\emph のような命令をそこに入れることはできません。hyperref は入れられないトークンを一つずつ捨て、捨てるたびに何を捨てたかを報告します。見出しは組版され、しおりだけが中身を失う——警告を無視すると、そういう静かな劣化になります。

log
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `math shift' on input line 4.

Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `superscript' on input line 4.

解決策は \texorpdfstring{TeX 用}{PDF 文字列用} です。第 1 引数が組版に、第 2 引数がしおりに使われるので、見出しには数式を、しおりにはその読み下しを渡せます。\section{The value of \texorpdfstring{$x^2$}{x squared}} のように書きます。ここで一つ注意があり、第 2 引数もそのまま PDF 文字列になるので、x^2 と書けば今度は ^ について同じ警告が出ます。第 2 引数には記号を残さず、x squared や Unicode の のように 文字だけ を置いてください。

PDF のメタデータ — pdftitlepdfauthorpdfusetitle

hyperref は PDF の 文書情報 も書き込みます。ビューアの「文書のプロパティ」に出る欄で、文献管理ソフトが取り込むのも、多くの検索インデックスが読むのもここです。指定は \hypersetup から pdftitle(タイトル)、pdfauthor(著者)、pdfsubject(主題)、pdfkeywords(キーワード)で行います。値にカンマや等号が含まれるとキーの区切りと衝突するので、値は波括弧で囲む のが安全です(pdftitle={Foundations of Linear Algebra})。

見落としやすいのは、これらが本文の \title\author とは 別物 だという点です。\title を書いてもメタデータには何も入りませんし、逆にメタデータを直しても表紙は変わりません。二つを同期させたければ hyperrefpdfusetitle を使います。指定すると hyperref\title\author から pdftitlepdfauthor を導出するので、二重管理が消えます。ただしこれは パッケージ オプションとして渡さなければなりません——\usepackage[pdfusetitle]{hyperref} と書きます。\hypersetup{pdfusetitle} と書いた場合は判定の時点をすでに過ぎているため、警告も出ないまま 何も起きません。タイトルに数式や \\ が入っている場合は、前節の \texorpdfstring の出番です。

しおり — 見出しから自動で作られる PDF のアウトライン

しおり(PDF のアウトライン)は、ビューアの脇に出る折りたためる見出し一覧です。100 ページを超える文書では、目次よりもこちらのほうが実際に使われます。hyperref は文書の章・節などの見出しから 自動でしおりを生成 し(bookmarks=true が既定)、節番号も入れたければ bookmarksnumbered=true、最初からツリーを開いておきたければ bookmarksopen=true を指定します。しおりは .out という補助ファイルを経由するため、目次と同じく 落ち着くまで複数回のコンパイル が要ります。

しおりが複雑な文書で乱れる、順序が入れ替わる、階層が壊れる——そうなったときの定番の対処が、hyperref に読み込む bookmark パッケージです。これは hyperref の古いしおり生成コードを置き換え、.out の扱いを安定させたうえで、しおりの 書体や色 まで設定できるようにします。細かな調整は \bookmarksetup{...} で行います。追加コストがほぼないので、長い文書では最初から入れておいてかまいません。

日本語のしおりが文字化けするとき

しおりとメタデータは PDF の中に 文字列として 書き込まれるため、そこに日本語や中国語、キリル文字などが入ると符号化の問題が表面化します。鍵は Unicode で書き出す ことです。LuaLaTeX と XeLaTeX では unicode が既定で有効なので、通常は何も足さなくても日本語のしおりが正しく出ます。明示したければ \usepackage[unicode]{hyperref} または \hypersetup{unicode} を書きます。

従来の pLaTeX / upLaTeX + dvipdfmx の経路では事情が違います。定番は \usepackage[dvipdfmx]{hyperref} として、さらに pxjahyper パッケージを併用することです。pxjahyper は (u)pLaTeX で日本語のしおりを文字化けなく作るために存在し、TeX Live に同梱されています。関連するオプションが pdfencoding=auto で、文字列が ASCII に収まればそのまま、収まらなければ Unicode に切り替える自動判定です(主に pdfTeX 系向け。Unicode エンジンでは既定が Unicode なので通常は不要)。要するに、LuaLaTeX なら何もしない、(u)pLaTeX なら pxjahyper と覚えておけば足ります。

latex
% pLaTeX / upLaTeX + dvipdfmx
\usepackage[dvipdfmx]{hyperref}
\usepackage{pxjahyper}   % Japanese bookmarks without garbling

% LuaLaTeX / XeLaTeX: unicode is already the default
% \usepackage{hyperref}

hyperref が足す参照命令 — \autoref\nameref

リンク化のついでに、hyperref は参照の書き方そのものを二つ足します。\autoref{key}\ref の代わりに使い、参照先の種類に応じて 語を自動で前置 して(節なら「section 3.4」、図なら「Figure 3」)全体をリンクにします。前置きの語は \figureautorefname\sectionautorefname などを再定義して変更でき、日本語化もこの手順です。もう一つの \nameref{key} は番号ではなく 見出しの文字列そのもの を差し込みます——\section{Introduction} の名札を引けば「Introduction」と出るので、番号ではなく題名で参照したいときに使います。なお複数参照や単複の自動処理まで必要なら、\autoref より cleveref\cref のほうが上です(参照命令全体の比較は相互参照のページにあります)。

そのまま使える \hypersetup の設定例

実務でよく使う形をまとめると次のようになります。colorlinks=true で枠をやめて文字に色を付け、種類ごとに色を分け、bookmarksnumbered で番号付きのしおりを作り、pdfusetitle でメタデータを \title\author と同期させています。印刷主体の文書なら、colorlinks から urlcolor までの 4 行を hidelinks の 1 行に置き換えてください。 リンクは目に見えなくなりますが、PDF で読む人にはクリック機能がそのまま残ります。

preamble
\title{Foundations of Linear Algebra}
\author{A. N. Author}

% pdfusetitle must be a PACKAGE option; inside \hypersetup it does nothing
\usepackage[pdfusetitle]{hyperref}   % almost last
\hypersetup{
  colorlinks=true,       % colour the text, not a box
  linkcolor=blue,        % \ref, \autoref, ToC entries
  citecolor=teal,        % \cite
  urlcolor=magenta,      % \url and \href
  bookmarksnumbered=true,
  pdfsubject={Lecture notes},
  pdfkeywords={LaTeX, linear algebra, vector spaces},
}
\usepackage{bookmark}    % after hyperref: sturdier bookmarks

% print-first alternative: replace the four colour lines with
%   hidelinks,