LuaTeX

LuaTeX — программируемый движок набора TeX для создания PDF из файлов разметки, работы с Unicode, системными OpenType-шрифтами и встроенными сценариями Lua. Он запускается из командной строки или через редактор, входящий в TeX-дистрибуцию, поэтому подходит для книг, научных статей, многоязычных документов и автоматизированной верстки, но не заменяет визуальный редактор существующих PDF.

Программа относится не к обычным просмотрщикам и редакторам PDF, а к компиляторам документов. Пользователь пишет текст и команды в файле с расширением .tex, выбирает формат Plain TeX, LuaLaTeX или совместимую макросистему, после чего движок рассчитывает переносы, строки, страницы, шрифты, математические формулы, ссылки и графические объекты. Результатом обычно становится новый PDF вместе с журналом сборки и вспомогательными файлами.

Актуальная ветвь поставляется в составе TeX Live 2026; для нее используется версия движка 1.24.0, а формат LuaLaTeX в современных сборках обычно запускается поверх варианта LuaHBTeX с HarfBuzz. Сам LuaTeX не является облачным сервисом: для штатной работы требуется локальная TeX-система, набор макропакетов и шрифтов. На Windows удобнее устанавливать TeX Live сетевым установщиком, на macOS — TeX Live или MacTeX, а на Linux — TeX Live либо пакеты дистрибутива.

Скачать LuaTeX

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
LuaTeX
Оценка 8.5
  • Нет графического редактора
  • Нужна TeX-дистрибуция
  • Сборка медленнее pdfTeX
Скачать LuaTeX
Загрузка начнётся после нажатия

Что такое LuaTeX и какую задачу он решает

LuaTeX — это исполняемый движок семейства TeX, развивающий идеи pdfTeX, e-TeX, Omega и Aleph и добавляющий к ним встроенный интерпретатор Lua. Его основная единица работы — не открытый в окне PDF, а поток токенов, макрокоманд, символов и узлов, из которых затем строятся абзацы и страницы. Программа особенно полезна там, где документ должен собираться повторяемо из текста, формул, таблиц, библиографии и данных. Изменения в исходнике можно провести через систему контроля версий, проверить автоматическими тестами и заново получить весь выпуск без ручного перемещения объектов.

Название движка часто используют как общее обозначение сразу нескольких режимов, хотя между ними есть важная разница. Команда luatex запускает ядро с минимальным набором возможностей TeX и выбранным форматом; lualatex загружает формат LaTeX и его экосистему классов и пакетов; texlua использует тот же встроенный Lua как самостоятельный интерпретатор для служебных сценариев. В актуальных TeX Live команда lualatex обычно связана с LuaHBTeX, то есть с вариантом, в который интегрирован HarfBuzz для формирования сложных письменностей. Поэтому строка версии в журнале может начинаться с LuaHBTeX, хотя пользователь сознательно выбрал LuaLaTeX.

LuaTeX не предназначен для исправления пары слов в чужом созданном PDF, перестановки страниц мышью или заполнения интерактивной формы. Такие операции относятся к PDF-редакторам. Движок создает документ заново по правилам верстки, а при необходимости дает макропакетам и собственному Lua-коду низкоуровневый доступ к шрифтам, переносам, спискам узлов, объектам PDF и поиску файлов. Это делает его не самым простым входом в работу с PDF, но одним из наиболее гибких инструментов для программируемого издательского конвейера.

Реальный вывод команды LuaTeX с номером версии

Разработчики, лицензия и место в экосистеме TeX

Проект создавался небольшой командой, в которую входят Ханс Хаген, Хартмут Хенкель, Тако Хукватер и Луиджи Скарсо. В кодовой базе объединены наработки классического TeX Дональда Кнута, расширений e-TeX, многонаправленного набора Omega и Aleph, PDF-механизмов pdfTeX, библиотеки поиска Kpathsea, языка Lua и MetaPost. Такое происхождение объясняет одновременно высокую совместимость с традиционными документами и наличие интерфейсов, которых нет у старых движков.

LuaTeX распространяется как свободное программное обеспечение по GNU General Public License версии 2 или более новой. Пользователь может изучать и собирать код, однако обычная установка из репозитория TeX Live предпочтительнее самостоятельной компиляции: движок зависит от общей инфраструктуры Web2C, таблиц форматов, дерева texmf, библиотек и согласованных макропакетов. Официальная страница проекта прямо ориентирует поддержку на ежегодные выпуски TeX Live и промежуточные исправления, а не на произвольные снимки репозитория.

В TeX Live движок присутствует как пакет luatex и сопровождается форматами, шрифтами, документацией, Kpathsea и менеджером tlmgr. В MiKTeX аналогичный компонент устанавливается через собственный менеджер пакетов, а MacTeX фактически является подготовленной для macOS поставкой TeX Live с графическими программами. Эта модель важна для скачивания: один файл luatex без окружения редко дает полноценную пользовательскую систему, поэтому основной кандидат установки — официальный установщик TeX Live, который затем загружает выбранную схему и LuaTeX для нужной платформы.

Почему у программы нет обычного графического окна

Интерфейс LuaTeX — командная строка, журнал выполнения и набор файлов проекта. Движок читает параметры запуска, открывает формат, обрабатывает .tex и сообщает о найденных шрифтах, классах, пакетах, страницах, предупреждениях и ошибках. При интерактивном режиме он может остановиться на ошибке и ждать команды пользователя; при автоматической сборке чаще выбирают nonstopmode или batchmode, чтобы процесс завершился с кодом возврата и оставил подробный .log для диагностики.

Редактировать текст обычно удобнее в TeXworks, TeXstudio, Visual Studio Code с расширением LaTeX Workshop, Emacs с AUCTeX, Vim/Neovim или другом редакторе. Эти программы подсвечивают синтаксис, запускают lualatex и показывают PDF, но не являются частью ядра LuaTeX. Параметры меню и кнопок зависят от редактора, поэтому корректное универсальное описание работы должно опираться на команду, журнал и файлы, а не на вымышленную панель инструментов движка.

Консольная модель дает преимущества на сервере и в непрерывной интеграции. Сборку можно выполнить без рабочего стола, запускать из Makefile, latexmk, arara, скрипта Python или системы публикации. Тот же проект компилируется локально и на сборочном агенте при совпадении версии TeX Live, пакетов и шрифтов. Обратная сторона — новичку приходится понимать структуру каталога, читать сообщения журнала и отличать ошибку движка от ошибки макропакета.

Параметры командной строки LuaTeX

LuaTeX, LuaLaTeX, LuaHBTeX и LuaMetaTeX: не одно и то же

LuaTeX — ядро, которое реализует примитивы TeX, Lua API, работу с узлами, шрифтами и выводом. LuaLaTeX — формат LaTeX, предварительно собранный для запуска на этом ядре. Когда пользователь пишет documentclass, usepackage, begin document и другие привычные команды LaTeX, он работает прежде всего с LuaLaTeX. Запуск чистого luatex уместен для Plain TeX, специализированных форматов и низкоуровневых тестов; простая замена lualatex на luatex в обычной статье приведет к неопределенным командам.

