Betrachten Sie dieses Beispiel:
\documentclass{article}
\begin{document}
\def\something{something}
\something
{
\def\something{another thing}
\something
}
\something
\end{document}
Aus der Ausgabe ist ersichtlich, dass es zwei Variablen gibt, die something
jeweils in ihrem eigenen Bereich liegen:
Nun platziere ich eine Variable in einem newcommand
:
\documentclass{article}
\def\something{something}
\newcommand{\dosomething}{
invoking ``dosomething''
\def\something{another thing}
\something
}
\begin{document}
\something
\dosomething
\something
\end{document}
Aus der Ausgabe ist ersichtlich, dass durch den Aufruf newcommand
die vorherige Definition der Variablen geändert wurde:
Dies kann insbesondere bei Bibliotheken mit Hunderten von Variablen zu undurchsichtigen Fehlern führen. Gibt es eine Möglichkeit, meine Variablen vor Änderungen durch newcommand
s zu schützen? Was ist der beste Ansatz?
Antwort1
TeX bietet einen Mechanismus zur Makroerweiterung; das Makro wird durch den Ersatztext ersetzt. Daher mit Ihrer aktuellen Definition
\newcommand{\dosomething}{
invoking ``dosomething''
\def\something{another thing}
\something
}
das Dokument
\begin{document}
\something
\dosomething
\something
\end{document}
ist praktisch gleichbedeutend mit
\begin{document}
\something
invoking ``dosomething''
\def\something{another thing}
\something
\something
\end{document}
(plus ein paar Leerzeichen am Ende, bei denen Sie etwas nachlässig waren :-)
)
Wenn Sie Änderungen an \something
auf die Ausführung von beschränken möchten \dosomething
, müssen Sie eine Gruppierungsebene einschließen, entweder mit expliziten Klammern {...}
oder (besser lesbar) mit den Primitiven \begingroup
/\endgroup
\newcommand{\dosomething}{% <-- don't forget this
\begingroup
invoking ``dosomething''%
\def\something{another thing}%
\something
\endgroup
}