====== 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>\LaTeX</latex> pour la commande ''\un'' et en <latex>\TeX</latex> pour la commande ''\one'') :

<code latex>
\newcommand{\un}[1]{Joie, quelle #1 !}
\def\one#1{Joie, quelle #1 !}
</code>

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 :

<code latex>
\newcommand{\un}[1]{Joie, quelle #1 !%
  \newcommand{\deux}[1]{Horreur, quelle #1 !}%
}
\def\one#1{Joie, quelle #1 !\def\two #1{Horreur, quelle #1 !}}
</code>

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 :

<code latex>
\newcommand{\un}[1]{Joie, quelle #1 !%
  \newcommand{\deux}[1]{Horreur, quelle ##1 !}%
}
\def\one#1{Joie, quelle #1 !\def\two ##1{Horreur, quelle ##1 !}}
</code>

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 : 

<code latex>
\newcommand{\un}{Joie, quelle joie !%
  \newcommand{\deux}[1]{Horreur, quelle ##1 !}%
}
</code>

-----
//Source ://
  * [[faquk>FAQ-hash|Defining macros within macros]]
  * [[faquk>FAQ-ltxhash|Defining LaTeX commands within other commands]]

{{htmlmetatags>metatag-keywords=(LaTeX,programming)
metatag-og:title=(Comment définir des commandes dans des commandes)
metatag-og:site_name=(FAQ LaTeX francophone)
}}