> 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/18-how-overleaf-created-the-tex-primitive-reference-data.md).

# Cách Overleaf tạo dữ liệu tham chiếu các lệnh nguyên thủy TeX

Bài viết này mô tả các phương pháp và kỹ thuật được dùng để tạo ra hai bảng đối chiếu chéo của các lệnh nguyên thủy TeX:

* [Các lệnh nguyên thủy của TeX được liệt kê theo bộ máy TeX](/latex/vi/chu-de-khac/46-tex-primitives-listed-by-tex-engine.md) và;
* [Các lệnh nguyên thủy của TeX được liệt kê theo bộ máy CJK TeX](/latex/vi/chu-de-khac/45-tex-primitives-listed-by-cjk-tex-engine.md).

Thông tin này được cung cấp cho những độc giả quan tâm đến các chi tiết tinh vi hơn, nhưng không phải là điều kiện tiên quyết để sử dụng chính bảng đối chiếu chéo. Để đáp ứng nhu cầu của các độc giả khác nhau, chúng tôi cung cấp một phiên bản tóm tắt rất ngắn cùng với phần giải thích dài hơn cho những ai muốn tìm hiểu sâu hơn các vấn đề.

## Phiên bản tóm tắt/ngắn gọn

Để xây dựng bảng đối chiếu chéo, Overleaf đã xử lý mã nguồn của 9 bộ máy TeX để trích xuất danh sách các lệnh nguyên thủy được hỗ trợ bởi từng bộ máy: quá trình đó tạo ra 9 tệp văn bản (mỗi bộ máy TeX một tệp). Chín tập hợp lệnh nguyên thủy đó được kết hợp để tạo ra một “danh sách chính”, về thực chất là hợp của các tập hợp lệnh nguyên thủy riêng lẻ: từ đó cho ra tổng cộng khoảng 1000 lệnh nguyên thủy duy nhất rải khắp các bộ máy khác nhau. Với mỗi bộ máy, danh sách lệnh nguyên thủy riêng của nó được đối chiếu chéo với tệp chính (tập hợp của tất cả các lệnh) để xác định trong số khoảng 1000 lệnh đó nó hỗ trợ những lệnh nào: các phép so sánh này được trình bày trong hai bảng sau:

* [Dữ liệu đối chiếu chéo các lệnh nguyên thủy TeX](/latex/vi/chu-de-khac/46-tex-primitives-listed-by-tex-engine.md)
* [Dữ liệu đối chiếu chéo các lệnh nguyên thủy TeX (dành cho các bộ máy CJK)](/latex/vi/chu-de-khac/45-tex-primitives-listed-by-cjk-tex-engine.md)

## “Xây dựng phần mềm” 101: Điều đó có nghĩa là gì?

Trong suốt phần còn lại của bài viết này, chúng ta đề cập đến khái niệm “biên dịch các bộ máy TeX”, một khái niệm có thể xa lạ nếu bạn không phải là lập trình viên, hoặc không lập trình bằng các ngôn ngữ biên dịch như C hay C++. Với mục đích của chúng ta, biên dịch phần mềm — tức là các bộ máy TeX — là quá trình tạo ra một chương trình TeX có thể thực thi từ các thành phần của nó — các tệp mã nguồn được viết bằng ngôn ngữ lập trình dùng để phát triển chương trình.

## Phiên bản đầy đủ: Muốn biết chi tiết? Hãy đọc tiếp...

