我正在创建一个环境,以便我可以编写一本书,其中包含基于环境模板以相同方式格式化的信息。最终,我希望能够编写
\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
}
因为 Jim Doe 没有喜欢的颜色,所以他的颜色是空白的,所以我认为他的颜色会显示一些默认值,例如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}