
Metade da dor de programar o TeX é a diferença entre comandos expansíveis e não expansíveis, sendo o último geralmente resultado de uma atribuição que ocorre dentro da definição do comando. Isso me faz pensar por que nem o TeX de Knuth nem quaisquer motores TeX posteriores adicionam uma construção \local\def
(ou com algum outro nome) que resolva esse problema de uma vez por todas? Então você poderia fazer
\def\mycmd{%
\local\def\tempa{<something>}%
\local\def\tempb{<something>}%
\local\def\tempc##1##2{<something>}%
\tempc{\tempa}{\tempb}%
}
e ainda tem um comando expansível. (Eu sei que você pode usar uma construção \group_begin: ... \tl_set:Nn \l__gaussler_temp_tl { ... } \exp_args:NV \group_end: \l__gaussler_temp_tl
para obter uma solução alternativa, mas ela não será expansível). Em outras palavras, funcionaria como uma função em uma linguagem de programação mais moderna. Usar \local
fora de uma definição de comando pode gerar um erro. Isso resolveria muitas das dores de cabeça da programação do TeX.
Por que isso ainda não foi feito?
Responder1
luatex tem o que você (talvez) está pedindo
\documentclass{article}
\begin{document}
{
\edef\zz{ ab \immediateassignment\def\zzz{this} cd \zzz}
zz: [\zz]
zzz: [\zzz]
\meaning\zzz
}
\meaning\zzz
\end{document}
Aqui \immediateassignment\def\zzz
está uma atribuição expansível \zzz
que, portanto, é permitida na \edef
inclusão usando o comando definido dentro do mesmo \edef
. É uma atribuição local, mas local para o grupo atual e não para o grupo atual \edef
. Não está claro se foi isso que você quis dizer.
so \zzz
é usado no \edef
e também é definido após o \edef
mas sai do escopo no }
que encerra o grupo atual, então \meaning
mostra-o como indefinido novamente na linha final.