
在閱讀了教科書的一些章節後,我知道 tex 從命令列或文件中讀取輸入行,然後將它們轉換為標記。當這些令牌進入其胃腸道時,tex 準備透過將它們轉換成盒子、膠水和其他東西來消化它們,然後建立一些清單。
關於宏,tex在哪個階段保存其巨集定義,在哪個階段tex進行巨集擴充以進行tex替換?
答案1
這很容易! TeX 總是進行巨集擴展,除非它不這樣做。
在第 215 頁,第二個雙重危險段落,我們讀到
擴展在以下時間被抑制:
- 在錯誤復原期間刪除令牌時(請參閱第 6 章)。
- 由於忽略條件文字而跳過標記時。
- 當 TeX 讀取巨集的參數。
\let
當 TeX 讀取由、\futurelet
、\def
、\gdef
、\edef
、\xdef
、\chardef
、\mathchardef
、\countdef
、\dimendef
、\skipdef
、\muskipdef
、\toksdef
、\read
和定義的控制序列\font
。- 當 TeX 讀取
\expandafter
,\noexpand
,\string
,\meaning
,\let
,\futurelet
,\ifx
,\show
,\afterassignment
,的參數標記\aftergroup
。- 當 TeX 吸收 a
\def
、\gdef
、\edef
、 或的參數文字\xdef
。- 當 TeX 吸收 a
\def
或\gdef
的替換文字\read
;或標記變數的文本,例如\everypar
or\toks0
;或\uppercase
或\lowercase
的 標記清單\write
。 (\write
當實際輸出到檔案時,的標記清單將在稍後擴展。)- 當 TeX 讀取對齊的前導碼時,除了在原始命令的標記之後
\span
或讀取 after 時\tabskip
。- 就在開始數學模式的標記(例如
$
3)之後,查看是否有另一個類別 3 的標記跟隨。- 就在開始字母常量的
`
12標記之後。
並非沒有道理,不是嗎?在進行定義時,我們希望不擴展任何內容(除了\edef
和\xdef
),第四、第五、第六和第七個項目符號處理此問題。同樣,如果我們想將令牌列表存儲在寄存器或\write
.
同樣,由於顯而易見的原因, 、 、\expandafter
或之後的標記不得展開;稍後,當 TeX 在適當的時間再次檢查它時,它就會出現。\noexpand
\afterassignment
\aftergroup
最後一個項目符號有一個技術原因:如果您想引用與\catcode
0、5、9、13、14 或 15 的字元相對應的字母常數,可以在其前面使用反斜線進行“轉義”,但是這實際上並沒有形成控制序列。所以`\^^M
如果你想引用常數 13 或 do ,你可以這樣做\chardef\%=`\%
。
第二個項目符號可以用一個重要的評論來補充:儘管 TeX 在跳過條件文本時不進行擴展,但它做檢查標記以便將條件與它們的\else
or相符\fi
。任何\let
對於原始條件、對於\else
或\fi
在這方面都計數的標記。
答案2
文中TeX 簡介指令及其參數以藍色書寫,但如果參數未展開,則以紅色書寫。此處以藍色寫入的參數是在擴展後讀取的。請參閱第 9 頁的文本,其中開始介紹 TeX 原語構造的摘要。