> 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/vi/bai-viet-chuyen-sau/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md).

# Hai chế độ của các bộ máy TeX: chế độ INI và chế độ sản xuất

Tất cả các bộ máy TeX đều có hai “chế độ” hoạt động: chế độ “INI” và chế độ “sản xuất”—chế độ sau chỉ là chế độ mặc định (chuẩn) dùng để tạo ra tài liệu dàn trang. Chế độ INI khá khác biệt và bạn cần dùng một tùy chọn dòng lệnh để đưa một bộ máy TeX vào chế độ INI. Bạn có thể xem cách làm bằng cách gõ `--help` trên dòng lệnh. Ví dụ, với LuaTeX nếu bạn chạy

`luatex --help`

bạn sẽ thấy nhiều tùy chọn dòng lệnh được bộ máy đó hỗ trợ:

```
Cách dùng: luatex --lua=FILE [OPTION]... [TEXNAME[.tex]] [COMMANDS]
   hoặc: luatex --lua=FILE [OPTION]... \FIRST-LINE
   hoặc: luatex --lua=FILE [OPTION]... &FMT ARGS
  Chạy LuaTeX trên TEXNAME, thường tạo ra TEXNAME.pdf.
  Mọi COMMANDS còn lại sẽ được xử lý như đầu vào của luatex, sau khi TEXNAME được đọc.

  Ngoài ra, nếu đối số không phải tùy chọn đầu tiên bắt đầu bằng dấu gạch chéo ngược,
  luatex sẽ diễn giải tất cả các đối số không phải tùy chọn như một dòng đầu vào.

  Ngoài ra, nếu đối số không phải tùy chọn đầu tiên bắt đầu bằng dấu &,
  từ tiếp theo được lấy làm FMT để đọc, ghi đè mọi thứ khác. Bất kỳ
  đối số còn lại sẽ được xử lý như trên.

  Nếu không có đối số hay tùy chọn nào được chỉ định, sẽ nhắc nhập liệu.

  Các tùy chọn thông thường sau đây được hiểu:

   --credits                     hiển thị thông tin ghi công và thoát
   --debug-format                bật gỡ lỗi định dạng
   --draftmode                   bật chế độ bản nháp (không tạo PDF đầu ra)
   --[no-]file-line-error        tắt/bật thông báo kiểu file:line:error
   --[no-]file-line-error-style  bí danh của --[no-]file-line-error
   --fmt=FORMAT                  tải tệp định dạng FORMAT
   --halt-on-error               dừng xử lý tại lỗi đầu tiên
   --help                        hiển thị trợ giúp và thoát
   --ini                         là iniluatex, để kết xuất các định dạng
   --interaction=STRING          đặt chế độ tương tác (STRING=batchmode/nonstopmode/scrollmode/errorstopmode)
   --jobname=STRING              đặt tên công việc thành STRING
   --kpathsea-debug=NUMBER       đặt các cờ gỡ lỗi tìm đường dẫn theo các bit của NUMBER
   --lua=FILE                    tải và thực thi một script khởi tạo lua
   --[no-]mktex=FMT              tắt/bật tạo mktexFMT (FMT=tex/tfm)
   --nosocket                    tắt thư viện socket của lua
   --output-comment=STRING       dùng STRING làm chú thích tệp DVI thay vì ngày tháng (không ảnh hưởng đến PDF)
   --output-directory=DIR        dùng DIR hiện có làm thư mục để ghi tệp
   --output-format=FORMAT        dùng FORMAT cho đầu ra của công việc; FORMAT là 'dvi' hoặc 'pdf'
   --progname=STRING             đặt tên chương trình thành STRING
   --recorder                    bật ghi lại tên tệp
   --safer                       tắt các lệnh lua dễ bị khai thác
   --[no-]shell-escape           tắt/bật các lệnh hệ thống
   --shell-restricted            giới hạn các lệnh hệ thống trong một danh sách lệnh được cho trong texmf.cnf
   --synctex=NUMBER              bật synctex (xem man synctex)
   --utc                         khởi tạo thời gian theo UTC
   --version                     hiển thị phiên bản và thoát

Có thể có được các mô hình hành vi thay thế bằng các công tắc đặc biệt

  --luaonly                      chạy một tệp lua rồi thoát
  --luaconly                     biên dịch byte một tệp lua rồi thoát
  --luahashchars                 các bit mà trình thông dịch Lua hiện tại dùng để băm chuỗi

Xem sổ tay tham khảo để biết thêm thông tin về quá trình khởi động.

Gửi báo cáo lỗi tới dev-luatex@ntg.nl.
```

Trong số rất nhiều tùy chọn đó, có hai tùy chọn liên quan ở đây:

