2010-01-27 5 views
35

J'essaye d'écrire un simple exemple de commande qui n'imprime rien sans argument, mais avec un argument il l'entoure de quelque chose.LaTeX newcommand par défaut: est vide?

J'ai lu que la valeur par défaut devrait être \@empty et la condition simple \ifx\@empty#1 doit faire le travail:

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

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

Les trois dernières commandes tout imprimer le mot empty pour une raison quelconque, et je veux la première deux pour ne rien imprimer et le dernier pour imprimer (((test))). J'utilise TeXLive/Ubuntu. Des idées?

Répondre

40

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} 

Le xifthen package fournit la construction \ifthenelse et le test \isempty.

Une autre option consiste à utiliser le package ifmtarg (voir la documentation ifmtarg.sty file).

+0

Fonctionne comme un charme, merci! :) – kolypto

8

Dans le moteur TeX sous-jacent avec lequel est écrit LaTeX, le nombre d'arguments qu'une commande peut prendre est corrigé. Ce que vous avez fait avec la valeur par défaut [\@empty] est de demander à LaTeX d'examiner le jeton suivant pour voir s'il s'agit d'un carré ouvert [. Si c'est le cas, LaTeX prend le contenu des crochets comme argument, sinon, le jeton suivant est remis dans le flux d'entrée et l'argument \@empty par défaut est utilisé à la place. Donc, pour obtenir votre idée de travailler, vous devez utiliser carrés crochets pour délimiter l'argument optionnel quand il est présent:

\optarg 
\optarg[] 
\optarg[test] 

Vous devriez avoir plus de chance avec cette notation.

Il est embêtant de ne pas pouvoir utiliser les mêmes parenthèses pour un argument optionnel que celui que vous utilisez pour un argument requis, mais c'est comme ça.

+0

Wow, merci! Jamais pensé que les supports sont si importants. Cependant, le problème persiste: '\ optarg' me donne toujours' (((vide))) 'et' \ optarg [] = ((())) '(ce qui ne devrait pas marcher de toute façon). Seul '\ optarg [test]' est maintenant '(((test)))' comme prévu. – kolypto

+1

Essayez '\ ifx! #! \ Else (((# 1))) \ fi' et faites l'argument par défaut'! '. Si cela fonctionne, vous pouvez changer le '!' Pour quelque chose que quelqu'un est moins susceptible d'utiliser par accident. –

11

Utilisation du package LaTeX3 de xparse:

\usepackage{xparse} 
\NewDocumentCommand\optarg{g}{% 
    \IfNoValueF{#1}{(((#1)))}% 
} 
+0

Merci, cela fonctionne aussi, mais est conçu pour être utilisé dans des paquets AFAIK. – kolypto

+1

Le but de xparse est de fournir une alternative complète à \ newcommand. Il n'y a aucune raison que vous ne puissiez pas l'utiliser pour une commande unique dans le préambule d'un document: je le fais certainement (mais j'ai écrit la plupart des implémentations actuelles de xparse, bien que je souligne que les idées ne sont pas vraiment le mien). L'exemple dans la documentation concerne principalement les paquets pour le moment, mais j'ai écrit un article TUGBoat pour le prochain numéro qui a des utilisations de "document". –

3
\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} 
Questions connexes