
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 \ifthenelse
und \@ifnotmtarg
einfachem TeX \if
waren 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 \DateOfBirth
und \PlaceOfBirth
, um das Geburtsdatum bzw. den Geburtsort festzulegen, die in Makros wie \@dateofbirth
und gespeichert werden könnten \@placeofbirth
. Indem Sie die Standardwerte dieser beiden Makros auf setzen, \relax
kö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, \MugShot
sodass der Code
\MugShot
\PlaceOfBirth{Mars}
\MugShot
\DateOfBirth{Tuesday}
\MugShot
\PlaceOfBirth{Venus}
\DateOfBirth{Wednesday}
\MugShot
würde ergeben:
(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.