```
--ini              là iniluatex, để kết xuất các định dạng
--fmt=FORMAT       tải tệp định dạng FORMAT
```

Ở đây, LuaTeX gọi chế độ INI của nó bằng tên `iniluatex`. Vậy điều này `iniluatex` (chế độ INI) thực sự có nghĩa là gì? Một gợi ý nhỏ là tùy chọn dòng lệnh thứ hai được nêu ở trên:

```
--fmt=FORMAT       tải tệp định dạng FORMAT
```

### Chế độ INI? Tệp định dạng? Tôi bị rối...

Các gói macro, chẳng hạn như LaTeX, là những tập hợp lớn gồm nhiều macro phức tạp: việc tải và xử lý văn bản thô của tất cả các tệp thành phần thực sự có một mức độ chậm trễ nhất định về thời gian và tính toán; ví dụ:

* đọc và quét hàng chục nghìn ký tự văn bản riêng lẻ;
* phân tích cú pháp, xử lý và lưu trữ hàng trăm macro/lệnh;
* khởi tạo các bảng nội bộ về phông chữ và dữ liệu ngắt từ.

Tất cả những việc này phải diễn ra, và các kết quả phải được lưu trong bộ nhớ, trước khi bộ máy TeX thực sự sẵn sàng xử lý tài liệu TeX của người dùng có sử dụng các macro do, ví dụ, các bộ sưu tập macro Plain TeX hoặc LaTeX cung cấp. Bạn có thể coi đây là quá trình khởi động của một bộ máy TeX: những chuẩn bị thiết yếu trước khi nó sẵn sàng xử lý tài liệu của bạn.

Có lẽ phản ánh công nghệ của thời kỳ đó, các bộ máy TeX cung cấp một lối tắt để xử lý các tệp văn bản đầy các bộ sưu tập macro: tải các tệp nhị phân tiền xử lý (*định dạng*) .

Khi được đặt vào chế độ INI, nhiệm vụ của một bộ máy TeX không phải là dàn trang mà thay vào đó là:

1. tải và khởi tạo tất cả các lệnh nguyên thủy của nó, đồng thời thiết lập mức tối thiểu cần thiết của các catcode (và các mã khác) để bộ máy TeX có thể bắt đầu xử lý tiếp.
2. khi (1) hoàn tất, nó sẽ tải và xử lý một bộ sưu tập macro do người dùng cung cấp, được gọi là một “format” (ví dụ: Plain TeX hoặc bộ sưu tập macro LaTeX).
3. sau khi hoàn tất thành công (1) và (2), TeX sẽ thực hiện một “brain dump” nhị phân của mọi thứ đã được tải và xử lý vào bộ nhớ của nó và ghi ra một tệp nhị phân *định dạng* tệp (ví dụ, `lualatex.fmt`).

Tệp định dạng là một tệp nhị phân lưu trữ biểu diễn “trạng thái” của TeX sau khi đã khởi tạo nhiều bảng dữ liệu nội bộ (bao gồm cả các lệnh nguyên thủy) và xử lý tất cả các lệnh macro có trong bộ sưu tập macro do người dùng cung cấp. Các bộ máy TeX làm điều này vì tải một tệp nhị phân “đã biên dịch sẵn” nhanh hơn nhiều so với việc xử lý lại các macro thô mỗi khi bạn muốn chạy một bộ máy TeX dùng, chẳng hạn, Plain TeX của Knuth hoặc gói macro LaTeX—hay thực ra là bất kỳ gói macro nào được thiết kế dưới dạng một “format”.

Khi bạn xử lý một tài liệu sẽ được dàn trang bằng LaTeX, ví dụ, bộ máy TeX không đọc lại (xử lý lại) toàn bộ các macro lõi của LaTeX mà thay vào đó nó đọc vào một tệp nhị phân có tên, ví dụ, `lualatex.fmt`. Nội dung chi tiết bên trong của các tệp định dạng là đặc thù cho từng bộ máy TeX và từng phiên bản của gói macro được dùng để tạo ra một `.fmt` tệp. Ví dụ, nếu bạn nâng cấp bản phân phối LaTeX của mình (tức là lõi của chính LaTeX, không phải các gói bổ sung) thì bạn cũng có thể cần tạo ra một `.fmt` tệp mới nữa.

### Ví dụ

Trong bộ phân phối mã nguồn LaTeX, bạn sẽ tìm thấy các tệp có phần mở rộng `.ini` ví dụ như lualatex.ini, được dùng để tạo ra `.fmt` các tệp—những `.ini` tệp này thường chứa mã khởi tạo đặc thù cho bộ máy rồi sau đó tiếp tục nạp các tệp macro lõi của LaTeX. Ví dụ, nếu bạn chạy LuaTeX với dòng lệnh sau:

