Разделы и оглавление

Урок учит делить документ на разделы и собирать оглавление одной командой.

Команды разделов (\section, \subsection, ...) задают логическую структуру; LaTeX сам нумерует их и строит из них оглавление.

Вы не пишете «1.2.3» руками. Вы говорите «здесь начинается подраздел», а номера и оглавление LaTeX рассчитает сам. Это и есть автоматизация структуры.

Иерархия уровней

Уровни от старшего к младшему (в article старший — \section, в report/book ещё выше стоит \chapter):

\chapter{Глава}          % только report/book
\section{Раздел}
\subsection{Подраздел}
\subsubsection{Под-подраздел}
\paragraph{Параграф}
\subparagraph{Подпараграф}

Каждая команда автоматически получает номер и крупный заголовок нужного размера. Текст после команды до следующего заголовка относится к этому разделу.

Нумерованные и ненумерованные

Звёздочка после имени команды отключает нумерацию и не вносит раздел в оглавление — так оформляют «Введение», «Заключение», «Список литературы»:

\section{Методы}        % будет «3 Методы»
\section*{Благодарности} % без номера, не в оглавлении

Оглавление одной командой

Команда \tableofcontents вставляет автоматически собранное оглавление со всеми разделами и их страницами:

\begin{document}
\maketitle
\tableofcontents
\section{Введение}
...
\end{document}

Важно: оглавление строится из данных .toc, которые пишутся при компиляции. Поэтому после добавления разделов документ нужно собрать дважды, иначе оглавление будет пустым или устаревшим — это прямое следствие двухпроходной модели из урока про компиляцию.

Как работает под капотом

Когда движок встречает \section{Введение}, он делает три вещи: увеличивает счётчик раздела, печатает заголовок с этим номером и записывает строку «номер — название — страница» в файл .toc. Команда \tableofcontents на следующем проходе просто читает .toc и печатает его содержимое. Глубину оглавления регулирует счётчик tocdepth: например, \setcounter{tocdepth}{2} покажет в оглавлении разделы и подразделы, но не под-подразделы.

Частые ошибки

  • Пустое оглавление после первой сборки. Соберите второй раз.
  • Нумеровать разделы вручную в тексте — двойная нумерация. Доверьте номера LaTeX.
  • Ждать «Введение» с номером. Если использовали \section*, номера и записи в оглавлении не будет.

Итоги

  • Структуру задают команды разделов; нумерация автоматическая.
  • Звёздочка (\section*) убирает номер и запись в оглавлении.
  • \tableofcontents собирает оглавление из .toc — нужна вторая сборка.

Два счётчика глубины: secnumdepth и tocdepth

За поведением разделов стоят два независимых счётчика, и их легко перепутать. secnumdepth отвечает за то, до какого уровня заголовки получают номер. Каждому уровню сопоставлено число: у \section оно равно 1, у \subsection — 2, у \subsubsection — 3 (в report/book добавляется \chapter на уровне 0, а \part стоит выше). Если значение счётчика меньше уровня заголовка, номер просто не печатается, хотя заголовок остаётся. Команда \setcounter{secnumdepth}{2} означает «нумеровать разделы и подразделы, а под-подразделы оставить без номеров». Это частый приём, когда мелкое дробление нужно для структуры, но засорять текст номерами вида 3.4.2.1 не хочется.

Второй счётчик, tocdepth, управляет совсем другим — какие уровни попадают в оглавление. Эти два параметра не связаны: можно нумеровать заголовки глубоко, но показывать в оглавлении только крупные уровни, и наоборот. Типичная настройка диплома — secnumdepth и tocdepth равны 2 или 3 одновременно, чтобы нумерация и оглавление совпадали по детальности. Понимание этой пары снимает большинство вопросов вида «почему подраздел пронумерован, но в оглавлении его нет» — за номер и за строку в оглавлении отвечают разные счётчики.

Что именно записывается в .toc

Стоит присмотреться к механике файла .toc поближе. Когда движок обрабатывает \section{Методы} и уровень укладывается в tocdepth, он дописывает в .toc строку с тремя данными: уровень элемента, его текст (вместе с номером, если тот печатается) и номер страницы, на которой раздел оказался. На следующем проходе \tableofcontents открывает этот файл и разворачивает каждую строку в готовый пункт оглавления с отточием и номером страницы. Именно поэтому оглавление всегда «отстаёт» на один проход: строка про страницу записывается уже после того, как страница свёрстана, а прочитать её можно только в следующей сборке. Та же двухпроходная механика, к слову, лежит в основе списков рисунков и таблиц — команды \listoffigures и \listoftables читают свои файлы .lof и .lot точно так же.

Ручное добавление строк: addcontentsline

Из правил есть полезное исключение. Звёздочка у \section* убирает и номер, и запись в оглавлении — но иногда ненумерованный раздел в оглавлении всё-таки нужен. Классический пример — список литературы или предисловие: номер им не положен, а вот строка в оглавлении желательна. Тогда сразу после ненумерованного заголовка ставят команду \addcontentsline, которая вручную дописывает в .toc одну строку нужного уровня с указанным текстом. Грубо говоря, \section* печатает заголовок без следа в оглавлении, а следующая за ним \addcontentsline возвращает этот след обратно — на нужном уровне и с правильной страницей. Это аккуратный способ совместить «без номера» и «видно в оглавлении», не ломая автоматику.

Проверьте себя
1. Как сделать раздел без номера и без записи в оглавлении?
A\section!{...}
B\section*{...} со звёздочкой
C\nosection{...}
DУдалить \tableofcontents
2. Почему оглавление иногда пустое после первой компиляции?
AКоманда \tableofcontents написана с ошибкой
BДанные пишутся в .toc при сборке, поэтому нужен второй проход
CВ article нет оглавления
DНужно вручную перечислить разделы
3. Кто отвечает за номера разделов вроде «3.2»?
AАвтор пишет их вручную
BLaTeX считает их автоматически через счётчики разделов
CОни задаются в \documentclass
DИх добавляет PDF-просмотрщик