LaTeX «Переменные» — \@varname

LaTeX «Переменные» — \@varname

В настоящее время я нахожусь в процессе написания своего первого файла класса документа (персонализированный класс резюме), и я хочу лучше понять, что именно я делаю. Поэтому сейчас я настраиваю команды, которые позволяют присваивать значения переменным (не уверен, что это действительно то слово, которое я должен использовать), через структуру вроде этой:

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

Таким образом, в файле .tex пользователь может использовать команду \institution{University of Whatever}для сохранения строки «University of Whatever» в \@institution, которая затем впоследствии вызывается в файле класса другой командой.

Все это работает так, как мне нужно, но теперь я надеюсь создать некоторые условные выражения для управления выводом. Например, у меня есть команда, \educationкоторая при вызове в документе форматирует раздел образования для резюме с учетом названия учреждения, дат посещения, информации о степени и т. д., которые уже ввел пользователь. Я хочу иметь возможность настроить его в файле класса, чтобы проверить, \@variableопределены ли эти переменные, а затем форматировать вывод по-разному в зависимости от того, какие из них определены, а какие пусты.

Я думаю, что основная проблема в том, что я на самом деле не понимаю, что \@variableэто за определения и каковы возможности их использования.

Полный пример того, чего я пытаюсь добиться, будет выглядеть примерно так (в LaTeX/псевдо):

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

Итак, если бы \@datesattendedбыли определены, форматирование изменилось бы, чтобы соответствовать им. В противном случае команда просто прошла бы мимо них, распечатав предоставленную информацию.

решение1

В командах нет ничего особенного \@variable. Это просто макросы, для хранения контента, а не для выполнения других операций. Таким образом, можно проверить, определены ли они, используя \ifdefinedпримитив (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}

РедактироватьТо же самое должно быть достигнуто с использованием пакета \ifdeffrometoolbox

решение2

Возможно, лучше, чем \newcommand[1]...использование регистров toks:

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

Если пользователь говорит

\institution{Ministry of Silly Walks}

то вы можете использовать это значение в своих макросах как:

\the\institution

Если вам нужно проверить, было ли уже установлено значение «переменной», вы можете сделать:

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

Связанный контент