Проблемы с областью действия \renewcommand внутри \newcommand

Проблемы с областью действия \renewcommand внутри \newcommand

Я создаю среду, чтобы я мог написать книгу, содержащую информацию, отформатированную одинаково на основе шаблона среды. В конце концов, я хотел бы иметь возможность писать

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

Связанный контент