> 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/19-how-tex-macros-actually-work-part-1.md).

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

[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ục tiêu của loạt bài này

Loạt bài này có một mục tiêu đầy tham vọng: giải thích *cách* cách các macro TeX (chẳng hạn như các lệnh LaTeX) thực sự hoạt động—ở cấp độ cơ bản nhất, bên trong chính phần mềm bộ máy TeX. Thay vì chỉ dựa vào *chỉ* vào một bộ các macro ví dụ được thiết kế để minh họa nhiều tính năng, các trường hợp biên và hành vi khác nhau của TeX, chúng ta sẽ nhìn vào chính TeX để xem *cách* và *vì sao* các phương pháp lập trình macro của nó hoạt động theo cách như vậy.

Để đạt được mục tiêu của mình, trước hết chúng ta cần thảo luận về những chủ đề khá ở mức thấp và, ban đầu, chúng có thể dường như khá xa với nhiệm vụ dàn trang tài liệu của bạn. Hy vọng rằng, sau khi đi sâu hơn, bạn sẽ có được nền tảng để xây dựng sự hiểu biết tốt hơn, cuối cùng sẽ giúp bạn tiết kiệm rất nhiều thời gian và có lẽ cũng giảm bớt mức độ bực bội.

### Ngôn ngữ lập trình TeX: Bạn có thấy quen không?

Không quá nặng lời khi mô tả ngôn ngữ lập trình TeX là khá bí hiểm, bởi vì nó đúng là như vậy—ít nhất theo tiêu chuẩn của hầu hết các ngôn ngữ lập trình phổ biến ngày nay. Khi bạn bắt đầu hành trình tìm hiểu TeX/LaTeX sâu hơn, đặc biệt nếu bạn muốn viết các macro không tầm thường, bạn sẽ nhanh chóng gặp các khái niệm như mã phân loại, token/quá trình mã hóa token và sự “mở rộng” của các lệnh hoặc macro. Chuỗi khái niệm dồn dập đó có lẽ sẽ khá xa lạ, có thể khiến bạn cảm thấy bối rối và, đôi khi, có lẽ hơi nản lòng, vì con đường dẫn tới thành công của bạn không phải lúc nào cũng được hỗ trợ bởi một số thông báo lỗi gần như khó hiểu của TeX/LaTeX.

## Vậy, chúng ta bắt đầu từ đâu? Với mã phân loại.

Các bộ máy TeX thuộc một lớp phần mềm gọi là [trình biên dịch](https://en.wikipedia.org/wiki/Compiler): các chương trình nhận vào một tệp được viết bằng một *nguồn* ngôn ngữ và *biên dịch* (chuyển đổi) nó thành một tệp đầu ra được viết bằng một *đích* ngôn ngữ. Cụ thể hơn, TeX là một *trình biên dịch tài liệu*. Với các bộ máy TeX (trình biên dịch), tệp đầu vào được viết bằng ngôn ngữ dàn trang TeX và đầu ra là một tệp được viết bằng một “ngôn ngữ” khác như [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) hoặc PDF—mặc dù ở đây chúng ta đang dùng khái niệm “ngôn ngữ” một cách khá linh hoạt.

Hãy xem kỹ hơn ngôn ngữ “nguồn”, hay đầu vào, được dùng để viết tệp TeX của bạn. Một `.tex` tệp xét cho cùng chỉ là một chuỗi ký tự dài (bao gồm cả các ký tự xuống dòng): gồm phần văn bản sẽ được dàn trang xen lẫn với `\`, `}`, `$`, `[` và đủ loại ký tự có thể xuất hiện trong một phạm vi kết hợp dường như gần như vô hạn. Bất kỳ ai không dùng TeX/LaTeX có thể nhìn vào một `.tex` tệp và được tha thứ nếu cho rằng đó chỉ là một mớ ký tự khá rối rắm với rất ít, nếu có, cấu trúc tệp có thể nhìn thấy. Gói macro LaTeX chắc chắn đã phần nào “áp đặt” một số cấu trúc cơ bản lên tệp đầu vào .tex. Tuy nhiên, giữa các `\begin{document}` và `\end{document}` việc đưa gì vào đó là do tác giả tài liệu quyết định. Nếu bạn nhìn vào `.tex` các tệp được viết bằng gói macro Plain TeX nguyên bản của Knuth, bạn sẽ thấy cấu trúc tài liệu gần như hoàn toàn vắng bóng.

Vì vậy, nói chung, một tệp đầu vào TeX có vẻ khá thiếu cấu trúc, như một sự pha trộn dường như ngẫu nhiên giữa nội dung cần dàn trang xen lẫn các chỉ dẫn (lệnh) định hướng việc dàn trang cho nội dung đó. Làm sao TeX có thể hiểu được một `.tex` tệp đầu vào như vậy: lọc mớ ký tự hỗn độn đi vào thành các chỉ dẫn có thể hành động cho bộ máy dàn trang và phần nội dung sẽ được dàn trang?

### Lọc mớ hỗn độn: Hãy làm quen với mã phân loại

Bất kỳ người quan sát nào, không biết gì về TeX, có thể nhìn vào một `.tex` tệp và nhận ra một số ký tự như `$` và biết đó là ký hiệu của một loại tiền tệ, hoặc nhìn thấy một `&` và nhận ra nó là dấu và. Người quan sát đó suy ra một *và* cho mỗi ký tự họ nhìn thấy—một ý nghĩa dựa trên vai trò mà ký tự đó đóng trong giao tiếp của con người. Ngoài ra, họ có thể thấy các ký tự như `a`, `e`, `hoặc` và biết chúng được phân loại là nguyên âm trong khi những ký tự khác như `b`, `c` hoặc `d` được phân loại là phụ âm. Là con người, chúng ta có một kiểu bảng tra cứu tích hợp sẵn (trong trí nhớ) mà qua đó chúng ta gán ý nghĩa cho mỗi ký tự mình thấy—một ý nghĩa dựa trên vai trò mà ký tự đó đảm nhiệm trong các ngôn ngữ mà chúng ta có thể giao tiếp.

Để xử lý một `.tex` tệp, phần mềm TeX cũng phải nhìn vào từng ký tự trong đầu vào của bạn và nó cũng cần gán một *và* cho từng ký tự mà nó “thấy”. Tuy nhiên, TeX chỉ là một cỗ máy dựa trên phần mềm xử lý văn bản—được lưu trữ như một chuỗi các số nguyên (mã ký tự) nằm trong tệp đầu vào. Là một cỗ máy, TeX phải được lập trình với dữ liệu liên quan cho biết cách xác định ý nghĩa của một ký tự mà nó đang “nhìn vào” và sau đó phải làm gì với ký tự đó. TeX đạt được điều này như thế nào?

Câu trả lời là một trong những khái niệm chỉ có ở TeX: *mã phân loại,* trong đó có 16 mã, từ 0 đến 15. Đối với TeX, mọi ký tự mà nó từng mong đợi sẽ thấy trong một `.tex` tệp đều có một cái gọi là *mã loại* được gán sẵn cho nó. Bên trong phần mềm TeX là một kiểu “bảng tra cứu” liệt kê mã phân loại *hiện tại* được gán cho từng ký tự mà TeX có thể thấy trong một tệp .tex đầu vào. Bạn nên xem các mã phân loại của TeX như việc gán một *và* cho từng ký tự riêng lẻ trong luồng đầu vào mà TeX phải kiểm tra (quét).

Để dàn trang tài liệu của bạn, một bộ máy TeX phải đọc (quét) từng ký tự một, nhưng mối quan tâm trực tiếp của TeX không phải là bản thân các ký tự (mã ký tự): *mã loại* có tầm quan trọng lớn hơn khi quét đầu vào. Mỗi ký tự *hiện tại* mã phân loại quyết định *ý nghĩa hiện tại* của ký tự đó *vào thời điểm TeX đọc nó vào*: mã phân loại đó quyết định cách TeX sẽ xử lý từng ký tự—chúng ta sẽ giải thích vì sao chúng ta nói “mã phân loại hiện tại” và “ý nghĩa hiện tại”. Chính nhờ các mã phân loại mà TeX có thể lọc mớ ký tự đi vào để phân biệt giữa các ký tự (nội dung) được dùng để dàn trang và các ký tự tạo thành chỉ dẫn cần được xử lý—*lệnh* mà TeX cần thực thi.

Bảng sau liệt kê 16 mã phân loại đó: mỗi mã biểu thị điều gì cùng với các ví dụ về những ký tự thường được gán cho từng loại.

| **Mã loại** | **Mô tả**                                                            | **LATEX/TEX tiêu chuẩn**                          |
| ----------- | -------------------------------------------------------------------- | ------------------------------------------------- |
| 0           | Ký tự thoát—báo cho TEX bắt đầu tìm một lệnh                         | `\`                                               |
| 1           | Bắt đầu một nhóm                                                     | {                                                 |
| 2           | Kết thúc một nhóm                                                    | }                                                 |
| 3           | Chuyển toán—chuyển vào/ra chế độ toán                                | $                                                 |
| 4           | Tab căn chỉnh                                                        | &                                                 |
| 5           | Kết thúc dòng                                                        | Mã ASCII 13 (`\r`)                                |
| 6           | Tham số macro                                                        | #                                                 |
| 7           | Chỉ số trên—dùng để dàn trang toán học: `$y=x^2$` $$y=x^2$$          | ˆ                                                 |
| 8           | Chỉ số dưới—dùng để dàn trang toán học: `$y=x_2$` $$y=x\_2$$         | \_                                                |
| 9           | Ký tự bị bỏ qua                                                      | ASCII 0 `<null>`                                  |
| 10          | Ký tự khoảng trắng                                                   | Các mã ASCII 32 (dấu cách) và 9 (ký tự tab)       |
| 11          | Chữ cái                                                              | A...Z, a...z, (và hàng nghìn ký tự Unicode)       |
| 12          | Khác                                                                 | 0...9 cùng với ,.;?" và nhiều ký tự khác          |
| 13          | Ký tự chủ động                                                       | Mã danh mục đặc biệt để tạo macro một ký tự như ˜ |
| 14          | Ký tự chú thích—bỏ qua mọi thứ theo sau cho đến hết dòng             | %                                                 |
| 15          | Ký tự không hợp lệ, không được phép xuất hiện trong tệp đầu vào .tex | Mã ASCII 127 (`DEL`)                              |

Việc sử dụng mã phân loại là cơ chế thiết yếu của TeX để lọc luồng ký tự đi vào, hiểu đầu vào của bạn nhằm xác định:

* các ký tự tạo thành văn bản cần được dàn trang;
* phân định nội dung nên được dàn trang dưới dạng toán học;
* các chuỗi ký tự là tên của các lệnh cần được xử lý hoặc thực thi;
* … và nhiều thao tác dàn trang khác.

Ban đầu, bạn có thể nghĩ rằng mã phân loại (ý nghĩa) của mỗi ký tự là một sự gán cố định nào đó: không thể thay đổi và được “đóng băng” vĩnh viễn trong nền tảng bên trong của phần mềm TeX, nhưng không phải vậy. Như đã lưu ý, TeX duy trì một bảng tra cứu nội bộ để lưu chi tiết về mã phân loại nào là *hiện tại* được gán cho từng ký tự—chúng tôi cố ý nói *đang được gán* vì mã phân loại của bất kỳ ký tự nào (chưa được đọc vào) có thể được thay đổi bằng cách dùng một lệnh nguyên thủy (tích hợp sẵn) gọi là `\catcode`catcode.

Nếu bạn chủ yếu quan tâm đến việc dùng LaTeX để “hoàn thành công việc”, rất có thể bạn chưa từng trực tiếp gặp mã phân loại, ngoại trừ có lẽ qua các thông báo lỗi mà bạn đã thấy. Nhưng hãy yên tâm, mã phân loại là một thành phần cốt lõi trong hoạt động của bộ máy TeX: giúp LaTeX (và các gói LaTeX) thực sự làm công việc dàn trang tài liệu của bạn.

Khi bộ máy TeX của bạn khởi động (“[khởi động](https://en.wikipedia.org/wiki/Bootstrapping)”) nó sẽ dùng một bộ gán mặc định các ký tự cho mã phân loại nhưng, thông qua lệnh `\catcode` các mặc định đó có thể được thay đổi bởi mã lõi LaTeX (các macro) và/hoặc bởi các gói LaTeX mà bạn đã nạp—hoặc thậm chí bởi mã TeX hay các macro của chính bạn. Tuy nhiên, theo thời gian và qua truyền thống/cách dùng, một số ký tự được gán cho các mã phân loại nhất định đã được chấp nhận như các “tiêu chuẩn”, và việc tuân thủ các tiêu chuẩn đó chắc chắn là điều đáng mong muốn nếu bạn muốn tài liệu của mình có tính di động và dễ dàng chia sẻ với đồng nghiệp hoặc người dùng khác. Ví dụ, ký tự `\` được gán mã phân loại 0 để chỉ ra sự bắt đầu của một lệnh TeX/LaTeX—xem [bảng ở trên](#tbl-0).

### Đọc (quét) đầu vào

Khi TeX đọc (quét) ký tự tiếp theo từ tệp đầu vào của bạn, điều đầu tiên nó làm là xem mã phân loại của ký tự đó, vậy hãy xem kỹ hơn điều gì xảy ra khi TeX đọc một dòng đầu vào điển hình.

Giả sử chúng ta có một tệp .tex chứa đoạn văn `Hello World \\jobname` ở đâu đó trong một đoạn văn. Nếu chúng ta nhìn vào `.tex` tệp bằng một [trình soạn thảo thập lục phân](https://en.wikipedia.org/wiki/Hex_editor), chúng ta thấy rằng chuỗi ký tự `Hello World \\jobname` trong tệp `.tex` của chúng ta chỉ là một dãy số nguyên, hay *mã ký tự*, được hiển thị trong ảnh chụp màn hình bên dưới dưới dạng chuỗi thập lục phân:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Mã ký tự thập lục phân trong tệp TeX](/files/b18f4c7e52f6b8dcb7afb2e17a6b46508006b58a)

Nếu chúng ta chuyển từ thập lục phân (cơ số 16) sang thập phân (cơ số 10), chuỗi mã ký tự là:

![Mã ký tự thập phân trong tệp TeX](/files/88fb89459a300a8711491377049a387b016020a3)

Chúng ta cũng biết rằng, đối với TeX, mỗi ký tự đều có một mã phân loại tương ứng; vì vậy, dựa trên [bảng ở trên](#tbl-0) chúng ta biết rằng các gán mã phân loại mặc định sau đây (có lẽ) cũng đang được sử dụng:

![Mã phân loại TeX](/files/8f3dea54a56870d4a1d26e3a07b03bf0db338197)

Vì vậy, đối với TeX, mỗi ký tự trong tệp đầu vào được biểu diễn bằng *hai* các giá trị số—mã ký tự và mã phân loại của nó:

![Mã ký tự và mã phân loại TeX tương ứng](/files/5f13bf58c48d19bcab3a7bc04f360d54fe044a43)

Tại thời điểm này, chúng ta mới chỉ xét đến giai đoạn đầu tiên trong quá trình TeX xử lý tệp của bạn: quét từng ký tự riêng lẻ. Vậy TeX thực sự làm gì với các cặp mã ký tự và mã phân loại này? Một khi TeX đã quét một ký tự riêng lẻ và tra cứu mã phân loại tương ứng của nó, chính xác thì TeX sử dụng thông tin này như thế nào để “lọc” các ký tự đi vào?

## Phần 2

Trong phần 2, chúng ta sẽ xem kỹ hơn cách TeX đọc đầu vào của bạn: giả làm “đôi mắt” của TeX khi nó nhìn vào đầu vào của bạn, từng ký tự mộ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/19-how-tex-macros-actually-work-part-1.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.
