Real-Time LuaTeX: Как перекомпилировать большие документы за 1 мс
Представьте: вы работаете над диссертацией на 500 страниц или технической документацией на 1000 страниц. Вносите правку — и ждёте 10–30 секунд, пока компилятор пересоберёт документ. А если бы это занимало 1 миллисекунду? Звучит как фантастика, но команда разработчиков из TUG (TeX Users Group) представила проект Real-Time LuaTeX, который делает именно это.
На конференции TUG 2026 в Лондоне был опубликован препринт статьи под названием «Real-Time LuaTeX: Recompiling Large Documents in 1ms». В материале описывается подход, позволяющий перекомпилировать большие LaTeX-документы практически мгновенно — за 1 миллисекунду. Это не просто оптимизация существующих алгоритмов, а принципиально новый взгляд на процесс компиляции.
Проблема: почему LaTeX компилируется так долго?
Традиционные компиляторы TeX (pdfTeX, XeTeX, LuaTeX) обрабатывают документ целиком: от начала до конца, разбирая каждую команду, подгружая пакеты, вычисляя разбивку на страницы и генерируя PDF. Даже при малейшем изменении — исправлении опечатки или смене шрифта — приходится повторять весь процесс. Это особенно болезненно для больших документов с множеством перекрёстных ссылок, библиографией и сложной вёрсткой.
Авторы статьи отмечают, что типичное время компиляции для документов объёмом 300–500 страниц составляет от 5 до 30 секунд. В некоторых случаях (сложные математические формулы, много графики) — до нескольких минут. Это не только замедляет работу, но и мешает итеративному редактированию: автор не может быстро увидеть результат правки.
Решение: инкрементальная компиляция в LuaTeX
Ключевая идея Real-Time LuaTeX — инкрементальная компиляция. Вместо того чтобы пересобирать весь документ, система отслеживает изменения и перекомпилирует только те части, которые были затронуты.
Вот как это работает на практике:
1. Мониторинг изменений — LuaTeX следит за файловой системой (inotify на Linux, kqueue на macOS, ReadDirectoryChangesW на Windows). Как только файл документа изменяется, запускается процесс перекомпиляции.
2. Разбиение на блоки — документ разбивается на логические блоки (главы, разделы, абзацы). Для каждого блока хранится кэш — результат предыдущей компиляции.
3. Выборочная перекомпиляция — при изменении блока перекомпилируется только он. Ссылки на другие блоки (например, перекрёстные ссылки) обновляются через специальную таблицу соответствий.
4. Быстрая сборка PDF — новый PDF генерируется не с нуля, а путём замены изменённых страниц в уже существующем PDF-файле.
Авторы утверждают, что для документа объёмом 1000 страниц время компиляции после правки одного абзаца составляет менее 1 миллисекунды. Это достигается за счёт того, что 99.9% работы уже сделано на предыдущих шагах.
Технические детали: как это реализовано
В статье подробно описываются технические аспекты реализации. Основные компоненты:
- Lua-скрипты — LuaTeX изначально поддерживает Lua как встроенный язык. Разработчики написали набор скриптов, которые управляют кэшированием и инкрементальной компиляцией.
- Хеширование блоков — каждый блок документа хешируется (SHA-256). Если хеш не изменился, блок не перекомпилируется.
- Таблица ссылок — специальная структура данных, которая хранит соответствие между метками (label) и номерами страниц/разделов. При изменении блока обновляется только часть таблицы.
- Асинхронная запись PDF — новый PDF записывается в отдельный буфер, а затем атомарно заменяет старый файл. Это предотвращает конфликты при одновременном чтении и записи.
Для тестирования использовался документ объёмом 1200 страниц с 200 изображениями и 500 перекрёстными ссылками. Среднее время полной компиляции — 28 секунд. Среднее время инкрементальной компиляции — 0.8 миллисекунды. Результаты были представлены на конференции TUG 2026 Источник.
Сравнение с традиционными подходами
| Параметр | Традиционный LuaTeX | Real-Time LuaTeX |
|---|---|---|
| Время полной компиляции (1000 стр.) | 25–35 секунд | 25–35 секунд |
| Время компиляции после правки (1 абзац) | 25–35 секунд | <1 мс |
| Поддержка перекрёстных ссылок | Да | Да (автоматически) |
| Использование памяти | 100–200 МБ | 150–300 МБ (из-за кэша) |
| Совместимость с пакетами | Полная | Требует адаптации для некоторых пакетов |
Основное ограничение — не все пакеты LaTeX поддерживают инкрементальную компиляцию. Например, пакеты, которые изменяют глобальные настройки (geometry, hyperref), требуют полной перекомпиляции. Однако для большинства повседневных задач (текст, формулы, таблицы) технология работает без проблем.
Практические кейсы: где это пригодится
Real-Time LuaTeX — не просто академическая игрушка. Вот несколько реальных сценариев, где технология может существенно ускорить работу:
Написание диссертации или научной статьи
Автор вносит правки в главу, и PDF обновляется мгновенно. Не нужно ждать 10–20 секунд после каждого изменения. Это особенно важно при работе с большими объёмами текста, когда каждая секунда ожидания отвлекает.
Техническая документация
Многие компании (например, в авиастроении или разработке ПО) используют LaTeX для генерации документации. Real-Time LuaTeX позволяет редакторам и инженерам видеть изменения в реальном времени, что ускоряет процесс рецензирования.
Образовательные проекты
Преподаватели, которые готовят учебные материалы на LaTeX, могут мгновенно проверять, как выглядит формула или таблица после правки. Это снижает порог входа для студентов, которые только осваивают LaTeX.
Автоматизация CI/CD для документов
В некоторых компаниях LaTeX-документы включают в конвейер непрерывной интеграции. Инкрементальная компиляция сокращает время сборки с минут до секунд, что особенно важно при частых коммитах.
Как это связано с современными инструментами
Если вы используете LaTeX в связке с другими сервисами, стоит обратить внимание на интеграции. Например, многие системы управления проектами (Jira, Trello) и редакторы (VS Code, TeXstudio) поддерживают плагины для LuaTeX. Real-Time LuaTeX может быть интегрирован через API, что позволяет автоматически обновлять PDF при изменении исходного кода. ASI Biont поддерживает подключение к LuaTeX через API — подробнее на asibiont.com/courses.
Ограничения и перспективы
Real-Time LuaTeX — это не серебряная пуля. У технологии есть несколько ограничений:
- Не все пакеты поддерживаются — пакеты, которые изменяют глобальные параметры (например, geometry), требуют полной перекомпиляции.
- Увеличенное потребление памяти — кэш блоков и таблица ссылок занимают дополнительную память (в тестах — до 300 МБ для документа на 1200 страниц).
- Сложность отладки — при ошибке в LaTeX-коде инкрементальная компиляция может давать некорректные результаты. Разработчики рекомендуют периодически выполнять полную компиляцию для проверки.
Тем не менее, команда TUG продолжает работу над проектом. В планах — поддержка ещё большего количества пакетов, оптимизация использования памяти и создание графического интерфейса для настройки.
Заключение
Real-Time LuaTeX — это шаг к тому, чтобы LaTeX стал таким же отзывчивым, как современные WYSIWYG-редакторы. Возможность перекомпилировать большие документы за 1 миллисекунду меняет сам подход к написанию текстов: вы больше не ждёте компилятор, а работаете в режиме реального времени.
Для авторов научных работ, технических писателей и всех, кто работает с большими LaTeX-документами, эта технология может стать настоящим прорывом. Рекомендую ознакомиться с полным текстом статьи на сайте TUG Источник.
Если вы используете LaTeX в профессиональной деятельности, попробуйте Real-Time LuaTeX уже сегодня — это может сэкономить часы ожидания в долгосрочной перспективе.
Комментарии