Estaba leyendo este tutorial para programación TeX:
http://pgfplots.sourceforge.net/TeX-programming-notes.pdf
recomendado en la segunda respuesta aquí:¿Dónde empiezo a programar en LaTeX?
Dice:
\toks<number>
También hay 255 registros de tokens que pueden considerarse variables de cadena especiales. Por supuesto, cada asignación de macro\def\macro{ content }
es también algún tipo de variable de cadena, pero los registros de token son especiales: su contenido no se expandirá cuando se use con\the\toks
número. Esto se puede utilizar para un control de expansión de grano fino; consulte la Sección 2.3 a continuación.
Pero no hay ejemplos de uso \toks
de registros. ¿Qué quiere decir con "variables de cadena especiales"? Para los 2 tipos de registros anteriores podría asignar el valor:
\count0=12
\dimen0=1.102pt
E imprimirlo:
Value1: \the\count0
Value2: \the\dimen0
Pero no entiendo cómo usarlo \toks
.
Respuesta1
Un registro de token es muy similar a una macro sin argumentos, pero existen diferencias en la sintaxis y las reglas de expansión.
Usando la definición simple y de látex de \toks@
para, \toks 0
puede almacenar los tokens abc
a través de
\toks@{abc}
o
\def\tmp{abc}
Tenga en cuenta que una macro tiene un comando específico para configurar la macro ( \def
o envoltorios alrededor de eso, como \newcommand
), pero los registros de token solo usan el nombre del registro seguido de unequilibradogrupo de texto.
Por el contrario, a diferencia de las macros que se expanden simplemente haciendo referencia a su nombre, los registros de token, al igual que otros registros, no son expandibles y se accede a sus contenidos expandiendo \the
.
Entonces
\the\toks@
y
\tmp
cada uno se expande a abc
.
Aparte de estas diferencias sintácticas, la expansión de los registros simbólicos difiere de las macros en dos aspectos importantes.
La expansión en
\edef
y otros contextos de solo expansión se limita a un nivel:\def\tmp{aaa} \def\tmpb{xx \tmp} \toks@{xx \tmp} \edef\A{\tmpb} \edef\B{\the\toks@}
Ahora
\tmpb
y\toks@
contiene la misma lista de tokensxx \tmp
, pero\A
está definida por tokens expandibles que se expanden completamente y, por lo tanto, tiene definición,xx aaa
pero los tokens devueltos por\the
no se expanden más en la definición\edef
, por lo que también lo tiene.\B
xx \tmp
La segunda diferencia es que como los registros de token no tienen argumentos,
#
no necesitan ser (y no son) especiales al definir o expandir el registro.\toks@{#1}
es solo un registro de token que consta de una lista de dos tokens
#
y1
.
Esto se utiliza en \g@addto@macro
la macro de LaTeX.
\g@addto@macro@\foo{abc}
se supone que debe agregarse abc
al final de la definición actual de \foo
.
Una definición simple (y si mal no recuerdo original) podría ser
\makeatletter
\gdef\foo{123}
\def\gaA#1#2{%
\expandafter\gdef\expandafter#1\expandafter{#1#2}}
\gaA\foo{abc}
\show\foo
Eso funciona bien y muestra la definición como 123abc
. Sin embargo intenta
\gaA\foo{#}
y obtienes
! Illegal parameter number in definition of \foo.
Sin embargo, podemos aprovechar el hecho de que #
no es especial en un registro toks y que el contenido del registro solo se expande una vez.
\long\def\g@addto@macro#1#2{%
\begingroup
\toks@\expandafter{#1#2}%
\xdef#1{\the\toks@}%
\endgroup}
Primero, se define el \toks@
registro para que contenga la expansión de la macro pasada en el primer argumento, seguida del contenido del segundo argumento. #
es seguro de usar en una tarea de toks. Entonces, la macro se define globalmente como \thetoks
cuya expansión es exactamente el contenido de \toks@
sin más expansión, incluso si contiene #
tokens:
\makeatletter
\gdef\foo{123}
\g@addto@macro\foo{abc}
\show\foo
\g@addto@macro\foo{#}
\show\foo
produce
> \foo=macro:
->123abc.
l.7 \show\foo
?
> \foo=macro:
->123abc##.
l.11 \show\foo
donde #
se ha agregado según lo previsto (solo #
se ha agregado uno, el duplicado ##
es un artefacto del uso \show
).