
Estoy creando un entorno para poder escribir un libro que contenga información formateada de la misma manera según la plantilla del entorno. Al final me gustaría poder escribir
\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}
y tenga la entrada formateada de forma agradable y de la misma manera según el entorno eqdescription
haciendo algo como esto:
\newenvironment{eqdescription}{}{%
\section{\eqnameval}
Favorite Color: \eqcolorval
Notes: \eqnotesval
}
Debido a que Jim Doe no tiene un color favorito, el suyo está en blanco, así que pensé que aparecería con algún valor predeterminado, como no favorite color
.
Pensé que definir algunos comandos para inicializar y establecer los valores dentro de un entorno sería fácil de esta manera:
\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}
}
}
Y que en la parte superior del entorno podría poner:
\initcommand{notes}{Default Value.}
\initcommand{name}{No Name.}
\initcommand{color}{No favorite color.}
Pero no sólo falla el comando init, sino que esto causa todo tipo de problemas con la redefinición de valores.
¿Existe una forma concisa de definir pequeñas plantillas como esta sin una sintaxis complicada ni código duplicado?
Respuesta1
Podrías configurar g
localmente def
los valores predeterminados al inicio de eqdescription
y luego \renewcommand
dentro del entorno cada vez que llames a \eqname
, \eqcolor
o \eqnotes
. Redefinirán \gdef
lo que ya existe. \renewcommand
tendrá un alcance local, pero requiere que se definan las definiciones. Esto no es un problema ya que los estás definiendo con \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}