在 Stephan Bechtolshein 的第一頁拖船篇大約\expandafter
,他描述了執行規則\expandafter
。
我認為案例 iii 不應該在這裡列出,因為左大括號應該是標記e而不是標記1。也就是說,作者應該把iii放在最外面的步驟1。
答案1
不幸的是,該教程不是很精確。實際上,第 2.iii 點是完全錯誤的:如果 ⟨token 1 ⟩ 是{
,那麼它根本就不會擴展,因為沒有字元標記是可擴展的。
但第 2 項在很多方面通常都是錯的。其他原語都是可擴展的,不只是\expandafter
、\csname
和\the
。例如,所有條件句是可擴展的,包括\else
、 、\fi
其中\or
。這是可以做到的功能
⟨primitive if⟩⟨condition⟩
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{⟨first⟩}{⟨second⟩}%
這是一段非常有用的程式碼,但 Bechtolsheim 似乎忽略了(據我所知,他在 TeX 的四卷書中甚至沒有描述過)。也是\number
可擴展的,僅提及另一個原語。
它要簡單得多:當 TeX 擴展標記時(也就是說,總是,除非擴展被抑制,例如使用 讀取巨集定義中的替換文字時\def
)並找到\expandafter
,它會跳過下一個標記,我們稱之為⟨tokene⟩,並嘗試擴展以下一個。如果令牌是可擴展的,則將其替換為其擴展(可能透過查找參數)。的擴展\expandafter
無效,流程從⟨token重新開始e⟩ 將被擴展(如果它是可擴展的)或被執行。
當 ⟨token 時完全沒有區別e⟩ 是{
相對於所有可能的其他標記。
另外,範例 8 有點誤導,因為它跳過了一個基本功能,即在對令牌暫存器進行賦值時,(可選)=
後面可以跟一個 ⟨filler⟩,這意味著 TeX 將擴展令牌而忽略空格和\relax
令牌直到找到{
.這使得可以做到
\tb=\expandafter{\the\ta}
可能細節。我的觀點是,要么提到了上述規則,要么不應將案例視為示例,而應將其視為其自身的特徵。