Проверьте, не является ли один из двух макросов пустым

Проверьте, не является ли один из двух макросов пустым

Я определяю два новых макроса и команды для изменения их содержимого с помощью следующих команд в .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так что вы можете использовать синтаксис ключ-значение, чтобы указать все.

Связанный контент