
Я создаю среду, чтобы я мог написать книгу, содержащую информацию, отформатированную одинаково на основе шаблона среды. В конце концов, я хотел бы иметь возможность писать
\begin{eqdescription}
\eqname{Bob Doe}
\eqcolor{Blue}
\eqnotes{Bob will help you.}
\end{eqdescription}
\begin{eqdescription}
\eqname{Jim Doe}
\eqnotes{Jim will NOT help you.}
\end{eqdescription}
и отформатировать запись красиво и одинаково в зависимости от среды, eqdescription
выполнив что-то вроде этого:
\newenvironment{eqdescription}{}{%
\section{\eqnameval}
Favorite Color: \eqcolorval
Notes: \eqnotesval
}
Поскольку у Джима Доу нет любимого цвета, его поле пустое, поэтому я подумал, что он будет отображаться с каким-то значением по умолчанию, например no favorite color
.
Я думал, что определение некоторых команд для инициализации и установки значений внутри среды будет простым, например, так:
\newcommand{\initcommand}[2]{%
% Set the Default Value:
\expandafter\newcommand\csname eq#1val\endcsname[0]{#2}
% Make a command \eq[name]{[avalue]} that sets it in the future.
\expandafter\newcommand\csname eq#1\endcsname [1] {%
\expandafter\renewcommand\csname eq#1val \endcsname[0]{##1}
}
}
И что наверху окружающей среды я мог бы поставить:
\initcommand{notes}{Default Value.}
\initcommand{name}{No Name.}
\initcommand{color}{No favorite color.}
Но это не только приводит к сбою команды init, но и вызывает всевозможные проблемы с переопределением значений.
Есть ли краткий способ определения таких небольших шаблонов без запутанного синтаксиса и дублирования кода?
решение1
Вы можете g
глобально def
вставить значения по умолчанию в начало eqdescription
, а затем \renewcommand
вводить их внутри среды всякий раз, когда вы вызываете \eqname
, \eqcolor
или \eqnotes
. Они \gdef
переопределят все, что уже существует. \renewcommand
будет иметь локальную область действия, но требует определения определений. Это не проблема, так как вы определяете их с помощью \begin{eqdescription}
:
\documentclass{article}
\newcommand{\eqname}{\renewcommand\eqnameval}
\newcommand{\eqcolor}{\renewcommand\eqcolorval}
\newcommand{\eqnotes}{\renewcommand\eqnotesval}
\newenvironment{eqdescription}
{% Set defaults for this environment
\gdef\eqnameval{No name.}%
\gdef\eqcolorval{No favourite colour.}%
\gdef\eqnotesval{Default value.}%
}
{%
\section{\eqnameval}
Favorite Color: \eqcolorval
Notes: \eqnotesval%
}
\setlength{\parindent}{0pt}% Just for this example
\begin{document}
\begin{eqdescription}
\eqname{Bob Doe}
\eqcolor{Blue}
\eqnotes{Bob will help you.}
\end{eqdescription}
\begin{eqdescription}
\eqname{Jim Doe}
\eqnotes{Jim will NOT help you.}
\end{eqdescription}
\end{document}