Alcance variable en nuevo comando

Alcance variable en nuevo comando

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, somethingcada una de las cuales vive en su propio ámbito:

ingrese la descripción de la imagen aquí

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 newcommandse modificó la definición anterior de la variable:

ingrese la descripción de la imagen aquí

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 newcommands? ¿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 \somethingse limiten a la ejecución de \dosomethingdebe 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
}

información relacionada