LuaHBTeX — вариант движка с библиотекой HarfBuzz. Она выполняет шейпинг, то есть выбирает контекстные формы глифов, лигатуры и позиции знаков для сложных письменностей. В современных TeX Live форматы LuaLaTeX связаны именно с LuaHBTeX, поэтому пользователь получает поддержку HarfBuzz без отдельного выбора другой команды в типичном сценарии. При отладке низкоуровневого кода все же нужно смотреть первую строку .log: там записано точное имя движка, версия и формат.

LuaMetaTeX — отдельный потомок LuaTeX, который развивается вокруг ConTeXt и переносит еще больше функций из C-ядра в Lua. Он не является новой версией LuaLaTeX и не предназначен для прямой замены в произвольном LaTeX-проекте. ConTeXt MkIV исторически использовал LuaTeX, а современный ConTeXt LMTX ориентирован на LuaMetaTeX. При переносе документов важно сначала определить макросистему: одинаковое слово Lua в названии не означает совместимость пакетов и примитивов.

Проверка HarfBuzz и поиск OpenType-шрифта в LuaHBTeX

Архитектура обработки документа

Сборка начинается с чтения формата — бинарного снимка подготовленных макроопределений и таблиц. Затем входной поток UTF-8 превращается в символы и токены с категориями, макросы раскрываются, а команды создают горизонтальные и вертикальные списки узлов. В списках находятся глифы, клей, кернинг, штрафы переноса, правила, вставки, направления и служебные объекты. Алгоритм разбивает абзац на строки, формирует страницы, выполняет вывод и записывает PDF либо промежуточный DVI-подобный результат.

Lua API встроен на нескольких уровнях. Сценарий может читать параметры движка, регистры и токены, создавать или обходить узлы, управлять шрифтами, участвовать в переносах, перехватывать открытие файлов, выполнять код во время корабельной отправки страницы и создавать дополнительные PDF-объекты. Большая часть реального пользовательского удобства приходит через пакеты, которые используют эти интерфейсы и скрывают низкоуровневые детали.

Открытость не означает, что каждую функцию следует переопределять. Ошибка в callback может нарушить внутренние инварианты списков, потерять атрибуты, создать цикл ссылок или вызвать трудно воспроизводимое падение. Для обычной статьи разумно оставаться на уровне LaTeX, fontspec, babel или polyglossia, unicode-math и проверенных расширений. Прямой node API оправдан в типографических экспериментах, генераторах, лингвистических системах и пакетах, где стандартных хуков недостаточно.

Unicode и кодировка входных файлов

LuaTeX использует Unicode и ожидает UTF-8 как основную кодировку входа. Русский, греческий, арабский, иврит, знаки IPA, математические символы и многие другие письменности можно хранить непосредственно в .tex без восьмибитных таблиц ввода. Это упрощает обмен проектом, поиск по тексту и работу с внешними данными. Однако наличие кодовой точки в файле еще не гарантирует отображение: выбранный шрифт должен содержать соответствующий глиф, а для сложного письма нужен корректный шейпинг и языковые настройки.

Старые проекты иногда подключают inputenc с нестандартной кодировкой или содержат байты Windows-1251. Перед переносом их лучше явно перекодировать в UTF-8 и убрать предположения о восьмибитных слотах. Пакеты, которые вручную подменяют активные символы, могут конфликтовать с современными механизмами. Диагностика начинается с проверки кодировки редактора, первой ошибки в .log и минимального файла, где остается один проблемный фрагмент.

Unicode влияет и на имена файлов, закладки PDF, метаданные и сортировку, но поведение этих частей определяется не только движком. Библиографический процессор, индексатор, оболочка и файловая система могут иметь собственные ограничения. Поэтому многоязычный проект тестируют целиком: компиляцию, biber или другую обработку библиографии, создание индекса, копирование текста из PDF и отображение закладок.

Системные OpenType- и TrueType-шрифты

Главное практическое преимущество LuaLaTeX перед pdfLaTeX — удобная работа с современными OpenType и TrueType. Пакет fontspec позволяет выбирать семейство по имени, задавать начертания, цифры, лигатуры, стилистические наборы, языковые и скриптовые признаки. Пакет luaotfload связывает LaTeX с механизмами загрузки шрифтов LuaTeX и поддерживает базу имен. В результате документ может использовать корпоративную гарнитуру, системный шрифт или файл из каталога проекта без конвертации в традиционные метрики.

Для воспроизводимости надежнее хранить разрешенные лицензией файлы шрифтов рядом с проектом и обращаться к ним по пути, а не полагаться на случайный набор системы. Имена гарнитур отличаются между выпусками и операционными системами, а один шрифт может иметь несколько внутренних названий. Если fontspec сообщает, что шрифт не найден, проверяют написание, доступность файла, базу luaotfload и то, что сборка действительно идет LuaLaTeX, а не pdfLaTeX.

Современный шрифт содержит таблицы OpenType, но не все функции включаются автоматически. Для латиницы могут использоваться стандартные лигатуры и кернинг, для арабского — контекстные формы и позиционирование знаков, для индийских письменностей — сложные перестановки. LuaHBTeX с HarfBuzz улучшает обработку таких сценариев, однако язык, script и feature должны быть согласованы с макропакетом. В PDF также важно проверить встраивание, подмножество, ToUnicode и возможность копирования текста.

Успешная сборка документа со шрифтом fontspec

Математический набор и OpenType Math

LuaLaTeX поддерживает Unicode-математику через пакет unicode-math и гарнитуры с таблицей OpenType Math. Пользователь может выбрать единый математический шрифт, использовать символы Unicode в формулах и настраивать диапазоны алфавитов. Движок предоставляет расширенный набор математических параметров и узлов, благодаря чему пакеты управляют размерами, вариантами знаков, акцентами, растяжимыми конструкциями, кернингом и позиционированием скриптов.

Переход со старого проекта требует проверки. Пакеты, рассчитанные на классические математические шрифты Type 1 и NFSS, не всегда совместимы с unicode-math. Команды выбора жирного, каллиграфического или прямого алфавита могут давать иной результат, а визуальные метрики другой гарнитуры меняют переносы и высоту строк. Лучше сначала собрать контрольные страницы с формулами, сравнить символы и только затем переносить большой документ.

Отдельное преимущество — возможность программного вмешательства в математические списки и параметры. Но такая настройка относится к разработке макропакетов: неправильное изменение классов атомов или размеров влияет на интервалы во всем документе. Для пользователя безопаснее опираться на unicode-math, mathtools, amsmath и хорошо документированные команды. Журнал помогает увидеть загруженную гарнитуру и предупреждения о недостающих символах.

Реальная сборка формулы с unicode-math

Встроенный Lua: от простой вставки до отдельного сценария

Команда directlua передает текст встроенному интерпретатору Lua во время обработки TeX. В простейшем случае код вычисляет значение и печатает его обратно через tex.print. Более серьезные сценарии читают CSV или JSON, проверяют условия, строят таблицы, нормализуют данные и создают повторяющиеся разделы. Поскольку вычисление выполняется при компиляции, итог остается частью единого воспроизводимого процесса.

