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

# 一系列新的文章：TeX 詞元及相關概念——但為什麼（以及如何）？

這篇導論文章旨在說明為什麼要寫這個系列、我希望達成什麼目標，並提供一些背景資訊，介紹如何透過觀察 TeX 引擎內部運作來探索 TeX token 所使用的技術。這個文章頁面也設計為收錄本系列所有文章的連結，並且會隨著每篇新文章發表而更新，以提供那些連結。

### 文章連結

每篇文章都會包含一組通往本系列其他文章的連結。

* [什麼是「TeX token」？](/latex/zh-tw/shen-ru-wen-zhang/53-what-is-a-tex-token.md)
* [什麼是「TeX token 清單」？](/latex/zh-tw/shen-ru-wen-zhang/54-what-is-a-tex-token-list.md)

## 本系列文章的背景

撰寫這個系列文章的動機，來自於閱讀一些關於 TeX 的資料，這些資料透過「token」的概念，以及 TeX 的「token 化過程」、「token 清單」和相關概念，例如「巨集展開」與「可展開指令」，來解釋 TeX 的許多活動。每當我看到以「TeX token」來表述的 TeX 相關說明時，同樣的問題總會浮現在腦海中：究竟， *是* 什麼是 TeX token？我必須弄清楚。

第一篇文章的範圍與內容， [什麼是「TeX token」？](/latex/zh-tw/shen-ru-wen-zhang/53-what-is-a-tex-token.md)，本質上就像程式設計師會說的那樣，相當「貼近底層」；毫無疑問，「TeX token」可以被歸類為一個相當冷門的寫作主題：那又何必費心呢？最終，你會採取一種觀點——或者也許是信念的一躍——認為其他人也可能一直對同樣的主題感到困惑，而這裡有空間用一兩篇文章來補足一些缺口。我的目標是提供一些有用的背景說明，這些說明可以補充你可能正在閱讀的其他資料，並且希望能幫助更好地理解一些在你學習 TeX、探索巨集與程式設計時會出現的關鍵概念。

顯然，在部落格文章的篇幅限制下，我們只能略窺其表——要嘗試解釋所有重要主題，或深入最幽暗難明之處，都是不切實際的。必要時，我會省略大量細節，並在過度簡化與把類比推到崩潰邊緣之間走一條細線。

「寫你自己也會想讀的文章」是一個很有用的準則，而我在撰寫這個系列時，也努力把它付諸實行。

## 既然提出了這個問題，接下來呢？

眼前的挑戰很明確：要如何了解 TeX token？因為這類細節（token、token 化等等）都深藏在 TeX 引擎的軟體程式碼之中——除非你真的對這些細節感興趣，否則其實不太需要去操心它們。

