> 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/zh-tw/shen-ru-wen-zhang/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md).

# TeX 引擎的兩種模式：INI 模式與生產模式

所有 TeX 引擎都有兩種「模式」：一種是「INI」模式，另一種是「生產」模式——後者其實就是用於排版成品的預設（標準）模式。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
  在 TEXNAME 上執行 LuaTeX，通常會建立 TEXNAME.pdf。
  其餘任何 COMMANDS 會在讀入 TEXNAME 之後，作為 luatex 輸入來處理。

  或者，如果第一個非選項引數以反斜線開頭，
  luatex 會將所有非選項引數解讀為一行輸入。

  或者，如果第一個非選項引數以 & 開頭，則
  下一個字詞會被視為要讀入的 FMT，並覆蓋其他所有設定。任何
  其餘引數會如上所述處理。

  如果未指定任何引數或選項，則提示輸入。

  以下是可用的一般選項：

   --credits                     顯示致謝並結束
   --debug-format                啟用格式除錯
   --draftmode                   開啟草稿模式（不產生輸出 PDF）
   --[no-]file-line-error        停用/啟用 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       DVI 檔案註解使用 STRING 取代日期（對 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 引擎才真正能夠準備好處理使用者的 TeX 文件；該文件會使用例如 Plain TeX 或 LaTeX 巨集集合所提供的巨集。你可以把這看成 TeX 引擎的啟動引導流程：在它準備好處理你的文件之前所做的必要準備。

也許反映了當時的技術水準，TeX 引擎提供了一條捷徑來處理充滿巨集集合的文字檔：載入已預處理的二進位（*格式*）檔案。

當進入 INI 模式時，TeX 引擎的工作不是排版，而是：

1. 載入並初始化所有原始指令，並設定最少量的 catcode（以及其他代碼），以便 TeX 引擎能開始後續處理。
2. 完成（1）之後，它接著會載入並處理使用者提供的巨集集合，稱為「格式」（例如 Plain TeX 或 LaTeX 巨集集合）。
3. 在成功完成（1）和（2）之後，TeX 會將所有已載入並處理到記憶體中的內容做一次「二進位腦傾印」，並將其寫出為一個二進位 *格式* 檔案（例如， `lualatex.fmt`).

格式檔是一種二進位檔，它儲存了 TeX 在初始化眾多內部資料表（包括原始指令）並處理完使用者提供的巨集集合中所有巨集指令之後的「心智狀態」的表示。TeX 引擎之所以這麼做，是因為載入「預先編譯」的二進位檔，比每次你想用例如 Knuth 的 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
% 原始由 Karl Berry 於 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 可執行檔更新了新功能，則很有可能先前以較舊版本 LuaTeX 製作的 `.fmt` 檔案將無法在新引擎上運作：你需要重新建置（重新編譯） `.fmt` 檔案中使用的指令。

如果你嘗試使用不相容的 `.fmt` 檔案，TeX 引擎就會無法載入它，並回應以下錯誤：

```
格式檔嚴重錯誤；我被難住了
```

同樣地，如果核心 LaTeX 巨集已更新，你也可能需要重新建置這些 `lualatex.fmt` 檔案。

`.fmt` 檔案可以由任何合適的巨集套件製作——不僅僅是 LaTeX；例如，Knuth 原始且簡單得多的「Plain」TeX 巨集也可以經過處理來產生一個 `.fmt` 檔案。如果你有時間，你也可以撰寫自己的巨集集合，並為該套件產生一個格式檔——請注意，你的巨集套件某處需要呼叫原始指令 `\dump` ，它會告訴 TeX 引擎執行其「二進位腦傾印」，並寫出 `.fmt` 檔案中使用的指令。

然而，絕大多數使用者從不需要擔心 TeX 引擎的「INI」模式，或是產生 `.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/zh-tw/shen-ru-wen-zhang/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.