Кавычки, обратные косые черты и категории символов TeX могут искажать Lua-код внутри аргумента. Поэтому большие фрагменты обычно выносят в .lua и подключают через require или dofile, а взаимодействие оформляют через небольшой стабильный интерфейс. Это облегчает тестирование обычным Lua-инструментарием и позволяет редактору правильно подсвечивать язык. Для передачи произвольного текста применяют специальные средства экранирования или токеновые библиотеки вместо длинной строки directlua.

Команда texlua запускает Lua-интерпретатор из поставки TeX Live без обработки документа. Она полезна для утилит, которым нужен поиск Kpathsea и библиотеки окружения TeX. Но texlua не равен системному lua: версия языка и доступные модули зависят от сборки LuaTeX. Сценарий, использующий внешний бинарный модуль, может не загрузиться из-за несовпадения ABI. Переносимый код предпочитает стандартные средства и проверяет наличие необязательных библиотек.

Запуск Lua-сценария командой texlua

Callbacks: точки расширения движка

Callback — зарегистрированная Lua-функция, которую движок вызывает в определенный момент. Есть точки для поиска и чтения файлов, обработки строк, переноса слов, формирования лигатур и кернинга, работы со списком перед разбиением абзаца, упаковки коробок, подготовки страницы и записи результата. Набор и сигнатуры нужно сверять с руководством конкретной версии: сайт проекта подчеркивает, что двоичный файл является окончательным ответом о фактическом поведении.

В экосистеме LaTeX несколько пакетов могут претендовать на одну точку. Прямая регистрация без диспетчера способна заменить чужую функцию. Поэтому разработчики используют luatexbase и совместимые механизмы управления, где callbacks получают имена и порядок. При отладке проверяют, кто зарегистрировал обработчик, возвращает ли он ожидаемый тип и сохраняет ли список узлов, когда не требуется изменение.

Callbacks открывают задачи, трудные для классического TeX: контекстный анализ абзаца, нестандартная расстановка знаков, автоматическая разметка глифов, контроль висячих строк, сбор статистики, подмена виртуальных ресурсов. Цена — зависимость от внутреннего API и версии. Код для публичного пакета должен иметь тесты на нескольких выпусках TeX Live и корректно отключаться, если нужная возможность отсутствует.

Узлы, атрибуты и программируемая типографика

После раскрытия макросов значительная часть документа представлена связанными списками узлов. Глифовый узел содержит шрифт, код символа и геометрию; glue задает естественную ширину, растяжение и сжатие; kern создает фиксированный промежуток; penalty влияет на места разрыва. Есть hlist и vlist для коробок, rule для линий, disc для вариантов переноса и специальные узлы для направлений, локальных абзацев и backend-операций.

Lua-код может обходить список, читать и менять поля, вставлять новые элементы и назначать атрибуты. Атрибут — числовая метка, которая проходит вместе с узлом и помогает пакету помнить семантику после раскрытия макросов. Например, можно отметить фрагменты языка, цветовую роль или объект индекса, а позже обработать их на этапе упаковки. Однако копирование и удаление узлов требует управления памятью и ссылками; оставленная неправильная связь способна проявиться далеко от места ошибки.

Для производительности существуют обычный интерфейс node и более прямой интерфейс direct node. Второй уменьшает накладные расходы, но требует большей дисциплины. В пользовательском документе почти никогда не нужно вручную редактировать списки: это слой авторов шрифтовых загрузчиков, языковых модулей и сложных пакетов. Понимание модели все же помогает читать журналы и объясняет, почему LuaTeX гибче, но иногда медленнее pdfTeX.

Компоненты и библиотеки реальной сборки LuaTeX

Разбиение абзацев, переносы и языки

Классический алгоритм TeX ищет оптимальный набор разрывов сразу для абзаца, учитывая ширину строк, растяжение пробелов, штрафы и переносы. LuaTeX сохраняет этот подход, но открывает больше этапов для Lua. Макропакет может загружать шаблоны переносов динамически, менять языковые параметры, анализировать список перед разбиением и даже реализовать альтернативный построитель абзаца.

В обычном документе языки настраивают через babel или polyglossia. Они выбирают правила переносов, подписи, даты, направление и дополнительные типографические соглашения. Для русского текста важно не только включить русский язык, но и выбрать шрифт с кириллицей. Для смешанных фрагментов язык следует переключать явно, иначе переносы будут рассчитываться по неправильным шаблонам.

Предупреждения overfull hbox и underfull hbox не означают поломку PDF. Первое сообщает, что содержимое вышло за ожидаемую ширину, второе — что строку пришлось растянуть с плохим качеством. Исправление начинается с текста, ширины, переносов и неразрывных конструкций, а не с глобального увеличения tolerances. Lua-код может автоматизировать контроль, но не заменяет редакторское решение для трудного абзаца.

Многонаправленный текст и сложные письменности

В LuaTeX вошли идеи Omega и Aleph для направлений набора. Движок умеет представлять направление в узлах и взаимодействовать с макропакетами, которые организуют текст справа налево, смешанные сегменты и вертикальные режимы. Для арабского и иврита нужно сочетание языкового пакета, шрифта, направления и шейпинга. Одной смены гарнитуры недостаточно.

LuaHBTeX использует HarfBuzz, что особенно важно для скриптов с контекстными формами, перестановкой и позиционированием диакритики. Но HarfBuzz решает уровень глифов, а не всю верстку: порядок абзаца, номера, знаки пунктуации, поля, колонтитулы и подписи задаются LaTeX-пакетами. При смешении левого и правого направления тестируют формулы, ссылки, списки, таблицы и извлечение текста из PDF.

Редкие письменности требуют внимательной проверки доступности глифов. Сообщение Missing character означает, что выбранный шрифт не содержит знак или загрузчик не выбрал ожидаемое семейство. Автоматическая подстановка может скрыть проблему, но изменить стиль и метрики. Для издательского проекта лучше заранее определить набор гарнитур и тестовую страницу со всеми письменностями.

PDF-вывод, объекты и метаданные

В стандартном режиме LuaTeX формирует PDF непосредственно, без обязательного промежуточного DVI и отдельного преобразователя. Backend отвечает за страницы, содержимое, ресурсы, шрифты, изображения, аннотации, назначения и служебные объекты. На уровне LaTeX большинство операций выполняют hyperref и новый слой управления PDF, который постепенно унифицирует работу разных движков. Низкоуровневые примитивы доступны, но их прямое использование делает проект чувствительным к изменениям.

Версия PDF, сжатие, идентификатор документа, дата и некоторые свойства можно контролировать. Для долговременного хранения или печати часто нужен стандарт PDF/A, PDF/X либо требования конкретной типографии; одного переключателя движка недостаточно. Следует проверить цветовые профили, встраивание шрифтов, прозрачность, структуру, метаданные и допустимые объекты специализированным валидатором.

LuaTeX способен создавать ссылки и аннотации, но не превращается из-за этого в интерактивный PDF-редактор. Формы и мультимедиа зависят от пакетов и поддержки просмотрщика. Современная работа над тегированным PDF активно использует гибкость LuaTeX, однако доступность документа определяется семантической разметкой, порядком чтения, альтернативными описаниями и корректностью пакетов, а не только названием движка.

Изображения, включение PDF и MetaPost

