##Séquences de contrôles aka commandes
Une commande (ou séquence de contrôle) peut prendre deux formes
* `\cmd` : caractère d'échappement `\` + nom de la commande `cmd`
* `\csname cmd\endcsname` : commande `\csname` + nome de la commande `cmd`
Dans la première forme le nom de la commande (i.e. `cmd`) peut être, soit 1) une chaîne
des caractères lettres (de code de catégorie 11). Ex. `\usepackage`, `\tableofcontents`, `\thepage`, soit 2) une seule caractère non lettre. Ex. `\;`, `\%`, `\\`.
Dans la deuxième forme le nom de la commande est une chaîne de caractères quelconques, à quelques exceptions qu'on verra plus tard. Ex. `\csname thepage\endcsname`, `\csname ^\endcsname`
##`\csname ...\endcsname`
Cette commande est en quelque sorte la fonction réciproque de `\string`.
En effet `\string\cmd` transforme la commande `\cmd` en chaîne des caractères `\`, `c`, `m` et `d`,
et `\csname cmd\endcsname` transforme la chaîne des caractères `c`, `m` et `d` en une commande
`\cmd`.
Cette commande (primitive) est là pour créer et utiliser des commandes qui ne sont
pas facilement accessibles par l'utilisateur, par exemple la gestion des compteurs :
avec la commande `\newcounter{ctr}` LaTeX va créer un compteur `\c@ctr` et en même temps définir
la commande `\thectr` qui permet l'affichage de la valeur de ce compteur.
Un deuxième exemple est le système des références croisées. En effet, avec la commande `\label{foo}`
LaTeX va définir une commande `\r@foo` où il stocke le numéro de l'objet et le numéro de la page.
Lorsque TeX rencontre `\csname` il développe au maximum le texte entre `\csname` et `\endcsname` correspondante. À l'issue de cet opération, si le résultat est une chaîne des caractères alors
`\csname ...\endcsname` est comme une commande `\[chaîne des caractères]`,
si le résultat contient des primitives alors, TeX affiche une message d'erreur.
**Remarque** Il est important de savoir que lorsque `\csname ...\endcsname` se développe en une commande `\[chaîne des caractères]` et si la commande
`\[chaîne des caractères]` n'est pas définie TeX définira `\csname ...\endcsname` et `\[chaîne des caractères]` comme `\relax`.
**Remarques**
* Tout le texte qui suit `%` sur le même ligne est ignoré,
donc `\csname avant % apres \endcsname` renvoie une message d'erreur,
alors que `\csname avant%...
apres\endcsname` =`\csname avantapres\endcsname` est valide.
* les caractères de code de catégorie 15 ne sont pas autorisées.
* le caractère `~` est active donc il se traite comme une commande. Or (cette commande) ne se développe pas en caractère donc ne peut pas être utilisé, toutefois on peut lui ajouter le préfixe `\string`.
###Exemples
* `\csname abc d\thepage\endcsname` : ici TeX développe `abc d\thepage` en `abc d[n]` où
`[n]` est le numéro de la page. On peut remarquer que c'est la même chose que
`\csname abc d\thepage\endcsname` ou `\csname abc d[n]\endcsname`
* `\csname table\empty of\empty contents\endcsname` : `table\empty of\empty contents`
se développe en `table[]of[]contents--->tableofcontents` donc
`\csname table\empty of\empty contents\endcsname` = `\csname tableofcontents\endcsname` = `\tableofcontents` (les espace après la commande `\empty` sont absorbées.
* `\csname the% texnique.fr 2017/08/25
page\endcsname` : le te texte `the% texnique.fr 2017/08/25
page` est développé par TeX en `thepage` donc `\csname the% texnique.fr 2017/08/25
page\endcsname` = `\csname thepage\endcsname` = `\thepage`.
**ECM 1**
\documentclass{article}
\newcommand{\foo}{\textbf{bla bla}}
\newcommand{\F}{f}
\newcommand{\f}{\F}
\newcommand{\o}{o}
\renewcommand{\o}{o}
\begin{document}
\foo=\csname \F \o o\endcsname=\csname \f \o o\endcsname
\end{document}
ici `\f` se développe en `\F` puis en `f` donc `\F \o o` et `\f \o o` sont développées en `foo`.
**ECM 2**
\documentclass{article}
\newcommand{\foo}{bla bla}
\newcommand{\f}{foo\empty}
\newcommand{\F}{foo\relax}
\begin{document}
\f=\F
\foo=\csname foo\endcsname=\csname \f\endcsname
mais % décommenter la ligne suivante
%\csname f\F\endcsname
\end{document}
ici `\F` se développe en `foo\relax` et `\relax` n'est pas développable donc le résultat final de développement n'est pas une chaîne des caractères, d'où le message d'erreur.
###Définitions
Pour définir une commande sous la deuxième forme, i.e. avec une chaîne des caractères non lettres on peut par exemple utiliser
* `\expandafter\newcommand\csname cmd\endcsname{texte de remplacement}` pour définir une commande à la manière de LaTeX `\newcommand{\foo}{texte de remplacement}` ou
* `\expandafter\def\csname cmd\endcsname{texte de remplacement}` pour définir une commande à la manière de TeX `\def\foo{texte de remplacement}` ou
* `\expandafter\let\csname cmd\endcsname\outrecmd`
cmd\endcsname\autrecmd` pour définir une commande à la manière de TeX
en lui donnant le sens d'une commande déjà définie `\let\foo\autrecmd`
**Remarque** LaTeX a défini Les commandes suivantes :
* `\def\@namedef#1{\expandafter\def\csname #1\endcsname}` donc on peut taper
`\makeatletter \@namedef{foo <bla&}{texte de remplacement}\makeatother` pour définir une commande (`\foo <bla&`).
* `\def\@nameuse#1{\csname #1\endcsname}` il suffit donc de taper `\makeatletter \@nameuse{foo <bla&}\makeatother` pour utiliser la commande (`\foo <bla&`).
## `\expandafter`
`\expandafter` est une primitive de TeX. Lorsque TeX rencontre `\expandafter\cmd1\cmd2`
il commence par développer `\cmd2` puis recommence en mettant `\cmd1` avant le (ou au début de) développement de `\cmd2`. i.e. `\expandafter\cmd1\cmd2` = `\cmd1[le développement de \cmd2]`.
**Exemple**
\documentclass{article}
\newcommand{\foo}{foo}
\begin{document}
\textbf\foo=\textbf{\foo}=\textbf{foo}
\expandafter\textbf\foo = \textbf foo
\end{document}
##Les environnements de LaTeX
* `\newenvironment{foo}{bon jour}{au revoir}` est en quelque sorte équivalente à
`\expandafter\newcommand\csname foo\endcsname{bon jour}` et
`\expandafter\newcommand\csname endfoo\endcsname{au revoir}`
* `\begin{foo}` est équivalente à `\begingroup\csname foo\endcsname`
* `\end{foo}` est équivalente à `\csname endfoo\endcsname\endgroup`
(ici l'équivalence est au sens de la fonction indispensable)
Les règles appliquées aux noms des environnements sont celles de la deuxième type des commandes
plus quelques exceptions supplémentaires.