[[LaTeX入門]] /
[[最初の例>LaTeX入門/最初の例]] /
[[簡単な数式 (1)>LaTeX入門/簡単な数式(1)]] /
[[簡単な数式 (2)>LaTeX入門/簡単な数式(2)]] /
[[各種パッケージの利用>LaTeX入門/各種パッケージの利用]] /
[[レポート>LaTeX入門/レポート]] /
[[HTML と LaTeX の比較>LaTeX入門/HTMLとLaTeXの比較]] /
[[複雑な数式>LaTeX入門/複雑な数式]] /
[[図表>LaTeX入門/図表]] /
[[図表の配置>LaTeX入門/図表の配置]] /
相互参照とリンク /
[[文献引用]] /
[[索引作成]] /
[[LaTeX マクロの作成>LaTeX入門/LaTeXマクロの作成]] /
[[スライドの作り方(jsarticle 編)>LaTeX入門/スライドの作り方(jsarticle編)]] /
[[応用的な使い方>LaTeX入門/応用的な使い方]] /
[[発展編>LaTeX入門/発展編]]

----


* 相互参照とリンク [#aa45fcc2]

さきほどの「図表」では,図や表の番号を本文中で参照するという作業を行いました。
LaTeX ではほかにも,数式番号や引用文献の番号などを参照することができます。
ここで,そのような相互参照とリンクについて説明します。

#contents


** 相互参照とは [#db0ce011]

// 大友さんによる「文献リストと相互参照,および索引の作り方」(インターネットアーカイブ)
// http://web.archive.org/web/20081231221606/http://www.klavis.info/bib.html
// をもとに,一部変更を施して移植しました。
// パブリックドメインにしていただいたことに感謝いたします。

例えば,○○の絵のつもりで「図38にあるように」などと書きたいときに,本当に○○の図の番号は38でいいのか不安になることもあるでしょう。
また,ついでにその図が置かれているページも示したいというときにも,いちいちページ番号を確認するのは面倒です。
文献の引用でも「××第2巻によると・・・」と書いていて,文献リストの番号を一緒に示したいとき,いちいち文献リストを確認しにいくのは面倒ですね。

こんなとき,次のように思うことがあるはずです。
「参照先の番号やページが変わったら,自動的に参照元の番号やページの記述も変わってくれたらなぁ。」
そうした願いをかなえるのが「相互参照」です。


** 相互参照の例 [#h84e81eb]

table の表番号,figure の図番号,equation の式番号等をそれぞれ参照したいときは,\label{目印名} という命令で目印(ラベル)を付けておきます。
そして,後で \ref{目印名} で表・図・式番号を,\pageref{目印名} で \label のあるページ数を出力することが出来ます。

たとえば,LaTeX ソースに
 エネルギー$E$と質量$m$は
 \begin{equation} \label{speed-of-light}
   E = mc^{2}
 \end{equation}
 で関係づけられる。
 ここに$c$は光速で,
 \begin{equation}
   c = 299{,}792{,}458 \, \mathrm{m/s}
 \end{equation}
 である。
と書いたとします。
そして,この数式を別の箇所で参照して
 真空中における光速度の定義(式\ref{speed-of-light},\pageref{speed-of-light}ページ)より,…
のように書いたとします。

このような相互参照を行っているファイルをタイプセットするには,''少なくとも2回は'' (u)platex で処理する必要があります。
タイプセットの結果,数式が「式番号(2),12ページ」に出力されたとすると,それを参照した文章の出力結果は
 真空中における光速度の定義(式2,12ページ)より,…
となります。

''少なくとも''2回タイプセットが必要というのは,LaTeX の相互参照が

-1回目のタイプセットでは拡張子 .aux のファイルにラベル情報を書きだす
-それを2回目のタイプセットで読み込む

という仕組みだからです。
1回目のタイプセットではまだ .aux ファイルが未完成ですので,文書中の \ref, \pageref などが “??” または間違った値で出力されてしまいます。
2回目では .aux ファイルが''ほぼ''完成していますので,''ほぼ''正しい値が表示されるでしょう。

ただし,目次などの作成の都合でページ番号がまだ変化することもよくあります。
より確実に相互参照を行うため,「''タイプセットは少なくとも3回''」と心に決めておくとよいでしょう。
-回数が足りないことによる失敗例:[[forum:1570]]


** ラベルの付け方の工夫 [#b692d432]

相互参照はたしかに便利な機能ではありますが,「どこがどのラベルか」が分かりにくくなってしまうのは事実です。
そこで,ラベル名を覚えやすくするとよいでしょう。

たとえば数式なら

 \label{fig:理想気体の状態方程式}  

などと「参照先の種類」がわかる言葉をラベル名の頭につけることで,"fig:"(FIGure,つまり図)だから式の「理想気体の状態方程式」ではなく,図を参照するんだな,と分かりやすくすることができます。
例えば,以下のような例をあげておきます。

|参照先の種類|ラベル名の付け方|参照のしかた|
|図|\label{fig:名前}|\ref{fig:名前}|
|表|\label{tab:名前}|\ref{tab:名前}|
|数式|\label{eq:名前}|\ref{eq:名前}|
|章・節|\label{sec:名前}|\ref{sec:名前}|

文献引用については特別な方法がありますので,[[後の項目>文献引用]]で説明することにします。


** リンクの付け方 [#ocae7881]

ウェブサイトなどの URL をソース中に書き込みたいときは,プリアンブルに
 \usepackage{url}
と書いておき,URL を挙げたい場所で例えば
 \url{http://oku.edu.mie-u.ac.jp/~okumura/texwiki/}
 \url{https://texwiki.texjp.org/}
のように書きます。
こうすれば,リンク無しではありますが URL をタイプライタ体で出力することができます。

しかし,さらに HTML と同じようにハイパーリンクを付けたい場合もあるでしょう。
そういう場合には [[hyperref]] パッケージを使います。
hyperref パッケージを使うと,いま説明した相互参照の「式2」や「図38」のような番号からも,同じ文書中の該当する箇所へリンクを飛ばすことができます。


** hyperref パッケージによるハイパーリンク [#e8c0eb2e]

プリアンブルに
 \usepackage[dvipdfmx]{hyperref}
と書くと hyperref パッケージが読み込まれます。

この「ハイパーリンクを付ける」という作業は,先ほどの[[図の取り込み>LaTeX入門/図表]]と同様に ''LaTeX 自身の機能ではありません''。
実際には,“dvi ファイルの中に書き込まれたハイパーリンクの取り扱いに関する指示”を,[[dvipdfmx]] などのソフトウェアが解釈します。
そこで,hyperref パッケージにも [[graphicx]] パッケージ同様,(u)pLaTeX + dvipdfmx でタイプセット(あるいは ptex2pdf でタイプセット)している場合は忘れずに dvipdfmx オプションを付けましょう。

ただし,hyperref パッケージは少々“癖のある”パッケージ((ハイパーリンクを実現するために,いろいろなコマンドを再定義しているためです。))です。
注意深く利用してください。