Stephan 的 TUGboat 文章中有關 \expandafter 的問題

Stephan 的 TUGboat 文章中有關 \expandafter 的問題

在 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}

可能細節。我的觀點是,要么提到了上述規則,要么不應將案例視為示例,而應將其視為其自身的特徵。

相關內容