> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ru/podrobnye-stati/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md).

# Два режима движков TeX: режим INI и производственный режим

Все движки TeX имеют два «режима» работы: режим «INI» и режим «production» — последний является просто режимом по умолчанию (стандартным), используемым для подготовки набранного материала. Режим INI довольно сильно отличается, и чтобы перевести движок TeX в режим INI, нужно использовать параметр командной строки. Узнать, как это сделать, можно, выполнив `--help` в командной строке. Например, в LuaTeX, если вы выполните

`luatex --help`

вы увидите множество параметров командной строки, поддерживаемых этим движком:

```
Использование: luatex --lua=FILE [OPTION]... [TEXNAME[.tex]] [COMMANDS]
   или: luatex --lua=FILE [OPTION]... \\FIRST-LINE
   или: luatex --lua=FILE [OPTION]... &FMT ARGS
  Запустить LuaTeX для TEXNAME, обычно создавая TEXNAME.pdf.
  Любые оставшиеся COMMANDS обрабатываются как ввод luatex после чтения TEXNAME.

  В качестве альтернативы, если первый аргумент, не являющийся параметром, начинается с обратной косой черты,
  luatex интерпретирует все аргументы, не являющиеся параметрами, как строку ввода.

  В качестве альтернативы, если первый аргумент, не являющийся параметром, начинается с &,
  следующее слово принимается как FMT для чтения, переопределяя всё остальное. Любые
  оставшиеся аргументы обрабатываются, как указано выше.

  Если не указаны аргументы или параметры, запросить ввод.

  Следующие обычные параметры поддерживаются:

   --credits                     показать сведения об авторах и выйти
   --debug-format                включить отладку формата
   --draftmode                   включить черновой режим (не создаёт выходной PDF)
   --[no-]file-line-error        отключить/включить сообщения в стиле файл:строка:ошибка
   --[no-]file-line-error-style  псевдонимы --[no-]file-line-error
   --fmt=FORMAT                  загрузить файл формата FORMAT
   --halt-on-error               остановить обработку при первой ошибке
   --help                        показать справку и выйти
   --ini                         быть в режиме iniluatex, для выгрузки форматов
   --interaction=STRING          установить режим взаимодействия (STRING=batchmode/nonstopmode/scrollmode/errorstopmode)
   --jobname=STRING              установить имя задания в STRING
   --kpathsea-debug=NUMBER       установить флаги отладки поиска путей в соответствии с битами NUMBER
   --lua=FILE                    загрузить и выполнить скрипт инициализации Lua
   --[no-]mktex=FMT              отключить/включить генерацию mktexFMT (FMT=tex/tfm)
   --nosocket                    отключить библиотеку Lua Socket
   --output-comment=STRING       использовать STRING в качестве комментария файла DVI вместо даты (не влияет на PDF)
   --output-directory=DIR        использовать существующий DIR как каталог для записи файлов
   --output-format=FORMAT        использовать FORMAT для вывода задания; FORMAT — это 'dvi' или 'pdf'
   --progname=STRING             установить имя программы в STRING
   --recorder                    включить запись имён файлов
   --safer                       отключить легко эксплуатируемые команды Lua
   --[no-]shell-escape           отключить/включить системные команды
   --shell-restricted            ограничить системные команды списком команд, заданным в texmf.cnf
   --synctex=NUMBER              включить synctex (см. man synctex)
   --utc                         установить начальное время в UTC
   --version                     показать версию и выйти

Альтернативные модели поведения можно получить с помощью специальных переключателей

  --luaonly                      запустить файл lua, затем выйти
  --luaconly                     выполнить байт-компиляцию файла lua, затем выйти
  --luahashchars                 биты, используемые текущим интерпретатором Lua для хеширования строк

См. справочное руководство для получения дополнительной информации о процессе запуска.

Сообщения об ошибках отправляйте на dev-luatex@ntg.nl.
```

Среди этих многочисленных параметров здесь важны два:

```
--ini              быть в режиме iniluatex, для выгрузки форматов
--fmt=FORMAT       загрузить файл формата FORMAT
```

Здесь LuaTeX называет свой режим INI именем `iniluatex`. Так что же это `iniluatex` (режим INI) на самом деле означает? Небольшую подсказку даёт второй параметр командной строки, показанный выше:

```
--fmt=FORMAT       загрузить файл формата FORMAT
```

### Режим INI? Файлы формата? Я запутался...

Макропакеты, такие как LaTeX, — это большие наборы сложных макросов: загрузка и обработка сырого текста всех входящих файлов действительно требуют определённых затрат времени и вычислений; например:

* чтение и сканирование десятков тысяч отдельных символов текста;
* разбор, обработка и хранение сотен макросов/команд;
* инициализация внутренних таблиц шрифтов и данных о переносах.

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

Возможно, отражая технологии своего времени, движки TeX предлагают сокращённый путь для обработки текстовых файлов, полных коллекций макросов: загрузку предварительно обработанных двоичных (*формат*) файлов.

Когда движок TeX переводится в режим INI, его задача — не выполнять набор, а вместо этого:

