Considere este ejemplo:
\documentclass{article}
\begin{document}
\def\something{something}
\something
{
\def\something{another thing}
\something
}
\something
\end{document}
Del resultado se puede ver que hay dos variables, something
cada una de las cuales vive en su propio ámbito:
Ahora, puse una variable para vivir dentro de un newcommand
:
\documentclass{article}
\def\something{something}
\newcommand{\dosomething}{
invoking ``dosomething''
\def\something{another thing}
\something
}
\begin{document}
\something
\dosomething
\something
\end{document}
De la salida se puede ver que al invocar newcommand
se modificó la definición anterior de la variable:
Esto puede provocar errores oscuros, especialmente con bibliotecas que involucran cientos de variables. ¿Hay alguna manera de proteger mis variables para que no sean alteradas por newcommand
s? ¿Cuál es el mejor enfoque?
Respuesta1
TeX ofrece un mecanismo de macroexpansión; la macro se reemplaza por el texto de reemplazo. Por lo tanto, con su definición actual
\newcommand{\dosomething}{
invoking ``dosomething''
\def\something{another thing}
\something
}
el documento
\begin{document}
\something
\dosomething
\something
\end{document}
es efectivamente equivalente a
\begin{document}
\something
invoking ``dosomething''
\def\something{another thing}
\something
\something
\end{document}
(más un par de espacios finales con los que has sido algo descuidado :-)
)
Si desea que los cambios \something
se limiten a la ejecución de \dosomething
debe incluir un nivel de agrupación, ya sea con llaves explícitas {...}
o (más legible) con las primitivas \begingroup
/\endgroup
\newcommand{\dosomething}{% <-- don't forget this
\begingroup
invoking ``dosomething''%
\def\something{another thing}%
\something
\endgroup
}