
Defino dos nuevas macros y comandos para cambiar su contenido con los siguientes comandos en un .cls
archivo.
\newcommand{\@mymacroa}{}
\newcommand{\mymacroa}[1]{\renewcommand{\@mymacroa}{#1}}
\newcommand{\@mymacrob}{}
\newcommand{\mymacrob}[1]{\renewcommand{\@mymacrob}{#1}}
Ahora quiero probar si uno (o ambos) de estos no está vacío (es decir, se ha modificado del valor predeterminado) y si uno de ellos tiene contenido, imprimir sus valores. Mis intentos anteriores con \ifthenelse
, \@ifnotmtarg
y TeX simple \if
no han tenido éxito.
En pseudocódigo, lo que quiero lograr es:
\@ifnotmtarg{\@mymacroa}\or\@ifnotmtarg{\@mymacrob}
do {print some text and the macros which are non-empty}
Respuesta1
Es difícil decir cuál es la mejor manera de hacer esto sin saber de qué otras maneras se usarán estos datos en el paquete, especialmente porque no estoy familiarizado con elgenealogíaárbolpaquete.
Con esta advertencia, una forma de hacerlo es definir comandos, por ejemplo \DateOfBirth
y \PlaceOfBirth
, para establecer la fecha y el lugar de nacimiento respectivamente, que podrían guardarse en macros como \@dateofbirth
y \@placeofbirth
. Al configurar los valores predeterminados de ambas macros, \relax
ahora puede probar para ver si alguna de ellas ha sido redefinida definiendo un nuevo booleano, por ejemplo \ifHaveDateOrPlace
, y usando algo como:
% 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
Por supuesto, también necesitaría macros para obtener el nombre del archivo de imagen y probablemente el nombre de la persona, pero quizás ya estén proporcionados porgenealogíaárbol. Con esto en su lugar, podría definir una macro \MugShot
para que el código
\MugShot
\PlaceOfBirth{Mars}
\MugShot
\DateOfBirth{Tuesday}
\MugShot
\PlaceOfBirth{Venus}
\DateOfBirth{Wednesday}
\MugShot
produciría:
(Mi imagen predeterminada es un signo de interrogación).
El código completo de este MWE consta del archivo látex:
\documentclass{myclass}
\begin{document}
\MugShot
\PlaceOfBirth{Mars}
\MugShot
\DateOfBirth{Tuesday}
\MugShot
\PlaceOfBirth{Venus}
\DateOfBirth{Wednesday}
\MugShot
\end{document}
junto con el archivo de clase myclass.cls
, que contiene todo el contenido:
\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
Si estos datos sólo se van a utilizar una vez, entonces un mejor enfoque probablemente sería definir una sola macro para imprimir la foto, junto con los datos asociados, o usar algo comoclavespgfpara que pueda utilizar una sintaxis clave-valor para especificar todo.