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
2_programmation:macros:arguments_optionnels_comme_pour_section [2018/06/03 16:19]
samcarter
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/10/21 13:50] (Version actuelle)
bdumont [Avec \NewDocumentCommand] réduction de taille de colonne pour affichage côte à côte
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 de l'​argument obligatoire donnée par l'​utilisateur ; 
 +au contraire, ''​\newcommand''​ exige que vous déterminiez la valeur  
 +de l'​argument par défaut au moment où vous définissez la commande. 
 + 
 + 
 +L'​astuce requise consiste à utiliser une macro dans l'argument ​optionnel ​: 
 + 
 +<WRAP column 70ex
 +<​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 29:
 \thing[opti]{manda}% #​1="​opti"​ \thing[opti]{manda}% #​1="​opti"​
 \end{document} \end{document}
-``` +</​code>​ 
-<!-- {% endraw ​%} --+</WRAP> 
-LaTeX itself has a trickier (but less readily understandable) +<WRAP column>​ 
-method, using a macro `\@dblarg`; inside LaTeX, the example +<​latexdoc>​ 
-above would have been programmed+\documentclass{article} 
-<!-- {% raw %} --+ 
-```latex+\newcommand\thing[2][\DefaultOpt]{% 
 +  \def\DefaultOpt{#​2}% 
 +  optional arg: #1,  mandatory arg: #2% 
 +} 
 + 
 +\begin{document} 
 +\thispagestyle{empty} 
 +\thing{manda}% #1=#2 
 + 
 +\thing[opti]{manda}% #​1="​opti"​ 
 +\end{document} 
 +</​latexdoc
 +</​WRAP>​ 
 +<WRAP clear/>​ 
 + 
 + 
 +Le code source de \LaTeX utilise une méthode plus subtile : 
 +il utilise une macro ''​\@dblarg''​. Voici comment l'​exemple précédent aurait 
 +été écrit dans LaTeX : 
 + 
 +<code latex
 +\makeatletter
 \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%
 } }
-``` +\makeatother 
-<!-- {% endraw ​%} --+</code> 
-In that code, `\@thing` is only ever called with an optional and a + 
-mandatory ​argument; if the default from the `\newcommand` is +Dans ce code, ''​\@thing''​ n'est jamais appelé qu'​avec un argument optionnel 
-invokeda bug in user code has bitten&​hellip;​+et un argument obligatoire ; si la valeur par défaut de la ''​\newcommand''​ 
 +est appelée, un bug apparaît dans le code utilisateur... 
 + 
 +typ 
 +
 +===== 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 60ex> 
 +<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.1528035592.txt.gz · Dernière modification: 2018/06/03 16:19 par samcarter
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0