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?
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).
Utilisation du package LaTeX3 xparse:
\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]
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.
\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}