为什么 TeX 不允许在命令内部使用本地、可扩展的定义?

为什么 TeX 不允许在命令内部使用本地、可扩展的定义?

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

在此处输入图片描述

相关内容