
TeXプログラミングの苦労の半分は、展開可能なコマンドと展開不可能なコマンドの違いです。後者は通常、コマンド定義内で行われる割り当ての結果です。それで、なぜKnuthのTeXもそれ以降のTeXエンジンも、\local\def
この問題を一挙に解決する構文(または別の名前)を追加しないのか不思議に思います。それなら、次のようにすればいいのです。
\def\mycmd{%
\local\def\tempa{<something>}%
\local\def\tempb{<something>}%
\local\def\tempc##1##2{<something>}%
\tempc{\tempa}{\tempb}%
}
\group_begin: ... \tl_set:Nn \l__gaussler_temp_tl { ... } \exp_args:NV \group_end: \l__gaussler_temp_tl
拡張可能なコマンドも残っています。(回避策として go のような構文を使用できることは知っていますが、拡張可能ではありません)。言い換えれば、より現代的なプログラミング言語の関数と同じように動作します。\local
コマンド定義の外部で使用すると、エラーが発生する可能性があります。これにより、TeX プログラミングの悩みの種の多くが解決されます。
なぜまだこれが実行されていないのでしょうか?
答え1
luatex にはあなたが(おそらく)求めているものがあります
\documentclass{article}
\begin{document}
{
\edef\zz{ ab \immediateassignment\def\zzz{this} cd \zzz}
zz: [\zz]
zzz: [\zzz]
\meaning\zzz
}
\meaning\zzz
\end{document}
ここでは\immediateassignment\def\zzz
、 の拡張可能な割り当てを示します。これは、同じ 内で defined コマンドを使用することを含めて\zzz
、 で許可されます。これはローカル割り当てですが、現在の ではなく、現在のグループに対してローカルです。これが意図したものかどうかは不明です。\edef
\edef
\edef
は\zzz
で使用され\edef
、 の後にも定義されていますが、現在のグループを終了する\edef
でスコープ外になるため、最終行で再び未定義として表示されます。}
\meaning