L'argument par défaut de LaTeX newcommand: est vide?

j'essaie d'écrire un exemple simple de commande qui n'imprime rien sans argument, mais avec un argument il l'entoure de quelque chose.

j'ai lu que la valeur par défaut doit être @empty et le ifx@empty#1 condition:

newcommand{optarg}[1][@empty]{%
ifx@empty#1  {}  else  {(((#1)))}  fi
}

optarg % (((empty)))
optarg{} % (((empty)))
optarg{test} % (((empty))) test

Les trois dernières commandes d'impression empty mot pour quelque raison, et je veux les deux premiers à l'impression de rien, et la dernière à imprimer (((test))).

J'utilise TeXLive / Ubuntu. Un des idées?

36
demandé sur kolypto 2010-01-27 05:22:48

4 réponses

essayez le test suivant:

\documentclass{article}

\usepackage{xifthen}% provides \isempty test

\newcommand{\optarg}[1][]{%
  \ifthenelse{\isempty{#1}}%
    {}% if #1 is empty
    {(((#1)))}% if #1 is not empty
}

\begin{document}

Testing \verb|\optarg|: \optarg% prints nothing

Testing \verb|\optarg[]|: \optarg[]% prints nothing

Testing \verb|\optarg[test]|: \optarg[test]% prints (((test)))

\end{document}

xifthen paquet offre \ifthenelse construction et de l' \isempty de test.

une Autre option est d'utiliser le ifmtarg paquet (voir ifmtarg.sty le fichier pour la documentation).

43
répondu godbyk 2010-01-27 08:06:45

en utilisant le paquet Xparse de LaTeX3:

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
11
répondu Joseph Wright 2010-01-27 08:23:47

dans le moteur Tex sous-jacent avec lequel LaTeX est écrit, le nombre d'arguments qu'une commande peut prendre est fixe. Ce que vous avez fait avec la valeur par défaut [\@empty] c'est de demander à LaTeX pour examiner le prochain jeton pour voir si c'est un crochet ouvert [. Si oui, LaTeX prend le contenu de crochets, comme argument, si ce n'est pas, la prochaine jeton est remis dans le flux d'entrée et la valeur par défaut \@empty argument est utilisé à la place. Donc, pour obtenir votre idée fonctionne, vous devez utiliser carré entre parenthèses pour délimiter l'argument optionnel lorsqu'il est présent:

\optarg
\optarg[]
\optarg[test]

Vous devriez avoir plus de chance avec cette notation.

il est ennuyeux que vous ne puissiez pas utiliser les mêmes crochets pour un argument optionnel que vous utilisez pour un argument requis, mais c'est comme ça.

8
répondu Norman Ramsey 2010-01-27 02:26:51
\documentclass{article}

\usepackage{ifthen} % provides \ifthenelse test  
\usepackage{xifthen} % provides \isempty test

\newcommand{\inlinenote}[2][]{%
    {\bfseries{Note:}}%  
    \ifthenelse{\isempty{#1}}  
            {#2}               % if no title option given
            {~\emph{#1} #2}    % if title given
}

\begin{document}

\inlinenote{
    simple note
}

\inlinenote[the title]{
    simple note with title
}

\end{document}
3
répondu barraq 2011-07-13 10:25:56