
Ich habe Herberts Antwort verwendet inAuf leere Makroargumente prüfenum zu prüfen, ob ein Argument leer ist. Ich habe mich gefragt, ob es möglich ist, Herberts Lösung zu erweitern, um auch zu erkennen, ob ein Makroargument leer ist \empty
. Wenn dies nicht klappt, wollte ich eine Möglichkeit finden, ein Makro so einzustellen, dass es \ifempty
sich wie gewünscht verhält. Der folgende Code zeigt, dass \ifempty
ein leeres Makroargument korrekt erkannt wird, aber nicht \empty
als leeres Argument betrachtet wird. Dann gebe ich ein paar erfolglose Versuche an, ein leeres Makro zu definieren.
\documentclass{article}
\makeatletter
\def\ifempty#1{%
\if\relax\detokenize{#1}\relax%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
\begin{document}
\ifempty{}{1. empty}{1. nonempty}
\ifempty{\empty}{2. empty}{2. nonempty}
\def\z%
\ifempty{\z}{3. empty}{3. nonempty}
\def\z{}%
\ifempty{\z}{4. empty}{4. nonempty}
\end{document}
Antwort1
Detokenisiert \empty
ist natürlich nicht leer. Kurzer Kommentar zu den vier Beispielen.
Ist wie erwartet.
Ist nicht leer, wie am Anfang gesagt wurde.
Sie definieren
\z
, wonach string folgen sollte% \ifempty
. Die Definition ist falsch, wird aber nie verwendet. Dann gibt es{3. empty}{3. nonempty}
und es wird als normaler Text geschrieben.Jetzt
\z
ist richtig definiert, aberz
natürlich nicht leer.
Wenn Sie einfach die Äquivalenz von Makros vergleichen möchten, \ifx
ist dies möglicherweise besser für Sie geeignet.