\let usa ponteiros?

\let usa ponteiros?

Realmente cria \letuma 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 \cso significado atual do token. Se <token>for outra sequência de controle, \csadquirirá o mesmo significado que essa sequência de controle. (TeXbook 206)

Suponha que eu defina um novo ambiente de lista barsno qual \barhaja 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 \itemquando compilo meu documento? 1, 2 ou 1001?

Responder1

A resposta à sua pergunta é "mais um", ou seja, \iteme \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 \afor "executado" ele aja exatamente como se <token>estivesse lá. Essa cópia é feita no momento da \letinstrução, de forma que por mais vezes que \aseja 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 \anã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 \ade 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}

insira a descrição da imagem aqui

informação relacionada