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?
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).
en utilisant le paquet Xparse de LaTeX3:
\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
\IfNoValueF{#1}{(((#1)))}%
}
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.
\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}