--- myst: html_meta: keywords: LaTeX,programming --- # Comment définir des commandes dans des commandes ? Si vous souhaitez créer des commandes qui définissent automatiquement d'autres commandes, la règle à retenir est que lorsque vous allez écrire `##`, il sera remplacé par `#` de la même manière que `#1` est remplacé par « le premier argument passé à la commande ». Aussi, si vous définissez la commande suivante (on met ici la manière de le faire respectivement en LaTeX pour la commande `\un` et en TeX pour la commande `\one`) : ```{noedit} \newcommand{\un}[1]{Joie, quelle #1 !} \def\one#1{Joie, quelle #1 !} ``` Dans les deux, que vous saisissiez `\un{joie}` ou `\one{joie}`, le développement de la commande va vous donner : « Joie, quelle joie ! ». Modifions maintenant naïvement ces commandes pour qu'elles définissent une autre commande : ```{noedit} \newcommand{\un}[1]{Joie, quelle #1 !% \newcommand{\deux}[1]{Horreur, quelle #1 !}% } \def\one#1{Joie, quelle #1 !\def\two #1{Horreur, quelle #1 !}} ``` Ici, `\un{joie}` va afficher « Joie, quelle joie ! » puis exécuter la commande `\newcommand{\deux}[1]{Horreur, quelle joie !}`, définition d'une commande `\deux` qui ignore son argument et restitue systématiquement « Horreur, quelle joie ! ». En effet `#1` est remplacé systématiquement par le premier argument. La commande `\one{joie}` sera encore plus insidieuse car, après avoir affiché « Joie, quelle joie ! », elle va exécuter la commande `\def\two joie{Horreur, quelle joie !}}`... autrement dit créer une commande `\two` qui demandera d'être appelée en saisissant toujours `\two joie` et qui restituera toujours « Horreur, quelle joie ! ». De fait, pour obtenir le bon comportement, nous devons utiliser la définition suivante : ```{noedit} \newcommand{\un}[1]{Joie, quelle #1 !% \newcommand{\deux}[1]{Horreur, quelle ##1 !}% } \def\one#1{Joie, quelle #1 !\def\two ##1{Horreur, quelle ##1 !}} ``` La commande `\un{joie}` exécutera `\newcommand{\deux}[1]{Horreur, quelle #1 !}` tandis que `\one{joie}` exécutera bien `\def\two #1{Horreur, quelle #1 !}`. Ici `##1` a bien été remplacé par `#1`. Pour imbriquer une définition dans une définition à l'intérieur d'une définition, vous avez besoin de `####`, en doublant le nombre de signes `#`. Au niveau d'imbrication suivant, vous avez besoin de 8 `#`, et ainsi de suite. Il est aussi à noter que le doublement des signes `#` est nécessaire que la commande englobante ait ou pas un argument : ```{noedit} \newcommand{\un}{Joie, quelle joie !% \newcommand{\deux}[1]{Horreur, quelle ##1 !}% } ``` :::{sources} - [Defining macros within macros](faquk:FAQ-hash) - [Defining LaTeX commands within other commands](faquk:FAQ-ltxhash) :::