
В настоящее время я нахожусь в процессе написания своего первого файла класса документа (персонализированный класс резюме), и я хочу лучше понять, что именно я делаю. Поэтому сейчас я настраиваю команды, которые позволяют присваивать значения переменным (не уверен, что это действительно то слово, которое я должен использовать), через структуру вроде этой:
\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}
РедактироватьТо же самое должно быть достигнуто с использованием пакета \ifdef
frometoolbox
решение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