Hier ist die Frage: Warum setzt der folgende Code die Bedeutung der \pgPtList
Steuersequenz zurück, wenn die Gruppe endet?
\documentclass[12pt]{article}
\begin{document}
\begingroup
\gdef\pgPtList{}
\edef\pgPtList{8}
pgPtList is: \pgPtList
\edef\pgPtList{8, 5}
pgPtList is: \pgPtList
\endgroup
Empty environment has ended.
pgPtList is: \pgPtList
\end{document}
Dies ist die Ausgabe, die es erzeugt:
pgPtList is: 8
pgPtList is: 8, 5
Empty environment has ended.
pgPtList is:
Nach meinem derzeitigen Verständnis hat dies etwas mit der Funktionsweise von Gruppen zu tun. Daher lautet eine wahrscheinliche Folgefrage: Wie kann ich die Steuerungssequenz neu definieren, sodass die Änderung bestehen bleibt, wenn die Gruppe beendet wird?
Hier ist der breitere Kontext: Ich versuche, eine Prüfung zu setzen und die Anzahl der Punkte auf jeder Seite zu verfolgen, und aktualisiere sie ständig, \pgPtList
um den Überblick darüber zu behalten, wie viele Punkte auf jeder Seite sind. Bei jeder Prüfung \pgPtList
fungiert es als Standardparameter für einen anderen Befehl, der eine Tabelle mit Punktwerten erstellt.
Die Punkte auf jeder Seite werden innerhalb einer enumerate
Umgebung aktualisiert, weshalb \begingroup
und \endgroup
im Reprex vorhanden sind. Idealerweise möchte ich die \pgPtList
Variable innerhalb dieser Umgebung aktualisieren können, auch wenn der Befehl für die Punkttabelle außerhalb davon aufgerufen wird.
Was mich am meisten verwirrt, sind \edef
und \gdef
. Ich gehe naiv davon aus, dass diese Befehle dazu gedacht sind, die resultierenden Steuersequenzen außerhalb der aktuellen Gruppe zugänglich zu machen, aber die Ausgabe, die ich vom obigen Code erhalte, lässt darauf schließen, dass etwas anderes passiert.
Antwort1
\def\macroname<argument specification>{definition}
ist eine lokale, standardmäßige Definition;\edef\macroname<argument specification>{definition}
ist eine lokale, erweiterte Definition, d. h.definition
wird vor der Zuweisung erweitert\macroname
;\gdef\macroname<argument specification>{definition}
ist eine globale, standardisierte Definition;\xdef\macroname<argument specification>{definition}
ist eine globale, erweiterte Definition.
In Ihrem Fall die ursprüngliche Definition\gdef\pgPtList{}
tutdie lokale Gruppe überleben. Wenn dies nicht der Fall wäre, würde die Verwendung von \pgPtList
after \endgroup
zu einem Fehler führen.
Alle nachfolgenden (Neu-)Definitionen von \pgPtList
sind jedoch ausdrücklich lokal, sodass diese Änderungen nicht erhalten bleiben \endgroup
und die Bedeutung von \pgPtList
auf die ursprüngliche leere Definition zurückgesetzt wird.
Das folgende Beispiel kann hilfreich sein:
\documentclass[12pt]{article}
\begin{document}
\newcounter{tweak}
\setcounter{tweak}{0}
\def\rstatement{Redefinition \thetweak.}
\begingroup
\gdef\pgPtList{Initial, global definition.}
pgPtList is: \pgPtList
\edef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\def\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\begingroup
\xdef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\begingroup
\gdef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\end{document}
Beachten Sie, dass \def
beim Einsatz des Makros der Wert des Zählers verwendet wird , der möglicherweise nicht dem Wert zum Zeitpunkt der Definition entspricht.\gdef
\pgPtList
tweak
\pgPtList
Im Gegensatz dazu verwendet Ensure \edef
den Wert des Zählers zum Zeitpunkt der Definition, auch wenn sich der Wert in der Zwischenzeit geändert hat.\xdef
\pgfPtList
tweak
Andererseits sind sowohl \def
als auch \edef
lokale Definitionen. Ihre Wirkung endet, wenn die aktuelle Gruppe endet.
Im Gegensatz dazu sind \gdef
und \xdef
global. Sie sind wirksam, bis eine nachfolgende Definition von \pgfPtList
sie ersetzt, unabhängig von der Gruppierung.