测试两个宏中是否有一个不为空

测试两个宏中是否有一个不为空

我定义了两个新的宏和命令,使用文件中的以下命令来更改其内容.cls

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

现在我想测试其中一个(或两个)是否非空(即是否已从默认值修改),如果其中一个有内容,则打印它们的值。我之前使用 和纯 TeX 的尝试\ifthenelse\@ifnotmtarg没有\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 的完整代码由乳胶文件组成:

\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

如果这些数据只使用一次,那么更好的方法可能是定义一个宏来打印照片以及相关数据,或者使用类似鍵盤这样您就可以使用键值语法来指定所有内容。

相关内容