> 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/geng-duo-zhu-ti/20-how-tex-macros-actually-work-part-2.md).

# TeX 巨集實際上如何運作：第 2 部分

[第 1 部分](/latex/zh-tw/geng-duo-zhu-ti/19-how-tex-macros-actually-work-part-1.md) [第 2 部分](/latex/zh-tw/geng-duo-zhu-ti/20-how-tex-macros-actually-work-part-2.md) [第 3 部分](/latex/zh-tw/geng-duo-zhu-ti/21-how-tex-macros-actually-work-part-3.md) [第 4 部分](/latex/zh-tw/geng-duo-zhu-ti/22-how-tex-macros-actually-work-part-4.md) [第 5 部分](/latex/zh-tw/geng-duo-zhu-ti/23-how-tex-macros-actually-work-part-5.md) [第 6 部分](/latex/zh-tw/geng-duo-zhu-ti/24-how-tex-macros-actually-work-part-6.md)

## 簡介：圖像中的故事

如第一部分所述，TeX 必須「讀取」你在其中的每個字元 `.tex` 檔案，而這個讀取過程更準確地稱為 *掃描*。傳統上，TeX 的輸入處理（掃描）被比喻為 TeX 擁有用來觀察輸入的「眼睛」，因此我們將在下方圖示中採用這個經久不衰的比喻。

### 圖 1：眼睛已準備就緒

我們假設 TeX 已從一個 `.tex` 檔案取得一些輸入，並且即將處理我們的字元字串 `Hello World \jobname` ，這些字元包含在一段文字中。它將依序檢查每個字元並檢視其類別碼。

![TeX 的眼睛已準備好掃描一行文字](/files/c5e3ff1dd68dfcc6fcdc574e241a7d7ee14192a6)

### 圖 2：處理類別碼

在下一個圖示中，我們將大致看到（更詳細說明見下文）TeX 對多種不同類別碼的反應。請注意，類別碼總共有 16 種，但為了簡化起見，我們只示範其中三種：11、10 和 0。其他字元碼在 TeX 的排版過程中也很重要，例如建立表格、排版數學式以及辨識巨集參數。

![TeX 對多種不同類別碼的反應](/files/306d495bd950d6e9f00771916f796775621b2be0)

#### 圖 2 附註

在這裡，我們考慮的是 TeX 在讀取（掃描）構成一段文字的字元時的情況。TeX 會檢查每個字元，查驗其類別碼，並根據類別碼以及 TeX 的「模式」（一種依其目前所做事情而定的狀態）採取適當動作。

* **（綠色眼睛）** TeX 會看到這些字元各自的類別碼都是 11（「字母」），並會將這些字元轉送出去，作為其正在建立的段落的一部分進行排版。不過，TeX 並不是只轉送（使用）字元碼本身，而是使用這一對數字（字元碼、類別碼）來計算一個複合整數值，稱為 *字元記號* （見下文）。一旦產生該字元記號，它就會進入 TeX 內部的排版流程／演算法。
* **（藍色眼睛）** TeX 看見一個類別碼為 10（「空白字元」）的空格字元（ASCII 32）——請注意，如前所述，在被 TeX 讀入之前，空格（ASCII 32）或任何字元的類別碼都很可能已被改成其他值——。

TeX 實際上如何處理類別碼 10（「空白字元」）的字元，會依 TeX 在何時／何處看到它——也就是 TeX 目前的「模式」——而有所不同。例如，有些時候 TeX 會直接略過它們。在這裡，TeX 會知道自己在處理段落文字時偵測到一個類別碼 10 的字元（恰好是空格，ASCII 32），因此最後會將它轉換為所謂的 interword glue：一種可伸縮的彈性空白。

* **（紅色眼睛）** 在這裡，TeX 觀察到一個具有非常重要類別碼的字元：0（跳脫字元）。

一個跳脫字元——*任何* 類別碼為 0 的字元——會告訴 TeX 切換到特殊讀取模式，並仔細掃描（讀取）後續字元，因為它們標識了一個的名稱 *命令*，而不是要排版的文字。在 TeX 文獻中，你也會看到「命令」這個術語被稱為 *控制序列*。 *緊接在它之後*；這是因為 TeX 識別兩種命令：

