> 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/chu-de-khac/20-how-tex-macros-actually-work-part-2.md).

# Các macro TeX thực sự hoạt động như thế nào: Phần 2

[Phần 1](/latex/vi/chu-de-khac/19-how-tex-macros-actually-work-part-1.md) [Phần 2](/latex/vi/chu-de-khac/20-how-tex-macros-actually-work-part-2.md) [Phần 3](/latex/vi/chu-de-khac/21-how-tex-macros-actually-work-part-3.md) [Phần 4](/latex/vi/chu-de-khac/22-how-tex-macros-actually-work-part-4.md) [Phần 5](/latex/vi/chu-de-khac/23-how-tex-macros-actually-work-part-5.md) [Phần 6](/latex/vi/chu-de-khac/24-how-tex-macros-actually-work-part-6.md)

## Giới thiệu: Một câu chuyện bằng hình ảnh

Như đã lưu ý ở Phần 1, TeX phải “đọc” mọi ký tự trong `.tex` tệp và quá trình đọc đó được gọi chính xác hơn là *quét*. Theo truyền thống, quá trình xử lý đầu vào (quét) của TeX được ví như TeX có “đôi mắt” để quan sát đầu vào, vì vậy chúng ta sẽ áp dụng phép so sánh quen thuộc đó trong các hình minh họa bên dưới.

### Hình 1: Đôi mắt đã sẵn sàng

Chúng ta giả sử TeX đã nhận được một số đầu vào từ một `.tex` tệp và sắp xử lý chuỗi ký tự của chúng ta `Hello World \\jobname` nằm trong một đoạn văn bản. Nó sẽ lần lượt kiểm tra từng ký tự và xem xét mã loại của nó.

![Đôi mắt của TeX đã sẵn sàng quét một dòng văn bản](/files/5d33ea52fb216cb4c159b7df1528d8548463a759)

### Hình 2: Xử lý mã loại

Trong hình minh họa tiếp theo, chúng ta thấy, ở dạng khái quát (với các chi tiết bổ sung bên dưới), TeX phản ứng như thế nào với một số mã loại khác nhau. Lưu ý rằng có tổng cộng 16 mã loại nhưng, để đơn giản, chúng ta chỉ minh họa việc sử dụng ba mã: 11, 10 và 0. Các mã ký tự khác trở nên quan trọng trong các quá trình dàn trang của TeX như dựng bảng, dàn công thức toán học và nhận diện các tham số macro.

![TeX phản ứng với một số mã loại khác nhau](/files/2831602b8b5aa06d5a106e11686ee58e773b9692)

#### Ghi chú cho Hình 2

Ở đây, chúng ta đang xem xét TeX khi nó đang đọc (quét) các ký tự tạo thành một phần của đoạn văn bản. TeX kiểm tra từng ký tự, xem mã loại của nó và thực hiện hành động thích hợp dựa trên mã loại và “chế độ” của TeX (một trạng thái dựa trên việc nó đang làm gì lúc đó).

* **(đôi mắt xanh lá)** TeX sẽ thấy rằng mỗi ký tự đó có mã loại 11 (“chữ cái”) và sẽ chuyển các ký tự đó đi để dàn trang như một phần của đoạn văn nó đang xây dựng. Tuy nhiên, TeX không chuyển tiếp (dùng) riêng mã ký tự, mà thay vào đó sử dụng cặp số (mã ký tự, mã loại) để tính một giá trị số nguyên tổng hợp được gọi là một *token ký tự* (xem bên dưới). Một khi token ký tự đó được tạo ra, nó sẽ đi vào các quá trình/thuật toán dàn trang bên trong của TeX.
* **(đôi mắt xanh lam)** TeX nhìn thấy một ký tự khoảng trắng (ASCII 32) với mã loại 10 (“khoảng trắng”)—lưu ý rằng, như đã thảo luận, hoàn toàn có thể mã loại của một khoảng trắng (ASCII 32), hoặc của bất kỳ ký tự nào, đã được đổi sang một giá trị khác—trước khi nó được TeX đọc vào.

