Por que o TeX não permite definições locais e expansíveis dentro dos comandos?

Por que o TeX não permite definições locais e expansíveis dentro dos comandos?

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_tlpara 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 \localfora 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\zzzestá uma atribuição expansível \zzzque, portanto, é permitida na \edefinclusã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 \edefe também é definido após o \edefmas sai do escopo no }que encerra o grupo atual, então \meaningmostra-o como indefinido novamente na linha final.

insira a descrição da imagem aqui

informação relacionada