
Realmente cria \let
uma nova sequência de controle ou apenas atribui um ponteiro a uma sequência de controle já definida?
Knuth diz que:
let\cs=<token>
fornece\cs
o significado atual do token. Se<token>
for outra sequência de controle,\cs
adquirirá o mesmo significado que essa sequência de controle. (TeXbook 206)
Suponha que eu defina um novo ambiente de lista bars
no qual \bar
haja apenas outro nome para \item
:
\newenvironment{bars}
{\begin{enumerate}\let\bar\item}
{\end{enumerate}}
e use esse ambiente 1000 vezes em meu documento da seguinte maneira:
\begin{bars}
\bar bla bla
\bar bla bla bla
\end{bars}
Quantos locais na memória acabam tendo o mesmo conteúdo de \item
quando compilo meu documento? 1, 2 ou 1001?
Responder1
A resposta à sua pergunta é "mais um", ou seja, \item
e \bar
(portanto, dois no total).
A maneira como \let\a<token>
funciona é copiar literalmente o significado de <token>
na sequência de controle \a
, de modo que sempre que \a
for "executado" ele aja exatamente como se <token>
estivesse lá. Essa cópia é feita no momento da \let
instrução, de forma que por mais vezes que \a
seja utilizada, nenhuma nova alteração seja feita; além disso, se <token>
houver alteraçõesisso ésignificado (digamos, através de outro \let
), o significado de \a
não é afetado.
Seu uso do termo "ponteiro" é inapropriado em certo sentido, já que o TeX como linguagem não possui um modelo de memória, nem (necessariamente) a linguagem na qual ele é implementado tem acesso aleatório aisso émodelo de memória, nem os detalhes internos de sua implementação são relevantes para a compreensão de seu funcionamento. No entanto, mesmo assumindo que o TeX foi implementado em (digamos) C, o análogo de um ponteiro para um token seria
\def\a{<token>}
o que seria como *\a = <token>
, assumindo que a sintaxe C fosse válida. A sintaxe imaginária *\a = *<token>
corresponde a \let\a<token>
, enquanto a sintaxe *\a = <token>
, embora semelhante à primeira, na verdade definiria \a
de tal forma que fazer \def\a{<other token>}
seriaredefinir <token>
, o que não é possível no TeX. Portanto, não existe realmente um análogo exato dos ponteiros no TeX.
Responder2
Embora o TeX possa armazenar múltiplas versões de uma determinada macro, localmente para um grupo { }, geralmente é bastante difícil preencher a memória, pois a memória é recuperada e reutilizada quando o grupo é deixado (esta foi a base do meu comentário original ). A maioria dos ambientes, como itemize, inclui esse agrupamento. Quando um comando existente é \def'd ou \let'd para ser outra coisa dentro de um grupo, a versão antiga é salva (empilhada) e restaurada no final do grupo.
Nenhuma das construções padrão gerará muito desperdício de "pilha", a menos que você gerencie alguma recursão infinita de grupos aninhados ou similares.
A geração de um grande número finito de grupos aninhados com diferentes definições de uma determinada macro pode ser feita, mas você precisa ser um pouco desonesto:
\documentclass[a5paper,12pt]{article}
\usepackage[margin=20mm]{geometry}
%% version of plain TeX \loop that uses global macros
\def\gloop#1\repeat{\gdef\body{#1}\giterate}
\def\giterate{\body \global\let\next\giterate \else\global\let\next\relax\fi \next}
\let\repeat=\fi % this makes \loop...\if...\repeat skippable
\begin{document}
\raggedright
\section*{Ascending}
\newcount\n
\global\n=0
\gloop
\ifnum \n<100
\bgroup
\edef\foo{\the\n}
\let\baz=\foo
\global\let\foobar=\baz
$\foo^{\baz}_{\foobar} \uparrow$
\global\advance\n 1
\repeat
\section*{Descending}
\global\n=0
\gloop
\ifnum \n<100
$\foo^{\baz}_{\foobar} \downarrow$
\egroup
\global\advance\n 1
\repeat
\end{document}