Re: \advance\toks 41{...}

Liste des GroupesRevenir à fct tex 
Sujet : Re: \advance\toks 41{...}
De : gouailles (at) *nospam* gmail.com (Gérard Lemenn)
Groupes : fr.comp.text.tex
Date : 13. Oct 2023, 15:13:01
Autres entêtes
Message-ID : <9b7345d6-74ba-4cad-9ca4-260737d96c3bn@googlegroups.com>
References : 1 2 3 4
User-Agent : G2/1.0
Le vendredi 13 octobre 2023 à 15:02:35 UTC+2, Gérard Lemenn a écrit :
Le vendredi 13 octobre 2023 à 14:48:57 UTC+2, Gérard Lemenn a écrit :
Le samedi 7 octobre 2023 à 18:11:48 UTC+2, Texboy a écrit :
Le 07/10/2023 à 17:45, Gérard Lemenn a écrit :
Bonjour,
 
Quelqu'un a une référence ou une idée de pourquoi on ne peut pas écrire :
 
\advance\toks 41{<general text>}
ou
\advance\toks 41\toks 10
 
Ce qui évidemment serait une concaténation de chaînes de symboles.
 
Bien sûr on peut créer une macro \toks@advance qui permette cette syntaxe, mais l'idée serait de surtout de rendre plus rapide la concaténation de chaînes.
 
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
de tokens, vous pouvez définir une macro comme par exemple :
 
\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
de sorte que :
\advance\toks 0\toks 10
 
concatène les tokens de façon beaucoup plus rapide que :
\toks 0=\expandafter {\the\toks \expandafter\z@ \the\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.
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.
On le vérifie facilement avec :
\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,
et notamment aussi parce que :
\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.
 
On le vérifie aisément en mettant par exemple une séquence \outer dans \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 \toks@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\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 }}%
% -------------------------------------------

Allez. Bon weekend again !






Date Sujet#  Auteur
7 Oct 23 * Re: \advance\toks 41{...}7Texboy
13 Oct 23 `* Re: \advance\toks 41{...}6Gérard Lemenn
13 Oct 23  `* Re: \advance\toks 41{...}5Gérard Lemenn
13 Oct 23   `* Re: \advance\toks 41{...}4Gérard Lemenn
14 Oct 23    `* Re: \advance\toks 41{...}3Texboy
28 Oct 23     +- Re: \advance\toks 41{...}1Florent CHERVET
28 Oct 23     `- Re: \advance\toks 41{...}1Florent CHERVET

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal