Testen Sie, ob eines der beiden Makros nicht leer ist

Testen Sie, ob eines der beiden Makros nicht leer ist

Ich definiere zwei neue Makros und Befehle, um deren Inhalt mit den folgenden Befehlen in einer .cls-Datei zu ändern.

\newcommand{\@mymacroa}{}
\newcommand{\mymacroa}[1]{\renewcommand{\@mymacroa}{#1}}
\newcommand{\@mymacrob}{}
\newcommand{\mymacrob}[1]{\renewcommand{\@mymacrob}{#1}}

Jetzt möchte ich testen, ob einer (oder beide) davon nicht leer ist (d. h. vom Standardwert abgeändert wurde) und wenn einer davon Inhalt hat, dessen Werte ausdrucken. Meine bisherigen Versuche mit \ifthenelseund \@ifnotmtargeinfachem TeX \ifwaren nicht erfolgreich.

Im Pseudocode möchte ich Folgendes erreichen:

\@ifnotmtarg{\@mymacroa}\or\@ifnotmtarg{\@mymacrob} 
do {print some text and the macros which are non-empty}

Antwort1

Es ist schwer zu sagen, wie man das am besten macht, ohne zu wissen, wie diese Daten sonst noch im Paket verwendet werden, insbesondere, da ich nicht vertraut bin mit derGenealogiebaumPaket.

Mit diesem Vorbehalt besteht eine Möglichkeit, dies zu tun, darin, Befehle zu definieren, beispielsweise \DateOfBirthund \PlaceOfBirth, um das Geburtsdatum bzw. den Geburtsort festzulegen, die in Makros wie \@dateofbirthund gespeichert werden könnten \@placeofbirth. Indem Sie die Standardwerte dieser beiden Makros auf setzen, \relaxkönnen Sie nun testen, ob eines von ihnen neu definiert wurde, indem Sie einen neuen Booleschen Wert definieren, beispielsweise \ifHaveDateOrPlace, und etwas wie Folgendes verwenden:

% include the date and/or place of birth if available
\HaveDateOrPlacefalse% reset date and place boolean
\if\@dateofbirth\relax\else\HaveDateOrPlacetrue\fi
\if\@placeofbirth\relax\else\HaveDateOrPlacetrue\fi
\ifHaveDateOrPlace\gtrsymBorn \@placeofbirth \@dateofbirth \fi

Natürlich bräuchte man auch Makros, um den Namen der Bilddatei und wahrscheinlich auch den Namen der Person zu erhalten, aber vielleicht werden diese bereits bereitgestellt vonGenealogiebaum. Damit können Sie ein Makro definieren, \MugShotsodass der Code

 \MugShot

 \PlaceOfBirth{Mars}
 \MugShot

 \DateOfBirth{Tuesday}
 \MugShot

 \PlaceOfBirth{Venus}
 \DateOfBirth{Wednesday}
 \MugShot

würde ergeben:

Bildbeschreibung hier eingeben

(Mein Standardbild ist ein Fragezeichen.)

Der vollständige Code für dieses MWE besteht aus der Latex-Datei:

\documentclass{myclass}

\begin{document}

 \MugShot

 \PlaceOfBirth{Mars}
 \MugShot

 \DateOfBirth{Tuesday}
 \MugShot

 \PlaceOfBirth{Venus}
 \DateOfBirth{Wednesday}
 \MugShot

\end{document}

zusammen mit der Klassendatei myclass.cls, die den gesamten Inhalt enthält:

\LoadClass[12pt]{amsart}

\RequirePackage{genealogytree}
\RequirePackage{graphicx}

% boolean to keep track of place and date of birth
\newif\ifHaveDateOrPlace
% place of birth
\providecommand\@placeofbirth{\relax}
\newcommand\PlaceOfBirth[1]{\renewcommand\@placeofbirth{\space#1}}

% date of birth
\providecommand\@dateofbirth{\relax}
\newcommand\DateOfBirth[1]{\renewcommand\@dateofbirth{\space#1}}

\providecommand\@personpicture{{\Huge?}}
\newcommand\Picture[2][]{\edef\@personpicture{\noexpand\includegraphics[width=30mm,#1]{#2}}}

% reset the people data
\newcommand\ResetData{%
\renewcommand\@placeofbirth{\relax}%
\renewcommand\@dateofbirth{\relax}%
}

\newcommand\MugShot{%
  \begin{tabular}{c}
    \@personpicture\\
    % include the date and/or place of birth if available
    \HaveDateOrPlacefalse% reset date and place boolean
    \if\@dateofbirth\relax\else\HaveDateOrPlacetrue\fi
    \if\@placeofbirth\relax\else\HaveDateOrPlacetrue\fi
    \ifHaveDateOrPlace\gtrsymBorn \@placeofbirth \@dateofbirth \fi
  \end{tabular}%
  \ResetData
}

\endinput

Wenn diese Daten nur einmal verwendet werden, wäre es wahrscheinlich besser, ein einzelnes Makro zu definieren, um das Foto zusammen mit den zugehörigen Daten zu drucken, oder etwas wiepgf-Schlüsselsodass Sie eine Schlüssel-Wert-Syntax verwenden können, um alles anzugeben.

verwandte Informationen