
Actualmente estoy en el proceso de escribir mi primer archivo de clase de documento (una clase de currículum personalizado) y quiero comprender mejor qué estoy haciendo exactamente. Entonces, ahora mismo estoy configurando comandos que permiten asignar valores a variables (no estoy seguro si esa es realmente la palabra que debería usar), a través de una estructura como esta:
\newcommand{\institution}[1]{\def\@institution{#1}}
\newcommand{\datesattended}[1]{\def\@datesattended{#1}}
\newcommand{\degree}[1]{\def\@degree{#1}}
Entonces, en el archivo .tex, el usuario puede usar el comando \institution{University of Whatever}
para guardar la cadena "Universidad de lo que sea" \@institution
, que luego se llama dentro del archivo de clase mediante otro comando.
Todo esto funciona como quiero, pero ahora espero crear algunas expresiones condicionales para controlar la salida. Por ejemplo, tengo un comando \education
que, cuando se llama en el documento, formateará una sección de educación para un currículum con el nombre de la institución, las fechas de asistencia, la información del título, etc. que el usuario ya había ingresado. Quiero poder configurarlo en el archivo de clase para verificar si estas \@variable
variables se han definido y luego formatear la salida de manera diferente según cuáles estén definidas y cuáles estén vacías.
Principalmente, creo que gran parte de mi problema es que en realidad no entiendo cuáles \@variable
son las definiciones o el alcance de lo que puedo hacer con ellas.
Un ejemplo completo de lo que estoy tratando de lograr sería similar a (en LaTeX/pseudo):
\newcommand{\showeducation}{%
\@institutionname -- \@degree
if \@datesattended is defined:
\newline \@datesattended
clear \@institutionname, \@datesattended, \@degree
}
Entonces, si \@datesattended
estuviera definido, el formato cambiaría para acomodarlo. De lo contrario, el comando simplemente lo pasaría por alto e imprimiría la información proporcionada.
Respuesta1
Los comandos no tienen nada de especial \@variable
. Son sólo macros, para almacenar contenido en lugar de realizar otras operaciones. Como tal, es posible probar si está definido, utilizando \ifdefined
una primitiva (e-TeX).
\documentclass[11pt,a4paper]{article}
\makeatletter
\newcommand{\@institutionname}{Ministry of Silly Walks}
\newcommand{\@degree}{Minster of Silly Walks}
%\newcommand{\@datesattended}{1969}
\newcommand{\showeducation}{%
\@institutionname\ -- \@degree
\ifdefined\@datesattended
\newline \@datesattended % Please use some 'better' setup here
\else
\let\@institutionname\relax
\let\@datesattended\relax
\let\@degree\relax
\fi
}
\makeatother
\begin{document}
\showeducation % Date should not be printed
\makeatletter
\newcommand{\@datesattended}{1969}
\makeatother
\showeducation % Now it should be printed, but the rest is \relax`ed
\end{document}
EditarLo mismo debería poder lograrse usando \ifdef
el etoolbox
paquete
Respuesta2
Quizás mejor que \newcommand[1]...
el uso de registros toks:
\newtoks\institution \newtoks\datesattended \newtoks\degree
Si el usuario dice
\institution{Ministry of Silly Walks}
entonces puedes usar este valor en tus macros como:
\the\institution
Si necesita probar, si el valor de la "variable" ya estaba establecido, puede hacer:
\if\relax\the\degree\relax The degree isn't set.\else The degree is set.\fi