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/12/03 23:23]
jejust
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/09/03 15:30]
bdumont [Avec \NewDocumentCommand] typo
Ligne 1: Ligne 1:
-====== Optional arguments like `\section` ======+====== 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>\LaTeX</latex>, qui fournit une syntaxe //ad hoc//.
  
-Optional arguments, in macros defined using ''\newcommand'', don'+===== Avec \newcommand =====
-quite work like the optional argument to ''\section'' The default +
-value of ''\section''s optional argument is the value of the +
-mandatory argument, but ''\newcommand'' requires that you "know" the +
-value of the default beforehand.+
  
-The requisite trick is to use a macro in the optional argument:+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> <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 24: Ligne 29:
 </code> </code>
  
-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 :
  
 <code latex> <code latex>
Ligne 36: Ligne 40:
 </code> </code>
  
-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'' 
-invokedbug in user code has bitten...+est appeléeun bug apparaît dans le code utilisateur...
  
 +typo===== 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 argument, j'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/>
  
 ----- -----
  
-//Source:// [[faquk>FAQ-oarglikesect|Optional arguments like `\section`]]+//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,programming+{{htmlmetatags>metatag-keywords=(LaTeX,latex,macros,programmation,plusieurs arguments optionnels
-metatag-og:title=(Optional arguments like `\section`)+metatag-og:title=(Comment définir des arguments optionnels comme ceux de “\section”?)
 metatag-og:site_name=(FAQ LaTeX francophone) metatag-og:site_name=(FAQ LaTeX francophone)
 }} }}
  
2_programmation/macros/arguments_optionnels_comme_pour_section.txt · Dernière modification: 2021/10/21 11:50 de bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0