Usando registros \toks

Usando registros \toks

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\toksnú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 \toksde 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 abca través de

\toks@{abc}

o

\def\tmp{abc}

Tenga en cuenta que una macro tiene un comando específico para configurar la macro ( \defo 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.

  1. La expansión en \edefy 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 \tmpby \toks@contiene la misma lista de tokens xx \tmp, pero \Aestá definida por tokens expandibles que se expanden completamente y, por lo tanto, tiene definición, xx aaapero los tokens devueltos por \theno se expanden más en la definición \edef, por lo que también lo tiene.\Bxx \tmp

  2. 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 #y 1.

Esto se utiliza en \g@addto@macrola macro de LaTeX.

\g@addto@macro@\foo{abc}

se supone que debe agregarse abcal 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 \thetokscuya 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).

información relacionada