Цикл компиляции: из .tex в PDF
Урок объясняет, что происходит при компиляции и зачем документ иногда собирают несколько раз.
Компиляция — это превращение исходника
.texв
В 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.