What does \ifx\\#1\\ stand for?
It's one of the uncountable ways to check whether an argument is empty. Almost all of them suffer of some drawback: in the case at hand, the argument mustn't be \\
.
What does \ifx
do? It compares the two tokens following it, without expanding them. The test return success if both tokens are equal in the sense of \meaning
or \show
:
if they are characters (or control sequences
\let
to a character), they must represent the same (character code, category code) pairif they are control sequences (but not
\let
to a character), they must have the same meaning; the cases are too many to list them all.
Before analyzing the macro, we should know something about TeX conditional: the abstract form is
\ifZ<test><true text>\else<false text>\fi
where \ifZ
denotes one of the primitive conditionals. The <test>
can take many forms, depending on \ifZ
(it's empty, in some cases); what is important is that the <true text>
is everything that goes from the end of <test>
to \else
(or \fi
if \else
is missing).
So let's see what happens when we call \mycommand{abc}
, that is, the default argument, which is empty, is substituted to #1
: the tokens that TeX sees are
\ifx\\\\<true>\else<false>\fi
Of course the test is true, because the tokens that follow \ifx
are both \\
.
When we call \mycommand[xyz]{abc}
, instead, TeX sees
\ifx\\xyz\\<true>\else<false>\fi
and TeX compares \\
to x
and they are different. But now the <true text>
is
yz\\<true>
(remember: the <true text>
is what goes from the test to the \else
) and it will be ignored altogether.
This test is quite safe, because it doesn't do expansion; however it might fail miserably if the user calls \mycommand[\\]{abc}
, so often different delimiter tokens are used, which are supposed not to creep into user's input (for instance \uchyph
or \vfuzz
). Another similar test might be
\if\relax\noexpand#1\relax
with the caveat that \if
does expand what's next until two unexpandable tokens remain. The first token is \relax
, which is unexpandable. The second one will be what becomes of the expansion of \noexpand
, that is, the first token of #1
(if non empty) but made unexpandable; if #1
is empty, then \noexpand
applies to \relax
, resulting again in \relax
because it's unexpandable.
In both cases some token is reserved (\\
in the first case, \relax
in the second one). The safest test is
\if\relax\detokenize{#1}\relax
because the expansion of a non empty #1
can never give a first token equivalent to \relax
: even if #1
is \relax
, \detokenize{\relax}
will give the string \relax
(the first token of which is the character \
).
Again, if #1
is empty, the test compares \relax
to \relax
; if #1
is not empty, everything will be ignored up to the \else
. Of course it requires that an engine with the e-TeX extensions is run: it won't work with "Knuth TeX".
\ifx <command> #1 <command>
<code for #1 is empty>
\else
<code for #1 is _not_ empty>
\fi
<command>
can also be
\ifx\relax#1\relax
if #1
is empty (or doesn't exist), then we have \relax=\relax
which is true.
If #1
is not empty, then we have \relax=#1
which is false (except #1=\relax
) and the following \relax
doesn't hurt because it does nothing.
With \ifx\\#1\\
the LaTeX kernel does a test for an extension of a filename:
\def\test#1.#2\\{%
\ifx\\#2\\
<no extension #2 is empty, because \\=\\>
\else
<extension is #2>
\fi