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édentesRévision précédente
Prochaine révision
Révision précédente
2_programmation:macros:arguments_optionnels_comme_pour_section [2021/09/03 14:10] – Ajout \NewDocumentCommand bdumont2_programmation:macros:arguments_optionnels_comme_pour_section [2021/10/21 11:50] (Version actuelle) – [Avec \NewDocumentCommand] réduction de taille de colonne pour affichage côte à côte bdumont
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...
  
 +typ
 +o
 ===== Avec \NewDocumentCommand ===== ===== Avec \NewDocumentCommand =====
  
Ligne 50: Ligne 76:
 <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 86:
 <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 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 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.1630678208.txt.gz · Dernière modification : 2021/09/03 14:10 de bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0