Разделы и оглавление
Урок учит делить документ на разделы и собирать оглавление одной командой.
Команды разделов (
\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 возвращает этот след обратно — на нужном уровне и с правильной страницей. Это аккуратный способ совместить «без номера» и «видно в оглавлении», не ломая автоматику.