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 [2020/11/25 00:41]
jejust Traduction en français.
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`? ======+====== 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//. 
 + 
 +===== Avec \newcommand ​=====
  
 Les arguments optionnels des macros définies avec ''​\newcommand''​ Les arguments optionnels des macros définies avec ''​\newcommand''​
 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 24: 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 39: Ligne 67:
 et un argument obligatoire ; si la valeur par défaut de la ''​\newcommand''​ et un argument obligatoire ; si la valeur par défaut de la ''​\newcommand''​
 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 =====
 +
 +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 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,​programmation,​plusieurs arguments optionnels) {{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:​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.1606261313.txt.gz · Dernière modification: 2020/11/25 00:41 par jejust
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0