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 | русский/многоязычные тексты, свои шрифты |
LuaLaTeX | Unicode + встроенный язык 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.