\newcommand 中的 \renewcommand 的范围问题

\newcommand 中的 \renewcommand 的范围问题

我正在创建一个环境,以便我可以编写一本书,其中包含基于环境模板以相同方式格式化的信息。最终,我希望能够编写

\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,然后在调用 或 时将它们放在环境中。将重新定义已存在的内容。将具有局部范围,但确实需要定义定义。 这不是问题,因为您使用 来定义它们:defeqdescription\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}

相关内容