Cách TeX thực sự xử lý các ký tự có mã loại 10 (“khoảng trắng”) thay đổi tùy theo khi nào/ở đâu TeX nhìn thấy nó—tức “chế độ” hiện tại của TeX. Ví dụ, có những lúc TeX sẽ đơn giản bỏ qua chúng. Ở đây, TeX sẽ biết rằng nó đã phát hiện một ký tự có mã loại 10 (trùng hợp là một khoảng trắng, ASCII 32) trong khi xử lý văn bản đoạn nên cuối cùng nó sẽ chuyển đổi nó thành cái gọi là keo giữa các từ: một loại khoảng trắng linh hoạt có thể giãn ra hoặc co lại.

* **(đôi mắt đỏ)** Ở đây, TeX đã quan sát thấy một ký tự có mã loại rất quan trọng: 0 (ký tự thoát).

Một ký tự thoát—*bất kỳ* ký tự nào có mã loại 0—báo cho TeX chuyển sang một chế độ đọc đặc biệt và cẩn thận quét (đọc) các ký tự tiếp theo vì chúng xác định tên của một *lệnh*, chứ không phải văn bản để dàn trang. Trong tài liệu về TeX, bạn cũng sẽ thấy thuật ngữ “lệnh” còn được gọi là *chuỗi điều khiển*. Sau khi thấy một ký tự thoát, TeX kiểm tra mã loại của ký tự theo sau *ngay sau nó*; điều này là vì TeX nhận ra hai loại lệnh:

* các lệnh nhiều chữ cái gọi là *các từ điều khiển*: ký tự theo ngay sau ký tự thoát có mã loại 11. Tất cả các ký tự tiếp theo có mã loại 11 đều được xem là một phần của tên lệnh. TeX sẽ ngừng tìm các ký tự cấu thành tên lệnh khi nó phát hiện bất kỳ ký tự nào mà *không* có mã loại 11—chẳng hạn một ký tự khoảng trắng với mã loại 10.
* các lệnh một chữ cái gọi là *ký hiệu điều khiển*: ký tự theo ngay sau *không* có mã loại 11.

Bạn có thể nghĩ về một ký tự thoát như việc kích hoạt TeX “thoát” khỏi hành vi quét thông thường của nó và áp dụng một cách tiếp cận khác cho vài ký tự tiếp theo—điều này được chỉ ra bằng khung chấm đỏ cho thấy TeX sẽ **Bắt đầu quét để tìm một lệnh**.

### Hình 3: Xử lý mã loại 11 (“chữ cái”)

Trong Phần 1 của loạt bài này, chúng ta đã lưu ý rằng mỗi ký tự TeX đọc từ đầu vào của nó được mô tả bởi hai số nguyên:

* mã ký tự: một số nguyên xác định biểu diễn số của một ký tự;
* mã loại: một giá trị từ 0 đến 15 mà TeX gán cho mọi ký tự có thể xuất hiện trong đầu vào của nó.

TeX sử dụng hai mẩu thông tin này ở giai đoạn tiếp theo của quá trình xử lý: tạo token ký tự.

Hình 3 mở rộng Hình 2 để cho thấy TeX làm gì với các ký tự đầu vào có mã loại 11 (chữ cái): nó tạo ra *các token ký tự*—các giá trị số nguyên mà TeX tính bằng cách kết hợp mã loại và mã ký tự của ký tự đó.

**Lưu ý**: Trong ví dụ này chúng ta chỉ bàn về các ký tự có mã loại 11, nhưng bạn nên biết rằng TeX cũng tạo ra các giá trị token cho các ký tự đầu vào có mã loại khác—ngoại trừ mã loại 0, vốn không bao giờ được biến thành token: ký tự thoát chỉ đóng vai trò như một “công tắc” để kích hoạt quá trình xử lý đặc biệt.

![TeX xử lý các ký tự có mã loại 11](/files/1142082c908f39e364ee562bbf4ec95d584d46cf)

Hình 5 bên dưới sẽ cho thấy TeX làm gì khi nó nhìn thấy một ký tự có mã loại 0 (một ký tự thoát).

#### Ghi chú cho Hình 3: Xử lý mã loại 11 (“chữ cái”)

