# Defining starred versions of commands (* macro)

I would like to define a *'d version of a command, something like

\newcommand{\foo}{blah}
\newcommand{\foo*}{blahblah}


If I try to do this, LaTeX complains that I'm trying to redefine \foo, so I guess I need to do something special to handle *s. But what?

-

See this entry in the UK TeX FAQ.

The "elegant" way is to use the suffix package (which requires eTeX):

\documentclass{article}

\usepackage{suffix}
\newcommand\foo{blah}
\WithSuffix\newcommand\foo*{blahblah}

\begin{document}

\foo

\foo*

\end{document}

-
Does this work with commands with optional arguments too? If so how? –  YAK Mar 11 '14 at 10:59
@YAK I don't know. Note that the combination starred/optional is very rare. –  lockstep Mar 11 '14 at 11:37

LaTeX3 solution:

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\foo{s}{%
\IfBooleanTF#1%
{blahblah}% If a star is seen
{blah}%     If no star is seen
}

-

If you look at source2e you might see a lot of lines that look like

\def\foo{\@ifstar\@foo\@@foo}
\def\@foo#1{...}
\def\@@foo#1{...}


This makes \foo a one-argument command that has regular and starred versions. The starred version is the expansion of \@foo while the nonstarred version is that of \@@foo. Using the @ sign in the auxiliary macros is a TeX convention which some authors embrace and some avoid.

There are higher-level ways to do it (as lockstep points out) but once you learn this pattern it's not too hard to use. Just make sure it's between \makeatletter...\makeatother or in a .sty file.

Edits removed some inaccuracies and editorializing.

-
What's the controversy with @? FWIW, it's also used in Plain and ConTeXt (although far less in the latter, which do is more common, leading to some funny command names such as \dodohideblock). –  Will Robertson Oct 22 '10 at 3:22
Let me be clear that I follow the @-convention and am not advocating against it. But I can also see the point of view that the name \@foo (or \f@o or \f@@) doesn't help the human reader understand the relationship. \@foowithstar and \@foowithoutstar might be better. Sorry if I blew that internal ambivalence into a controversy. :-) Also, I wanted to point out that @'s are not required in auxiliary macros. –  Matthew Leingang Oct 22 '10 at 11:12
Yes, using '@' in place of vowels is a pain in the neck, whereas using it as a divider is fine. –  Joseph Wright Oct 23 '10 at 17:39