--- myst: html_meta: keywords: LaTeX, programmation, commandes, macros, \makeatletter, \makeatother, style personnalisé, définir une commande, commandes internes de LaTeX --- # Que font `\makeatletter` et `\makeatother` ? ## Être ou ne pas être une lettre : le cas de @ Comme indiqué dans la question "[](/2_programmation/macros/bien_nommer_ses_macros_et_environnements)", le caractère `@` est normalement traité comme un chiffre ou un symbole de ponctuation. En particulier, il ne peut pas apparaître dans le nom d'une commande. De fait, si vous écrivez par exemple `\cejour@midi`, il ne s'agit pas d'un nom d'une commande isolée, mais de la commande `\cejour` suivie des caractères `@`, `m`, `i`, etc. Pourtant, si vous lisez les sources d'une extension, d'un fichier de classe ou même du noyau LaTeX, vous constaterez que beaucoup de noms de commandes y contiennent au moins un `@`. Il s'agit d'une convention standard de LaTeX (déjà utilisée par le format `plain` d'ailleurs) qui sert à empêcher l'utilisateur d'utiliser directement ces commandes dans le document principal : il pourra par exemple pas appeler `\cejour@midi` car LaTeX ne comprendra que `\cejour` suivi du texte `@midi`. Ceci repose que le fait que TeX peut être paramétrée pour considérer ou pas `@` (ou tout autre caractère) comme une lettre. Par défaut avec LaTeX, `@` est une lettre à l'intérieur des fichiers de style (extensions) ou de classe (les commandes `\documentclass` et `\usepackage` gèrent comportement), et n'est pas une lettre dans les documents . ## Modifier le sens de @ Si vous souhaitez néanmoins modifier ou définir une telle commande, il faut, au préalable, dire à LaTeX de considérer `@` comme une lettre, afin que ce dernier puisse être utilisé dans les noms de commandes. C'est le rôle de `\makeatletter` (autrement dit, "faire de `at` \[c'est ainsi que se prononce `@` en anglais courant\] une lettre"). Il ne faut pas oublier par la suite de rétablir l'ordre naturel des choses avec la commande `\makeatother`. Le livre [The LaTeX Companion](/1_generalites/documentation/livres/documents_sur_latex) donne de nombreux exemples (disponibles sur le CTAN) de cet usage. Voici un exemple qu'il donne (en page 29 de la 2{sup}`e` édition). L'auteur y modifie la présentation de la sous-section. ```{noedit} \makeatletter \renewcommand\subsection{\@startsection {subsection}{2}{0mm}%name, level, indent {-\baselineskip}% beforeskip {0.5\baselineskip}% afterskip {\normalfont\normalsize\itshape}}% style \makeatother ``` La question "[](/2_programmation/macros/commande_etoilee)" donne un autre exemple d'utilisation de ces commandes. ## Une solution alternative à ces commandes À l'intérieur d'une extension, le `@` est toujours considéré comme une lettre. Il est donc, dans ce cas, inutile d'utiliser `\makeatletter` pour définir des commandes dont le nom contient un `@`. Ce principe conduit à une bonne alternative à l'utilisation des commandes `\makeatletter` et `\makeatother` lorsque ces dernières se multiplient : regrouper tous ces fragments de code pour en faire une extension en les plançant dans un fichier `sty` (de préférence placé dans le même répertoire que votre fichier `tex`) et en appelant votre nouvelle extension avec la commande `\usepackage`. Ainsi, vous regroupez dans un fichier votre code LaTeX un peu plus complexe et rendez votre code mieux organisé. Ce principe est décrit dans la question "[](/2_programmation/extensions/apprendre_a_ecrire_des_classes_et_des_packages)". :::{sources} - [Être ou ne pas être une lettre : le cas de @](https://www.elzevir.fr/imj/latex/tips.html#makeatletter), par Manuel Pégourié-Gonnard ; - [\@ and @ in macro names](faquk:FAQ-atsigns) ; - [Why do LaTeX internal commands have an @ in them?](https://tex.stackexchange.com/questions/6240/why-do-latex-internal-commands-have-an-in-them) :::