Ở đây, chúng ta sẽ tập trung vào **green** hoạt động: điều gì xảy ra khi TeX nhìn thấy các ký tự có mã loại 11 (“chữ cái”). Sau khi TeX đã đọc một ký tự, và xác định mã loại của nó (ở đây là 11), việc TeX làm tiếp theo là *kết hợp* cặp số này thành một số nguyên duy nhất gọi là token ký tự: các token này (số nguyên) được chuyển sang giai đoạn tiếp theo của các thuật toán/quá trình dàn trang bên trong của TeX. Như đã nói, TeX cũng sẽ tạo token ký tự cho các ký tự có mã loại khác (tức không phải 11), ở đây chúng ta chỉ dùng mã loại 11 làm ví dụ.

Mỗi token ký tự (một số nguyên) ràng buộc vĩnh viễn một ký tự đầu vào với mã loại được gán cho ký tự đó **tại thời điểm nó được TeX quét (đọc vào)**: thực tế đó có tầm quan trọng then chốt trong việc hiểu hành vi của các macro TeX/LaTeX. Tất nhiên, trong quá trình xử lý tiếp theo, TeX đôi khi sẽ cần tách một token ký tự để xác định cặp (mã ký tự, mã loại) nào đã được dùng để tạo token đó. Tuy nhiên, một khi một ký tự đã được đọc vào bởi quá trình (quét) đầu vào của TeX, giá trị token ký tự do TeX tính ra khiến ký tự đó bị *vĩnh viễn* gắn với mã loại được gán cho nó *tại thời điểm nó được đọc vào*.

**Tính toán token ký tự**

Các bộ máy TeX dùng một công thức đơn giản để tính một token ký tự, $$T$$, từ một ký tự có mã loại $$C$$ và mã ký tự $$A$$:

$$T = \text{constant} \times C + A$$

Các bộ máy 8-bit, như pdfTeX, dùng:

$$T = 256\times C + A$$

Các bộ máy hỗ trợ Unicode, như XeTeX hoặc LuaTeX, phải dùng một công thức khác vì, trong Unicode, mã ký tự có thể lớn hơn nhiều so với mức tối đa 255 trong thế giới mã hóa ASCII 8-bit cũ. Chẳng hạn, XeTeX sử dụng:

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

Một lần nữa, cần lưu ý rằng các ký tự có mã loại 0 không được chuyển thành token ký tự: mã loại 0 có một vị trí rất đặc biệt trong việc lọc đầu vào của TeX và chỉ được dùng như một “công tắc” để kích hoạt TeX vào chế độ quét đặc biệt các vài ký tự tiếp theo. Hình 5 sẽ bàn về điều này.

### Hình 4: Xử lý mã loại 10 (“khoảng trắng”)

Việc TeX xử lý các ký tự có mã loại 10 (“khoảng trắng”) phụ thuộc vào việc TeX hiện đang làm gì khi nó phát hiện một ký tự có mã loại 10 trong đầu vào. Trong ví dụ của chúng ta, TeX đang thực hiện xử lý đoạn văn thông thường và ký tự khoảng trắng, với mã loại 10, sẽ được chuyển thành keo giữa các từ.

![TeX xử lý các ký tự có mã loại 10](/files/e56ffe371bd3fa682f227bf2da396884aa40d492)

