newcommand / newenvironment - paramètres facultatifs
j'expérimente avec mes propres commandes et environnements et maintenant je fais face à ces problèmes:
- comment créer une commande
foo{parameter}[optional]
ou l'environnement appelébegin{bar}{parameter}[optional]
? - comment créer une commande
foo[optional_1]...[optional_n]{parameter}
j'ai essayé
newcommand{foo}[3][][]{#1#2#3} - failed
newcommand{foo}[3][2][][]{#1#2#3} - failed
Est-ce que quelqu'un sait quelque chose? Merci beaucoup.
3 réponses
Utilisation de la xparse paquet (une partie de la LaTeX3 efforts de développement):
\usepackage{xparse}
\NewDocumentCommand\foo{O{}O{}m}{%
% Code with optional #1 and #2 with empty defaults
}
\NewDocumentCommand\foo{mO{}}{%
% Code with optional #2 with empty default
}
\NewDocumentEnvironment{foo}{O{}}{%
% Start code with optional #1
}{%
% End code with optional #1
}
les arguments optionnels sont un peu différents dans xparse avec \newcommand. Vous pouvez détecter si l'un est donné ou pas:
\NewDocumentCommand\foo{mo}{%
\IfNoValueTF{#2}
{Code without #2}
{Code with #2}%
}
vous verrez que cela fonctionne en utilisant un 'o' minuscule, alors que le 'O' majuscule nécessite alors une valeur par défaut (que j'ai rendue vide en incluant un groupe vide).
Vous ne pouvez pas créer un
\foo{parameter}[optional]
commande simplement; toutefois, vous pouvez créer un\foo[optional]{parameter}
commande\newcommand{\foo}[2][def]{Mandatory: #2; optional: #1}
Si vous l'appelez comme
\foo{given}
, il produiraMandatory: given, optional: def
; si vous l'appelez comme\foo[optional]{given}
, il produiraMandatory: given, optional: optional
. C'est probablement la façon dont vous devriez le faire-qui sera mieux avec le reste de votre code LaTeX. La création d'un nouvel environnement avec des paramètres optionnels se fait de la même façon avec\newenvironment{env}[2][def]{(#1,#2)\begingroup}{\endgroup}
où
#
est de nouveau l'option l'argument; c'est encore écrit que\begin{env}[opt]{req}...\end{env}
. Si vous vraiment vous voulez une commande dans l'autre forme, voir la fin de ma réponse.La TeX FAQ a une réponse sur l'écriture de commandes avec plus d'un argument optionnel. Il existe deux options pour la façon de le faire. L'idée sous-jacente est de définir une commande qui prend un argument optionnel, puis exécute une autre commande qui prend elle-même un argument optionnel, etc.; le twoopt le paquet encapsule ceci.
Si vous vraiment vous voulez une commande comme:\reversed{mandatory}[optional]
, vous pouvez le faire comme si. Tout d'abord, vous définissez une commande qui prend un argument requis, le stocke dans une macro, puis l'achemine vers une autre commande. Cette seconde commande prend un argument optionnel, et utilise la commande définie et l'argument optionnel. En mettant tout ça ensemble, on obtient
\makeatletter
\newcommand{\reversed}[1]{\def\reversed@required{#1}\reversed@opt}
\newcommand{\reversed@opt}[1][def]{Required: \reversed@required; optional: #1}
\makeatother
Vous pouvez ensuite, utilisez \reversed{mandatory}[optional]
ou \reversed{mandatory}
, et tout devrait fonctionner.
considérez aussi le paquet xargs. Voici un exemple tiré de sa documentation.
configurer de la manière habituelle,
\usepackage{xargs}
et ensuite si vous définissez
\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}
(ce qui signifie utiliser "1" pour le premier argument, s'il n'est pas spécifié, et à utiliser "n" pour le troisième). Puis
$\coord{x}$
rendements (sans indices)
(x1,. . . , xn)
et
$\coord[0]{y}$
les rendements (encore une fois, sans les indices, et y remplace le paramètre obligatoire)
(y0,..., yn)