跳轉到內容

TeX/expandafter

來自華夏公益教科書,自由的教科書
< TeX
\expandafter <macro> <tokens>

\expandafter 命令會延遲展開宏,直到它的引數被展開。

\def\a[#1]{A's argument was `#1'}
\def\args{[FOO]}
\a\args

將無法工作,顯示“! \a 的使用與定義不匹配”。這是因為在定義 \a 時,第一個引數(表示為 #1)出現在方括號中。因此,\a 期望它的第一個引數出現在方括號中,而在 \a\args 中,\a 之後緊隨的字元不是左方括號。使用 \expandafter,我們可以寫

\expandafter\a\args

這會在 \a 之前展開 \args,就好像我們在開頭寫了以下內容一樣

\a[FOO]

因此,TeX 將列印 "A's argument was `FOO'"。

\expandafter 命令首先展開 <macro> 之後的令牌,然後展開 <macro>,將展開的 <tokens> 放在它後面,就好像它們是在檔案中鍵入的一樣。

多次呼叫

[編輯 | 編輯原始碼]

人們有時會看到長串的 expandafters,通常可以理解為“在 N 後展開”,例如

% Chain of expandafters leads to \pra having definition ``\onelevelexpanded''
\def\onelevelexpanded{Page={\the\count0} }
\def\mycommandcontents{\onelevelexpanded}
\ea\def\ea\pra\ea{\mycommandcontents}

這僅展開 \mycommandcontents 一次(與 TeX/edef 相反)。

參考文獻

[編輯 | 編輯原始碼]

參見 Stephan Bechtolsheim 的文章

華夏公益教科書