`luatex --ini lualatex.ini`

LuaTeX sẽ ghi ra một tệp có tên `lualatex.fmt`

Tại thời điểm viết bài này, `lualatex.ini` chứa mã sau:

```
% tex-ini-files 2016-04-15: lualatex.ini
% Ban đầu được viết năm 2008 bởi Karl Berry. Miền công cộng.

\input luatexconfig.tex

\begingroup
  \catcode`\{=1 %
  \catcode`\}=2 %
  % Thiết lập việc đặt trong ngoặc kép cho tên công việc trước latex.ltx
  % Web2c pdfTeX/XeTeX đặt trong ngoặc kép các tên công việc có chứa khoảng trắng, nhưng LuaTeX thì
  % không làm điều này ở cấp độ bộ máy. Hành vi có thể được thay đổi bằng
  % một callback. Ban đầu mã này được nạp qua lualatexquotejobname.tex
  % nhưng điều đó đòi hỏi một mẹo vòng qua latex.ltx: hành vi đã được thay đổi
  % để cho phép dùng trực tiếp đường callback.
  \global\everyjob{\directlua{require("lualatexquotejobname.lua")}}
\endgroup

\input latex.ltx
```

`lualatex.ini` bắt đầu bằng cách nạp một tệp có tên `luatexconfig.tex` tệp này thực hiện một số khởi tạo đặc thù cho LuaTeX—đúng như bạn mong đợi ở một tệp (khởi tạo)! Ở dòng cuối cùng, nó nạp `.ini` (khởi tạo) file! Ở dòng cuối cùng, nó nạp `latex.ltx` điều này khiến LuaTeX đọc và xử lý các macro lõi của LaTeX.

Sau khi LuaTeX xử lý xong `lualatex.ini` nó sẽ ghi ra *tệp định dạng* nhị phân `lualatex.fmt`có tên `.fmt` . Khi mã LaTeX đã được biên dịch thành một định dạng nhị phân, LuaTeX (hoặc bất kỳ bộ máy TeX nào khác) có thể đọc rất nhanh

tệp để khởi động và khởi tạo các bảng nội bộ của nó về các định nghĩa macro, phông chữ của LaTeX, v.v.—nó không phải trải qua quá trình dài dòng là đọc và xử lý hàng chục nghìn ký tự có trong gói macro LaTeX. `yourfile.tex` (sử dụng `lualatex` tệp định dạng) bằng cách gõ lệnh:

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

`.fmt` các tệp thường là đặc thù cho một bộ máy cụ thể: ví dụ, các tệp của LuaTeX `.fmt` các tệp thường không thể dùng di động với một bộ máy TeX khác: ví dụ như pdfTeX hoặc XeTeX. Hơn nữa, nếu tệp thực thi LuaTeX được cập nhật với các tính năng mới thì rất có thể một `.fmt` tệp được chuẩn bị bằng một phiên bản LuaTeX cũ sẽ không hoạt động với bộ máy mới: bạn sẽ cần dựng lại (biên dịch lại) `.fmt` .

Nếu bạn cố dùng một `.fmt` tệp không tương thích thì một bộ máy TeX sẽ không thể nạp nó và sẽ phản hồi bằng lỗi:

```
Lỗi tệp định dạng nghiêm trọng; tôi bó tay
```

Tương tự, nếu các macro lõi của LaTeX được cập nhật thì bạn cũng có thể cần dựng lại `lualatex.fmt` tệp mới nữa.

`.fmt` các tệp có thể được chuẩn bị từ bất kỳ gói macro phù hợp nào—không chỉ LaTeX; ví dụ, các macro “Plain” TeX nguyên bản và đơn giản hơn nhiều của Knuth cũng có thể được xử lý để tạo ra một `.fmt` tệp. Bạn có thể, nếu có thời gian, tự viết bộ sưu tập macro của riêng mình và tạo một tệp định dạng cho gói đó—lưu ý rằng ở đâu đó trong gói macro của bạn, bạn sẽ cần gọi lệnh nguyên thủy `\dump` lệnh này bảo bộ máy TeX thực hiện “brain dump” nhị phân của nó và ghi ra `.fmt` .

Tuy nhiên, đại đa số người dùng chẳng bao giờ cần lo lắng về chế độ “INI” của các bộ máy TeX, hay về quá trình tạo ra `.fmt` các tệp: Overleaf và bản phân phối TeX Live che chắn bạn khỏi những chi tiết đó—trừ khi bạn cần tự tìm hiểu chúng.


---

# 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/vi/bai-viet-chuyen-sau/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.
