Pruebe si una de las dos macros no está vacía

Pruebe si una de las dos macros no está vacía

Defino dos nuevas macros y comandos para cambiar su contenido con los siguientes comandos en un .clsarchivo.

\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, \@ifnotmtargy TeX simple \ifno 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 \DateOfBirthy \PlaceOfBirth, para establecer la fecha y el lugar de nacimiento respectivamente, que podrían guardarse en macros como \@dateofbirthy \@placeofbirth. Al configurar los valores predeterminados de ambas macros, \relaxahora 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 \MugShotpara que el código

 \MugShot

 \PlaceOfBirth{Mars}
 \MugShot

 \DateOfBirth{Tuesday}
 \MugShot

 \PlaceOfBirth{Venus}
 \DateOfBirth{Wednesday}
 \MugShot

produciría:

ingrese la descripción de la imagen aquí

(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.

información relacionada