Mỗi bộ máy dàn trang dựa trên TeX đều hỗ trợ một “phương ngữ” của ngôn ngữ TeX: một tập hợp cụ thể các lệnh nguyên thủy điều khiển các tính năng dàn trang của từng bộ máy và cung cấp các khối xây dựng để tạo/định nghĩa macro: các chuỗi lệnh do người dùng tự định nghĩa. Mọi macro, dù được viết cho LaTeX, plain TeX hay bất kỳ gói macro nào khác, cuối cùng đều được cấu thành từ các lệnh nguyên thủy — mặc dù bạn có thể phải đi sâu xuống khá xa, qua nhiều lớp macro bổ sung, trước khi chạm tới “lớp nền móng” của các lệnh nguyên thủy TeX. Tập hợp 9 bộ máy TeX được phân tích để tạo ra dữ liệu tham chiếu về các lệnh nguyên thủy dĩ nhiên có nhiều lệnh chung, nhưng mỗi bộ máy TeX cũng có các lệnh nguyên thủy riêng của nó, do các nhà phát triển thêm vào, để hỗ trợ các tính năng đặc thù của “phiên bản” TeX đó.

Các lệnh nguyên thủy của một bộ máy TeX được tích hợp sẵn trong phần mềm TeX thực thi: các lệnh nguyên thủy không phải là macro do người dùng tạo ra, mà là các chỉ dẫn cơ bản, không thể chia nhỏ/ nguyên tử, được dùng để điều khiển hành vi dàn trang của từng bộ máy. Vì vậy, cách đáng tin cậy nhất để tạo một danh sách dứt khoát các lệnh nguyên thủy được bất kỳ bộ máy TeX nào hỗ trợ là xem xét chính mã nguồn từ đó các chương trình TeX thực thi được xây dựng (biên dịch) và trích xuất danh sách các lệnh nguyên thủy được định nghĩa trong mã nguồn đó. Nghe có vẻ dễ, đúng không? Tuy nhiên, do lịch sử phát triển kéo dài 40 năm của TeX, việc khám phá/xem xét các tệp mã nguồn của các bộ máy TeX (trừ LuaTeX) không hề đơn giản. Lý do của những phức tạp đó nằm ở các công cụ, ngôn ngữ lập trình (Pascal) và phương pháp luận (lập trình có chú giải) mà Knuth đã dùng để viết mã nguồn TeX nguyên thủy — từ đó, rốt cuộc, tất cả các bộ máy khác đều kế thừa.

Chúng tôi lưu ý một ngoại lệ với LuaTeX vì mã lõi của bộ máy này đã được viết lại bằng C để loại bỏ việc dùng Pascal và các phức tạp kế thừa khác được nêu chi tiết bên dưới (Web2C); do đó, mặc dù mã nguồn của LuaTeX khá lớn, cách nó được “đóng gói” và phân phối lại dễ hiểu hơn nhiều so với các bộ máy TeX khác. Vì thế, dựa trên quy trình/các bước dùng để xây dựng chúng từ mã nguồn, sẽ thuận tiện hơn nếu nhóm các bộ máy TeX thành hai loại:

1. LuaTeX: quy trình biên dịch tùy chỉnh (hiện đại hơn)
2. Tất cả các bộ máy khác: quy trình biên dịch kế thừa (Web2C)

## Bối cảnh của mã kế thừa: Vì sao việc biên dịch (hầu hết) các bộ máy TeX lại phức tạp

Như chúng ta sẽ khám phá bên dưới, Knuth đã phát hành mã nguồn TeX gốc của mình dưới dạng một tệp đơn, nguyên khối có tên `tex.web` mà cứ 7 năm một lần, Knuth vẫn tiếp tục cập nhật để sửa bất kỳ lỗi còn sót nào — không bao giờ có tính năng mới nào được thêm vào, đó thuần túy là một việc sửa lỗi.

