简体   繁体   中英

LaTeX \newcommand default argument: is empty?

I'm trying to write a simple example command that prints nothing without an argument, but with an argument it surrounds it with something.

I've read that the default value should be \\@empty and the simple \\ifx\\@empty#1 condition should do the job:

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

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

The latter three commands all print the empty word for some reason, and I want the first two to print nothing and the last to print (((test))) .

I'm using TeXLive/Ubuntu. An ideas?

Try the following test:

\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}

The xifthen package provides the \\ifthenelse construct and the \\isempty test.

Another option is to use the ifmtarg package (see the ifmtarg.sty file for the documentation).

Using the LaTeX3 xparse package:

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

In the underlying TeX engine with which LaTeX is written, the number of arguments a command can take is fixed. What you've done with the default [\\@empty] is ask LaTeX to examine the next token to see if it is an open square bracket [ . If so, LaTeX takes the contents of square brackets as the argument, if not, the next token is put back into the input stream and the default \\@empty argument is used instead. So to get your idea to work, you have to use square brackets to delimit the optional argument when present:

\optarg
\optarg[]
\optarg[test]

You should have better luck with this notation.

It's annoying that you can't use the same brackets for an optional argument as you use for a required argument, but that's the way it is.

\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}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM