> 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/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md).

# Một loạt bài viết mới: Các token TeX và các khái niệm liên quan—Nhưng tại sao (và như thế nào)?

Bài viết mở đầu này nhằm giải thích vì sao loạt bài này được viết, tôi hy vọng đạt được điều gì, và cung cấp thông tin nền về các kỹ thuật được dùng để khám phá các token TeX thông qua việc quan sát hoạt động bên trong của một bộ máy TeX. Trang bài viết này cũng được thiết kế để chứa các liên kết tới toàn bộ các bài trong loạt bài và sẽ được cập nhật để bổ sung các liên kết đó khi mỗi bài mới được xuất bản.

### Liên kết đến các bài viết

Mỗi bài viết sẽ chứa một tập hợp liên kết đến các bài viết khác trong loạt bài này.

* [“TeX token” là gì?](/latex/vi/bai-viet-chuyen-sau/53-what-is-a-tex-token.md)
* [“Danh sách token TeX” là gì?](/latex/vi/bai-viet-chuyen-sau/54-what-is-a-tex-token-list.md)

## Bối cảnh của loạt bài này

Động lực để viết loạt bài này xuất phát từ việc đọc tài liệu về TeX, trong đó giải thích nhiều hoạt động của TeX thông qua khái niệm “token” cùng với “quá trình token hóa” của TeX, “danh sách token” và các khái niệm liên quan như “mở rộng macro” và “các lệnh có thể mở rộng”. Bất cứ khi nào tôi gặp những lời giải thích liên quan đến TeX được diễn đạt theo thuật ngữ “TeX tokens”, cùng một câu hỏi lại hiện lên trong đầu: Chính xác thì, *là* một token TeX? Tôi cần phải tìm ra.

Phạm vi và nội dung của bài viết đầu tiên, [“TeX token” là gì?](/latex/vi/bai-viet-chuyen-sau/53-what-is-a-tex-token.md), tự thân nó, theo đúng bản chất, khá “sát với phần cứng” như các lập trình viên có thể nói, và không nghi ngờ gì rằng “TeX tokens” có thể được xếp vào loại chủ đề khá huyền bí để viết về: vậy tại sao lại phải bận tâm? Cuối cùng, bạn chọn một quan điểm—hoặc có lẽ là một bước nhảy của niềm tin—rằng người khác cũng có thể đang băn khoăn về cùng chủ đề đó và rằng vẫn còn chỗ cho một hoặc hai bài viết để lấp một số khoảng trống. Mục tiêu của tôi là cung cấp một số giải thích nền tảng hữu ích có thể bổ sung cho những tài liệu khác mà bạn đang đọc và, hy vọng, giúp hiểu tốt hơn một số khái niệm then chốt nảy sinh khi bạn tìm hiểu về TeX và khám phá macro cũng như lập trình.

Rõ ràng, trong phạm vi của các bài blog, chúng ta chỉ có thể lướt qua bề mặt—đơn giản là không thực tế nếu cố gắng giải thích mọi chủ đề đáng chú ý hoặc lặn xuống những vùng nước tối tăm nhất. Do yêu cầu cần thiết, tôi sẽ bỏ qua khá nhiều chi tiết và đi trên lằn ranh mong manh giữa việc quá đơn giản hóa và đẩy các phép so sánh đến mức gãy đổ.

“Hãy viết những bài bạn muốn được đọc” là một nguyên tắc hữu ích và là điều tôi đã cố gắng áp dụng khi viết loạt bài này.

## Đã đặt câu hỏi rồi, giờ thì sao?

Thử thách trước mắt rất rõ ràng: làm thế nào để tìm hiểu về các token TeX, vì những chi tiết như vậy (về token, token hóa, v.v.) bị chôn sâu trong mã phần mềm của các bộ máy TeX—thực ra bạn không cần phải bận tâm về điều đó, trừ khi, dĩ nhiên, bạn thực sự quan tâm đến những chi tiết ấy.