Документ может включать растровые изображения и страницы PDF через стандартные LaTeX-пакеты. LuaTeX имеет библиотеку img для идентификации и размещения графических ресурсов, а backend управляет масштабом, объектами и повторным использованием. Для надежной сборки указывают относительные пути, избегают неоднозначных файлов с одинаковым именем и проверяют цветовую модель и разрешение до компиляции.

MPlib встраивает MetaPost как библиотеку. Макросистемы могут строить векторную графику во время одной сборки, передавать параметры из TeX и сразу включать результат без отдельного внешнего процесса. Это удобно для диаграмм, геометрических построений, орнаментов и программной инфографики. Время обработки растет с числом сложных рисунков, поэтому неизменяемые элементы иногда кэшируют.

При включении чужого PDF возможны ограничения версии, шифрования, поврежденной структуры и особенностей прозрачности. Ошибка чтения страницы не всегда означает дефект LuaTeX: файл мог быть создан нестандартным генератором. Практический порядок — открыть PDF проверенным просмотрщиком, нормализовать его надежным инструментом, сократить пример до одной страницы и проверить журнальное сообщение, а не многократно менять макросы вслепую.

Установка LuaTeX на Windows через TeX Live

Официальный сетевой установщик TeX Live для Windows загружает небольшую программу, затем выбранные коллекции из зеркала CTAN. Windows 10 и более новые версии поддерживаются текущим TeX Live, причем поставляются 64-разрядные исполняемые файлы. На обычном компьютере можно оставить графический режим, выбрать схему и каталог, а затем дождаться загрузки пакетов и построения форматов. Полная схема занимает несколько гигабайт; минимальная уменьшает размер, но потребует добавлять пакеты позже.

После установки каталог bin должен быть доступен через PATH. Проверка выполняется командами luatex --version и lualatex --version. Если система находит старую MiKTeX или прошлый TeX Live, команда where lualatex покажет порядок путей. Одновременное существование нескольких поставок допустимо, но редактор и терминал должны запускать один и тот же экземпляр, иначе пакет установлен в одном дереве, а сборка ищет его в другом.

TeX Live Manager устанавливает и обновляет пакеты. Для стабильного проекта годовой выпуск часто фиксируют: текущие обновления внутри одного выпуска применяют после резервной проверки, а переход на следующий год тестируют отдельно. Принудительное смешивание репозитория другого года с установленным tlmgr не поддерживается. Если нужен полностью повторяемый конвейер, сохраняют профиль установки, список пакетов и используемые шрифты.

Поиск формата, пакета и руководства через Kpathsea

Установка на Linux, macOS и других системах

На Linux есть два основных пути. Пакеты дистрибутива удобно обновляются вместе с системой и интегрированы с ее каталогами, но могут отставать от текущего TeX Live. Официальный install-tl ставит независимое дерево, дает свежий годовой выпуск и собственный tlmgr. Не следует одновременно обновлять один и тот же каталог средствами apt, dnf, pacman и tlmgr: менеджеры имеют разные базы состояния.

На macOS полная поставка MacTeX включает TeX Live и приложения, а BasicTeX дает меньший набор. Актуальный MacTeX 2026 поддерживает современные версии macOS на Intel и Arm. Пользователь, которому нужен только командный конвейер, может установить TeX Live сетевым способом. Важно, чтобы терминал и графический редактор использовали одинаковый PATH, особенно после наличия нескольких годовых каталогов.

TeX Live публикует двоичные платформы для ряда Unix-систем, GNU/Linux на x86_64 и ARM, Windows, macOS и других вариантов; также код можно собирать самостоятельно. Конкретный список меняется с годовым выпуском. Контейнеры и серверы часто используют scheme-small или тщательно выбранные коллекции. Минимизация полезна для размера образа, но каждое отсутствующее style-файл или шрифт проявится только на реальном проекте, поэтому зависимости фиксируют явно.

Первый запуск и минимальный документ

Для первой проверки создают файл test.tex в UTF-8. Минимальный LuaLaTeX-документ содержит класс article, начало и конец document. Подключение fontspec подтверждает работу современного шрифтового пути. Команда lualatex test.tex должна создать test.pdf, test.log и test.aux. Повторный запуск нужен для ссылок, оглавления и нумерации, когда сведения записываются во вспомогательный файл.

\documentclass{article}
\usepackage{fontspec}
\setmainfont{DejaVu Serif}
\begin{document}
Проверка LuaLaTeX: \directlua{tex.print(6*7)}.
\end{document}

lualatex -interaction=nonstopmode test.tex

В первой строке .log записаны точный движок, версия TeX Live и имя формата. Далее видны загруженные классы, пакеты и шрифты. Финальная строка сообщает число страниц и размер PDF. Даже при созданном файле сборка может завершиться с предупреждениями, поэтому автоматический процесс анализирует код возврата и журнал, а не только наличие test.pdf.

Команда luatex test.tex не является равнозначной заменой: без формата LaTeX команды documentclass и begin будут неизвестны. Для Plain TeX создают другой исходник или явно указывают формат. Это самая частая путаница в названиях: LuaTeX обозначает ядро, а LuaLaTeX — готовую среду для большинства пользовательских документов.

Параметры командной строки, которые реально применяются

Ключ interaction задает реакцию на ошибки. errorstopmode останавливается и принимает интерактивные команды, scrollmode продолжает после части ошибок, nonstopmode старается пройти весь документ, batchmode уменьшает вывод. Для непрерывной интеграции обычно используют nonstopmode вместе с halt-on-error, чтобы получить полный контекст до первой фатальной ошибки и ненулевой статус процесса.

Параметр output-directory направляет создаваемые файлы в отдельный каталог, jobname меняет базовое имя результата, synctex включает синхронизацию между строкой исходника и местом в PDF, recorder записывает список прочитанных и созданных файлов. draftmode может пропустить запись PDF при некоторых проверках. Ключ format выбирает формат, а lua задает стартовый Lua-файл для специальных режимов.

Shell escape разрешает документу запускать внешние программы. Полный режим следует включать только для доверенного проекта; restricted использует ограниченный список. На сервере неизвестный .tex рассматривают как потенциально опасный код, потому что Lua и TeX могут читать доступные файлы, расходовать ресурсы и при разрешениях вызывать процессы. Изоляция, отдельный пользователь, лимиты и контейнер важнее удобного ключа.

Реальный статус ограниченного выполнения внешних команд

Автоматическая сборка с latexmk

latexmk отслеживает зависимости и повторяет нужные проходы LuaLaTeX, библиографии, индекса и других инструментов, пока вспомогательные файлы не стабилизируются. Команда latexmk -lualatex main.tex избавляет от ручного запуска два или три раза. Конфигурацию можно хранить в latexmkrc проекта, задавая выходной каталог, режим ошибок и дополнительные правила.

Автоматизация не отменяет понимание журнала. Если один проход создает постоянно меняющуюся метку времени или пакет переписывает файл нестабильно, latexmk увидит бесконечную необходимость перезапуска. Сообщение о неразрешенных ссылках после первого прохода нормально, но после финального требует проверки метки, порядка включения файлов и удаления поврежденных вспомогательных данных.

Для сборочного сервера полезны флаги, которые прекращают работу при ошибке, и очистка отдельного каталога перед проверкой. Полная очистка каждый раз увеличивает время, потому что теряются кэши и вспомогательные результаты; инкрементальная сборка быстрее, но может скрыть зависимость от старого файла. Надежный процесс сочетает быстрые обычные сборки и периодическую сборку с чистого состояния.

