Ceci est une ancienne révision du document !


Comment définir des arguments optionnels comme ceux de \section ?

On présentera quelques méthodes traditionnelles, avant de se tourner vers la commande \NewDocumentCommand désormais incluse dans le noyau de \LaTeX, qui fournit une syntaxe ad hoc.

Avec \newcommand

Les arguments optionnels des macros définies avec \newcommand ne fonctionnent pas vraiment comme l'argument optionnel de \section. En effet, la valeur par défaut de l'argument optionnel de \section est celle l'argument obligatoire, par contre, \newcommand exige que vous connaissiez à l'avance la valeur par défaut de l'argument.

$\Reponse$ L'astuce requise consiste à utiliser une macro dans l'argument optionnel :

\documentclass{article}
 
\newcommand\thing[2][\DefaultOpt]{%
  \def\DefaultOpt{#2}%
  optional arg: #1,  mandatory arg: #2%
}
 
\begin{document}
\thing{manda}% #1=#2
 
\thing[opti]{manda}% #1="opti"
\end{document}

$\Reponse$ LaTeX lui-même a une méthode plus subtile (mais moins facile à comprendre): il utilise une macro \@dblarg. Voici comment l'exemple précédent aurait été écrit dans LaTeX :

\newcommand\thing{\@dblarg\@thing}
\newcommand\@thing[2][\@error]{%
  optional arg: #1,  mandatory arg: #2%
}

Dans ce code, \@thing n'est jamais appelé qu'avec un argument optionnel et un argument obligatoire ; si la valeur par défaut de la \newcommand est appelée, un bug apparaît dans le code utilisateur…

Avec \NewDocumentCommand

La macro \NewDocumentCommand, autrefois fournie par l'extension xparse et intégrée dans le cœur de \LaTeX depuis 2020, fournit une syntaxe qui permet de définir les commandes de manière flexible. On peut ainsi redéfinir la commande \thing ci-dessus :

\NewDocumentCommand\thing{o m}{%
  optional arg: #1,  mandatory arg: #2%
}

o indique un argument optionnel et m un argument obligatoire (mandatory). Chaque argument peut être rendu long en préfixant le caractère d'un +.

On peut indiquer une valeur par défaut de la manière suivante :

\NewDocumentCommand\thing{O{valeur par défaut} m}{%
  optional arg: #1,  mandatory arg: #2%
}

Sources :

2_programmation/macros/arguments_optionnels_comme_pour_section.1630678208.txt.gz · Dernière modification: 2021/09/03 16:10 par bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0