Da @saputello ja schon wie gewohnt hervorragend geklärt hat, was `\detokenize` macht, dachte ich, ich gebe vielleicht ein kleines Beispiel, wo man es einsetzen kann. Das folgende definiert einen Befehl `\ifempty{<test>}{<wahr>}{<falsch>}`:
\makeatletter
\newcommand\ifempty[1]{%
\if\relax\detokenize{#1}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatletter
Wie in [Was macht `\if`?][1] geklärt wurde, expandiert `\if` so lange, bis es zwei nicht expandierbare Token findet und vergleicht dann deren Zeichencodes. Da `\detokenize` expandierbar ist, gibt in dieser Definition von `\ifempty{<test>}{<wahr>}{<falsch>}` der `\if`-Test nur dann `<wahr>` zurück, wenn das Argument _wirklich leer_ ist. Wenn `#1` leer ist, dann expandiert `\detokenize` zu nichts und `\if` vergleicht `\relax` mit `\relax`:
\if\relax\detokenize{}\relax => \if\relax\relax => wahr
Wenn `#1` nun ein Leerzeichen ist, dann wird `\relax` mit dem Lehrzeichen verglichen und gibt `<falsch>` zurück. Das würde mit
\if\relax#1\relax
nicht funktionieren, da das Leerzeichen hier nach dem ersten `\relax` ignoriert würde. (Das entspräche also eher einem `\ifblank`.) Auch eine Eingabe von `\relax` würde `<falsch>` ergeben, was mit `\if\relax#1\relax` ebenfalls `<wahr>` ergäbe. Das `\relax` wird von `\detokenize` ja in eine Reihe von Zeichen mit Kategorie-Code `12` verwandelt, weshalb nun `\relax` mit `\ ` verglichen wird.
Nachdem das alles gesagt wurde: mit [`etoolbox`][2] stehen einem zahlreiche solcher Test-Makros beriet, bereit, man muss sie also gar nicht selbst implementieren.
[1]: http://texwelt.de/wissen/fragen/1307/was-macht-if
[2]: http://www.ctan.org/pkg/etoolbox