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}%
}
并且仍然有一个可扩展的命令。(我知道您可以使用类似 go 的构造来\group_begin: ... \tl_set:Nn \l__gaussler_temp_tl { ... } \exp_args:NV \group_end: \l__gaussler_temp_tl
获得解决方法,但它不可扩展)。换句话说,它就像更现代的编程语言中的函数一样工作。\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
有一个可扩展的分配,\zzz
因此允许在 中\edef
使用相同的 内定义的命令\edef
。这是一个本地分配,但仅限于当前组,而不是当前\edef
。不清楚这是否是你的意思。
因此\zzz
在中使用,\edef
并且也在之后定义,但是在结束当前组的地方\edef
超出了范围,因此在最后一行再次将其显示为未定义。}
\meaning