Problemas de escopo com \renewcommand dentro de \newcommand

Problemas de escopo com \renewcommand dentro de \newcommand

Estou criando um ambiente para poder escrever um livro contendo informações todas formatadas da mesma forma com base no modelo de ambiente. Eventualmente, eu gostaria de poder escrever

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

e ter a entrada formatada de maneira adequada e da mesma maneira com base no ambiente, eqdescriptionfazendo algo assim:

\newenvironment{eqdescription}{}{%
    \section{\eqnameval}

    Favorite Color: \eqcolorval

    Notes: \eqnotesval
    }

Como Jim Doe não tem uma cor favorita, a cor dele está em branco, então pensei que a cor dele apareceria com algum valor padrão, como no favorite color.

Achei que definir alguns comandos para inicializar e definir os valores dentro de um ambiente seria fácil assim:

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

E isso no topo do ambiente eu poderia colocar:

\initcommand{notes}{Default Value.}
\initcommand{name}{No Name.}
\initcommand{color}{No favorite color.}

Mas o comando init não apenas falha, como também causa todos os tipos de problemas com a redefinição de valores.

Existe uma maneira concisa de definir pequenos modelos como este sem sintaxe complicada e código duplicado?

Responder1

Você pode definir globalmente defos padrões no início de eqdescriptione, em seguida, dentro \renewcommanddo ambiente sempre que chamar \eqnameou . O irá redefinir tudo o que já existe. terá um escopo local, mas exige que as definições sejam definidas. Isso não é um problema, pois você os define com :\eqcolor\eqnotes\gdef\renewcommand\begin{eqdescription}

insira a descrição da imagem aqui

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

informação relacionada