Cách TeX xử lý khoảng trắng có vẻ khá kỳ lạ, nhưng bạn có thể tìm thấy một cái nhìn tổng quan tốt trong các chương 1 và 2 của [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) của Victor Eijkhout—bạn có thể [tải xuống một bản PDF miễn phí](https://bitbucket.org/VictorEijkhout/tex-by-topic) trên trang web của ông.

Ví dụ, khi TeX nhìn thấy một ký tự có mã loại 10, có những lúc TeX sẽ:

* bỏ qua (phớt lờ) tất cả chúng—ví dụ, khi TeX đang ở chế độ dọc;
* chuyển nhiều khoảng trắng thành một khoảng trắng duy nhất—bỏ qua các khoảng trắng thừa như khi xử lý một đoạn văn;
* hấp thụ chúng—ví dụ, hấp thụ một khoảng trắng đơn sau tên lệnh;

Cũng lưu ý rằng, có những lúc TeX còn sẽ *tạo ra* khoảng trắng—bằng cách chuyển các ký tự xuống dòng thành một khoảng trắng. Hành vi/cách xử lý các ký tự khoảng trắng (bất kỳ ký tự nào có mã loại 10) là một trong những “tính kỳ lạ” của TeX: cần thời gian/thực hành để trở nên quen thuộc (thoải mái) với khía cạnh này của TeX.

### Hình 5a: Xử lý mã loại 0 (một “ký tự thoát”)

Trong hình này, TeX đã xử lý tất cả các ký tự cho đến `\` ký tự, có mã loại 0: “ký tự thoát”—chúng ta sẽ dùng thêm một chuỗi hình minh họa để cho thấy TeX xử lý một ký tự thoát và xác định tên của một lệnh.

![TeX xử lý các ký tự có mã loại 0](/files/60b651b7a4742e8cc02f37efeab4d6be4f686336)

### Hình 5b: Tìm tên lệnh

Trong hình này, chúng ta nhìn vào phần trong khung chấm đỏ (**Bắt đầu quét để tìm một lệnh**) để xem TeX làm gì sau khi nó đã nhìn thấy một ký tự thoát.

![TeX đang tìm tên lệnh](/files/5f05ecfc0a2850e29c85decde44ab05455fda739)

**Ghi chú cho Hình 5b**

* Một khi đã được nhận diện, ký tự thoát đã hoàn thành nhiệm vụ của nó: nó đóng vai trò như một công tắc và không tham gia vào bất kỳ quá trình xử lý tiếp nào—cụ thể, nó được **không** chuyển thành một token ký tự.
* Để tiện, chúng ta sẽ nhắc lại một vài chi tiết đã nêu trước đó. Sau khi thấy một ký tự thoát, TeX kiểm tra mã loại của ký tự theo sau *ngay sau nó*; điều này là vì TeX nhận ra hai loại lệnh:
* * các lệnh nhiều chữ cái gọi là *các từ điều khiển*: ký tự theo ngay sau ký tự thoát có mã loại 11. Tất cả các ký tự tiếp theo có mã loại 11 đều được xem là tạo thành tên của một lệnh (*từ điều khiển*). TeX sẽ ngừng tìm các ký tự cấu thành tên lệnh khi nó phát hiện bất kỳ ký tự nào mà *không* có mã loại 11—chẳng hạn một ký tự khoảng trắng với mã loại 10.
  * các lệnh một chữ cái gọi là *ký hiệu điều khiển*: ký tự theo ngay sau *không* có mã loại 11.
* Trong ví dụ của chúng ta, ký tự đầu tiên sau `\` là một `j` (mã loại 11) điều này cho TeX biết phải tìm một lệnh có thể là một chuỗi nhiều chữ cái gồm các ký tự có mã loại 11.
* TeX tiếp tục kiểm tra xem có thêm ký tự nào có mã loại 11 hay không. Ngay khi nó phát hiện một ký tự có mã loại khác, chẳng hạn một khoảng trắng với mã loại 10, TeX biết rằng nó đã đến cuối tên lệnh. Chỉ để nhấn mạnh ý này: ở đây chính là một ký tự khoảng trắng (mã loại 10) đã “kết thúc” lệnh nhưng đó có thể là bất kỳ ký tự nào mà **không** có mã loại 11.

## Phần 3

Trong Phần 3, chúng ta sẽ tiếp tục từ Hình 5b để hoàn tất phần này của câu chuyện—cách TeX xác định một lệnh—và chuyển sang những gì nó làm tiếp theo. Chúng ta cũng sẽ xem xét sâu hơn một số khía cạnh bên trong của quá trình xử lý của TeX—một số phần trong đó có thể bỏ qua ở lần đọc đầu tiên, trừ khi bạn thực sự thích các chi tiết.

[Phần 1](/latex/vi/chu-de-khac/19-how-tex-macros-actually-work-part-1.md) [Phần 2](/latex/vi/chu-de-khac/20-how-tex-macros-actually-work-part-2.md) [Phần 3](/latex/vi/chu-de-khac/21-how-tex-macros-actually-work-part-3.md) [Phần 4](/latex/vi/chu-de-khac/22-how-tex-macros-actually-work-part-4.md) [Phần 5](/latex/vi/chu-de-khac/23-how-tex-macros-actually-work-part-5.md) [Phần 6](/latex/vi/chu-de-khac/24-how-tex-macros-actually-work-part-6.md)


---

# 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/chu-de-khac/20-how-tex-macros-actually-work-part-2.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.
