Ich brauche Hilfe beim Verständnis von if-Anweisungen.
Wie erstelle ich den folgenden Pseudocode in LaTeX?
\newcommand{\@leader}{}
\newcommand{\leader}[1]{\renewcommand\@leader{#1}}
\newcommand{\donow}{
\if \@leader == {} %aka blank, null, empty
this is the false %do false
\else
\@leader %do leader
\fi
}
Wenn ein Benutzer seinem Dokument Folgendes hinzufügt,
\leader{
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\leader{}
\donow
Drucken Sie Folgendes aus
*This is an item
*this is also an item
this is the false
Meine einzige Frage zu Variablen lautet: Ist meine Lösung wirklich die beste Möglichkeit, Variablen zu erstellen?
Antwort1
Sie können Makro-zu-Makro mit testen \ifx
. Das heißt, \ifx<csA><csB><true>\else<false>\fi
es wird getestet, ob die Definition von <csA>
mit der von <csB>
und übereinstimmt <true>
, oder <false>
andernfalls:
\documentclass{article}
\makeatletter
\newcommand{\@emptymacro}{}% Used to test against an empty macro
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifx\@something\@emptymacro %aka blank, null, empty
this is the false %do false
\else
\@something %do something
\fi
}
\makeatother
\begin{document}
\something{%
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\something{}
\donow
\end{document}
etoolbox
bietet einen ähnlichen Prüfmechanismus:
\usepackage{etoolbox}
\makeatletter
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifdefempty{\@something}{%aka blank, null, empty
this is the false %do false
}{%
\@something %do something
}%
}
\makeatother
Antwort2
Der Standard-TeX-Code für die gegebene Aufgabe ist:
\def\something#1{\def\internal{#1}%
\ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}
Das Problem dieses Codes (oben) ist, dass das Makro \something
nicht erweiterbar ist, da es \def
eine Zuweisung enthält. Wenn Sie ein erweiterbares Makro mit demselben Test benötigen, müssen Sie das Token auswählen, das nie als erstes Token im Parameter verwendet wurde (sagen wir ?
in unserem Beispiel) und Sie können schreiben:
\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}
Wenn Sie nicht wissen, welches Token niemals als erstes Token des Parameters vorkommt, können Sie \detokenize
beispielsweise das erweiterbare Primitiv von eTeX verwenden:
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi