
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 \education
que 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 \@variable
variá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 \@variable
sã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 \@datesattended
fosse 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 \@variable
comandos. São apenas macros, para armazenar conteúdo em vez de realizar outras operações. Como tal, é possível testar se está definido, usando \ifdefined
uma 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 \ifdef
o etoolbox
pacote
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