"Variables" de LaTeX - \@varname

"Variables" de LaTeX - \@varname

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 \educationque, 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 \@variablevariables 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 \@variableson 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 \@datesattendedestuviera 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 \ifdefineduna 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 \ifdefel etoolboxpaquete

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

información relacionada