TeX, LaTeX и движки pdfLaTeX/XeLaTeX/LuaLaTeX

Урок разбирает экосистему: TeX, LaTeX и три современных движка — что выбрать и почему.

Движок — это программа, которая читает ваш .tex и собирает PDF. Их несколько, и они отличаются работой со шрифтами и юникодом.

Когда вы «запускаете LaTeX», на самом деле работает конкретный движок. Понимать разницу важно: для русского текста, например, удобнее одни движки, чем другие.

TeX, LaTeX, движки — кто есть кто

  • TeX — низкоуровневый наборный движок Кнута. Напрямую им почти не пользуются.
  • LaTeX — набор макрокоманд поверх TeX (формат). Это «язык», на котором вы пишете.
  • Движок — конкретная исполняемая программа, понимающая формат LaTeX: pdfLaTeX, XeLaTeX или LuaLaTeX.

Три движка

ДвижокКодировка/шрифтыКогда брать
pdfLaTeXтрадиционные TeX-шрифты, ввод обычно UTF-8 с пакетамиклассика, англоязычные тексты, максимальная совместимость
XeLaTeXнативный Unicode, системные шрифты OpenTypeрусский/многоязычные тексты, свои шрифты
LuaLaTeXUnicode + встроенный язык Lua для скриптовтонкая автоматизация, современные проекты

Практический совет для русскоязычных работ: берите XeLaTeX или LuaLaTeX — они без танцев с бубном работают с кириллицей и системными шрифтами. О кириллице будет отдельный урок.

Запуск из терминала

Каждый движок — это команда, которой скармливают имя файла:

pdflatex thesis.tex      # классический движок
xelatex  thesis.tex      # Unicode + системные шрифты
lualatex thesis.tex      # Unicode + Lua

В результате рядом с thesis.tex появится thesis.pdf, а ещё несколько служебных файлов (о них — в уроке про цикл компиляции).

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

Движок читает .tex сверху вниз, разворачивает макросы LaTeX в элементарные TeX-команды, набирает абзацы и страницы и пишет результат. pdfLaTeX генерирует PDF напрямую и использует собственные шрифтовые карты; XeLaTeX и LuaLaTeX умеют обращаться к шрифтам операционной системы (через библиотеки HarfBuzz/fontspec), поэтому могут поставить в документ любой установленный TTF/OTF-шрифт и корректно набрать любой юникод-символ без специальных пакетов кодировки.

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

  • Компилировать кириллицу через pdfLaTeX без нужных пакетов — получите кракозябры. Проще взять XeLaTeX.
  • Менять движок, но не пересобрать вспомогательные файлы. При смене движка стоит удалить старые .aux и собрать заново.

Откуда взялись три движка и почему их не свели в один

Исторически TeX Дональда Кнута появился в конце 1970-х, и тогда о юникоде ещё не было речи: движок оперировал 8-битными кодировками, а шрифты хранил в собственном формате METAFONT. Когда мир перешёл на Unicode и OpenType, переписывать оригинальный TeX побайтово было рискованно — на нём держатся миллионы документов и обещание Кнута о неизменности результата. Поэтому сообщество пошло другим путём и сделало несколько движков-наследников: pdfTeX научил классический TeX выводить PDF напрямую (раньше получался промежуточный формат DVI), XeTeX добавил нативный Unicode и доступ к системным шрифтам, а LuaTeX встроил скриптовый язык Lua прямо в наборное ядро. Над каждым из них надстроен формат LaTeX, отсюда и привычные названия pdfLaTeX, XeLaTeX, LuaLaTeX. Важно понимать: это не конкуренты-«версии», а специализированные инструменты, которые сосуществуют десятилетиями именно потому, что у каждого своя ниша и своя совместимость.

Практическое следствие этой истории — выбор движка влияет на то, какие пакеты вам доступны. Старые пакеты для работы со шрифтами (fontenc, inputenc) задумывались под pdfLaTeX и его восьмибитную модель; современные fontspec и polyglossia работают только под XeLaTeX и LuaLaTeX, потому что им нужен прямой доступ к OpenType. Если вы найдёте в интернете пример с \setmainfont{Times New Roman}, а собираете его через pdfLaTeX, получите ошибку — команда из чужой ветки экосистемы. Это самая частая причина «у автора собралось, а у меня нет»: дело не в опечатке, а в несовпадении движка.

Чем именно различается работа со шрифтами

Под капотом различие выглядит так. pdfLaTeX подбирает глиф из заранее заготовленных шрифтовых карт (.tfm, .pfb): он знает метрики каждого символа из таблицы и не «видит» сам контур буквы, поэтому не может подхватить произвольный шрифт, установленный в системе. XeLaTeX и LuaLaTeX, наоборот, отдают раскладку текста библиотеке шейпинга (в современном LuaLaTeX это HarfBuzz, тот же движок, что в браузерах), и она уже сама разбирается с лигатурами, кернингом и сложными письменностями. Именно поэтому арабская вязь, индийские письменности или включение цветной иконки прямо в текст без проблем работают в XeLaTeX/LuaLaTeX и почти невозможны в чистом pdfLaTeX.

Есть и обратная сторона: за гибкость платят скоростью. pdfLaTeX обычно собирает документ заметно быстрее, потому что работает с готовыми метриками и не обращается к тяжёлым шрифтовым библиотекам. LuaLaTeX — самый медленный из трёх, особенно на первом запуске, когда он строит кэш шрифтов; зато он же даёт максимум контроля. Для длинной диссертации с десятками пересборок эта разница в секундах накапливается, и многие выбирают XeLaTeX как компромисс между удобством Unicode и приемлемой скоростью.

Итоги

  • Вы пишете на LaTeX, а собирает PDF конкретный движок.
  • pdfLaTeX — классика; XeLaTeX/LuaLaTeX — Unicode и системные шрифты (лучше для русского).
  • Запуск — это команда вида xelatex файл.tex.
Проверьте себя
1. Что такое «движок» в контексте LaTeX?
AГрафический редактор формул
BПрограмма, которая читает .tex и собирает PDF (pdfLaTeX, XeLaTeX, LuaLaTeX)
CОблачное хранилище для документов
DШрифт по умолчанию
2. Какой движок удобнее для русского текста и системных шрифтов?
AТолько pdfLaTeX
BXeLaTeX или LuaLaTeX — они нативно работают с Unicode и шрифтами ОС
CЛюбой, разницы нет
DНикакой не подходит для кириллицы
3. Чем особенен LuaLaTeX по сравнению с XeLaTeX?
AНе поддерживает Unicode
BВ него встроен язык Lua для скриптовой автоматизации вёрстки
CОн не умеет делать PDF
DОн работает только в Overleaf