\tableofcontents・\listoffigures・\listoftables は、見出しやキャプションの情報を集めて目次・図目次・表目次を自動で組み立てます。このページでは、その仕組み(補助ファイルと 2 回処理)と深さの制御、星付き見出しを手で目次に足す方法、そして tocloft で字下げ・書体・点線リーダーまで作り込む手順を扱います。見出しの基本そのものは「文書構造・見出し・目次」のページに譲り、ここは生成と カスタマイズ に的を絞ります。
三つの自動リストと補助ファイル
目次は **\tableofcontents を置くだけで作られます。同じ要領で、\listoffigures** は figure 環境のキャプションを集めた図目次を、**\listoftables** は table 環境のキャプションを集めた表目次を生成します。ふつうは前付け(タイトルの直後)に並べて置きます。
仕組みは三つとも同じです。LaTeX は処理の最中に、各見出しやキャプションの番号・題・ページを 補助ファイル へ書き出します。目次は .toc、図目次は .lof、表目次は .lot で、いずれもファイル名は文書本体(ルートファイル)と同じです。次の処理ではその補助ファイルを読み込んでリストを組みます。
ここから 重要な帰結 が出ます。1 回目の処理では補助ファイルがまだ無い(または古い)ので、リストは空または不正確です。正しい結果を得るには 最低 2 回コンパイル してください。公式リファレンスも「情報を蓄える 1 回目と、それを取り出す 2 回目」と明記しています。ページ番号が動くとさらに増えることもあり、latexmk のようなビルドツールは安定するまで自動で繰り返します。
見出しの題は、ヘッダの言語に応じたマクロで決まります。目次の見出しは \contentsname(既定 “Contents”)、図目次は \listfigurename、表目次は \listtablename で、\renewcommand で差し替えられます。なお book・report ではこれらは 番号なしの章(内部的に \chapter*)として、article では番号なしの節として組まれます。番号が付かないため、これら自身は既定では目次に載りません(あとで足す方法を示します)。
\documentclass{report}
\begin{document}
\tableofcontents % .toc を使う(2 回処理が必要)
\listoffigures % .lof
\listoftables % .lot
\chapter{序論}
\end{document}目次の深さ — tocdepth
どのレベルの見出しまで目次に載せるかは **tocdepth カウンタが決めます。値は見出しの level 値**(\section が 1、\subsection が 2、book/report の \chapter が 0…)で、「載せる最下位レベル」を表します。たとえば \setcounter{tocdepth}{1} なら節までで小節以下は省かれ、\setcounter{tocdepth}{2} なら小節まで載ります。既定値は **article で 3、book・report で 2** です。
番号付けを司る secnumdepth と混同しないでください。secnumdepth は 見出しに番号を振る 深さ、tocdepth は 目次に載せる 深さで、両者は独立に設定できます。番号は小節まで付けたいが目次は節までで十分、といった調整も自由です。\listoffigures・\listoftables は階層がひとつ(図・表)だけなので tocdepth の影響を受けません。
手動で項目を足す — addcontentsline と addtocontents
星付き見出し(\section* や \chapter*)は番号もページ参照も持たないため、自動では目次に載りません。「はじめに」「謝辞」、あるいは参考文献や索引を目次に出したいときは、**\addcontentsline{ext}{unit}{text}** で手動の行を書き出します。引数は三つともすべて必須です。
ext** — 対象の補助ファイルの拡張子。目次ならtoc、図目次ならlof、表目次ならlot。unit** — 項目の種類。tocではpart・chapter・section・subsectionなど(その書式と字下げが使われる)、lofではfigure、lotではtable。text** — 載せる文字列。\protect\numberline{}を前置すると、番号付き項目と同じ字下げにそろえられる。壊れやすい命令には\protectを付ける。
位置どりには注意が必要です。\addcontentsline は処理がその行に達した時点のページ番号を記録するので、見出し命令の 直後 に置きます。星付き見出しの定番は次のとおりです。ページ番号は LaTeX が自動で補うので、text に書く必要はありません。
\section*{はじめに}
\addcontentsline{toc}{section}{はじめに}
\chapter*{謝辞}
\addcontentsline{toc}{chapter}{謝辞}もう一方の **\addtocontents{ext}{text} は、行ではなく 素材** — 空きや書式命令など — を補助ファイルに差し込みます。引数は対象拡張子 ext と、書き込む内容 text の二つ。たとえば図目次に縦の空きを入れるには次のように書きます。.lof は次回に読み戻されるので、\vspace のような壊れやすい命令には \protect が要ります。要するに **行(ページ番号付きの項目)は \addcontentsline、空きや装飾は \addtocontents** と覚えると整理できます。
\addtocontents{lof}{\protect\vspace{2ex}} % 図目次に縦の空きを差し込む
\addtocontents{toc}{\protect\setcounter{tocdepth}{1}} % ここ以降の目次の深さを変えるtocloft で作り込む
標準の目次の見た目を細かく変えたいときの定番が **tocloft** パッケージ(Peter Wilson 作)です。\usepackage{tocloft} で読み込み、各レベルの 字下げ・番号幅・書体・点線リーダー を、\renewcommand や専用命令で個別に設定できます。命令名は規則的で、目次のレベルを表す接頭辞(toc=\part、chap=\chapter、sec=\section、subsec=\subsection…、図は fig、表は tab)を組み合わせて読み解けます。
字下げと番号幅 は \cftsetindents{entry}{indent}{numwidth} でまとめて設定できます。第 1 引数は対象(section など)、indent は左端からの字下げ、numwidth は番号を組む幅です。個別の長さレジスタ \cftsecindent・\cftsecnumwidth を \setlength で直接変える方法もあります。番号の桁が増えて題と重なるときは numwidth を広げます。
書体 は項目側とページ番号側で別々です。\renewcommand{\cftsecfont}{...} が節項目の題の書体、\cftsecpagefont がそのページ番号の書体を決めます(章なら \cftchapfont・\cftchappagefont)。リスト見出しそのものの書体は \cftloftitlefont(図目次)などで変えられます。
点線リーダー(題とページ番号の間の点列)は \cftsecleader が司ります。点の密度は長さ \cftdotsep(既定 4.5)で、小さくすると点が密に、大きくすると疎になります。リーダーを完全に消すには \renewcommand{\cftsecleader}{\cftdotfill{\cftnodots}} とします(\cftnodots は「点を打たない」ことを表す十分大きな値)。点そのものの文字は \cftdot(既定はピリオド)で変えられます。
| 命令 | 役割 | |
|---|---|---|
\cftsetindents | そのレベルの字下げと番号幅をまとめて設定 | {entry}{indent}{numwidth} |
\cftsecfont | 節項目の題の書体 | \renewcommand で再定義 |
\cftsecpagefont | 節項目のページ番号の書体 | \renewcommand で再定義 |
\cftsecleader | 節項目の点線リーダー | \cftdotfill{\cftdotsep} など |
\cftdotsep | 点線の点の間隔(既定 4.5、小で密) | 長さ(mu 単位) |
\cftnodots | 点を打たないための十分大きな値 | リーダーを消すのに使う |
次は、節の題を太字にし、点線をやや密にする例です。プリアンブルに書きます。
\usepackage{tocloft}
\renewcommand{\cftsecfont}{\bfseries} % 節の題を太字に
\renewcommand{\cftsecpagefont}{\bfseries} % ページ番号も太字に
\renewcommand{\cftsecleader}{\bfseries\cftdotfill{\cftdotsep}} % 太字の点線リーダー
\renewcommand{\cftdotsep}{2} % 点をやや密に
\cftsetindents{section}{1.5em}{2.5em} % 字下げと番号幅図目次・表目次を目次に載せる
前述のとおり、\listoffigures や \listoftables(および参考文献・索引)の見出しは番号なしのため、既定では目次に出ません。これを出す方法は二つあります。手軽なのは、各リスト命令の 直前 に \addcontentsline を一行置く方法です。tocloft 自身にはこの自動追加機能は ありません。
\cleardoublepage
\addcontentsline{toc}{chapter}{\listfigurename} % 図目次を目次に載せる
\listoffigures
\cleardoublepage
\addcontentsline{toc}{chapter}{\listtablename} % 表目次を目次に載せる
\listoftablesもうひとつは **tocbibind** パッケージ(同じく Peter Wilson 作)を読み込む方法です。\usepackage{tocbibind} とすれば、目次・図目次・表目次・参考文献・索引のうち存在するものを 自動で目次に追加 します。個別に止めたいときはオプションで切り替えられます — nottoc(目次自身を除外)、notlot(表目次を除外)、notlof(図目次を除外)、notbib(参考文献を除外)、notindex(索引を除外)。とくに複数ページにわたる参考文献や索引で \addcontentsline を手で置くより安全で、手作業の行が要らなくなります。
より高度な制御 — titletoc と etoc
tocloft で足りないほど作り込むなら、二つの選択肢があります。**titletoc**(Javier Bezos 作、titlesec の一部)は、目次の各行の前後の素材や区切りまで含めた書式を、レベルごとに細かく定義できます。行を独立に整形する強力なフックを備え、見出しの体裁を titlesec でそろえている文書と相性がよいです。
etoc**(Jean-François Burnol 作)はさらに自由度が高く、目次を「行スタイル」と「全体スタイル」という枠組みで完全に再設計できます。同じ .toc から **\localtableofcontents** で章ごとの部分目次を出せるのが目玉で、ツリー状やマインドマップ状の目次といった凝った表現まで可能です。まずは tocloft で試し、構造そのものを作り変えたくなったら titletoc/etoc に進む、という順序がおすすめです。