Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 381
kolypto Avatar asked Jan 27 '10 02:01

kolypto


2 Answers

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).

like image 66
godbyk Avatar answered Sep 29 '22 16:09

godbyk


Using the LaTeX3 xparse package:

\usepackage{xparse} \NewDocumentCommand\optarg{g}{%   \IfNoValueF{#1}{(((#1)))}% } 
like image 21
Joseph Wright Avatar answered Sep 29 '22 18:09

Joseph Wright