
Половина боли программирования TeX — это разница между расширяемыми и нерасширяемыми командами, причем последнее обычно является результатом назначения, происходящего внутри определения команды. Это заставляет меня задуматься, почему ни 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
расширяемое назначение, \zzz
которое, следовательно, разрешено в \edef
включительном использовании определенной команды в пределах того же \edef
. Это локальное назначение, но локальное для текущей группы, а не для текущего \edef
. Неясно, это ли вы имели в виду.
so \zzz
используется в \edef
и также определен после , \edef
но выходит из области действия в , }
который завершает текущую группу, поэтому \meaning
снова отображается как неопределенный в последней строке.