Автоматическая сборка LuaLaTeX через latexmk

Структура проекта и поиск файлов Kpathsea

Kpathsea ищет форматы, классы, пакеты, шрифты и конфигурацию в деревьях texmf. Команда kpsewhich показывает, какой именно файл будет найден. Это незаменимо при конфликте версий: одинаковый package.sty может существовать в системном дереве, локальном texmf и каталоге проекта, причем ближайший файл перекрывает остальные. Редактирование системного экземпляра напрямую плохо переносится и исчезает при обновлении.

Проект удобно делить на main.tex, главы, изображения, библиографию, Lua-модули и локальный каталог стилей. Относительные пути делают сборку переносимой. Имена без пробелов и неоднозначного регистра уменьшают различия между Windows и Unix. Генерируемые .aux, .log, .toc, .out, .fls, .fdb_latexmk и synctex обычно исключают из системы контроля версий, если они не нужны для специального процесса.

Локальный texmf используют для пакетов, которые должны быть доступны нескольким проектам. После добавления файлов в некоторые конфигурации обновляют базу имен, но пользовательское дерево TeX Live часто просматривается напрямую. При ошибке File not found сначала запускают kpsewhich, затем проверяют установленную коллекцию и только потом копируют случайный style-файл рядом с документом. Один файл пакета может зависеть от десятков других.

Типовой процесс для книги или большого отчета

Большой документ разбивают на главы и подключают через input или include. Класс определяет страницы, колонтитулы и структуру; пакеты отвечают за шрифты, языки, таблицы, изображения и библиографию. LuaTeX полезен, когда требуется единая современная гарнитура, сложные письменности, генерация фрагментов из данных или программный контроль типографики. Система контроля версий хранит текст, настройки и небольшие ресурсы.

Перед выпуском выполняют чистую сборку, проверяют список предупреждений, неразрешенные ссылки, отсутствующие символы и переполненные строки. Затем открывают PDF на нескольких характерных страницах: начало главы, таблица, формула, разворот с иллюстрацией, библиография и указатель. Автоматическая проверка может искать фразы Missing character, Undefined control sequence, Label(s) may have changed и multiply defined.

Для нескольких вариантов издания Lua-код и условные макросы помогают выбирать формат бумаги, набор глав, метаданные и данные заказа. Но условия должны быть централизованы, иначе проект превращается в сеть скрытых ветвей. Хорошая практика — отдельный файл конфигурации на вариант и одинаковая команда сборки с параметром, а не ручное комментирование десятков строк.

Документы, формируемые из данных

Lua встроен в тот же процесс, поэтому отчеты можно собирать из таблиц, результатов расчетов и структурированных файлов. Сценарий читает данные, проверяет обязательные поля, сортирует записи и передает безопасно экранированные значения в TeX. Движок затем выполняет переносы, нумерацию и разбиение страниц. Такой подход применяют для каталогов, сертификатов, расписаний, счетов, технических спецификаций и персонализированных выпусков.

Главный риск — смешение данных и команд. Символы обратной косой черты, фигурные скобки, процент, амперсанд и решетка имеют специальный смысл в TeX. Нельзя печатать непроверенную строку через tex.print и считать ее обычным текстом. Нужно выбрать функцию экранирования или создавать токены с безопасными категориями. Если данные считаются недоверенными, сборку запускают в изолированном окружении без shell escape.

Валидацию лучше выполнять до верстки: проверять типы, диапазоны, уникальность идентификаторов, существование изображений и длины полей. Тогда ошибка сообщает номер записи, а не проявляется как переполнение строки на сотой странице. Lua-модуль можно тестировать отдельно, а минимальный .tex использовать как интеграционный тест взаимодействия с макросами.

Доступный и тегированный PDF

Структурный PDF должен содержать логический порядок чтения, теги заголовков, списков, таблиц и формул, языки, альтернативные описания и корректное сопоставление символов. LaTeX-проект развивает автоматическое тегирование, и гибкость LuaTeX особенно полезна для построения структуры на основе внутренних списков. В новейших форматах часть возможностей включается через DocumentMetadata и актуальные пакеты.

Нельзя предполагать, что любой документ после перехода на LuaLaTeX автоматически соответствует PDF/UA. Пакет может создавать неподдерживаемый объект, таблица иметь сложные объединения, рисунок — отсутствующее описание, а математическая формула — экспериментальное представление. Проверка включает специализированный валидатор и чтение с ассистивной технологией, а не только визуальный просмотр.

Версия движка и формата здесь особенно важна: инфраструктура тегирования быстро развивается. В журнале фиксируют LuaHBTeX, выпуск LaTeX и дату формата. Проект, который должен воспроизводиться, собирают в закрепленном окружении, а обновление тестируют на наборе характерных страниц. Старые рекомендации для экспериментальных testphase не переносят механически в новый выпуск.

Безопасность локальной и серверной компиляции

TeX — язык программирования с доступом к файлам, а Lua расширяет возможности. Документ может читать данные, создавать файлы в разрешенных каталогах, долго вычислять и потреблять память. При полном shell escape он способен запускать внешние команды с правами процесса. Поэтому файл, полученный от неизвестного автора, не следует компилировать в основной пользовательской учетной записи с доступом к документам и ключам.

Для сервиса применяют контейнер или изолированную виртуальную среду, отдельного непривилегированного пользователя, ограничение процессорного времени, памяти, размера вывода и числа файлов, запрет сети и полный сброс окружения между заданиями. TeX Live имеет настройки openout и shell escape, но они являются лишь частью защиты. Lua API и особенности файловой системы требуют внешней песочницы.

Зависимости также входят в модель угроз. Случайный пакет, положенный рядом с проектом, перекрывает системный. Сборочный процесс должен принимать только ожидаемые типы, фиксировать контрольные суммы собственных стилей и не загружать код из изменяемого сетевого каталога. Логи могут содержать локальные пути и фрагменты данных, поэтому их публикацию проверяют отдельно.

Производительность и потребление памяти

LuaTeX часто запускается медленнее pdfTeX: нужно инициализировать Lua, загрузчик OpenType, базу шрифтов и дополнительный код. Особенно заметен первый проход после установки или очистки кэша luaotfload. На длинном документе относительная разница может уменьшиться, но сложный Lua-фильтр или сотни шрифтов снова увеличат время. Официальная дорожная карта прямо отмечает цену гибкости по сравнению с родственными движками.

Оптимизация начинается с измерения. Сравнивают время холодной и теплой сборки, количество проходов, загрузку шрифтов, дорогие рисунки и пользовательские callbacks. Нельзя ускорить проект случайным отключением проверок, если затем требуется ручная диагностика. Часто помогает latexmk, разделение неизменных графических этапов, локальный быстрый диск и отказ от повторного чтения больших данных в каждом callback.

Память расходуют списки узлов, шрифтовые таблицы, изображения и Lua-объекты. Удержание ссылок на уже ненужные узлы мешает сборщику мусора, а копирование больших списков увеличивает пик. Разработчик пакета должен освобождать структуры и избегать глобальных таблиц без необходимости. Обычный пользователь прежде всего сокращает тестовый пример и выясняет, не вызвана ли проблема конкретным пакетом или изображением.

