Post by Gérard LemennPost by Gérard LemennPost by TexboyPost by Gérard LemennBonjour,
\advance\toks 41{<general text>}
ou
\advance\toks 41\toks 10
Ce qui évidemment serait une concaténation de chaînes de symboles.
Bonne journée.
La primitive \advance s'emploie avec la syntaxe suivante
\advance<registre de compteur><[by]><nombre>
\advance<registre de dimension><[by]><dimension>
\advance<registre de ressort><[by]><ressort>
\advance<registre de muressort><[by]><muressort>
Pour la première, elle agit sur un compteur et l'incrémente de l'entier
signé <nombre>. Le fonctionnement est identique pour les autres syntaxes.
Elle ne peut pas agir sur un registre de tokens.
Si vous souhaitez une macro qui ajoute un <texte général> à un registre
\def\addtotoks#1#2{#1\expandafter{\the#1#2}}
Notez que l'argument #2 n'est pas développé et donc
\addtotoks{\toks41 }{\toks10 }
pourra ne pas fonctionner comme attendu.
Merci.
Mais on pourrait imaginer une extension de la primitive \advance
\advance\toks 0\toks 10
car avec cette écriture, le contenu de \toks 0 est relu (comme un argument)
pour assigner à nouveau \toks 0.
Ce qui est long dans le cas ou \toks 0 contient une longue chaîne.
De plus, ça me paraît esthétique car \advance
pourrait alors s'appliquer à tous les registres de eTeX.
Bonne journée.
\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.
\loggingall \toks 0=\toks 10\toks 0=\toks 10
La deuxième affectation signale : "reassigning toks 0"
ce qui signifie qu'eTeX ne fait rien, \toks 0 pointant déjà
sur la même zone mémoire que \toks 10.
Les tokens registers sont extrêmement pratiques pour pleins de raisons,
\edef\macro {\the\toks 0}
est extrêmement rapide, même si \the\toks 0 est très long, car TeX
ne regarde pas dans le contenu de \toks 0.
\loggingall
\toks 0={\outermacro }
\outer\def\outermacro {}
\edef\macro {\the\toks 0}% no problem here: TeX does not look inside \toks 0
\show\macro
Bon weekend.
Pour finir voici un petit code d'implémentation de \advance pour les tokens
sous le nom de \***@advance.
Bien sûr, on ne peut pas préfixer par \global !
Et on a besoin d'un token auxilliaire pour stocker la chaine à ajouter.
% ------------------------------------------
\def\***@advance {\expandafter \***@adva \romannumeral-`\q }%
\def\***@adva {\afterassignment \***@advb \let\@***@token =}%
\def\***@advb {\ifx \toks\@***@token \begingroup
\afterassignment\***@advc \count@ =%
\else \afterassignment\***@advd \***@advtok \fi
}% \***@advb
\def\***@advc {\expandafter \endgroup \expandafter \toksdef \expandafter \@***@token \the\count@
\afterassignment\***@advd \***@advtok
}% \***@advc
\def\***@advd {\@***@token =\expandafter {\the\expandafter\@***@token \the\***@advtok }}%
% -------------------------------------------
Allez. Bon weekend again !