* 稱為的多字母命令 *控制字*：緊接在跳脫字元之後的字元，其類別碼為 11。所有後續類別碼為 11 的字元都被視為命令名稱的一部分。當 TeX 偵測到任何一個字元時，它就會停止尋找構成命令名稱一部分的字元，而該字元 *不會* 的類別碼不是 11——例如類別碼為 10 的空格字元。
* 稱為的單字母命令 *控制符號*：緊接在跳脫字元之後的字元 *不會* 的類別碼為 11。

你可以將跳脫字元視為觸發 TeX 從其通常的掃描行為中「跳脫」出來，並對接下來幾個字元採取不同的處理方式——紅色虛線框表示 TeX 將會 **開始掃描命令**.

### 圖 3：處理類別碼 11（「字母」）

在本系列第一部分中，我們提到 TeX 從輸入中讀取的每個字元都由兩個整數描述：

* 字元碼：一個定義字元數值表示法的整數；
* 類別碼：TeX 指派給可能出現在其輸入中的每個字元的一個介於 0 到 15 之間的值。

TeX 在其處理的下一階段會使用這兩項資訊：建立字元記號。

圖 3 是對圖 2 的延伸，說明 TeX 會如何處理這些類別碼為 11（字母）的輸入字元：它會建立 *字元記號*——TeX 透過組合該字元的類別碼與字元碼所計算出的整數值。

**注意**：在這個例子中，我們只討論類別碼為 11 的字元，但你應該知道，TeX 也會為具有其他類別碼的輸入字元建立記號值——唯有類別碼 0 例外，它絕不會被轉成記號：跳脫字元只是作為觸發特殊處理的「開關」。

![TeX 處理類別碼 11 的字元](/files/2ed2dddfb1b427b51923ef437e79005e299d6080)

下方的圖 5 將顯示 TeX 在看到類別碼 0（跳脫字元）的字元時會做什麼。

#### 圖 3 附註：處理類別碼 11（「字母」）

在這裡，我們將聚焦於 **green** 活動：當 TeX 看到類別碼 11（「字母」）的字元時會發生什麼事。當 TeX 讀取一個字元並判定其類別碼（此處為 11）之後，接下來 TeX 會做的是 *將……組合* 把這一對數字組合成一個稱為字元記號的整數：這些記號（整數）會被送往 TeX 內部排版演算法／處理的下一階段。如前所述，TeX 也會為其他類別碼（即非 11）的字元建立字元記號，這裡我們只是以類別碼 11 作為範例。

每個字元記號（整數）都會永久將一個輸入字元與指派給該字元的類別碼綁定在一起 **，也就是 TeX 掃描（讀入）它時的那一刻**：這一事實對於理解 TeX/LaTeX 巨集的行為至關重要。當然，在後續處理中，TeX 有時需要拆解一個字元記號，以判定是用哪一組（字元碼、類別碼）組合來建構該記號。然而，一旦字元被 TeX 的輸入（掃描）程序讀入，TeX 所計算出的字元記號值就會使該字元 *永久地* 與指派給它的類別碼耦合 *在它被讀入的當下*.

**計算字元記號**

TeX 引擎使用一個簡單的公式來計算字元記號， $$T$$，由一個類別碼為 $$C$$ 且字元碼為 $$A$$:

$$T = \text{constant} \times C + A$$

8 位元引擎，例如 pdfTeX，使用：

$$T = 256\times C + A$$

具 Unicode 感知能力的引擎，例如 XeTeX 或 LuaTeX，必須使用不同的公式，因為在 Unicode 之下，字元碼可以遠大於舊式 8 位元 ASCII 編碼世界中的上限 255。以 XeTeX 為例，它使用：

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

再次提醒，值得注意的是，類別碼 0 的字元不會被轉換成字元記號：類別碼 0 在 TeX 的輸入過濾中佔有非常特殊的位置，純粹作為一個「開關」來觸發 TeX 進入特殊模式，掃描接下來幾個字元。圖 5 會處理這一點。

### 圖 4：處理類別碼 10（「空白字元」）

TeX 對類別碼 10（「空白字元」）的處理方式，取決於它在輸入中偵測到類別碼 10 的字元時，當下正在處理什麼。在我們的例子中，TeX 正在進行例行的段落處理，而類別碼 10 的空格字元將會被轉換為 interword glue。

![TeX 處理類別碼 10 的字元](/files/6263992b9829254ade43643722073132b2a1b2f5)