Воспроизводимость PDF

Одинаковый .tex не всегда дает побайтно одинаковый PDF на разных компьютерах. На результат влияют версия движка и формата, пакеты, шрифты, метки времени, порядок файловой системы, библиотека HarfBuzz и настройки локали. Для визуальной воспроизводимости достаточно закрепить окружение и ресурсы; для идентичных байтов дополнительно контролируют даты, идентификаторы и недетерминированные данные.

Практический набор фиксации включает год TeX Live, профиль или контейнер, список пакетов, файлы шрифтов, команду сборки и переменные. В журнале сохраняют строку версии. Обновление выполняют отдельной веткой и сравнивают PDF визуально, текстово и по журналу. Изменение переносов после обновления шрифта может быть корректным, но должно быть осознанным.

Lua-код обязан сортировать наборы, порядок которых не определен, и не включать текущее время без явной необходимости. Внешние данные сохраняют рядом с выпуском или получают по контролируемому идентификатору. Сборка, которая обращается к меняющемуся API, перестает быть воспроизводимой даже при стабильном движке.

Совместимость со старыми документами pdfLaTeX

Многие LaTeX-документы собираются LuaLaTeX после смены движка, но полная прозрачность не гарантируется. Пакеты inputenc и fontenc теряют прежнюю роль, команды выбора шрифта меняются, прямые pdfTeX-примитивы могут быть переименованы или эмулироваться, а восьмибитные предположения ломаются. Начинать следует с минимальной замены шрифтового слоя, а не с одновременного обновления всех пакетов.

Если проект использует только стандартные Computer Modern, формулы и простые рисунки, переход может не дать заметной пользы и увеличить время сборки. LuaLaTeX выбирают ради Unicode, OpenType, сложных письменностей, Lua-автоматизации, современного тегирования или пакета, которому нужен движок. Для стабильного старого документа pdfLaTeX остается разумным вариантом.

Сравнение выполняют на полном наборе страниц. Другие метрики шрифта меняют число строк и страниц, другой перенос — положение рисунков, а новый backend — метаданные. Не следует требовать пиксельного совпадения после сознательной смены гарнитуры. Важнее проверить структуру, нумерацию, ссылки, формулы и типографическое качество.

Диагностика: как читать журнал сборки

Первая значимая ошибка обычно важнее последующих. Undefined control sequence указывает на неизвестную команду: опечатку, отсутствующий пакет, запуск неправильного формата или несовместимую версию. File not found означает проблему поиска или установки. Missing character сообщает об отсутствующем глифе. Emergency stop и Fatal error часто являются следствием предыдущей строки, а не самостоятельной причиной.

При errorstopmode движок показывает строку и приглашение. В автоматической работе интерактивность мешает, поэтому используют nonstopmode и halt-on-error. Журнал содержит раскрытые пути и контекст; терминал может показывать только конец. Для отчета об ошибке нужен минимальный пример, строка версии, команда запуска и полный относящийся фрагмент .log.

Предупреждения сортируют по риску. Неопределенные ссылки и цитаты меняют содержание, отсутствующие символы теряют знаки, переполненные строки портят макет, предупреждения пакетов могут быть информационными. Политика сборки может превращать определенные шаблоны в ошибку. После исправления удаляют только те вспомогательные файлы, которые могли сохраниться в поврежденном состоянии, а не очищают все при каждом предупреждении.

Реальная диагностика неопределенной команды LuaLaTeX

Ошибка: LuaLaTeX или пакет не найден

Сообщение о неизвестной команде lualatex означает, что TeX-дистрибуция не установлена либо ее bin отсутствует в PATH. На Windows проверяют where lualatex, на Unix — command -v lualatex. Если найден старый путь, порядок переменных среды исправляют и перезапускают редактор: графическая программа наследует окружение при старте.

Если не найден .sty, команда kpsewhich package.sty подтверждает видимость. В TeX Live пакет устанавливают через tlmgr, в системной поставке Linux — через менеджер дистрибутива, в MiKTeX — через его консоль. Название пакета в менеджере иногда отличается от имени .sty, поэтому используют поиск базы. Копирование одиночного файла допустимо только для собственного локального стиля с известными зависимостями.

Ошибка формата, например невозможность найти lualatex.fmt, указывает на незавершенное построение форматов, поврежденную установку или смешение деревьев. fmtutil показывает конфигурацию и может пересоздать формат. Сначала проверяют свободное место, права записи, версию репозитория и то, какой fmtutil запущен.

Ошибка: шрифт не найден или отсутствуют символы

fontspec error: font not found проверяют на минимальном документе с одним setmainfont. Имя копируют из системного каталога шрифтов или вместо имени указывают файл. Затем смотрят luaotfload-tool, состояние кэша и права чтения. Если редактор запускает другой TeX Live, его база может отличаться от терминальной.

Missing character означает иной класс проблемы: гарнитура найдена, но конкретного знака нет. Нужно выбрать шрифт с нужным диапазоном, определить запасное семейство через языковой пакет или исправить неожиданный символ. Универсальная подстановка без контроля способна смешать пропорции и толщины. Для математики отдельно проверяют таблицу OpenType Math и наличие нужного глифа.

После обновления шрифта переносы и длины строк могут измениться, даже если название то же. Производитель мог поменять метрики или таблицы OpenType. В критичном выпуске сохраняют конкретный файл и контрольную сумму. Лицензия гарнитуры должна разрешать такое использование и встраивание в PDF.

Ошибка: Lua-код и callbacks

Lua-ошибка сопровождается стеком вызовов и номером строки .lua либо фрагмента directlua. Сначала запускают модуль отдельно через texlua, если он не зависит от состояния TeX. Затем уменьшают входные данные и проверяют типы. Значения nil часто возникают из-за отсутствующего ключа, неверного имени callback или различий API между версиями.

При повреждении списка узлов сообщение может появиться во время упаковки или вывода страницы, далеко от callback. Временно отключают обработчики по одному, проверяют возвращаемое значение и целостность связей next/prev. Нельзя повторно вставлять один и тот же узел в два места без копирования. Атрибуты и свойства сохраняют при необходимости.

Код пакета не должен полагаться на недокументированное поле только потому, что оно есть в текущей сборке. Официальное руководство рекомендует сверять API с бинарником. Для поддержки нескольких TeX Live используют проверку версии и отдельные ветви, но избегают сложной матрицы старых реализаций без тестов.

Ошибка: внешняя команда, shell escape и права

Пакет может требовать внешнюю программу для графики, подсветки кода или преобразования. В restricted mode разрешены только команды из списка; полный shell escape добавляет риск. Сообщение о невозможности запуска проверяют по журналу, наличию бинарника в PATH и кавычкам пути. На Windows особенности пробелов и расширений отличаются от оболочки Unix.

В сборочном сервисе безопаснее заранее установить нужный инструмент и добавить строго определенное правило, чем включать полный режим для любого документа. Входные имена нормализуют, рабочий каталог изолируют, сеть отключают, результат проверяют по типу и размеру. Даже доверенный инструмент может обработать специально сформированный файл с уязвимостью.

