索引(巻末の「あいうえお/ABC 順」の見出し一覧)は、本文に印を付けておけば LaTeX が自動で組み立ててくれます。鍵は三つ — プリアンブルで \makeindex を宣言し、本文の要所に \index{…} を置き、出したい場所で \printindex を呼ぶ。ただし並べ替えは LaTeX 本体ではなく makeindex(日本語は mendex / upmendex)という別プログラム が担うので、bibtex と同じく追加の処理が要ります。このページでは入口の宣言から、項目の書き方(! 副項目・@ 読み・| ページ修飾)、ビルドの手順、日本語の並べ替え、スタイル調整、そして現代的な imakeidx までを順に見ていきます。
索引を作る四つの部品
標準の索引機能は **makeidx パッケージが提供します。プリアンブルで読み込み、続けて \makeindex** を宣言すると、LaTeX は索引項目を別ファイル(.idx)へ書き出すようになります。あとは本文に印を付け、最後に出力場所を指定するだけです。
\usepackage{makeidx}** — 索引コマンドを読み込む(プリアンブル)。\makeindex** — 索引の収集を有効にする宣言(プリアンブル)。これが無いと\indexは無視されます。\index{項目}** — 本文中、その語が現れる箇所に置く印。出力には何も現れず、現在のページ番号だけが記録されます。\printindex** — 整形済みの索引を実際に組む命令。ふつう文書の末尾に置きます。
大事なのは、\index は 見えない印 だということ。語そのものは本文に手で書き、その直後に \index{…} を添えるのが定石です(乱数\index{乱数}を使う)。印を付けた位置のページ番号が、その項目に対して記録されます。
項目の書き方
\index の引数には専用の記法があり、副項目・読み(ソートキー)・ページ範囲・ページ番号の修飾・相互参照を表せます。これらは LaTeX ではなく makeindex が解釈する 特殊文字 で、!・@・|・" の四つです。
**副項目(!)。** 感嘆符で階層を区切ります。\index{animals!cats} は「animals」という主項目の下に「cats」という副項目を作ります。! を重ねれば最大 3 階層(mendex / upmendex 系では更に深く)まで入れ子にできます。
**読み・ソートキー(@)。** ソートキー@表示 の形で、並べ替えに使う文字列と、実際に印刷する文字列を分けられます。記号や数式は字面どおりには並ばないので、これが要になります。\index{alpha@$\alpha$} は索引に α を表示しつつ「alpha」の位置に並べます。日本語では漢字の 読み を与えるのに使います(\index{さくいん@索引})。
**ページ範囲(|( … |))。** ある話題が数ページに渡るとき、開始位置に |(、終了位置に |) を付けると、12–15 のような範囲表記になります。\index{再帰|(} で始め、後の箇所に \index{再帰|)} で閉じます。
**ページ番号の修飾(|)。 縦棒のあとに 引数を一つ取る命令名** を書くと、そのページ番号だけに書式が適用されます。\index{猫|textbf} は定義のあるページを 太字 にし、\index{群|textit} は斜体にします。自作のコマンド名も使えます。
**相互参照(|see / |seealso)。** 同じく縦棒に続けて、ページ番号の代わりに別項目への案内を出せます。\index{犬|see{ペット}} は「犬 → ペットを見よ」、|seealso{…} は「~も見よ」になります。
**特殊文字そのものを出す(")。** !・@・|・" を文字として索引に入れたいときは、直前に二重引用符を置きます。たとえば \index{C"!} は項目「C!」を作ります。
| 記号 | 役割 | 例 |
|---|---|---|
! | 副項目(階層) | \index{animals!cats} |
@ | ソートキー=読み(並べ替え用) | \index{alpha@$\alpha$} |
|( |) | ページ範囲の開始/終了 | \index{再帰|(} … \index{再帰|)} |
|cmd | ページ番号を装飾(太字など) | \index{猫|textbf} |
|see | 「~を見よ」の相互参照 | \index{犬|see{ペット}} |
" | 次の特殊文字をそのまま出す | \index{C"!} |
ビルドの流れ(makeindex を回す)
索引は一度のコンパイルでは完成しません。bibtex と同じく、間に別プログラムを挟む 3 段階 になります。まず LaTeX を走らせると、\index が集められて file.idx という生ファイルができます。次に **makeindex** プログラムでこれを並べ替え・整形し、file.ind(組版可能な索引)を作ります。最後にもう一度 LaTeX を走らせると、\printindex が file.ind を読み込んで本文に索引が現れます。処理ログは file.ilg に残ります。
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}
METAFONT\index{METAFONT} は字形を、TeX\index{TeX} は組版を担う。
ここでは乱数\index{乱数|textbf} の生成を扱い、
群\index{group@群} と環\index{ring@環} にも触れる。
アルゴリズム\index{algorithm|(} の説明はここから始まり…
% (数ページ後)
…アルゴリズム\index{algorithm|)} の説明はここで終わる。
\printindex
\end{document}コマンドラインからは次のように回します。-s でスタイルファイル、-o で出力名、-t でログ名を指定できます(省略時は拡張子だけ差し替わります)。
pdflatex mydoc # writes mydoc.idx
makeindex mydoc # mydoc.idx -> mydoc.ind (log in mydoc.ilg)
pdflatex mydoc # \printindex reads mydoc.indこの手順は **latexmk が自動で面倒を見てくれます**。.idx が更新されると makeindex を呼び、必要な回数だけ LaTeX を再実行するので、手で 3 回叩く必要はありません。
日本語の索引(mendex / upmendex)
makeindex は欧文のアルファベット順を前提にしているため、日本語の索引には **mendex(pLaTeX 系)か upmendex**(upLaTeX・LuaLaTeX 系、Unicode 対応)を使います。どちらも makeindex 互換で、makeindex の代わりに同じ位置で呼ぶだけです。
uplatex mydoc # writes mydoc.idx
upmendex -s style.ist mydoc # sorts kana correctly -> mydoc.ind
uplatex mydoc # \printindex reads mydoc.ind最大の利点は 仮名の並べ替え です。makeindex で五十音順に並べるには、項目ごとに 読み@表記 の形で平仮名・片仮名の読みを与え、濁点なども揃える必要がありました。upmendex は ICU(International Components for Unicode) を使って仮名を自動で正しく整列するので、その手間が大きく減ります。さらに -d で 辞書ファイル を指定すれば、漢字語の読みをまとめて登録でき、@ による読み付与すら省けます。
使い分けの目安:pLaTeX なら mendex、upLaTeX・LuaLaTeX なら upmendex。読みを @ で与える方式は両者とも有効です(\index{さくいん@索引})。
索引スタイルを変える(.ist)
索引の見た目は **スタイルファイル(.ist)** で制御し、makeindex -s style.ist file のように -s で渡します。中身は <パラメータ> <値> の対を並べたもので、文字列は二重引用符で囲み、% 以降は注釈です(mendex / upmendex のスタイルも makeindex と上位互換)。
headings_flag** — 0 以外にすると、A・B… や「あ・か・さ」といった 見出し(グループの先頭文字) を各グループの前に挿入します。lethead_prefix/lethead_suffix** — その見出しの前後に置く文字列。delim_0/delim_1/delim_2— 項目(各階層)とページ番号の間に入れる 区切り**(例:", "やリーダー線)。item_0/item_1** — 項目間・階層間に挿入する文字列(改行やインデント)。preamble/postamble** — 索引全体の前後に入るコード。
見出しの体裁を整えるだけなら、次のような小さな .ist で十分です。
% style.ist
headings_flag 1
heading_prefix "{\\bfseries "
heading_suffix "}\\nopagebreak\n"
delim_0 "\\dotfill "現代的なやり方:imakeidx
imakeidx は makeidx を拡張したパッケージで、二つの大きな利点があります。第一に、コンパイル時に makeindex を自動で呼ぶ** こと。-shell-escape(外部コマンド実行の許可)付きで LaTeX を走らせれば、目次と同じ感覚で索引が生成され、手作業のパスが不要になります。第二に、複数の索引 を 1 文書に持てること(人名索引・事項索引など)。
\makeindex にオプションを渡して設定します。name= で索引を区別し、title= で見出し、intoc で目次に載せ、program= で並べ替えプログラム(makeindex / xindy / texindy、日本語なら mendex・upmendex)を、options= で -s style.ist などの引数を指定します。複数の \makeindex を書けばその数だけ索引ができ、\index[name]{…} と \printindex[name] で振り分けます。
\documentclass{article}
\usepackage{imakeidx}
% two indexes; built automatically with -shell-escape
\makeindex[name=subject, title=事項索引, intoc, program=upmendex]
\makeindex[name=people, title=人名索引, intoc, program=upmendex,
options={-s style.ist}]
\begin{document}
群\index[subject]{group@群} は重要だ。
クヌース\index[people]{Knuth@クヌース} が TeX を作った。
\printindex[subject]
\printindex[people]
\end{document}# auto-build: makeindex/upmendex is invoked for you
lualatex -shell-escape mydoc
lualatex -shell-escape mydoc # second pass resolves page numbersxindy を使う場合のみフルの shell-escape が必要ですが、自動ビルドそのものに -shell-escape が要る点は共通です。手動で回したいときは imakeidx でも従来どおり外部から makeindex / mendex を呼べます。-shell-escape を有効にできない環境(一部の Web サービスや厳格な CI)では、自動ビルドは使えないので手動パスか latexmk に任せてください。