newcommand / newenvironment - paramètres facultatifs

j'expérimente avec mes propres commandes et environnements et maintenant je fais face à ces problèmes:

  1. comment créer une commande foo{parameter}[optional] ou l'environnement appelé begin{bar}{parameter}[optional]?
  2. 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.

16
demandé sur Crowley 2010-05-26 02:11:47

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).

12
répondu Joseph Wright 2010-05-27 06:02:47
  1. 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 produira Mandatory: given, optional: def; si vous l'appelez comme \foo[optional]{given}, il produira Mandatory: 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}
    

    # 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.

  2. 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.

15
répondu Antal Spector-Zabusky 2015-10-12 22:05:26

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)

5
répondu dank 2018-04-23 04:45:50