1. загрузить и инициализировать все его примитивные команды, а затем настроить самый минимум кодов символов (и других кодов), чтобы движок TeX мог начать дальнейшую обработку.
2. после того как (1) выполнено, он затем загрузит и обработает предоставленную пользователем коллекцию макросов, называемую «форматом» (например, макропакет Plain TeX или коллекцию макросов LaTeX).
3. после успешного завершения (1) и (2) TeX выполнит «двоичный дамп мозга» всего, что было загружено и обработано в его память, и запишет это в двоичный *формат* файл (например, `lualatex.fmt`).

Файл формата — это двоичный файл, который хранит представление «состояния» TeX после инициализации многочисленных внутренних таблиц данных (включая примитивы) и обработки всех макрокоманд, присутствующих в предоставленной пользователем коллекции макросов. Движки TeX делают это потому, что загружать «предварительно скомпилированный» двоичный файл быстрее, чем повторно обрабатывать исходные макросы каждый раз, когда вы хотите запустить движок TeX, используя, например, Plain TeX Кнута или макропакет LaTeX — или любой другой макропакет, предназначенный как «формат».

Когда вы обрабатываете документ, который должен быть набран LaTeX, например, движок TeX не перечитывает (не переобрабатывает) все основные макросы LaTeX, а вместо этого читает двоичный файл, например, `lualatex.fmt`. Внутреннее устройство файлов формата специфично для каждого движка TeX и каждой версии макропакета, используемой для создания `.fmt` файла. Например, если вы обновите свою дистрибуцию LaTeX (то есть ядро самого LaTeX, а не дополнительные пакеты), вам, возможно, также потребуется создать новый `.fmt` файл.

### Пример

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

`luatex --ini lualatex.ini`

LuaTeX запишет файл под названием `lualatex.fmt`

На момент написания, `lualatex.ini` содержит следующий код:

```
% tex-ini-files 2016-04-15: lualatex.ini
% Изначально написано в 2008 году Карлом Берри. Общественное достояние.

\input luatexconfig.tex

\begingroup
  \catcode`\{=1 %
  \catcode`\}=2 %
  % Настройка заключения имени задания в кавычки перед latex.ltx
  % Web2c pdfTeX/XeTeX заключают имена заданий, содержащие пробелы, в кавычки, но LuaTeX
  % не делает этого на уровне движка. Поведение можно изменить с помощью
  % обратного вызова. Изначально этот код загружался через lualatexquotejobname.tex
  % но для этого требовался хак вокруг latex.ltx: поведение было изменено
  % чтобы можно было использовать путь через обратный вызов напрямую.
  \global\everyjob{\directlua{require("lualatexquotejobname.lua")}}
\endgroup

\input latex.ltx
```

`lualatex.ini` начинается с подключения файла под названием `luatexconfig.tex` который выполняет некоторую инициализацию, специфичную для LuaTeX — как и следовало ожидать от `.ini` (инициализационного) файла! В последней строке он подключает `latex.ltx` что заставляет LuaTeX читать и обрабатывать основные макросы LaTeX.

После того как LuaTeX завершит обработку `lualatex.ini` он запишет двоичный *файл формата* под названием `lualatex.fmt`. После того как код LaTeX будет скомпилирован в двоичный формат, LuaTeX (или любой другой движок TeX) сможет очень быстро прочитать `.fmt` файл, чтобы выполнить начальную загрузку и инициализацию своих внутренних таблиц определений макросов LaTeX, шрифтов и так далее — ему не придётся проходить через длительный процесс чтения и обработки многих тысяч символов, содержащихся в пакете макросов LaTeX.

Теперь вы можете указать LuaTeX набрать ваш документ LaTeX `yourfile.tex` (используя `lualatex` файл формата) выполнив команду:

```
luatex --fmt=lualatex yourfile.tex
```

`.fmt` файлы обычно специфичны для конкретного движка: например, файлы LuaTeX `.fmt` файлы, как правило, не являются переносимыми для использования с другим движком TeX: например, pdfTeX или XeTeX. Более того, если исполняемый файл LuaTeX обновляется с новыми возможностями, вполне возможно, что файл `.fmt` файл, подготовленный более старой версией LuaTeX, не будет работать с новым движком: вам потребуется пересобрать (перекомпилировать) `.fmt` файла.

Если вы попытаетесь использовать несовместимый `.fmt` файл, то движок TeX не сможет его загрузить и выдаст ошибку:

```
Фатальная ошибка файла формата; я в тупике
```

Точно так же, если основные макросы LaTeX обновлены, вам, возможно, также придётся пересобрать `lualatex.fmt` файл.

`.fmt` Файлы формата можно подготовить из любого подходящего пакета макросов — не только из LaTeX; например, оригинальные и гораздо более простые макросы «Plain» TeX Кнута тоже можно обработать для создания `.fmt` файла. Вы могли бы, если бы у вас было время, написать собственную коллекцию макросов и создать файл формата для этого пакета — обратите внимание, что где-то в вашем пакете макросов вам нужно будет вызвать примитивную команду `\dump` которая сообщает движку TeX выполнить свой «двоичный дамп мозга» и записать `.fmt` файла.

Однако подавляющему большинству пользователей никогда не нужно беспокоиться о режиме «INI» движков TeX или о процессе создания `.fmt` файлов: Overleaf и дистрибутив TeX Live скрывают от вас эти детали — если только вам не понадобится их искать.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ru/podrobnye-stati/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
