
Я определяю два новых макроса и команды для изменения их содержимого с помощью следующих команд в .cls
файле.
\newcommand{\@mymacroa}{}
\newcommand{\mymacroa}[1]{\renewcommand{\@mymacroa}{#1}}
\newcommand{\@mymacrob}{}
\newcommand{\mymacrob}[1]{\renewcommand{\@mymacrob}{#1}}
Теперь я хочу проверить, является ли один (или оба) из них непустым (т. е. был ли изменен из значения по умолчанию) и если один из них имеет содержимое, вывести их значения. Мои предыдущие попытки с использованием \ifthenelse
, \@ifnotmtarg
и простого TeX \if
не увенчались успехом.
В псевдокоде я хочу добиться следующего:
\@ifnotmtarg{\@mymacroa}\or\@ifnotmtarg{\@mymacrob}
do {print some text and the macros which are non-empty}
решение1
Трудно сказать, как лучше всего это сделать, не зная, какими еще способами эти данные будут использоваться в пакете, тем более, что я не знаком сгенеалогическоедеревоупаковка.
С этой оговоркой один из способов сделать это — определить команды, скажем, \DateOfBirth
и \PlaceOfBirth
, чтобы задать дату и место рождения соответственно, которые можно сохранить в макросах, таких как \@dateofbirth
и \@placeofbirth
. Установив значения по умолчанию для обоих этих макросов, \relax
теперь вы можете проверить, был ли какой-либо из них переопределен, определив новое логическое значение, скажем \ifHaveDateOrPlace
, и используя что-то вроде:
% 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
Конечно, вам также понадобятся макросы для получения имени файла изображения и, возможно, имени человека, но, возможно, они уже предусмотреныгенеалогическоедерево. При этом вы можете определить макрос, \MugShot
чтобы код
\MugShot
\PlaceOfBirth{Mars}
\MugShot
\DateOfBirth{Tuesday}
\MugShot
\PlaceOfBirth{Venus}
\DateOfBirth{Wednesday}
\MugShot
будет производить:
(Моя картинка по умолчанию — вопросительный знак.)
Полный код этого MWE состоит из файла latex:
\documentclass{myclass}
\begin{document}
\MugShot
\PlaceOfBirth{Mars}
\MugShot
\DateOfBirth{Tuesday}
\MugShot
\PlaceOfBirth{Venus}
\DateOfBirth{Wednesday}
\MugShot
\end{document}
вместе с файлом класса myclass.cls
, который содержит все содержимое:
\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
Если эти данные будут использоваться только один раз, то лучшим подходом, вероятно, будет определение одного макроса для печати фотографии вместе с соответствующими данными или использование чего-то вродеpgfkeysтак что вы можете использовать синтаксис ключ-значение, чтобы указать все.