If-Anweisungen und Variablen

If-Anweisungen und Variablen

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>\fies wird getestet, ob die Definition von <csA>mit der von <csB>und übereinstimmt <true>, oder <false>andernfalls:

Bildbeschreibung hier eingeben

\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}

etoolboxbietet 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 \somethingnicht erweiterbar ist, da es \defeine 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 \detokenizebeispielsweise das erweiterbare Primitiv von eTeX verwenden:

\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi

verwandte Informationen