> 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/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md).

# \expandafter hoạt động như thế nào: TeX sử dụng các danh sách token tạm thời

[Phần 1](/latex/vi/bai-viet-chuyen-sau/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Phần 2](/latex/vi/bai-viet-chuyen-sau/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Phần 3](/latex/vi/bai-viet-chuyen-sau/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Phần 4](/latex/vi/bai-viet-chuyen-sau/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Phần 5](/latex/vi/bai-viet-chuyen-sau/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Phần 6](/latex/vi/bai-viet-chuyen-sau/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## Mở rộng và các danh sách token nội bộ

Cho đến nay, chúng ta đã tìm hiểu về token, danh sách token và các nguyên tắc cốt lõi đằng sau khái niệm mở rộng của TeX. Trong phần này, chúng ta sẽ sử dụng nguyên thủy TeX `\jobname` để giới thiệu một khía cạnh quan trọng của quá trình xử lý mở rộng: việc TeX sử dụng *các danh sách token tạm thời*—đó là một *cơ bản* khía cạnh của cách `\expandafter` hoạt động, như chúng ta sẽ thấy sau trong loạt bài này.

`\jobname` là một nguyên thủy TeX có thể mở rộng mà phép mở rộng của nó tạo ra một chuỗi các token ký tự biểu thị tên của tệp đầu vào chính `.tex` tệp. Ví dụ, giả sử chúng ta có đoạn văn bản sau là một phần của `.tex` tệp có tên `mycode.tex`:

```
    Tên tệp của tôi là \jobname .tex %Lưu ý khoảng trắng sau \jobname
```

Điều này sẽ dàn chữ thành

```
    Tên tệp của tôi là mycode.tex
```

Khi chúng ta dùng `\jobname` lệnh, các ký tự được dàn ra sẽ không được đọc từ tệp vật lý của bạn `.tex` tệp, vậy chúng đến từ đâu: TeX lưu/đọc các token đó ở đâu? Không nhìn thấy với người dùng (tức là, sâu bên trong chính TeX) quá trình mở rộng của `\jobname` tạo ra một danh sách token tạm thời được dựng từ chuỗi các token ký tự biểu thị tên tệp của bạn. Một khi `\jobname` đã tạo danh sách token đó, TeX tạm thời “chuyển hướng nhìn” khỏi nguồn đầu vào hiện tại của nó (ở đây là, tệp `.tex` tệp) để đọc token (token ký tự) từ danh sách token tạm thời đó. Khi TeX cần thêm một token đầu vào khác, nó sẽ đọc token tiếp theo từ danh sách nội bộ đó và tiếp tục như vậy cho đến khi hết danh sách; lúc đó TeX sẽ tiếp tục đọc token từ nguồn đầu vào trước đó của nó, mà ở đây sẽ là văn bản đọc từ `.tex` tệp đầu vào của chúng ta.

Như hình minh họa sau cho thấy, TeX tiếp tục đọc `.tex` tệp đầu vào tại đúng vị trí nó đã dừng sau khi xử lý `\jobname`—sau khi đọc ký tự khoảng trắng nhưng trước khi đọc ký tự “.”. Dấu chấm (.) trên thực tế đang chờ được đọc từ bộ đệm đầu vào của TeX — một vùng nhỏ trong bộ nhớ TeX được thiết kế để chứa một dòng văn bản được đọc từ `.tex` tệp — TeX đọc và xử lý `.tex` tệp của bạn từng dòng một, nó không nạp toàn bộ tệp vào bộ nhớ.

Khi xem hình minh họa sau, hãy đọc từ dưới lên để theo dõi luồng xử lý.

![Cách TeX mở rộng \jobname](/files/d3d04aa368f0a91a7e41caa7a131db3a1aa7f122)

Nhắc lại phần thảo luận của chúng ta về mở rộng, ta có thể quan sát rằng phép mở rộng của `\jobname` đã dẫn đến việc `\jobname` lệnh (token) bị *loại bỏ* khỏi đầu vào và *được thay thế* với các token phát sinh từ phép mở rộng: danh sách token tạm thời được tạo ra để chứa tên của `.tex` .

Các lệnh có thể mở rộng (như `\jobname`) không phải là những nguyên thủy TeX duy nhất “âm thầm” tạo và sử dụng danh sách token để đạt được hiệu quả của chúng. Ví dụ, các lệnh `\uppercase` và `\lowercase` đều tạo ra các danh sách token nội bộ để đổi chữ hoa/chữ thường của đối số. Khi việc đổi kiểu chữ hoàn tất, TeX chuyển sang đọc các token ký tự từ các danh sách token do những lệnh đó tạo ra. Danh sách token là cơ chế duy nhất của TeX để “lưu trữ dữ liệu token” — ngoài việc ghi dữ liệu ra một tệp đĩa vật lý.

### Nguồn của token: TeX là một bậc thầy tung hứng

Khi TeX xử lý một tài liệu thông thường, nó phải quản lý *nhiều* nguồn token: đầu vào đến từ vô số tệp đĩa vật lý và vô số danh sách token nội bộ được tạo ra trong quá trình xử lý. Trong phần này, chúng ta sẽ rất ngắn gọn tìm hiểu cách TeX có thể “tung hứng” các nguồn đầu vào đó.

Giả sử chúng ta muốn một macro đơn giản để dàn chữ tên của `.tex` tệp:

```
    \def\myfile{Tên tệp của tôi là \jobname .tex}
```

Sau đó, vào một thời điểm nào đó trong `.tex` tệp, chúng ta gọi macro `\myfile`: tạm thời, TeX chuyển từ việc tạo/đọc token qua văn bản trong tệp văn bản của bạn (`.tex`) sang việc đọc token từ `\myfile` định nghĩa (danh sách token) được lưu trong bộ nhớ của nó. Khi TeX thực thi `\myfile` macro (xử lý các token của nó) nó sẽ phát hiện một token đại diện cho `\jobname` lệnh, mà phép mở rộng của nó lại tạo ra một danh sách token tạm thời khác từ đó TeX phải đọc token. Ngay cả trong tình huống đơn giản này, TeX vẫn phải quản lý ba nguồn đầu vào:

1. trang `.tex` tệp văn bản chứa `\myfile` macro;
2. danh sách token lưu định nghĩa của `\myfile` macro;
3. một danh sách token được tạo bởi `\jobname` lệnh bên trong `\myfile` macro.

Khi TeX xử lý một tài liệu, nó liên tục chuyển đổi giữa các nguồn đầu vào: các tệp vật lý và danh sách token, vậy TeX theo dõi việc này như thế nào? Câu trả lời là, ở bên trong, các bộ máy TeX duy trì một cái gọi là [ngăn xếp đầu vào](https://en.wikipedia.org/wiki/Stack_\(abstract_data_type\)) hoạt động như một dạng “bộ nhớ” giúp TeX ghi nhớ nó đang làm gì (đang đọc từ đâu) khi nó chuyển giữa các nguồn đầu vào.

Không đi quá sâu vào chi tiết, mã nội bộ trong các bộ máy TeX sử dụng một biến toàn cục gọi là `curinput` (đầu vào hiện tại), trong đó, ngoài các thứ khác, cho TeX biết liệu hiện tại nó đang đọc từ một tệp vật lý hay danh sách token. `curinput` cũng chỉ cho TeX vị trí (trong danh sách token hiện tại hoặc bộ đệm văn bản của nó) từ đó nó phải lấy token tiếp theo. Nếu TeX đang đọc từ một danh sách token `curinput` cũng ghi lại loại danh sách token nào đang được xử lý — ví dụ, danh sách token được lưu dưới dạng macro hay các token đó phát sinh từ một nguồn khác.

Khi cần, biến `curinput` sẽ được thay đổi để trỏ tới một nguồn đầu vào mới và “trạng thái đầu vào” hiện tại của TeX (nguồn và vị trí) sẽ được lưu trong ngăn xếp đầu vào để TeX có thể quay lại đúng vị trí đó sau này (vị trí trong một `.tex` tệp hoặc token tiếp theo trong một danh sách token). Khi nguồn đầu vào mới đó cạn kiệt (ví dụ, không còn token nào trong danh sách token hoặc đã tới cuối tệp) nó sẽ được lấy ra khỏi ngăn xếp và `curinput` được cập nhật để đảm bảo TeX quay lại lấy token từ nguồn trước đó.

## Tìm hiểu sâu hơn (đọc thêm tùy chọn)

Các phần sau cung cấp thêm thông tin nền cho những độc giả thích tìm hiểu chi tiết.

### Danh sách token thực

Hình minh họa sau được tạo bằng bản dựng TeX tùy chỉnh của Knuth trên Overleaf, vốn cho phép truy cập dữ liệu và cấu trúc dữ liệu nội bộ của TeX. Minh họa về danh sách token này dựa trên phiên bản đơn giản hóa đã trình bày ở trên và bao gồm dữ liệu bổ sung, chẳng hạn như hiển thị các ký tự được tạo bởi `\jobname` có mã phân loại 12, không phải mã phân loại thông thường là 11. Trong sơ đồ này, “node” chỉ là tên gọi của một đơn vị lưu trữ bộ nhớ được TeX sử dụng.

![Bên trong một danh sách token của TeX](/files/4bdaa8fb207da6c254cd81ea8474e23d6c4275a0)

### Cách TeX đọc và xử lý \jobname

Ngoài ra, để đầy đủ, sau đây là tổng quan về “quá trình suy nghĩ” của TeX khi nó phát hiện `\jobname` trong đầu vào của chúng ta `.tex` tệp. Trong hình minh họa này, ta thấy TeX phát hiện một ký tự thoát (`\` với mã phân loại 0), xử lý chuỗi ký tự `jobname`, tạo ra một token và tra cứu ý nghĩa của `\jobname` lệnh, nơi TeX sẽ phát hiện nó có mã lệnh > 100, cho biết đây là một lệnh có thể mở rộng.

![Cách TeX quét và xử lý \jobname](/files/a214315191db9f15d842686cf25eefb5f7649270)

[Phần 1](/latex/vi/bai-viet-chuyen-sau/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Phần 2](/latex/vi/bai-viet-chuyen-sau/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Phần 3](/latex/vi/bai-viet-chuyen-sau/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Phần 4](/latex/vi/bai-viet-chuyen-sau/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Phần 5](/latex/vi/bai-viet-chuyen-sau/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Phần 6](/latex/vi/bai-viet-chuyen-sau/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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/bai-viet-chuyen-sau/21-how-does-expandafter-work-tex-uses-temporary-token-lists.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.
