Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
2_programmation:macros:arguments_optionnels_comme_pour_section [2018/06/02 17:37]
joseph.wright
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/09/03 17:19]
bdumont [Avec \NewDocumentCommand] Plusieurs arguments entre crochets
Ligne 1: Ligne 1:
---- +====== Comment définir des arguments ​optionnels comme ceux de \section ​? =====
-title: Optional ​arguments ​like `\section+
-category: programming +
-tags: macros latex +
-permalink: /​FAQ-oarglikesect +
-date: 2014-06-10 +
----+
  
-Optional argumentsin macros defined using `\newcommand`,​ don'+On présentera quelques méthodes traditionnellesavant de se tourner vers la commande ''​\NewDocumentCommand'' désormais incluse dans le noyau de <​latex>​\LaTeX</​latex>​qui fournit une syntaxe //ad hoc//.
-quite work like the optional argument to `\section`. ​ The default +
-value of `\section`s optional argument is the value of the +
-mandatory argumentbut `\newcommand` requires that you ''​know''​ the +
-value of the default beforehand.+
  
-The requisite trick is to use a macro in the optional ​argument: +===== Avec \newcommand ===== 
-<!-- {% raw %} --> + 
-```latex+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 ​
 + 
 +<​code ​latex>
 \documentclass{article} \documentclass{article}
 +
 \newcommand\thing[2][\DefaultOpt]{% \newcommand\thing[2][\DefaultOpt]{%
   \def\DefaultOpt{#​2}%   \def\DefaultOpt{#​2}%
   optional arg: #1,  mandatory arg: #2%   optional arg: #1,  mandatory arg: #2%
 } }
 +
 \begin{document} \begin{document}
 \thing{manda}% #1=#2 \thing{manda}% #1=#2
Ligne 26: Ligne 27:
 \thing[opti]{manda}% #​1="​opti"​ \thing[opti]{manda}% #​1="​opti"​
 \end{document} \end{document}
-``` +</code
-<!-- {% endraw %} --+ 
-LaTeX itself has trickier ​(but less readily understandable+$\Reponse$  ​LaTeX lui-même ​une méthode plus subtile ​(mais moins facile à comprendre): 
-method, using a macro `\@dblarg`; inside ​LaTeX, the example +il utilise une macro ''​\@dblarg''​. Voici comment l'​exemple précédent aurait 
-above would have been programmed+été écrit dans LaTeX : 
-<!-- {% raw %} --> + 
-```latex+<code latex>
 \newcommand\thing{\@dblarg\@thing} \newcommand\thing{\@dblarg\@thing}
 \newcommand\@thing[2][\@error]{% \newcommand\@thing[2][\@error]{%
   optional arg: #1,  mandatory arg: #2%   optional arg: #1,  mandatory arg: #2%
 } }
-``` +</​code>​ 
-<!-- {% endraw ​%} --+ 
-In that code, `\@thing` is only ever called with an optional and a +Dans ce code, ''​\@thing''​ n'est jamais appelé qu'​avec un argument optionnel 
-mandatory ​argument; if the default from the `\newcommand` is +et un argument obligatoire ; si la valeur par défaut de la ''​\newcommand''​ 
-invokeda bug in user code has bitten&​hellip;​+est appelée, un bug apparaît dans le code utilisateur... 
 + 
 +===== Avec \NewDocumentCommand ===== 
 + 
 +La macro ''​\NewDocumentCommand'',​ autrefois fournie par l'​extension [[ctanpkg>​xparse]] et intégrée dans le cœur de <latex>​\LaTeX</​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 : 
 + 
 +<code latex> 
 +\NewDocumentCommand\thing{o m}{% 
 +  argument optionnel entre crochets : #1,  argument obligatoire :​ #2% 
 +} 
 +</code
 + 
 +''​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 :​ 
 + 
 +<code latex> 
 +\NewDocumentCommand\thing{O{valeur par défaut} m}{% 
 +  argument optionnel entre crochets : #1 ​argument obligatoire :​ #2% 
 +
 +</​code>​ 
 + 
 +Il est même possible d'​indiquer plus d'un argument entre crochets, auquel cas l'​utilisateur ne pourra pas définir le second sans avoir défini le premier (noter que ''​[]''​ produit un argument vide, pas l'​argument par défaut :​ 
 + 
 +<WRAP column 75ex> 
 +<code latex> 
 +\NewDocumentCommand\thing{ 
 +  ​O{valeur par défaut} 
 +  O{un autre défaut}  
 +  m 
 +}{% 
 +  premier ​argument ​optionnel entre crochets : \textbf{#​1}\
 +  ​second argument optionnel entre crochets : \textbf{#​2}\\ 
 +  argument obligatoire : \textbf{#​3} 
 +
 + 
 +\thing[le premier argument]{% 
 +  j'ai défini le premier argument entre crochets mais pas le second} 
 + 
 +\thing[le premier argument][le second argument]{% 
 +  j'ai défini les deux arguments optionnels} 
 + 
 +\thing[][le second argument]{le premier argument est vide} 
 + 
 +\thing[valeur par défaut][le second argument]{% 
 +  pour obtenir la valeur par défaut du premier argument et 
 +  définir le second argumentj'ai dû indiquer explicitement 
 +  la valeur par défaut} 
 +</code
 +</​WRAP>​ 
 +<WRAP column>​ 
 +<​latexdoc>​ 
 +\documentclass{article} 
 +\thispagestyle{empty} 
 +\setlength{\parskip}{10pt} 
 +\setlength{\parindent}{0pt} 
 +\def\thing[#​1][#​2]#​3{% 
 +  premier argument optionnel entre crochets : \textbf{#​1}\\ 
 +  second argument optionnel entre crochets : \textbf{#​2}\\ 
 +  argument obligatoire : \textbf{#3} } 
 + 
 +\begin{document} 
 + 
 +\thing[le premier argument][un autre défaut]{j'​ai défini le premier argument entre crochets mais pas le second} 
 + 
 +\thing[le premier argument][le second argument]{j'​ai défini les deux arguments optionnels} 
 + 
 +\thing[][le second argument]{le premier argument est vide} 
 + 
 +\thing[valeur par défaut][le second argument]{pour obtenir la valeur par défaut du premier argument et définir le second argument, j'ai dû indiquer explicitement la valeur par défaut} 
 + 
 +\end{document} 
 +</​latexdoc>​ 
 +</​WRAP>​ 
 +<WRAP clear/>​ 
 + 
 +----- 
 + 
 +//​Sources ://​  
 + 
 +  * [[faquk>​FAQ-oarglikesect|Optional arguments like “\section.]] 
 +  * Joseph Wright, [[https://​www.tug.org/​TUGboat/​tb42-1/​tb130wright-newdoccmd.pdf|\NewDocumentCommand versus \newcommand versus …]], //TUGboat// 42-1, 2021.
  
 +{{htmlmetatags>​metatag-keywords=(LaTeX,​latex,​macros,​programmation,​plusieurs arguments optionnels)
 +metatag-og:​title=(Comment définir des arguments optionnels comme ceux de “\section”?​)
 +metatag-og:​site_name=(FAQ LaTeX francophone)
 +}}
  
2_programmation/macros/arguments_optionnels_comme_pour_section.txt · Dernière modification: 2021/10/21 13:50 par bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0