"Variáveis" do LaTeX - \@varname

"Variáveis" do LaTeX - \@varname

Atualmente, estou escrevendo meu primeiro arquivo de classe de documento (uma classe de currículo personalizada) e quero entender melhor o que exatamente estou fazendo. Então, agora estou configurando comandos que permitem que valores sejam atribuídos a variáveis ​​(não tenho certeza se essa é realmente a palavra que deveria usar), através de uma estrutura como esta:

\newcommand{\institution}[1]{\def\@institution{#1}}
\newcommand{\datesattended}[1]{\def\@datesattended{#1}}
\newcommand{\degree}[1]{\def\@degree{#1}}

Assim, no arquivo .tex, o usuário pode usar o comando \institution{University of Whatever}para salvar a string "University of Anything" em \@institution, que é posteriormente chamada dentro do arquivo de classe por outro comando.

Tudo isso funciona como eu quero, mas agora espero criar algumas expressões condicionais para controlar a saída. Tipo, eu tenho um comando \educationque quando chamado no documento irá formatar uma seção de educação para um currículo levando em consideração o nome da instituição, datas cursadas, informações de graduação, etc. Quero poder configurá-lo no arquivo de classe para verificar se essas \@variablevariáveis ​​​​foram definidas e, em seguida, formatar a saída de maneira diferente com base em quais estão definidas e quais estão vazias.

Primeiramente, acho que grande parte do meu problema é que na verdade não entendo quais \@variablesão as definições ou o escopo do que posso fazer com elas.

Um exemplo completo do que estou tentando alcançar seria algo como (em LaTeX/pseudo):

\newcommand{\showeducation}{%
    \@institutionname -- \@degree
    if \@datesattended is defined:
        \newline \@datesattended
    clear \@institutionname, \@datesattended, \@degree
}

Portanto, se \@datesattendedfosse definido, a formatação mudaria para acomodá-lo. Caso contrário, o comando simplesmente passaria por cima dele, imprimindo a informação que foi dada.

Responder1

Não há nada de especial nos \@variablecomandos. São apenas macros, para armazenar conteúdo em vez de realizar outras operações. Como tal, é possível testar se está definido, usando \ifdefineduma 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}

EditarO mesmo deve ser possível usando \ifdefo etoolboxpacote

Responder2

Talvez seja melhor do que \newcommand[1]...o uso de registros toks:

\newtoks\institution  \newtoks\datesattended  \newtoks\degree

Se o usuário disser

\institution{Ministry of Silly Walks}

então você pode usar esse valor em suas macros como:

\the\institution

Se precisar testar, se o valor da "variável" já foi definido, você pode fazer:

\if\relax\the\degree\relax The degree isn't set.\else The degree is set.\fi

informação relacionada