tex什麼時候進行巨集展開?

tex什麼時候進行巨集展開?

在閱讀了教科書的一些章節後,我知道 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

最後一個項目符號有一個技術原因:如果您想引用與\catcode0、5、9、13、14 或 15 的字元相對應的字母常數,可以在其前面使用反斜線進行“轉義”,但是這實際上並沒有形成控制序列。所以`\^^M如果你想引用常數 13 或 do ,你可以這樣做\chardef\%=`\%

第二個項目符號可以用一個重要的評論來補充:儘管 TeX 在跳過條件文本時不進行擴展,但它檢查標記以便將條件與它們的\elseor相符\fi。任何\let對於原始條件、對於\else\fi在這方面都計數的標記。

答案2

文中TeX 簡介指令及其參數以藍色書寫,但如果參數未展開,則以紅色書寫。此處以藍色寫入的參數是在擴展後讀取的。請參閱第 9 頁的文本,其中開始介紹 TeX 原語構造的摘要。

相關內容