TeX 對空格的處理看起來相當特異，但在 [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) Victor Eijkhout 所著的第 1 章與第 2 章中可以找到很好的概述——你可以 [下載一份免費的 PDF 複本](https://bitbucket.org/VictorEijkhout/tex-by-topic) ，可透過他的網站。

例如，當 TeX 看到類別碼 10 的字元時，有些時候 TeX 會：

* 全部略過（忽略）——例如，當 TeX 處於垂直模式時；
* 將多個空白字元轉換為單一空白字元——例如在處理段落時會跳過多餘空格；
* 將它們吸收掉——例如在命令名稱之後吸收一個空格；

另外請注意，有些時候 TeX 也會 *產生* 空格——方法是將行尾字元轉換為空格。空格字元（任何類別碼為 10 的字元）的行為／處理方式是 TeX 的一種「特異之處」：需要花時間／練習才能熟悉（適應） TeX 的這個面向。

### 圖 5a：處理類別碼 0（「跳脫字元」）

在這個圖示中，TeX 已處理到 `\\` 這個字元為止，它的類別碼是 0：即「跳脫字元」——我們將使用另一組圖示來展示 TeX 如何處理跳脫字元並辨識命令名稱。

![TeX 處理類別碼 0 的字元](/files/9e61efd9bd501f36d3825ddda0258ee03ac414f7)

### 圖 5b：尋找命令名稱

在這個圖示中，我們將查看紅色虛線框區段（**開始掃描命令**）以看看 TeX 在看到跳脫字元之後會做什麼。

![TeX 尋找命令名稱](/files/9cf0bcee34b5cc9d6c7ff039607fb63341bca508)

**圖 5b 附註**

* 一旦辨識出來，跳脫字元的工作就完成了：它充當了一個開關，不再參與任何後續處理——具體來說，它不會 **不是** 被轉換為字元記號。
* 為方便起見，我們重述一下前面提到的某些細節。在看到跳脫字元之後，TeX 會檢查緊接著其後的字元的類別碼 *緊接在它之後*；這是因為 TeX 識別兩種命令：
* * 稱為的多字母命令 *控制字*：緊接在跳脫字元之後的字元，其類別碼為 11。所有後續類別碼為 11 的字元都被視為構成一個命令名稱（*控制詞*）。當 TeX 偵測到任何一個字元時，它就會停止尋找構成命令名稱一部分的字元，而該字元 *不會* 的類別碼不是 11——例如類別碼為 10 的空格字元。
  * 稱為的單字母命令 *控制符號*：緊接在跳脫字元之後的字元 *不會* 的類別碼為 11。
* 在我們的例子中，緊接在 `\\` 是一項 `j` （類別碼 11），這告訴 TeX 要尋找一個可能是由多個類別碼 11 字元組成的命令。
* TeX 會持續檢查是否還有更多類別碼 11 的字元。一旦它偵測到任何其他類別碼的字元，例如類別碼 10 的空格，TeX 就知道已經到達命令名稱的結尾。再強調一次：在這裡，是空格字元（類別碼 10）「終止」了命令的結尾，但它也可能是任何一個 **不是** 的類別碼為 11。

## 第 3 部分

在第 3 部分中，我們將從圖 5b 繼續，完成這個故事的這一部分——TeX 如何辨識一個命令——並接著看它下一步會做什麼。我們也會更深入探討 TeX 處理中的一些內部面向——其中部分內容在第一次閱讀時可以略過，除非你真的很喜歡細節。

[第 1 部分](/latex/zh-tw/geng-duo-zhu-ti/19-how-tex-macros-actually-work-part-1.md) [第 2 部分](/latex/zh-tw/geng-duo-zhu-ti/20-how-tex-macros-actually-work-part-2.md) [第 3 部分](/latex/zh-tw/geng-duo-zhu-ti/21-how-tex-macros-actually-work-part-3.md) [第 4 部分](/latex/zh-tw/geng-duo-zhu-ti/22-how-tex-macros-actually-work-part-4.md) [第 5 部分](/latex/zh-tw/geng-duo-zhu-ti/23-how-tex-macros-actually-work-part-5.md) [第 6 部分](/latex/zh-tw/geng-duo-zhu-ti/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/zh-tw/geng-duo-zhu-ti/20-how-tex-macros-actually-work-part-2.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.
