28 votes

LaTeX \ newcommand argument par défaut : est vide?

Je tente d'écrire une commande exemple simple qui n'imprime rien sans argument, mais qui entoure quelque chose avec un argument.

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

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

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

Les trois dernières commandes impriment toutes le mot vide pour une raison quelconque, et je veux que les deux premières n'impriment rien et la dernière imprime (((test))).

J'utilise TeXLive/Ubuntu. Des idées ?

32voto

godbyk Points 4357

Essayez le test suivant:

\documentclass{article}
\usepackage{xifthen}% fournit le test \isempty
\newcommand{\optarg}[1][]{%
  \ifthenelse{\isempty{#1}}%
    {}% si #1 est vide
    {(((#1)))}% si #1 n'est pas vide
}
\begin{document}
Testing \verb|\optarg|: \optarg% n'imprime rien
Testing \verb|\optarg[]|: \optarg[]% n'imprime rien
Testing \verb|\optarg[test]|: \optarg[test]% imprime (((test)))
\end{document>

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

Une autre option est d'utiliser le package ifmtarg (voir le fichier ifmtarg.sty pour la documentation).

10voto

Joseph Wright Points 1444

En utilisant le package LaTeX3 xparse :

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

5voto

Norman Ramsey Points 115730

Dans le moteur TeX sous-jacent avec lequel LaTeX est écrit, le nombre d'arguments qu'une commande peut avoir est fixe. Ce que vous avez fait avec le [\@empty] par défaut est demander à LaTeX d'examiner le jeton suivant pour voir s'il s'agit d'un crochet ouvrant [. 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 par défaut \@empty est utilisé à la place. Ainsi, pour que votre idée fonctionne, vous devez utiliser des crochets pour délimiter l'argument optionnel lorsqu'il est présent :

\optarg
\optarg[]
\optarg[test]

Vous devriez avoir plus de chance avec cette notation.

C'est ennuyeux de ne pas pouvoir utiliser les mêmes crochets pour un argument facultatif que pour un argument requis, mais c'est comme ça que ça se passe.

3voto

barraq Points 93
\documentclass{article}

\usepackage{ifthen} % fournit le test \ifthenelse
\usepackage{xifthen} % fournit le test \isempty

\newcommand{\inlinenote}[2][]{%
    {\bfseries{Note:}}%  
    \ifthenelse{\isempty{#1}}  
            {#2}               % si aucune option de titre donnée
            {~\emph{#1} #2}    % si un titre est donné
}

\begin{document}

\inlinenote{
    note simple
}

\inlinenote[le titre]{
    note simple avec titre
}

\end{document}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X