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
Dernière révision Les deux révisions suivantes
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/09/03 16:10]
bdumont Ajout \NewDocumentCommand
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/10/19 22:59]
bdumont [Avec \newcommand] clarification et nettoyage
Ligne 8: Ligne 8:
 ne fonctionnent pas vraiment comme l'​argument optionnel de ''​\section''​. ne fonctionnent pas vraiment comme l'​argument optionnel de ''​\section''​.
 En effet, la valeur par défaut de l'​argument optionnel de ''​\section''​ En effet, la valeur par défaut de l'​argument optionnel de ''​\section''​
-est celle l'​argument obligatoirepar contre, ''​\newcommand''​ exige +est celle de l'​argument obligatoire ​donnée ​par l'​utilisateur ; 
-que vous connaissiez à l'​avance ​la valeur ​par défaut ​de l'​argument.+au contraire, ''​\newcommand''​ exige que vous déterminiez ​la valeur ​ 
 +de l'​argument ​par défaut au moment où vous définissez la commande.
  
  
-$\Reponse$  ​L'​astuce requise consiste à utiliser une macro dans l'​argument optionnel :+L'​astuce requise consiste à utiliser une macro dans l'​argument optionnel :
  
 +<WRAP column 70ex>
 <code latex> <code latex>
 \documentclass{article} \documentclass{article}
Ligne 28: Ligne 30:
 \end{document} \end{document}
 </​code>​ </​code>​
 +</​WRAP>​
 +<WRAP column>
 +<​latexdoc>​
 +\documentclass{article}
 +
 +\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/>
 +
  
-$\Reponse$  ​LaTeX lui-même a une méthode plus subtile (mais moins facile à comprendre):+Le code source de \LaTeX ​utilise ​une méthode plus subtile :
 il utilise une macro ''​\@dblarg''​. Voici comment l'​exemple précédent aurait il utilise une macro ''​\@dblarg''​. Voici comment l'​exemple précédent aurait
 été écrit dans LaTeX : été écrit dans LaTeX :
  
 <code 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
 </​code>​ </​code>​
  
Ligne 44: Ligne 68:
 est appelée, un bug apparaît dans le code utilisateur... est appelée, un bug apparaît dans le code utilisateur...
  
-===== Avec \NewDocumentCommand =====+typ 
 +o===== 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 :​ 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 :​
Ligne 50: Ligne 75:
 <code latex> <code latex>
 \NewDocumentCommand\thing{o m}{% \NewDocumentCommand\thing{o m}{%
-  ​optional arg: #​1,  ​mandatory arg: #2%+  ​argument optionnel entre crochets : #​1,  ​argument obligatoire : #2%
 } }
 </​code>​ </​code>​
Ligne 60: Ligne 85:
 <code latex> <code latex>
 \NewDocumentCommand\thing{O{valeur par défaut} m}{% \NewDocumentCommand\thing{O{valeur par défaut} m}{%
-  ​optional arg: #​1,  ​mandatory arg: #2%+  ​argument optionnel entre crochets : #​1,  ​argument obligatoire : #2%
 } }
 </​code>​ </​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/>
  
 ----- -----
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