Цикл компиляции: из .tex в PDF

Урок объясняет, что происходит при компиляции и зачем документ иногда собирают несколько раз.

Компиляция — это превращение исходника .tex в .pdf. По пути рождаются служебные файлы, которые хранят номера и ссылки.

В Word вы не «собираете» документ — он всегда готов. В LaTeX между исходником и PDF есть шаг компиляции, и понимание этого шага избавляет от половины загадочных проблем новичка.

Что появляется рядом с .tex

После одного запуска движка вы увидите несколько файлов:

thesis.tex   <- ваш исходник (его вы пишете)
thesis.pdf   <- результат (его смотрит читатель)
thesis.aux   <- вспомогательный: метки, номера, ссылки
thesis.log   <- журнал: предупреждения и ошибки
thesis.toc   <- содержимое оглавления
thesis.out   <- закладки PDF

Главные — .tex (пишете вы) и .pdf (результат). Остальные генерируются автоматически; их можно смело удалять, они пересоздадутся.

Почему иногда нужно собрать дважды

Перекрёстные ссылки и оглавление работают так: при первом проходе LaTeX записывает номера разделов и меток в .aux, но ещё не знает их, когда встречает ссылку \ref. При втором проходе он читает готовый .aux и подставляет правильные номера. Поэтому после добавления ссылок документ собирают минимум дважды, иначе на месте номера будет стоять ??.

Если в работе есть библиография через BibTeX, последовательность ещё длиннее: LaTeX → BibTeX → LaTeX → LaTeX. Запоминать это вручную не нужно — для того есть автоматизатор latexmk (отдельный урок).

Как читать ошибки

Когда компиляция падает, движок печатает сообщение и номер строки. Пример типичной ошибки:

! Undefined control sequence.
l.42 \fracc
           {1}{2}

Здесь LaTeX говорит: на строке 42 встретилась неизвестная команда \fracc (опечатка в \frac). Главные подсказки в любой ошибке — восклицательный знак с текстом и l.NN с номером строки. Отладке посвящён отдельный урок в конце курса.

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

Компиляция однопроходна по тексту, но многопроходна по проекту: данные о номерах «дозревают» через файл .aux. Это классический приём отложенного связывания — движок не возвращается назад внутри одного прохода, поэтому информацию из конца документа он узнаёт только на следующем запуске. Отсюда и правило «соберите ещё раз, если ссылки показывают ?? или оглавление пустое».

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

  • Один проход и удивление, почему ссылки ??. Соберите второй раз.
  • Редактировать .aux руками. Не нужно: он перезаписывается при каждой сборке.
  • Игнорировать .log. Все предупреждения о переполнениях и недостающих пакетах там.

Зачем вообще нужен отдельный шаг компиляции

Может показаться, что компиляция — лишняя возня по сравнению с привычным редактором, где текст сразу виден на экране. Но именно из этого шага вырастают главные достоинства LaTeX. Word работает по принципу WYSIWYG («что видишь, то и получаешь»): вы одновременно и пишете содержание, и вручную управляете внешним видом. LaTeX же разделяет эти задачи — вы описываете структуру («это заголовок», «это формула», «здесь ссылка»), а во что именно она превратится, движок решает на этапе сборки по единым правилам. Поэтому документ на сто страниц выглядит безупречно однородным, нумерация никогда не «съезжает», а смена шаблона журнала — это замена одной строки, а не ручная переверстка. Цена за это — необходимость нажать «собрать», и понимание, что между исходником и результатом всегда есть прослойка.

Полезно держать в голове, что движок собирает документ в один проход сверху вниз, как будто читает текст впервые и не может заглянуть вперёд. Когда он доходит до места, где надо разбить абзац на строки или страницу на колонки, он принимает решение здесь и сейчас по своему знаменитому алгоритму переноса, минимизирующему «некрасивость» всей строки целиком. Отсюда растут и предупреждения Overfull \hbox — это движок честно сообщает, что не смог уложить строку в заданную ширину и что-то вылезло за поле. Такие предупреждения не ломают сборку, но именно в .log их и надо искать, когда в PDF что-то выглядит криво.

Чем отличается сборка в Overleaf и латексмк

Когда вы нажимаете «Recompile» в Overleaf, под капотом происходит ровно та же многопроходная пляска, только её прячут от вас: сервис обычно вызывает latexmk, который сам определяет, сколько раз нужно прогнать движок и запускать ли BibTeX, пока номера и ссылки не перестанут меняться. Поэтому в Overleaf вы почти никогда не сталкиваетесь с проблемой «?? вместо номера» — повторные проходы делаются автоматически. Локально же, если вы запускаете xelatex руками, эта забота ложится на вас, и привычка собирать дважды (а с библиографией — четырежды) становится мышечной памятью. Знание о том, что Overleaf просто автоматизирует ручной цикл, помогает не теряться при переезде проекта на локальную машину.

Ещё одна тонкость касается кэширования служебных файлов. Иногда сборка «застревает» в странном состоянии: ссылки показывают старые номера, оглавление дублируется или вылезает ошибка, которой по тексту быть не должно. В 90% случаев виноваты протухшие .aux, .toc или .fls, оставшиеся от предыдущей структуры документа. Лечится это «чистой сборкой» — удалением всех вспомогательных файлов и компиляцией с нуля; в Overleaf для этого есть пункт меню «Clear cached files», а локально latexmk -c подчищает мусор автоматически. Привыкайте при необъяснимых глюках сначала собрать начисто, и только потом искать ошибку в самом тексте.

Итоги

  • Компиляция: .tex → движок → .pdf плюс служебные файлы.
  • Ссылки и оглавление требуют двух проходов через .aux.
  • Ошибки ищите по строке ! ... и номеру l.NN в выводе и в .log.
Проверьте себя
1. Почему документ со ссылками иногда нужно компилировать дважды?
AПервый раз всегда ломается
BНомера меток записываются в .aux на первом проходе, а подставляются ссылками на втором
CТак требует лицензия LaTeX
DЧтобы PDF был меньше по размеру
2. За что отвечает файл .aux?
AЭто резервная копия PDF
BХранит метки, номера разделов и данные для перекрёстных ссылок
CЭто файл со шрифтами
DЭто сжатая версия исходника
3. Что главное в сообщении об ошибке компиляции?
AЦвет текста
BСтрока с восклицательным знаком и указание l.NN с номером строки
CРазмер файла .log
DИмя движка