Phần mở rộng của mã nguồn TeX (`.web`) có lẽ không quen thuộc và bạn có thể tự hỏi Knuth đã dùng ngôn ngữ nào để viết TeX? Câu trả lời là Pascal nhưng phần `.web` cần được giải thích thêm một chút. Knuth đã phát triển một phương pháp lập trình mà ông gọi là [lập trình có chú giải](https://en.wikipedia.org/wiki/Literate_programming) trong đó mã nguồn và tài liệu của một chương trình được kết hợp với nhau và phát hành dưới dạng một tệp tổng hợp duy nhất (mã + tài liệu) với phần mở rộng `.web`: kiểu tệp đó được gọi là tệp WEB. Chúng tôi sẽ giải thích về các tệp WEB chi tiết hơn một chút bên dưới.

### Tạo ra các bộ máy TeX mới: Những ràng buộc của Knuth

Mặc dù Knuth từ lâu đã công khai mã nguồn TeX của mình (`tex.web`) cho tất cả mọi người, ông đã, như quyền tuyệt đối của mình, đặt ra một ràng buộc quan trọng rằng mã nguồn (`tex.web`) của ông không được phép chỉnh sửa/sửa đổi trực tiếp rồi phân phối lại với tên chương trình “TeX”. Trong mã nguồn, ông viết:

```
% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved.
% Copying of this file is authorized only if (1) you are D. E. Knuth, or if
% (2) you make absolutely no changes to your copy. (The WEB system provides
% for alterations via an auxiliary file; the master file should stay intact.)
```

và cả:

```
Nếu chương trình này bị thay đổi, hệ thống tạo ra không nên được gọi là
`\TeX'; tên chính thức `\TeX' tự thân nó được dành riêng
cho các hệ phần mềm hoàn toàn tương thích với nhau.
Một bộ kiểm thử đặc biệt gọi là “\.{TRIP} test” có sẵn để
giúp xác định liệu một cách hiện thực cụ thể có xứng đáng được
được gọi là `\TeX' [cf.~báo cáo Khoa học Máy tính Stanford CS1027,
tháng 11 năm 1984].
```

Về bản chất: đừng chỉnh sửa rồi phân phối các phiên bản đã sửa đổi của mã nguồn TeX gốc và tiếp tục gọi nó là `tex.web`. Nếu bạn thực sự muốn thay đổi, ví dụ thêm các lệnh nguyên thủy mới, thì bạn phải áp dụng các thay đổi đó bằng cách thực hiện “các sửa đổi thông qua một tệp phụ trợ” và đặt cho chương trình “phiên bản phái sinh của TeX” của bạn một cái tên phân biệt nó với “TeX”, mà ở dạng in kiểu ($$\mathrm\TeX$$), là nhãn hiệu của Hiệp hội Toán học Hoa Kỳ.

### Sự kế thừa của mã cũ

Mặc dù đã có những nỗ lực viết lại hoàn toàn TeX bằng các ngôn ngữ và phương pháp lập trình hiện đại — chẳng hạn như hai sáng kiến dựa trên Java [Hệ thống dàn trang mới](https://en.wikipedia.org/wiki/New_Typesetting_System) và [εχTEX](http://www.extex.org/) và các dự án khác như [một dự án bằng Clojure](https://www.infoq.com/news/2015/01/implementing-tex-in-clojure), thì không dự án nào hoàn toàn thành công. Lịch sử của các dự án và sáng kiến nhằm tiếp tục phát triển TeX là một chủ đề thú vị và độc giả có thể muốn [truy cập UK TeX FAQ](https://texfaq.org/FAQ-enginedev) để biết thêm thông tin.

Những sáng kiến không phải LuaTeX mà cũng đã thành công, như e-TeX, pdfTeX, XeTeX và các bộ máy khác, đều được xây dựng *trực tiếp lên trên* mã gốc của Knuth: lấy mã nguồn của ông và “áp dụng các thay đổi” để tạo ra một bộ máy mới với các khả năng bổ sung — chẳng hạn như thêm các lệnh nguyên thủy mới, tạo ra đầu ra PDF, hỗ trợ nhập văn bản UTF-8, v.v. Dù con đường đó đã dẫn đến những thành công đáng kể, nó cũng có nghĩa là các bộ máy phái sinh ấy kế thừa mã cũ và các kỹ thuật phát triển mà Knuth đã tạo ra cách đây 40 năm.

Điều mấu chốt ở đây là, ngoại trừ LuaTeX, hầu hết các bộ máy TeX được phái sinh từ mã nguồn gốc của Knuth đều được tạo ra bằng cách lấy một tệp đơn nguyên khối (thường là `tex.web`) và áp dụng các thay đổi tạo ra thêm một tệp đơn nguyên khối khác chứa mã nguồn lõi của bộ máy mới. Những độc giả nâng cao có thể muốn bỏ qua đến phần [ghi chú về pdfTeX và XeTeX](#aside-xetex-and-pdftex).

### Một chút lịch sử/bối cảnh bổ sung về TeX

Khoảnh khắc khai sinh của TeX là [được ghi lại trong nhật ký của Knuth là ngày 30 tháng 3 năm 1977](/latex/vi/bai-viet-chuyen-sau/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md#the-genesis-of-tex-a-brief-history), nay đã hơn 40 năm trước. Về mặt nội bộ, TeX là một chương trình cực kỳ phức tạp, mà Knuth đã rất công phu để [ghi chép với chi tiết đặc biệt](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373). Để làm điều đó, Knuth đã phát triển một phong cách lập trình mà ông gọi là [lập trình có chú giải](https://en.wikipedia.org/wiki/Literate_programming) trong đó mã nguồn và tài liệu của một chương trình được kết hợp lại và phát hành dưới dạng một tệp tổng hợp có phần mở rộng `.web` (được gọi là tệp WEB). Knuth chọn Pascal làm ngôn ngữ lập trình để viết phần mềm TeX của mình và, không ngạc nhiên, dùng ngôn ngữ dàn trang TeX để viết tài liệu cuối cùng. Do đó, mã nguồn chính của TeX do Knuth biên soạn được xuất bản dưới dạng một tệp đơn, nguyên khối, có tên `tex.web`: một sự pha trộn giữa mã nguồn Pascal và mã dàn trang TeX cho phần tài liệu.

Nếu một chương trình được viết bằng phong cách/phương pháp lập trình có chú giải của Knuth (như TeX, MetaFont, BibTeX và các chương trình khác) thì bạn cần tiền xử lý tệp WEB để trích xuất tài liệu hoặc mã nguồn. Để truy cập tài liệu của chương trình, bạn xử lý tệp WEB (ví dụ, `tex.web`) bằng một tiện ích có tên [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) để tạo ra tài liệu dưới dạng một `.tex` tệp mà bạn có thể dàn trang. Để trích xuất mã nguồn bằng Pascal, bạn dùng một tiện ích khác có tên [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) đầu ra một tệp có phần mở rộng `.p` chứa mã nguồn Pascal.

Tại thời điểm viết bài (đầu năm 2019), phiên bản mới nhất của TeX do Knuth là 3.14159265, có ngày tháng tháng 1 năm 2014. Một lần nữa, hãy lưu ý rằng mã nguồn TeX của Knuth chỉ nằm trong một tệp duy nhất chứa khoảng 25.000 dòng mã TeX/Pascal!

### Từ Pascal sang C

Trong hơn 40 năm kể từ khi TeX ra đời, Pascal đã lỗi thời và ngày nay hầu như chẳng còn ai, nếu có!, nghĩ đến việc xây dựng TeX từ mã nguồn Pascal gốc của nó. Để né việc Knuth dùng Pascal, một quy trình làm việc có tên [Web2C](http://tug.org/texinfohtml/web2c.html) đã được thiết kế (khoảng năm 1987), trong đó mã nguồn Pascal của TeX được chuyển đổi một cách cơ học (tức là bằng phần mềm) sang phiên bản tương đương bằng mã C, rồi dùng mã đó để biên dịch TeX và xây dựng chương trình thực thi. Nó hoạt động tốt nhưng nhược điểm duy nhất là mã nguồn C được tạo ra tự động không nhằm để con người xem xét tùy ý: nó *cực kỳ* dài dòng và gần như không thể xuyên thủng, vì được dành cho trình biên dịch chứ không phải cho con người — đây là ảnh chụp màn hình cho thấy một đoạn nhỏ mã C được tạo từ mã nguồn Pascal của TeX:

![](/files/1f87cb9163e0002042946493981561bbbc87d94a)

### Một Knuth-ism khác: các tệp thay đổi WEB

Như đã lưu ý ở trên, để xây dựng dựa trên mã nguồn gốc của Knuth, bạn “áp dụng các thay đổi” hoặc, theo lời Knuth, thực hiện “các sửa đổi thông qua một tệp phụ trợ”: nhưng điều đó thực sự có nghĩa là gì? Hãy đến với *cơ chế tệp thay đổi*.

### Tệp thay đổi: cơ chế để tạo ra các bộ máy TeX mới

Những nhà phát triển muốn mở rộng TeX của Knuth theo một cách nào đó, tức là xây dựng trên công trình gốc của Knuth, thường muốn tạo ra một “phiên bản” TeX hoàn toàn mới hoặc cung cấp một *phần mở rộng* có thể được thêm vào bất kỳ bộ máy TeX nào. Các ví dụ về phần mở rộng bao gồm [SyncTeX](https://github.com/jlaurens/synctex) và [EncTeX](https://ctan.org/pkg/enctex?lang=en)—ví dụ, SyncTeX là một phần mở rộng rất hữu ích hiện nay đã được bao gồm trong tất cả các bộ máy TeX. Nhu cầu về EncTeX phần lớn đã bị vượt qua bởi sự phát triển của các bộ máy TeX hiểu Unicode — nhưng lưu ý rằng EncTeX được tích hợp sẵn trong pdfTeX.

Dù mong muốn là tạo ra một “phiên bản” TeX mới (tức là một sản phẩm phái sinh từ TeX gốc của Knuth) hay tạo ra một phần mở rộng, các nhà phát triển đều bắt đầu từ mã nguồn gốc của Knuth và áp dụng những sửa đổi cần thiết để tạo ra một bộ máy TeX mới (hoặc một phần mở rộng cài thêm). Tuy nhiên, như đã lưu ý ở trên, bất kỳ ai muốn sửa đổi hành vi của TeX đều cần làm điều đó bằng “các sửa đổi thông qua một tệp phụ trợ” vì những thay đổi/sửa đổi đó không được phép thực hiện bằng cách *trực tiếp* chỉnh sửa mã nguồn gốc của Knuth: các nhà phát triển bắt buộc phải dùng cái gọi là WEB *cơ chế tệp thay đổi*. Mã để sửa đổi TeX của Knuth được viết bằng “ngôn ngữ” WEB và lưu vào một hoặc nhiều tệp mã (gọi là *tệp thay đổi*) sau đó được *ghép* với mã nguồn gốc, chưa bị động đến, của Knuth. Quá trình ghép đó tạo ra một tệp WEB tổng hợp mới hiện chứa *mã nguồn lõi* của phần mềm TeX dựa trên/đã sửa đổi mới. *Tệp thay đổi* thường có phần mở rộng `.ch` nhưng trong thực tế, chúng có thể mang bất kỳ phần mở rộng nào mà nhà phát triển muốn.

#### Bạn sử dụng/áp dụng các tệp thay đổi như thế nào?

Ngày nay, cách dễ nhất để áp dụng các tệp thay đổi và chỉnh sửa một tệp WEB “chính” là dùng một chương trình tiện ích có tên [TIE](https://ctan.org/pkg/tie). Ví dụ, giả sử bạn muốn sửa đổi TeX của Knuth bằng cách thêm, chẳng hạn, vài lệnh nguyên thủy mới hoặc bạn muốn thay đổi hành vi của một lệnh nguyên thủy TeX (chuẩn) hiện có. Bạn sẽ viết mã của mình (bằng Pascal!) bằng hệ thống lập trình có chú giải WEB và lưu nó vào một tệp có tên, chẳng hạn, `myprim.ch`. Bước tiếp theo là ghép mã của bạn (trong `myprim.ch`) với tệp nguồn gốc của Knuth `tex.web` và tạo ra một tệp WEB tổng hợp mới biểu diễn cái mà chúng ta sẽ gọi là `mytex.web`. Để làm điều này, bạn chỉ cần chạy chương trình TIE như sau:

```
tie -m mytex.web tex.web myprim.ch
```

Giả sử việc ghép thành công, điều này sẽ tạo ra một tệp WEB mới, `mytex.web`hoàn toàn không bị thay đổi, `tex.web` hoàn toàn không bị thay đổi,

Bây giờ hãy giả sử rằng có người khác thích những thay đổi bạn đã thực hiện và muốn sửa đổi công trình của bạn để bổ sung thêm các thay đổi của họ lên trên, hoặc bên cạnh, những gì bạn đã làm. Thay vì phân phối phiên bản TeX đã sửa đổi của bạn (`mytex.web`) bạn quyết định chỉ công bố/chia sẻ tệp thay đổi, `myprim.ch`. Bất kỳ ai muốn xây dựng dựa trên công trình của bạn giờ đây có thể tạo và chia sẻ tệp thay đổi của họ, chẳng hạn, `moreprim.ch` để mở rộng mã của bạn theo một cách nào đó. Bất kỳ ai khác muốn tận dụng cả hai tệp thay đổi giờ đây có thể tạo một tệp WEB tổng hợp mới bằng cách ghép *cả hai* tệp thay đổi vào mã nguồn gốc của Knuth để tạo ra thêm một chương trình TeX khác, chẳng hạn, `newmytex.web`:

```
tie -m newmytex.web tex.web myprim.ch moreprim.ch
```

### Các hệ thống TeX thực sự: nhiều tệp thay đổi

Mô tả TIE ở trên thực ra rất gần với cách mà nhiều bộ máy TeX được xây dựng trong thực tế: chúng bắt đầu từ `tex.web` và thêm một chuỗi các tệp thay đổi để tạo ra tệp nguồn WEB cho bộ máy đó. Mỗi bộ máy TeX đòi hỏi bộ tệp thay đổi riêng của nó, và những tệp này phải được áp dụng/xử lý (ghép) theo một thứ tự nghiêm ngặt: nếu đặt sai thứ tự thì quá trình ghép sẽ thất bại vì mỗi tệp thay đổi trong một chuỗi đều dựa vào các thay đổi được đưa vào bởi các tệp thay đổi xuất hiện sớm hơn trong chuỗi.

Đây là một lần chạy mẫu của TIE, áp dụng nhiều tệp thay đổi vào `tex.web` để tạo ra `ktex.web`—tệp WEB tổng hợp với các sửa đổi đối với TeX của Knuth để làm cho nó sẵn sàng (phù hợp) để chuyển đổi sang C qua quy trình Web2C. Cũng lưu ý các điểm sau:

* `tex.ch` là một tệp thay đổi rất lớn, trong đó, ngoài nhiều thứ khác, sửa đổi TeX để dùng Kpathsea;
* phần mở rộng SyncTeX được thêm vào thông qua nhiều tệp thay đổi.

```
tie -m ktex.web tex.web tex.ch enctex.ch synctex-def.ch0 synctex-mem.ch0 synctex-mem.ch2 synctex-rec.ch0 synctex-rec.ch1 synctex-rec.ch2 tex-binpool.ch
Đây là TIE, Phiên bản CWEB 2.4.
Bản quyền (c) 1989,1992 bởi THD/ITI. Mọi quyền được bảo lưu.
(tex.web)
(tex.ch)
(enctex.ch)
(synctex-def.ch0)
(synctex-mem.ch0)
(synctex-mem.ch2)
(synctex-rec.ch0)
(synctex-rec.ch1)
(synctex-rec.ch2)
(tex-binpool.ch)
....500....1000....1500....2000....2500....3000....3500....4000....4500
....5000....5500....6000....6500....7000....7500....8000....8500....9000
....9500....10000....10500....11000....11500....12000....12500....13000
....13500....14000....14500....15000....15500....16000....16500....17000
....17500....18000....18500....19000....19500....20000....20500....21000
....21500....22000....22500....23000....23500....24000....24500....
(Không phát hiện lỗi nào.)
```

#### Lưu ý thêm: XeTeX và pdfTeX

Để đầy đủ, chúng ta nên lưu ý rằng quy trình biên dịch của pdfTeX và XeTeX thực ra không bắt đầu với `tex.web`; thay vào đó, chúng bắt đầu với các tệp có tên `pdftex.web` và `xetex.web` tương ứng: có lẽ vì các thay đổi quá rộng lớn nên việc chia sẻ/công bố các tệp WEB đã chứa sẵn những sửa đổi rất đáng kể được thực hiện trên mã nguồn gốc của Knuth sẽ hợp lý hơn.

### Một ví dụ: e-upTeX

Cộng đồng TeX Nhật Bản đã phát triển một số bộ máy TeX được thiết kế để đáp ứng các độ phức tạp của việc dàn trang văn bản tiếng Nhật:

* **pTeX**: bộ máy TeX của Knuth được mở rộng để hỗ trợ dàn trang tiếng Nhật;
* **e-pTeX**: Sự kết hợp của e-TeX và pTeX (cộng thêm vài lệnh nguyên thủy được giới thiệu bởi pdfTeX);
* **upTeX**: Một phiên bản của pTeX có hỗ trợ Unicode cùng các phần mở rộng để xử lý tốt hơn CJK (Trung Quốc, Nhật Bản và Hàn Quốc);
* **e-upTeX**: Sự kết hợp (ghép) của e-TeX và upTeX.

#### Tạo tệp nguồn tổng hợp cho e-upTeX

Để tạo tệp nguồn WEB tổng hợp cho e-upTeX (với SyncTeX) bạn bắt đầu với `tex.web` nhưng cần áp dụng **26** các tệp thay đổi riêng lẻ, theo thứ tự sau, để tạo ra một tệp tổng hợp duy nhất từ đó có thể trích xuất danh sách các lệnh nguyên thủy:

```
etex.ch, tex.ch0, tex.ch, tex.ech, etex.ch0,
ptex-base.ch, uptex-m.ch, euptex.ch0, eptex.ech,
etex.ch1, euptex.ch1, synctex-def.ch0, synctex-ep-mem.ch0,
synctex-mem.ch0, synctex-e-mem.ch0, synctex-ep-mem.ch1,
synctex-p-rec.ch0, synctex-rec.ch0, synctex-rec.ch1,
synctex-e-rec.ch0, synctex-p-rec.ch1, fam256.ch,
pdfstrcmp-eup-pre.ch, pdfutils.ch, pdfstrcmp-eup-post.ch,
tex-binpool.ch
```

#### Áp dụng các tệp thay đổi: những tệp nào và theo thứ tự nào?

Như đã lưu ý, việc áp dụng/xử lý các tệp thay đổi theo một thứ tự nghiêm ngặt là cực kỳ quan trọng — nhưng làm sao bạn biết được cần những tệp nào và phải xử lý chúng theo thứ tự nào? May mắn thay, thông tin then chốt đó được ghi lại trong các tệp nằm trong bản phân phối TeX Live, và việc khảo sát mã nguồn TeX Live đã tiết lộ các quy tắc chi phối yêu cầu biên dịch cho từng bộ máy TeX. Theo các quy tắc đó, Overleaf đã có thể tái tạo tệp nguồn WEB tổng hợp cho mỗi bộ máy TeX và trích xuất danh sách các lệnh nguyên thủy để tiếp tục xử lý dữ liệu.

## Và cuối cùng: Làm thế nào để trích xuất danh sách các lệnh nguyên thủy?

Một khi tệp WEB tổng hợp đã được tạo ra, nhiệm vụ trích xuất danh sách các lệnh nguyên thủy, bằng biểu thức chính quy, trở nên đơn giản vì tất cả các lệnh nguyên thủy đều được định nghĩa (“đăng ký”) bằng một hàm Pascal duy nhất có tên `primitive(...)`. Dưới đây là một vài ví dụ thực tế lấy từ mã nguồn của Knuth: `tex.web` mã nguồn:

```
primitive("lineskip",assign_glue,glue_base+line_skip_code)
primitive("baselineskip",assign_glue,glue_base+baseline_skip_code)
primitive("parskip",assign_glue,glue_base+par_skip_code)
primitive("abovedisplayskip",assign_glue,glue_base+above_display_skip_code)
primitive("belowdisplayskip",assign_glue,glue_base+below_display_skip_code)
primitive("abovedisplayshortskip",assign_glue,glue_base+above_display_short_skip_code)
...
...
```

Như bạn có thể thấy, hàm `primitive(...)` rất phù hợp để xử lý văn bản bằng biểu thức chính quy: tên của lệnh nguyên thủy đang được đăng ký nằm trong dấu ngoặc kép (`"..."`) cùng với dữ liệu bổ sung phân loại hành vi của từng lệnh nguyên thủy (chúng ta sẽ không xem xét điều đó chi tiết). Sau khi trích xuất danh sách các lệnh nguyên thủy cho từng bộ máy, dữ liệu đó được một số tập lệnh Lua xử lý để tạo HTML chứa các kết quả được lập bảng.

### Quay lại LuaTeX

Chúng ta đã lưu ý rằng LuaTeX không sử dụng đúng quy trình biên dịch giống như 8 bộ máy TeX còn lại. Sau khi đã tìm hiểu ngắn gọn về quy trình Web2C, việc chuyển đổi Pascal sang C và cơ chế tệp thay đổi, giờ đây chúng ta có thể giải thích điểm khác biệt của LuaTeX: các nhà phát triển LuaTeX đã quyết định loại bỏ quy trình cồng kềnh là chuyển Pascal sang C — như đã nêu trong [Sổ tay tham chiếu LuaTeX](http://www.pragma-ade.com/general/manuals/luatex):

> ...khung biên dịch là web2c và chúng tôi vẫn tiếp tục dùng nó nhưng bỏ qua bước Pascal sang C.

Bộ máy lõi LuaTeX đã được viết lại bằng C, điều đó có nghĩa là quy trình biên dịch của nó có phần chuẩn hơn và chắc chắn thuận tiện hơn nhiều. Một hệ quả hữu ích là các lệnh nguyên thủy được LuaTeX hỗ trợ được tách gọn ra trong một tệp mã nguồn C riêng biệt, nhờ đó việc truy cập/liệt kê chúng trở nên dễ dàng hơn đáng kể.

Nói chính xác hơn, chúng ta cũng nên lưu ý rằng một số tệp mã nguồn của LuaTeX sử dụng một biến thể của phương pháp lập trình có chú giải của Knuth, gọi là [CWEB](https://en.wikipedia.org/wiki/CWEB), dựa trên C chứ không phải Pascal.

### Không chỉ các tệp WEB: còn cần các mã nguồn khác

Sau khi tạo tệp nguồn WEB tổng hợp cho bất kỳ bộ máy TeX nào (trừ LuaTeX), mã nguồn Pascal phải được trích xuất và chuyển đổi sang mã C nhưng đó chưa phải là toàn bộ giải pháp. Ngoài mã C được tạo ra từ nguồn WEB (Pascal⮕C), hầu hết các bộ máy TeX còn phụ thuộc (cần) vào một số tệp mã nguồn phụ trợ bổ sung (các thư viện) thường được viết bằng C — chẳng hạn như [Kpathsea](https://www.tug.org/kpathsea/). Các tệp nguồn phụ trợ (thư viện) triển khai những chức năng không cần, hoặc không thể, viết bằng WEB (Pascal). Bất cứ thứ gì được viết bằng “ngôn ngữ” WEB cho TeX đều phải dùng ngôn ngữ Pascal, sau đó được trích xuất và chuyển thành C do máy tạo ra: nếu bạn không cần làm điều đó, sao ngay từ đầu không viết thẳng bằng C hoặc C++?


---

# 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/18-how-overleaf-created-the-tex-primitive-reference-data.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.
