Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

27 Sep '13, 21:30

cgnieder's gravatar image

cgnieder
22.1k253463

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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

27 Sep '13, 21:29

cgnieder's gravatar image

cgnieder
22.1k253463

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 `\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, 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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

27 Sep '13, 21:29

cgnieder's gravatar image

cgnieder
22.1k253463