Một cách để tìm lời giải cho những câu hỏi này là cố gắng đọc qua mã nguồn gốc của TeX trong [`tex.web`](https://www.ctan.org/tex-archive/systems/knuth/dist/tex)—bằng cách chạy [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) để trích xuất tài liệu TeX—hoặc bằng cách mua một bản sao của cuốn sách [Computers & Typesetting, Tập B: TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TEX-Program-v/dp/0201134373). Tôi đã mua một bản in của cuốn sách! Chắc chắn việc mã nguồn TeX được xuất bản dưới dạng sách là cực kỳ hữu ích và tất nhiên có rất nhiều phần giải thích hữu ích xuyên suốt. Tuy nhiên, TeX của Knuth được viết bằng Pascal và, một cách tự nhiên, mã nguồn Pascal được chú thích theo phương pháp lập trình văn học của Knuth—trình bày mã theo từng đoạn nhỏ, dễ tiếp thu. Dễ thấy rằng cách tiếp cận tài liệu của Knuth thực sự giúp ích rất nhiều cho một phần mềm phức tạp như TeX, nhưng việc đọc cuốn sách quả thật đòi hỏi khá nhiều việc đối chiếu chéo và lật qua lại giữa các trang.

Mặc dù hữu ích, riêng cuốn sách vẫn chưa đủ đối với tôi để hiểu rõ hơn điều gì xảy ra khi TeX tạo ra các “token”—chủ đề mà tôi đặc biệt quan tâm. Chỉ có một cách để thực sự tìm ra: xây dựng chương trình TeX, chạy nó trên một tệp TeX nhỏ và đúng nghĩa là quan sát mã chạy khi TeX quét và đọc đầu vào. Các chi tiết về việc xây dựng TeX từ mã nguồn khá huyền bí—chuyển Pascal sang C—nhưng ở phần tiếp theo có một mô tả ngắn cùng với liên kết đến một bài đăng blog cá nhân đi sâu hơn vào chi tiết.

Không giống XeTeX và LuaTeX—có thể xử lý văn bản ở định dạng UTF-8 và hỗ trợ mã hóa Unicode—TeX của Knuth là một bộ máy 8-bit, nghĩa là nó giả định các ký tự đầu vào nằm trong phạm vi từ 0 đến 255. Mặc dù đây là một khác biệt quan trọng, nó không *đáng kể* ảnh hưởng đến thảo luận của chúng ta về các token TeX vì chúng ta bao quát những chủ đề và nguyên lý chung cho mọi bộ máy TeX: chúng là cốt lõi của phần mềm.

## Làm thế nào để bạn nghiên cứu các token TeX?

Việc gỡ rối con đường từ văn bản đầu vào đến các token TeX, đối với tôi, là cả một hành trình—tôi phải thú nhận rằng những mức độ bối rối khác nhau gần như là người bạn đồng hành thường trực suốt chặng đường: TeX là một phần mềm phức tạp đến vậy.

Trong vài năm qua (từ khoảng năm 2009), tôi thường xuyên biên dịch phiên bản mới nhất của LuaTeX từ mã nguồn của nó—một quá trình khá đơn giản nhờ cách phân phối mã nguồn LuaTeX thực sự tuyệt vời. Dựa trên kinh nghiệm đó, tôi bắt đầu quan tâm đến việc hiểu rõ hơn cách xây dựng TeX nguyên bản của Knuth từ mã nguồn của nó—a *rất* khác, vì TeX được viết bằng phương pháp lập trình văn học của Knuth. Bản dựng TeX cá nhân đó, trên Windows nhưng sử dụng các trình biên dịch và bộ công cụ mã nguồn mở, được thực hiện bên ngoài bản phân phối TeX Live và là một dự án độc lập. Nó cũng đòi hỏi phải xây dựng chuỗi công cụ cần thiết để chuyển đổi `tex.web` thành một chương trình C có thể được biên dịch rồi thực thi trong trình gỡ lỗi để xem TeX thực sự làm gì khi xử lý các ký tự đầu vào.

TeX nguyên bản của Knuth được dùng thay vì pdfTeX, XeTeX hay LuaTeX vì tôi cần một phiên bản TeX gần nhất với mã nguồn được in trong cuốn TeX: The Program. Cuốn sách đó được xuất bản lần đầu vào năm 1986 và mặc dù TeX đã có một số cập nhật kể từ thời điểm đó, phiên bản mới nhất của TeX (3.14159265, phát hành vào tháng 1 năm 2014) chắc chắn vẫn đủ gần với mã nguồn có trong cuốn sách.

Phản ánh phương pháp lập trình văn học của Knuth, mã nguồn TeX được phân phối ở định dạng văn bản gọi là WEB: một sự pha trộn giữa tài liệu TeX và mã nguồn Pascal. Ý tưởng cơ bản là bạn dùng hai tiện ích gọi là TANGLE và WEAVE, xử lý các tệp WEB để trích xuất либо tài liệu TeX hoặc mã nguồn Pascal:

* [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) trích xuất mã nguồn Pascal từ một tệp WEB
* [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) trích xuất tài liệu TeX từ tệp WEB

Tuy nhiên, trước khi trích xuất mã nguồn Pascal, bạn phải tiền xử lý `tex.web` tệp *để áp dụng một số thay đổi cho phép chuyển mã Pascal của TeX sang mã C bằng một quy trình gọi là Web2C. Bước tiền xử lý này được gọi là*.

áp dụng các tệp thay đổi `.ch`Tệp mã gốc của Knuth (tex.web) không được chỉnh sửa trực tiếp dưới bất kỳ hình thức nào; thay vào đó, bạn áp dụng các sửa đổi bằng cái gọi là tệp thay đổi (phần mở rộng `.web` tệp—chẳng hạn như `tex.web`. Các tệp thay đổi được ghép với mã nguồn gốc của Knuth—bằng một chương trình tiện ích bổ sung tên là TIE—để tạo ra một tệp chẳng hạn như `mytex.web` mà bạn xử lý bằng TANGLE để trích xuất mã Pascal vào `mytex.pas`. Khi bạn có một tệp mã nguồn Pascal phù hợp, bạn có thể thực hiện các bước cuối cùng trong quy trình Web2C để chuyển nó thành một tệp mã nguồn C mà bạn có thể biên dịch thành một chương trình TeX thực thi được. Nếu bạn muốn đọc về quy trình chuyển đổi Web2C khá rắc rối này, có thêm chi tiết trên [trang blog cá nhân của tác giả này](http://www.readytext.co.uk/?p=2529).

Kết quả cuối cùng là một chương trình TeX có thể được chạy bằng [Eclipse IDE for C/C++](http://www.eclipse.org/home/index.php) để chạy từng bước qua mã nguồn TeX (bằng C) và xem điều gì xảy ra khi nó quét qua dữ liệu đầu vào của bạn. Chắc chắn đây không phải là cách giải trí hấp dẫn nhất vì mã C được tạo tự động và ở một số chỗ cực kỳ khó theo dõi (mã nguồn TeX sử dụng GOTO và biến toàn cục rất nhiều). Cuốn sách TeX: The Program vẫn vô cùng quý giá để giúp định hướng trong mã nguồn C, dù cuốn sách chứa mã nguồn TeX ở dạng mã Pascal được dàn trang đẹp mắt.

Để khép lại phần thảo luận, dưới đây là một ảnh chụp màn hình ví dụ cho thấy TeX đang được thực thi qua Eclipse IDE với việc chạy tạm dừng ở hàm `getnext()`—hàm này nằm ở trung tâm của các quá trình tạo token của TeX.

![Ảnh chụp màn hình cho thấy TeX được thực thi qua Eclipse IDE](/files/9701b0fc91e85af867971c40047c6621563004c9)

Dò từng bước qua mã nguồn C của TeX bằng Eclipse IDE mã nguồn mở cho C/C++.

## Kết luận và lời cảm ơn

Viết bài đầu tiên và tập hợp ý tưởng cho các bài blog tương lai trong loạt bài này chắc chắn đã tốn khá nhiều thời gian. Tôi vô cùng biết ơn John Hammersley và Mary Anne Baynes tại Overleaf vì sự hỗ trợ của họ cho ý tưởng loạt bài này và vì đã cho phép tôi dành thời gian cần thiết cho việc nghiên cứu bổ sung về bối cảnh. Tôi hy vọng loạt bài này thành công trong việc xác định và giải quyết các chủ đề mà nhiều người quan tâm chung và chứng tỏ có giá trị đối với những ai đọc 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/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.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.
