Sujet : Re: \advance\toks 41{...}
De : tex.boy (at) *nospam* teaser.fr (Texboy)
Groupes : fr.comp.text.texDate : 14. Oct 2023, 18:27:24
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <ugej1s$3v7g2$1@dont-email.me>
References : 1 2 3 4 5
User-Agent : Mozilla Thunderbird
Le 13/10/2023 à 15:13, Gérard Lemenn a écrit :
Pour être plus précis :
\toks 0=\toks 10
>
est ultra rapide, car alors \toks 0 pointe sur la même chaine que \toks 10
Il n'y a pas de copie du contenu de \toks 10 dans \toks 0.
Ah ?
\toks0={A} \toks10={B}
\toks0=\toks10
\toks10={C}
\showthe\toks0 % donne B et non pas C
Et on a besoin d'un token auxilliaire pour stocker la chaine à ajouter.
% ------------------------------------------
\def\toks@advance {\expandafter \toks@adva \romannumeral-`\q }%
\def\toks@adva {\afterassignment \toks@advb \let\@let@token =}%
\def\toks@advb {\ifx \toks\@let@token \begingroup
\afterassignment\toks@advc \count@ =%
\else \afterassignment\toks@advd \toks@advtok \fi
}% \toks@advb
\def\toks@advc {\expandafter \endgroup \expandafter \toksdef \expandafter \@let@token \the\count@
\afterassignment\toks@advd \toks@advtok
}% \toks@advc
\def\toks@advd {\@let@token =\expandafter {\the\expandafter\@let@token \the\toks@advtok }}%
% -------------------------------------------
Oui. Pour le sucre syntaxique et faire la distinction entre \toks<nombre> et \<toksname>, on peut aussi utiliser \meaning et alléger un peu le code. Ce qui, à mon avis, ne doit pas modifier de façon significative la vitesse d'exécution (pas testé)...
\newtoks\tmptoks \newcount\tmpcount
\def\toksadd{\expandafter\toksaddA\meaning}
\expandafter\def\expandafter\toksaddA\string\toks{\afterassignment\toksaddB\tmpcount}
\def\toksaddB{\afterassignment\toksaddC\tmptoks= }
\def\toksaddC{\toks\tmpcount\expandafter{\the\toks\expandafter\tmpcount\the\tmptoks}}