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/12/04 00:23]
jejust
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:
-====== ​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'​t +===== 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 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> <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 23: 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/>
  
-LaTeX itself has a trickier (but less readily understandable) 
-method, using a macro ''​\@dblarg'';​ inside LaTeX, the example 
-above would have been programmed: 
  
 +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> <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>​
  
-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...
  
 +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,​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.1543879396.txt.gz · Dernière modification: 2018/12/04 00:23 par jejust
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0