我定义了两个新的宏和命令,使用文件中的以下命令来更改其内容.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
如果这些数据只使用一次,那么更好的方法可能是定义一个宏来打印照片以及相关数据,或者使用类似鍵盤这样您就可以使用键值语法来指定所有内容。