目次・図目次・表目次(tocloft)

\tableofcontents\listoffigures\listoftables は、見出しやキャプションの情報を集めて目次・図目次・表目次を自動で組み立てます。このページでは、その仕組み(補助ファイルと 2 回処理)と深さの制御、星付き見出しを手で目次に足す方法、そして tocloft で字下げ・書体・点線リーダーまで作り込む手順を扱います。見出しの基本そのものは「文書構造・見出し・目次」のページに譲り、ここは生成と カスタマイズ に的を絞ります。

三つの自動リストと補助ファイル

目次は **\tableofcontents を置くだけで作られます。同じ要領で、\listoffigures** は figure 環境のキャプションを集めた図目次を、**\listoftables** は table 環境のキャプションを集めた表目次を生成します。ふつうは前付け(タイトルの直後)に並べて置きます。

仕組みは三つとも同じです。LaTeX は処理の最中に、各見出しやキャプションの番号・題・ページを 補助ファイル へ書き出します。目次は .toc、図目次は .lof、表目次は .lot で、いずれもファイル名は文書本体(ルートファイル)と同じです。次の処理ではその補助ファイルを読み込んでリストを組みます。

ここから 重要な帰結 が出ます。1 回目の処理では補助ファイルがまだ無い(または古い)ので、リストは空または不正確です。正しい結果を得るには 最低 2 回コンパイル してください。公式リファレンスも「情報を蓄える 1 回目と、それを取り出す 2 回目」と明記しています。ページ番号が動くとさらに増えることもあり、latexmk のようなビルドツールは安定するまで自動で繰り返します。

見出しの題は、ヘッダの言語に応じたマクロで決まります。目次の見出しは \contentsname(既定 “Contents”)、図目次は \listfigurename、表目次は \listtablename で、\renewcommand で差し替えられます。なお bookreport ではこれらは 番号なしの章(内部的に \chapter*)として、article では番号なしの節として組まれます。番号が付かないため、これら自身は既定では目次に載りません(あとで足す方法を示します)。

document.tex
\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、bookreport で 2** です。

番号付けを司る secnumdepth と混同しないでください。secnumdepth見出しに番号を振る 深さ、tocdepth目次に載せる 深さで、両者は独立に設定できます。番号は小節まで付けたいが目次は節までで十分、といった調整も自由です。\listoffigures\listoftables は階層がひとつ(図・表)だけなので tocdepth の影響を受けません。

手動で項目を足す — addcontentsline と addtocontents

星付き見出し(\section*\chapter*)は番号もページ参照も持たないため、自動では目次に載りません。「はじめに」「謝辞」、あるいは参考文献や索引を目次に出したいときは、**\addcontentsline{ext}{unit}{text}** で手動の行を書き出します。引数は三つともすべて必須です。

  • ext** — 対象の補助ファイルの拡張子。目次なら toc、図目次なら lof、表目次なら lot
  • unit** — 項目の種類。toc では partchaptersectionsubsection など(その書式と字下げが使われる)、lof では figurelot では table
  • text** — 載せる文字列。\protect\numberline{} を前置すると、番号付き項目と同じ字下げにそろえられる。壊れやすい命令には \protect を付ける。

位置どりには注意が必要です。\addcontentsline は処理がその行に達した時点のページ番号を記録するので、見出し命令の 直後 に置きます。星付き見出しの定番は次のとおりです。ページ番号は LaTeX が自動で補うので、text に書く必要はありません。

latex
\section*{はじめに}
\addcontentsline{toc}{section}{はじめに}

\chapter*{謝辞}
\addcontentsline{toc}{chapter}{謝辞}

もう一方の **\addtocontents{ext}{text} は、行ではなく 素材** — 空きや書式命令など — を補助ファイルに差し込みます。引数は対象拡張子 ext と、書き込む内容 text の二つ。たとえば図目次に縦の空きを入れるには次のように書きます。.lof は次回に読み戻されるので、\vspace のような壊れやすい命令には \protect が要ります。要するに **行(ページ番号付きの項目)は \addcontentsline、空きや装飾は \addtocontents** と覚えると整理できます。

latex
\addtocontents{lof}{\protect\vspace{2ex}}   % 図目次に縦の空きを差し込む
\addtocontents{toc}{\protect\setcounter{tocdepth}{1}}  % ここ以降の目次の深さを変える

tocloft で作り込む

標準の目次の見た目を細かく変えたいときの定番が **tocloft** パッケージ(Peter Wilson 作)です。\usepackage{tocloft} で読み込み、各レベルの 字下げ・番号幅・書体・点線リーダー を、\renewcommand や専用命令で個別に設定できます。命令名は規則的で、目次のレベルを表す接頭辞(toc=\partchap=\chaptersec=\sectionsubsec=\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点を打たないための十分大きな値リーダーを消すのに使う

次は、節の題を太字にし、点線をやや密にする例です。プリアンブルに書きます。

latex
\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 自身にはこの自動追加機能は ありません

latex
\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 で試し、構造そのものを作り変えたくなったら titletocetoc に進む、という順序がおすすめです。