\section が本当にしているのは、文字を大きくすることではありません。見出しの段階を表す整数をひとつ宣言することです。LaTeX の見出しは \part から \subparagraph まで七段あり、それぞれに −1 から 5 までの数が割り当てられています。そのあとに続く二つの問い——この見出しに番号を付けるか(secnumdepth)、目次に載せるか(tocdepth)——は、どちらもこの整数との大小比較でしかありません。つまり階層を決めた時点で、番号も目次もほとんど決まっています。このページでは七段の使い分け、星付き形式、\tableofcontents が二度目のコンパイルを要求する理由、そして \appendix と book の三部構成までを順に見ます。
見出しの七段階と level 値
上位から順に \part・\chapter・\section・\subsection・\subsubsection・\paragraph・\subparagraph の七段です。この「level 値」は比喩ではありません。標準クラスのソースを開くと、\section は \@startsection{section}{1}{…} と定義されていて、二番目の引数 1 がそのまま level 値です。\subsection は 2、\subsubsection は 3、\paragraph は 4、\subparagraph は 5。番号を出すかどうかを決めるカーネルのコードは \ifnum #2>\c@secnumdepth という一行で、#2 がこの数字にあたります。見出しは太字を出すための装飾ではなく、読者に論理の現在地を渡す標識であり、同時に文書全体の番号体系を決める宣言でもあるわけです。
| 命令 | level 値 | 区分 | 使えるクラス |
|---|---|---|---|
\part | −1 (book/report), 0 (article) | 部 | すべて |
\chapter | 0 | 章 | book / report のみ |
\section | 1 | 節 | すべて |
\subsection | 2 | 小節 | すべて |
\subsubsection | 3 | 小々節 | すべて(既定では book/report で番号なし) |
\paragraph | 4 | 段落見出し(本文に続けて組まれる) | すべて(既定では番号なし) |
\subparagraph | 5 | 小段落見出し(本文に続けて組まれる) | すべて(既定では番号なし) |
表の下二段だけ様子が違うのは、見た目の設計が符号ひとつに畳み込まれているからです。\@startsection の五番目の引数は「見出しのあとに空ける量」で、\section では 2.3ex と正、\paragraph と \subparagraph では -1em と負になっています。カーネルはこの符号を見て、正なら見出しのあとで改行し、負なら改行せずその絶対値ぶんの水平の空きを置いて本文を続けます。だから \paragraph{要点} と書くと「要点 ここから本文が続きます」のように、見出しが本文に流れ込む「行内見出し(run-in heading)」になります。段落の頭に短いラベルを置きたいときの道具で、独立した行の見出しが欲しいなら \subsubsection までで止めるのが正解です。
\documentclass{report} % \chapter is available here
\begin{document}
\chapter{Introduction}
\section{Background}
\subsection{Related work}
\paragraph{Key point}The body text continues on this same line.
\end{document}\chapter が使えるのは book と report だけ
article クラスに \chapter はありません。定義されていないので、article の本文に書けば ! Undefined control sequence. で止まります。パッケージが足りないのではなく、章という単位そのものが article の設計に無いのです。したがって article の最上位見出しはふつう \section で、章立てが欲しければ report(章あり・要旨あり)か book(章あり・両面印刷前提・前付け/後付けあり)に移ります。\part はどのクラスでも使えますが、位置づけが違います。article では level 0、book と report では \chapter の上の level −1 です。
ここで段を飛ばすと、番号にその跡が残ります。report で \chapter の直後に \subsection を置くと、見出し番号は 1.0.1 になります。真ん中の 0 は、一度も進められなかった節カウンタです。LaTeX が階層を勝手に詰めてくれることはなく、飛ばした段の値をそのまま印字します。逆に report や book で \chapter を一度も書かないまま \section を始めると 0.1 から始まります。番号に見慣れない 0 が出たら、まず飛ばした段を疑うのが早道です。
番号を消す——星付き形式と secnumdepth
文書全体でどの深さまで番号を付けるかは、カウンタ secnumdepth ひとつが決めます。値は「番号を付ける最下位の level 値」で、TeX Live 2024 同梱の標準クラスでは article が 3、book と report が 2 です。だから article では小々節(level 3)まで番号が付き、book では小節(level 2)で止まります。book で小々節にも番号を付けたければ、プリアンブルに \setcounter{secnumdepth}{3} と書きます。逆に \setcounter{secnumdepth}{0} とすれば節以下の番号が一斉に消え、-2 にすればすべての見出しから番号が消えます。
一箇所だけ番号を消したいなら、命令の 星付き形式 を使います。\section*{謝辞} と書けば、その見出しは番号を持たず、しかも 目次にも載りません。番号なしと目次不掲載が抱き合わせになっているのは、カーネルの星付き用マクロが目次への書き出し自体を行わないからです。「はじめに」「謝辞」「結論」のように番号がなじまない見出しでは望ましい挙動ですが、目次には出したい場合は困ります。その場合は見出しの直後に \addcontentsline{toc}{section}{謝辞} を添えます。星付き見出しは番号カウンタを進めないので、以降の番号がずれる心配もありません。
もうひとつ覚えておきたいのが 省略可能引数 です。\section[短い題]{本文に出る長い題} と書くと、本文の見出しには長いほうが、目次と柱(ヘッダ)には角括弧の短いほうが使われます。論文の節見出しは往々にして一行に収まらないので、目次と柱の見た目を守るための実用的な逃げ道になります。角括弧を省いたときは、長い題がそのまま両方に使われます。
\setcounter{secnumdepth}{3} % number subsubsections too
\section{Results and discussion} % numbered, e.g. "3 Results and discussion"
\section*{Acknowledgements} % no number, and no TOC entry
\addcontentsline{toc}{section}{Acknowledgements} % put it back in the TOC
\section[Method]{A detailed formulation of the proposed method}\tableofcontents が二度目のコンパイルを要求する理由
目次は \tableofcontents を置くだけで出ますが、置いた回のコンパイルでは出ません。TeX は文書を頭から一度しか読まないので、目次を組む時点では後ろにどんな見出しがあるか知りません。そこで LaTeX は見出しに出会うたび \contentsline{section}{\numberline {1}First}{1}{} のような行を補助ファイル .toc に書き出し、次回の実行で冒頭からそれを読み込んで目次を組みます。だから正しい目次を得るには最低 2 回のコンパイルが必要です。厄介なのは、1 回目に No file document.toc. とログに一行出るだけで、警告らしい警告が出ないことです。目次が空、あるいは古いまま提出される事故はここから起きます。latexmk のようなビルドツールは必要な回数を自動で繰り返すので、この事故を構造的に防げます。
図と表の一覧も同じ仕組みです。\listoffigures は .lof、\listoftables は .lot を経由し、やはり複数回のコンパイルを要します。自動では載らない項目を手で入れるのが \addcontentsline{ext}{unit}{text} で、第 1 引数 ext が対象の拡張子(toc / lof / lot)、第 2 引数 unit が項目の種類(section・chapter・figure など)、第 3 引数 text が載せる文字列です。行ではない素材——たとえば見出し群のあいだの空き——を差し込みたいときは \addtocontents{ext}{text} を使います。こちらは中身をそのまま補助ファイルに流し込むので、\vspace のような命令には \protect を付けます。
\tableofcontents
\setcounter{tocdepth}{2} % list down to subsections
\section*{Introduction} % starred: never listed
\addcontentsline{toc}{section}{Introduction} % list it by hand
\listoffigures % goes through the .lof file
\addtocontents{lof}{\protect\vspace{2ex}} % extra space inside that listtocdepth と secnumdepth の違い
目次に載せる深さは tocdepth が決めます。値の意味は secnumdepth と同じ level 値で、既定も同じく article が 3、book・report が 2。ただし二つは独立していて、番号は節までにとどめつつ目次には小節まで並べる、といった設定がふつうに可能です。決定的な違いはいつ効くかです。secnumdepth は組版のその場で番号を出すかを決めますが、tocdepth は違います。LaTeX は深さにかかわらずすべての見出しを .toc に書き出しており、tocdepth は書き出されたその行を読み戻すときにふるいにかけているだけです。実際、\paragraph の行は既定の article でも .toc に入っています——印字されていないだけです。この設計には実利があります。tocdepth を深くしても .toc を作り直す必要はなく、追加のコンパイルは 1 回で足ります。
\appendix と book の三部構成
付録に入る位置で \appendix と一度だけ書きます。これは見出しを作る命令ではなく 番号付けの切り替えスイッチ です。article では節カウンタと小節カウンタを 0 に戻し、\thesection を英字表示に置き換えます。book と report では章と節を 0 に戻し、\thechapter を英字にしたうえで、見出しの前に付く語を Chapter から Appendix に差し替えます。ですから \appendix のあとは、これまでどおり \chapter{記号一覧} と書くだけで「Appendix A 記号一覧」になります。二度書いたり、付録の各見出しの前に書いたりすると番号がその都度リセットされるので、置くのは一度だけです。
book クラスにはさらに、本を三つに分ける命令があります。\frontmatter は前付け(序文・目次など)に入り、ページ番号を小文字ローマ数字にして 1 から振り直し、章番号を止めます(章の題は目次には載ります)。\mainmatter で本文に入り、ページ番号をアラビア数字に戻して再び 1 から数え、章番号を復活させます。\backmatter は後付け(参考文献・索引など)で、ページ番号はそのまま続けたまま章番号だけをまた止めます。ページ番号をリセットするのは \frontmatter と \mainmatter の二つだけ、という非対称が要点です。
\documentclass{book}
\begin{document}
\frontmatter % i, ii, ... and unnumbered chapters
\tableofcontents
\mainmatter % 1, 2, ... and numbered chapters again
\chapter{Introduction}
\appendix % chapters now read "Appendix A", "Appendix B"
\chapter{Notation}
\backmatter % bibliography, index: page numbers keep running
\end{document}ところでこの見出し命令一式を設計したのは Leslie Lamport です。彼が 2013 年の ACM チューリング賞を受けたのは、しかし LaTeX に対してではなく、分散システムの仕事——論理時計、安全性と活性、複製状態機械といった概念——に対してでした。世界中の理工系の学生が毎日 \section と打っているのは、受賞理由に一行も書かれていない仕事のほうだ、というわけです。
番号や目次がおかしいときの見方
- 番号に
0が混じる(1.0.1など) — 段を飛ばしています。report/bookで\chapterの直後に\subsectionを置いていないか、\chapterを書く前に\sectionを始めていないかを確認します。 - 目次が空、または古い —
.tocは前回の実行で書かれたものです。2 回コンパイルします。警告は出ないので、latexmkに任せるのが確実です。 ! Undefined control sequence.が\chapterで出る —articleを使っています。reportかbookに変えるか、最上位見出しを\sectionにします。- 星付き見出しが目次に出ない — 仕様どおりです。見出しの直後に
\addcontentsline{toc}{section}{…}を置きます。 - 小節が目次に出ない —
tocdepthが浅いだけです。\setcounter{tocdepth}{2}にして、あと 1 回コンパイルします(.tocの作り直しは不要)。 - 付録の番号が期待と違う —
\appendixは見出しではなくスイッチです。付録の最初の見出しの直前に、一度だけ置きます。