マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

expl3な言語で完全展開可能な関数(マクロ)を作る件について (6)

展開可能性のジレンマ

ところが、実はまだ大きな罠が残っている。それは、\exp_args:Nx 自体が展開可能でないということである。((マニュアル(interface3)を見れば判るが、他の \exp_args:N? は全て完全展開可能であるのに、\exp_args:Nx だけ制限付展開可能ですらない。これは、TeX 言語において「トークン列を網羅展開する」という操作を実現する手段が \edef(これは代入だから当然展開可能でない)を使う他に存在しないという本質的な制限に由来する。ちなみに、LuaTeX には \expanded という「網羅展開させる」プリミティブが存在する。))つまり、これを使ってしまうと、\NabeAzzX が展開可能でなくなってしまうのである。事実、(シリーズ前回の)ソースコードで (*2) の部分(\NabeAzzX を網羅展開させている)を有効にすると、またそこでエラーが起こる。

\exp_args:Nx が展開可能でないというのは、「(ある関数が)引数を網羅展開させる処置をとると自身の展開可能性が失われる」ということである。ここで注目すべきは、\exp_args:Nf は完全展開可能であるということ、つまり、「引数を完全展開させる処置をとることは自身の展開可能性を消さない」ということである。従って、もし (*1) で \exp_args:Nx の代わりに \exp_args:Nf が使えるのであれば、\NabeAzzX の制限付展開可能性が回復されるだろう。しかし実際にはこれも上手くいかない。何故なら、\zrxxnz_iota:n が「制限付展開可能でしかない」からである。(つまり、\exp_args:Nf では展開が途中で止まってしまう。)

このように、完全展開可能と制限付展開可能の違いで、目的が達成できるか否かが変わる場合が存在するのである。