web-dev-qa-db-fra.com

Argument par défaut LaTeX \ newcommand: est-il vide?

J'essaie d'écrire un exemple de commande simple 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 devrait être \@empty et le simple \ifx\@empty#1 condition devrait 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 impriment toutes le mot empty 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. Une idée?

36
kolypto

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 le \ifthenelse et le \isempty test.

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

48
godbyk

Utilisation du package LaTeX3 xparse:

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

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] Est de demander à LaTeX d'examiner le jeton suivant pour voir s'il s'agit d'un crochet ouvert [. Si tel 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. Donc, pour que votre idée fonctionne, vous devez utiliser carré 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 que vous ne puissiez pas utiliser les mêmes crochets pour un argument optionnel que vous utilisez pour un argument obligatoire, mais c'est ainsi.

8
Norman Ramsey
\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
barraq