[texhax] Defining a command which runs differently based ion input argument
Heiko Oberdiek
heiko.oberdiek at googlemail.com
Tue Dec 28 13:37:27 CET 2010
On Tue, Dec 28, 2010 at 01:28:00AM -0800, Mike B. wrote:
> How can I define a command which runs differently based on if an input
> argument was provided or not?. For example:
>
> \mycommand
> would introduce a vsapce of 1cm
>
> whereas
> \mycommand{xyz}
> would print xyz
Why do you want to have the same macro name for different purposes?
> So it's conceptually something likel:
> if input argument is missing then
> run this code
> else
> run this code
> endif
There are already many solutions in the thread:
* A classical optional argument:
\newcommand*{\mycommand}[1][]{...}
* An optional argument using braces.
However optional arguments at the end have the risk of
misinterpretation:
\mycommand
{\bfseries Hello World} % group braces are taken as argument braces
\mycommand\xyz % missing argument braces
Another concept/idea:
In the example above the first use of \mycommand is in
vertical mode, the second in horizontal mode.
This can be used to make the macro behaving differently
dependend on the mode:
\makeatletter
\newcommand*{\mycommand}{%
\ifhmode
\expandafter\mycommand at hmode
\else
\ifvmode
\mycommand at vmode
\else
\errmessage{Invalid mode}%
\fi
\fi
}
\newcommand*{\mycommand at hmode}[1]{#1}
\newcommand*{\mycommand at vmode}{\vspace{1cm}}
Yours sincerely
Heiko Oberdiek
More information about the texhax
mailing list