Ошибка записи PDF или вспомогательного файла бывает вызвана открытым в программе файлом на Windows, отсутствием прав, слишком длинным путем или закончившимся местом. Меняют выходной каталог, закрывают блокирующее приложение и проверяют доступность. Запуск от администратора скрывает причину и создает файлы с неудобными правами, поэтому не является первым решением.

Форматы вывода и режим DVI

Основной результат LuaTeX — PDF, однако существуют команды dviluatex и dvilualatex для DVI-подобного режима. Он нужен специализированным цепочкам, где дальнейшую обработку выполняет другой драйвер. Не все PDF-специфические пакеты ведут себя одинаково, а современные OpenType-сценарии обычно ориентированы на прямой PDF.

Выбор режима должен исходить из требований типографии или инфраструктуры. Создавать DVI только по привычке нет смысла, если конечная цель — PDF и все пакеты поддерживают прямой backend. Напротив, исторический конвейер с собственным драйвером нельзя переводить без проверки specials, шрифтов и изображений.

Команда и формат фиксируются явно. Расширение входного файла не определяет движок. Редактор может сохранить прошлый рецепт pdfLaTeX, поэтому первая строка журнала остается главным подтверждением. Снимок списка форматов показывает, какие варианты реально подготовлены в установленной системе.

Список подготовленных форматов на базе LuaTeX

Сравнение LuaTeX с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
LuaTeXПрограммируемой верстки, Unicode, OpenType и Lua-автоматизацииНет собственного визуального редактора, сборка тяжелее
pdfTeXБыстрой и стабильной сборки традиционных LaTeX-проектовОграниченная нативная работа с Unicode и OpenType
XeTeXПрямого использования системных шрифтов и многоязычного текстаНет встроенного Lua API и узловой программируемости LuaTeX
LuaMetaTeXСовременного ConTeXt LMTX и глубокой Lua-настройкиНе является прямым движком для обычного LuaLaTeX-проекта
TectonicСамодостаточной автоматической сборки TeX с загрузкой зависимостейИная модель пакетов и не полная замена TeX Live с LuaTeX

LuaTeX выбирают, когда нужны одновременно экосистема LaTeX, современные шрифты, Unicode и программируемые этапы. pdfTeX остается удачным для стабильного старого проекта, где важны скорость и неизменность. XeTeX проще воспринимать как шрифтовой Unicode-движок без Lua-расширений. LuaMetaTeX выбирают вместе с ConTeXt LMTX, а Tectonic — для управляемого автоматического конвейера с собственной моделью получения зависимостей. PDF Commander в таблицу не включен, потому что он редактирует уже существующие PDF и относится к другому классу задач; он дополняет, а не заменяет TeX-компилятор.

Сильные стороны LuaTeX

  • Unicode и UTF-8 как естественная основа многоязычного исходника.
  • OpenType, TrueType и системные шрифты через fontspec и luaotfload.
  • Встроенный Lua для вычислений, данных, генерации и расширения движка.
  • Доступ к callbacks, токенам, узлам, переносам и этапам построения страниц.
  • Прямой PDF-вывод и интеграция MPlib для программной векторной графики.
  • Работа в TeX Live, MiKTeX и MacTeX на основных настольных платформах.
  • Поддержка LuaHBTeX и HarfBuzz для сложного шейпинга письменностей.

Сочетание высокого и низкого уровней — главное достоинство. Автор обычной статьи может ограничиться LaTeX-командами и fontspec, а разработчик пакета при необходимости спускается к спискам узлов и PDF-объектам. Один и тот же движок обслуживает простой отчет, многоязычную книгу, генератор документов и исследовательский типографический эксперимент.

Свободная лицензия и включение в крупные дистрибуции обеспечивают проверяемую поставку. Проект не зависит от одного визуального редактора: смена TeXworks на другую среду не меняет язык документа. Командный интерфейс хорошо встраивается в серверные процессы и контроль версий.

Ограничения и слабые стороны

  • Отсутствует собственное окно для визуального редактирования страниц.
  • Для практической работы нужен согласованный TeX-дистрибутив и пакеты.
  • Запуск и обработка OpenType часто медленнее, чем у pdfTeX.
  • Низкоуровневый Lua API сложен и чувствителен к ошибкам управления узлами.
  • Результат зависит от версий макропакетов, шрифтов и формата.
  • Редактирование чужого созданного PDF не относится к назначению движка.
  • Компиляция недоверенного документа требует полноценной изоляции.

Эти ограничения не делают программу плохой, но определяют ее аудиторию. Пользователь, которому нужно открыть PDF и переставить страницу, получит лишнюю сложность. Автор технического документа, который хочет точную повторяемую верстку, наоборот, выигрывает от текстовой модели. Ошибка выбора класса инструмента чаще вызывает разочарование, чем конкретная функция LuaTeX.

Сложность особенно заметна при разработке расширений. Документация объемна, а поведение зависит от точной версии. Опыт TeX не автоматически означает опыт Lua и внутренних списков. Проекту нужен минимальный тестовый набор и дисциплина обновлений.

Кому подходит LuaTeX

LuaTeX подходит авторам научных статей, диссертаций, книг и учебных материалов, которым нужны формулы, библиография, перекрестные ссылки, многоязычный текст и современные гарнитуры. Он уместен у издателей, создающих серии по шаблону, и у разработчиков, генерирующих PDF из данных. Лингвисты и типографы ценят доступ к шейпингу, направлениям и узлам.

Он также полезен разработчикам LaTeX-пакетов и ConTeXt-модулей, исследователям алгоритмов набора, создателям нестандартных шрифтовых решений и командам, которые строят серверную публикацию. Lua позволяет реализовать логику рядом с документом без отдельного препроцессора, хотя большие системы все равно выигрывают от четкого разделения модулей.

LuaTeX не лучший первый выбор для простого визуального макета листовки, интерактивного исправления чужого PDF или документа, который должен редактироваться коллегами только в офисном процессоре. Также не стоит мигрировать стабильный pdfLaTeX-проект без конкретной причины.

Практический выбор комплектации TeX Live

Новичку проще установить стандартную или полную схему, чтобы не искать каждый пакет. Для ноутбука с ограниченным диском подойдет меньшая схема и добавление коллекций по необходимости. На сервере минимальный набор должен быть описан кодом: базовая схема, LuaTeX, LaTeX, рекомендованные и дополнительные пакеты, нужные языки и шрифты.

LuaTeX входит в базовую инфраструктуру TeX Live, но документ может зависеть от fontspec, unicode-math, babel, библиографии, TikZ и сотен файлов. Поэтому проверка одного luatex --version подтверждает движок, но не полноту окружения. Контрольный проект должен охватывать реальные функции.

После установки полезно сохранить вывод версии, проверить lualatex, texlua, kpsewhich и latexmk. Менеджер tlmgr показывает состояние пакетов. Обновления выполняют из официального репозитория того же года, а при нестабильном зеркале выбирают другое зеркало, не заменяя установщик неизвестным downloader.

Проверочный сценарий перед выпуском

Перед передачей PDF выполняют последовательную проверку. Сначала запускают чистую сборку с фиксированной командой и сохраняют журнал. Затем убеждаются, что первая строка указывает ожидаемый LuaHBTeX или LuaTeX и нужный год TeX Live. После этого ищут фатальные ошибки, неопределенные ссылки, отсутствующие символы и переполненные коробки. Отдельно проверяют библиографию, указатель, оглавление, закладки и число страниц.

