Discussion:
\advance\toks 41{...}
(trop ancien pour répondre)
Gérard Lemenn
2023-10-07 15:45:42 UTC
Permalink
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 \***@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.
Texboy
2023-10-07 16:11:45 UTC
Permalink
Post by Gérard Lemenn
Bonjour,
\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
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.
Gérard Lemenn
2023-10-13 12:48:56 UTC
Permalink
Post by Texboy
Post by Gérard Lemenn
Bonjour,
\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
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.
Gérard Lemenn
2023-10-13 13:02:33 UTC
Permalink
Post by Gérard Lemenn
Post by Texboy
Post by Gérard Lemenn
Bonjour,
\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.
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.
Gérard Lemenn
2023-10-13 13:13:01 UTC
Permalink
Post by Gérard Lemenn
Post by Gérard Lemenn
Post by Texboy
Post by Gérard Lemenn
Bonjour,
\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 !
Texboy
2023-10-14 17:27:24 UTC
Permalink
Post by Gérard Lemenn
Post by Gérard Lemenn
\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
Post by Gérard Lemenn
Et on a besoin d'un token auxilliaire pour stocker la chaine à ajouter.
% ------------------------------------------
% -------------------------------------------
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}}
Florent CHERVET
2023-10-28 20:31:33 UTC
Permalink
Post by Texboy
Post by Gérard Lemenn
\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
Exactement :
1ere ligne : vous définissez deux chaînes, indépendamment
2è ligne : \toks 0 pointe vers la même chaine que \toks 10
3è ligne : \toks 10 pointe vers la nouvelle chaîne : "C"

C'est comme quand on fait \let\A =\B
On ne recopie pas le contenu de \B, on fait simplement pointer
\A vers la même mémoire que \B...

Bon weekend.
Florent CHERVET
2023-10-28 20:59:55 UTC
Permalink
Post by Texboy
Post by Gérard Lemenn
Post by Gérard Lemenn
\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
Post by Gérard Lemenn
Et on a besoin d'un token auxilliaire pour stocker la chaine à ajouter.
% ------------------------------------------
% -------------------------------------------
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}}
Mon code marcherait même si on écrit :
\***@advance \macro
où \macro commence par : \toks@
Alors que votre code non.

Mais on peut bien sûr passer par \meaning si on veut, mais il faut
le \romannumeral-`\q avant de s'occuper du \meaning.

Donc en fait, hormis \global impossible, mon code s'approche le plus de la syntaxe de TeX.

Bref, bon weekend !

Stefan Ram
2023-10-07 16:22:58 UTC
Permalink
Post by Gérard Lemenn
Bonjour,
Bonjour !
Post by Gérard Lemenn
\advance\toks 41{<general text>}
ou
\advance\toks 41\toks 10
Dans le TeXbook, je trouve la syntaxe :

<arithmetic> ->
\advance<integer variable><optional by><number> |
\advance<dimen variable><optional by><dimen> |
\advance<glue variable><optional by><glue> |
\advance<muglue variable><optional by><muglue> .

, pour ajouter des <tokens> à \toks 41 peut-être :

\toks 41=\expandafter{\the\toks41 <tokens>}

(non testé).
Continuer la lecture sur narkive:
Loading...