探索並回答這些問題的一個方法，是嘗試閱讀 TeX 的原始程式碼 [`tex.web`](https://www.ctan.org/tex-archive/systems/knuth/dist/tex)——透過執行 [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) 以擷取 TeX 文件，或是購買一本 [Computers & Typesetting, Volume B: TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TEX-Program-v/dp/0201134373)。我買了一本紙本書！能以書本形式出版 TeX 的原始程式碼，當然非常有幫助，而且其中也有許多實用的說明。不過，Knuth 的 TeX 是用 Pascal 撰寫的，而 Pascal 原始碼自然是以 Knuth 的 literate programming 方法來記錄——把程式碼以小而易消化的片段呈現。很容易理解，Knuth 的文件化方式對於像 TeX 這樣複雜的軟體確實很有幫助，但閱讀這本書的確需要大量交叉查閱與翻頁比對。

雖然有幫助，但對我而言，單靠這本書還不足以更深入理解 TeX 在建立「token」時究竟發生了什麼——這正是我特別感興趣的主題。要真正弄清楚，只有一個辦法：建置 TeX 程式，在一個小型 TeX 檔案上執行，然後在 TeX 掃描與讀取輸入時，實際觀察程式碼的執行過程。從原始碼建置 TeX 的細節有點晦澀——需要把 Pascal 轉成 C——但下一節會有簡短說明，並附上一個連到我個人部落格文章的連結，裡面有更詳細的內容。

與 XeTeX 和 LuaTeX 不同——它們可以處理 UTF-8 格式的文字並支援 Unicode 文字編碼——Knuth 的 TeX 是一個 8 位元引擎，這表示它假設輸入字元的範圍是 0 到 255。雖然這是一個重要的區別，但它並不 *實質上* 影響我們對 TeX token 的討論，因為我們所涵蓋的主題與原則是所有 TeX 引擎都共有的：它們正是這套軟體的核心。

## 你要如何研究 TeX token？

對我而言，從輸入文字一路拆解到 TeX token 的過程，是一段相當漫長的旅程——老實說，在這條路上，各種程度的困惑幾乎一路相伴：TeX 的確是一套非常複雜的軟體。

多年來（大約從 2009 年開始），我一直例行從原始碼編譯最新版的 LuaTeX——這個過程相當直接，這要歸功於 LuaTeX 原始碼分發方式極其出色。基於那段經驗，我開始對如何從原始碼建置 Knuth 最初的 TeX 產生興趣—— *非常* 不一樣的命題，因為 TeX 是用 Knuth 的 literate programming 方法撰寫的。那份在 Windows 上、使用開源編譯器與工具組所完成的 TeX 個人建置，是在 TeX Live 發行版之外進行的，而且是一個獨立專案。它還需要建置一整套工具鏈，用來轉換 `tex.web` 成一個 C 程式，接著便能編譯並在除錯器中執行，以查看 TeX 在處理輸入字元時實際做了什麼。

我使用的是 Knuth 原始的 TeX，而不是 pdfTeX、XeTeX 或 LuaTeX，因為我需要一個最接近書籍《TeX: The Program》中印刷原始碼的 TeX 版本。那本書最早於 1986 年出版，雖然自那時以來 TeX 經歷了一些更新，但 TeX 的最新版本（3.14159265，於 2014 年 1 月發布）確實已經與書中所含的原始碼相當接近。

反映 Knuth 的 literate programming 方法，TeX 的原始碼以一種名為 WEB 的文字格式分發：這是 TeX 文件與 Pascal 原始碼的混合體。基本概念是，你使用兩個名為 TANGLE 與 WEAVE 的工具來處理 WEB 檔案，以擷取 TeX 文件或 Pascal 原始碼：

* [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) 從 WEB 檔案中擷取 Pascal 原始碼
* [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) 從 WEB 檔案中擷取 TeX 文件

然而，在擷取 Pascal 原始碼之前，你必須先預處理 Knuth 的 `tex.web` 檔案，套用一系列變更，使 TeX 的 Pascal 程式碼能透過一個稱為 Web2C 的流程轉換成 C 程式碼。這個預處理步驟稱為 *套用變更檔*.

Knuth 的原始程式檔（tex.web）絕不能以任何方式直接修改；你應該使用所謂的變更檔（副檔名 `.ch`）來套用修正，這些變更檔包含你希望對主要 `.web` 檔案所施加的變更——例如 `tex.web`。變更檔會與 Knuth 的原始碼合併——使用另一個稱為 TIE 的工具程式——以建立一個名為，例如， `mytex.web` ，然後再用 TANGLE 處理它，將 Pascal 程式碼擷取到 `mytex.pas`。一旦你有了合適的 Pascal 原始檔，就可以套用 Web2C 流程的最後步驟，將它轉換成 C 原始碼檔，再把它編譯成可執行的 TeX 程式。如果你想閱讀這個相當曲折的 Web2C 轉換流程，這位作者的部落格上還有更多細節 [個人部落格網站](http://www.readytext.co.uk/?p=2529).

最終結果是一個 TeX 程式，可以使用免費且優秀的 [Eclipse IDE for C/C++](http://www.eclipse.org/home/index.php) 來單步執行 TeX 的原始碼（以 C 撰寫），並觀察它在掃描你的輸入時會發生什麼。這絕對不是最有趣的消遣，因為 C 程式碼是機器自動產生的，而且有些地方極難追蹤（TeX 的原始碼大量使用 GOTO 與全域變數）。即使如此，《TeX: The Program》這本書在協助導航 C 原始碼方面仍然非常寶貴，儘管書中收錄的是以排版精美的 Pascal 程式碼呈現的 TeX 原始碼。

為了把討論做個總結，這裡有一張範例截圖，顯示 TeX 透過 Eclipse IDE 執行的畫面，執行暫停在函式 `getnext()`——它正是 TeX 產生 token 過程的核心。

![顯示 TeX 透過 Eclipse IDE 執行的截圖](/files/a0a05e98e05b2c4dc1c5675683fa96565d369a8f)

使用開源的 Eclipse IDE for C/C++ 逐步執行 TeX 的 C 原始碼。

## 結論與致謝

撰寫第一篇文章，以及構思本系列未來部落格文章的內容，確實相當耗時。我非常感謝 Overleaf 的 John Hammersley 與 Mary Anne Baynes 對這個系列構想的支持，以及允許我花時間進行額外的背景研究。我希望這個系列文章能成功指出並處理常見的關注主題，並對讀者有所助益。


---

# 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/zh-tw/shen-ru-wen-zhang/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.