Визуальный контроль строят не на случайном просмотре, а на наборе контрольных мест: титульная страница, начало и конец главы, страницы с самым длинным заголовком, сложная формула, таблица с переносами, рисунок на границе страницы, смешанное направление письма и библиография. Для каждой версии проекта можно хранить растровые эталоны и сравнивать рендеры, понимая, что сознательная смена шрифта изменит геометрию.

Техническая проверка PDF включает сведения о шрифтах, метаданных, версии формата, цветах и доступности. Если заказчик требует PDF/A, PDF/X или PDF/UA, используют профильный валидатор. Обычный просмотрщик не обнаруживает все нарушения. Финальный файл создают из того же коммита и окружения, которые прошли проверку, а не из локальной папки с незафиксированными изменениями.

Настройка редактора без привязки к конкретной программе

Любой редактор должен запускать lualatex с текущим главным файлом, показывать .log и открывать полученный PDF. Рецепт содержит имя команды, параметры interaction, synctex и выходной каталог. Если проект многопроходный, вместо прямого lualatex указывают latexmk -lualatex. Главный файл отмечают в настройке проекта, чтобы команда из открытой главы не пыталась собрать фрагмент без преамбулы.

Синхронизация SyncTeX связывает позицию курсора с координатами в PDF. Она создается ключом synctex и поддерживается многими редакторами и просмотрщиками. Это удобство внешней среды, а не окно LuaTeX, но оно существенно ускоряет работу с большим документом. При переносе выходных файлов редактору указывают тот же каталог, иначе он откроет старый PDF.

Если терминал собирает проект, а кнопка редактора нет, сравнивают полный путь команды, рабочий каталог, переменные среды и аргументы. Часто редактор был запущен до изменения PATH или использует встроенную конфигурацию MiKTeX. Строка версии в двух журналах быстро показывает расхождение.

Разработка собственного Lua-модуля

Модуль оформляют как таблицу с небольшим публичным API и загружают через require. Чистые функции обработки данных отделяют от обращений к tex, token, node и callback. Тогда их можно тестировать командой texlua. Взаимодействие с TeX сводят к нескольким функциям, которые принимают простые значения и возвращают экранированный текст или построенные узлы.

Диагностические сообщения выводят через texio.write_nl с понятным префиксом пакета. Ошибка должна сообщать имя входного файла или записи и ожидаемый тип. Глобальные переменные избегают, callbacks получают уникальные имена, а повторная загрузка модуля не должна регистрировать один обработчик дважды. Версию LuaTeX проверяют до обращения к новому API.

Для выпуска создают минимальные тесты: успешный документ, пустые данные, символы TeX в строках, отсутствующий файл, неправильный тип, несколько языков и повторная сборка. Тесты сравнивают журнал и важные свойства PDF. Это дешевле, чем искать повреждение списка узлов в большой книге.

Перенос проекта между операционными системами

Различия начинаются с регистра имен, разделителей пути, доступных шрифтов и кодировки оболочки. Файл Illustration.PDF может находиться на файловой системе Windows и не находиться на Linux при запросе illustration.pdf. Абсолютные пути и буквы дисков исключают. Все текстовые файлы хранят в UTF-8 с согласованными окончаниями строк.

Системные шрифты заменяют файлами проекта либо документируют точные семейства для каждой платформы. Внешние команды указывают переносимо или оборачивают в скрипт, который выбирает реализацию. Shell escape тестируют отдельно. Библиографические и индексные инструменты должны быть установлены в обеих средах.

Лучший контроль — сборка в одном контейнере на всех рабочих станциях и сервере. Но контейнер не решает лицензирование шрифтов и просмотр результата. Команда все равно проверяет PDF на целевых устройствах и у типографии. Переносимость означает воспроизводимый процесс, а не обещание идентичного отображения во всех просмотрщиках.

Команды для инвентаризации установленной системы

Команда luatex --credits показывает, из каких проектов и библиотек собрана конкретная программа: TeX, e-TeX, Omega, Aleph, pdfTeX, Kpathsea, Lua, MetaPost, PDF-библиотека, fontforge-компоненты и версии внешних библиотек. Эти сведения полезны при воспроизведении ошибки, связанной с изображениями, шрифтами или Lua ABI. Вывод прикладывают вместе со строкой версии, но не заменяют им минимальный документ.

kpsewhich -var-value позволяет увидеть TEXMFROOT, TEXMFDIST, TEXMFHOME и другие переменные дерева. fmtutil --listcfg перечисляет форматы и состояние. tlmgr info показывает пакет и установленные файлы. luaotfload-tool диагностирует базу шрифтов. latexmk -diagnostics помогает понять правила автоматической сборки. Набор этих команд быстрее ручного поиска в десятках каталогов.

Инвентаризацию сохраняют в текстовый отчет сборки. При обращении за помощью достаточно указать платформу, год TeX Live, LuaTeX или LuaHBTeX, формат, команду и первый воспроизводящий файл. Скриншот последней строки терминала без журнала обычно скрывает причину.

Обновление с одного выпуска TeX Live на другой

TeX Live проектируется как отдельные годовые деревья. Новый выпуск устанавливают рядом, переключают PATH и собирают контрольные документы. Пакеты и форматы между годами не смешивают. После успешной проверки старое дерево можно оставить для воспроизведения прошлых выпусков или удалить осознанно.

Изменения могут затронуть версию LuaTeX, LuaHBTeX, HarfBuzz, LaTeX, babel, fontspec, unicode-math и шрифты. Даже при отсутствии ошибок возможны другие переносы и страницы. Поэтому сравнение включает журнал, число страниц, визуальные рендеры и текстовое содержимое. Для тегированного PDF дополнительно выполняют валидацию структуры.

Собственный Lua-код проверяют на удаленные или измененные поля API. Предупреждение о deprecated не игнорируют до следующего года, а устраняют с тестом. Пакет должен уметь сообщить понятную ошибку при слишком старом движке, а не падать в середине страницы.

Итоговая оценка

LuaTeX — зрелый свободный движок для тех случаев, когда PDF должен быть результатом программируемой типографики, а не ручного редактирования страниц. Версия 1.24.0 в TeX Live 2026 продолжает стабильную ветвь 1.x; повседневный LuaLaTeX обычно работает через LuaHBTeX. Сильнейшие стороны — Unicode, OpenType, Lua, callbacks и доступ к внутренней модели TeX.

Наиболее надежный способ начать — установить официальный TeX Live, собрать минимальный LuaLaTeX-документ, проверить строку версии и затем подключать пакеты по одному. Для большого проекта нужно закрепить окружение, хранить шрифты и настройки, автоматизировать повторные проходы и читать журнал. Низкоуровневые возможности стоит применять только там, где пакетов высокого уровня недостаточно.

При правильном выборе задачи LuaTeX объединяет качество TeX, современные шрифты и программирование в одном конвейере. Он требует больше подготовки, чем визуальный PDF-редактор, зато дает управляемый исходник, повторяемую сборку и глубину настройки, недоступную обычным настольным приложениям.