\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}

関連情報