[plain tex] analyse lexicale pour \uppercase

Comment TeX développe t’il \uppercase ?

L’exemple ci-dessous peut être utilisé pour essayer de tester sa
compréhension. Vous trouverez ensuite la retranscription d’une session
TeX en ligne de commande, laquelle vient contredire ce que je pensais.

#+BEGIN_EXAMPLE
\catcode@=11 \uccode1=i \uccode2=`z
\uppercase{\gdef\on@12{ab}}
#+END_SRC

Il me semblait que TeX aurait défini une macro nommée \on@iz, étant donné
que les unités lexicales i et z ont le code de catégorie 11 (lettre).

Selon moi, \uppercase aurait reçu la liste d’unités lexicales
suivante : ‘\gdef’, ‘\on@’, ‘1’, ‘2’, ‘{’, ‘a’, ‘b’, ‘}’. Après
conversion, on aurait obtenu la liste suivante : ‘\gdef’, ‘\on@iz’, ‘{’,
‘A’, ‘B’, ‘}’. Enfin, TeX aurait développé la séquence
‘\gdef\on@iz{AB}’, ce qui aurait équivalu à définir une macro \on@iz.

Cependant, je me suis aperçu que ce n’était pas ça.

#+BEGIN_EXAMPLE
$ tex

  • This is TeX, Version 3.14159265 (TeX Live 2020) (preloaded format=tex)
    **\catcode`@=11

*\uccode1=i \uccode2=z

*\show\on@

\on@=undefined
<*> \show\on@

?

*\uppercase{\gdef\on@12{ab}}

*\show\on@

\on@=macro:
iz->AB.
<*> \show\on@

?
! Emergency stop
<*> \show\on@

No pages of output.
Transcript written on texput.log.
$
#+END_EXAMPLE

Cet exemple montre bien qu’on a défini une macro nommée \on@ et que
cette macro est délimitée avec les unités lexicales i et z.

Cordialement,
Kevin Vigouroux

Bonjour la liste !

J’ai trouvé la réponse : les codes de catégories ne sont pas changés
durant une conversion avec \uppercase ou \lowercase. Par conséquent,
pour \on@iz, on obtient les codes de catégories : 11[o] 11[n] 11[@]
12[1->i] 12[2->z].

Cordialement,
Kevin Vigouroux

[…] durant une conversion avec \uppercase ou \lowercase. Par
conséquent, pour \on@iz, on obtient les codes de catégories : 11[o]
11[n] 11[@] 12[1->i] 12[2->z].

Précision importante à ajouter : le nom d’une macro est seulement
composé de lettres (unités lexicales de catégorie 11) mais le texte de
paramètre d’une macro peut contenir d’autres caractères que des lettres
(c.f. page 238 du TeXbook).

P.S.: La primitive \string transforme tous les codes de catégorie de sa
liste d’unités lexicales en 12.

Cordialement,
Kevin Vigouroux

Kevin Vigouroux xyz@xyz.tld writes:

[…] durant une conversion avec \uppercase ou \lowercase. Par
conséquent, pour \on@iz, on obtient les codes de catégories : 11[o]
11[n] 11[@] 12[1->i] 12[2->z].

Précision importante à ajouter : le nom d’une macro est seulement
composé de lettres (unités lexicales de catégorie 11) mais le texte de
paramètre d’une macro peut contenir d’autres caractères que des lettres
(c.f. page 238 du TeXbook).

P.S.: La primitive \string transforme tous les codes de catégorie de sa
liste d’unités lexicales en 12.

En fait, on peut inclure n’importe quel caractère grâce aux primitives
\csname … \endcsname. Enfin, \string affecte la catégorie 10 au
caractère espace contenue dans le nom d’une séquence de contrôle (c.f.
le TeXbook, page 48).

Cordialement,
Kevin Vigouroux