At several places in this FAQ, questions are answered in terms of how to program a LaTeX macro. Sometimes, these macros might also help users of Plain TeX or other packages; this answer attempts to provide a rough-and-ready guide to transcribing such macro definitions for use in other packages.
The reason LaTeX has commands that replace \
def
, is that
there's a general philosophy within LaTeX that the user should be
protected from himself: the user has different commands according to
whether the command to be defined exists (\
renewcommand
) or not
(\
newcommand
), and if its status proves not as the user expected,
an error is reported. A third definition command,
\
providecommand
, only defines if the target is not already
defined; LaTeX has no direct equivalent of \
def
, which ignores
the present state of the command. The final command of this sort is
\
DeclareRobustCommand
, which creates a command which is "robust"
(i.e., will not expand if subjected to LaTeX "protected
expansion"); from the Plain TeX user's point of view,
\
DeclareRobustCommand
should be treated as a non-checking version
of \
newcommand
.
LaTeX commands are, by default, defined \
long
; an optional *
between the \
newcommand
and its (other) arguments specifies that
the command is not to be defined \
long
. The *
is
detected by a command \
@ifstar
which uses \
futurelet
to switch
between two branches, and gobbles the *
: LaTeX users are
encouraged to think of the *
as part of the command name.
LaTeX's checks for unknown command are done by \
ifx
comparison
of a \
csname
construction with \
relax
; since the command name
argument is the desired control sequence name, this proves a little
long-winded. Since #1
is the requisite argument, we have:
(\expandafter\ifx \csname\expandafter\@gobble\string#1\endcsname \relax ...
\
@gobble
simply throws away its argument).
The arguments of a LaTeX command are specified by two optional arguments to the defining command: a count of arguments (0-9: if the count is 0, the optional count argument may be omitted), and a default value for the first argument, if the defined command's first argument is to be optional. So:
In the last case,\newcommand\foo{...} \newcommand\foo[0]{...} \newcommand\foo[1]{...#1...} \newcommand\foo[2][boo]{...#1...#2...}
\
foo
may be called as \
foo{goodbye}
,
which is equivalent to \
foo[boo]{goodbye}
(employing the
default value given for the first argument), or as
\
foo[hello]{goodbye}
(with an explicit first argument).
Coding of commands with optional arguments is exemplified by the
coding of the last \
foo
above:
\def\foo{\futurelet\next\@r@foo} \def\@r@foo{\ifx\next[% \let\next\@x@foo \else \def\next{\@x@foo[boo]}% \fi \next } \def\@x@foo[#1]#2{...#1...#2...}
This question on the Web: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=cvtlatex