So vermeiden Sie das Zurücksetzen von Makrodefinitionen innerhalb einer Gruppe/Umgebung

So vermeiden Sie das Zurücksetzen von Makrodefinitionen innerhalb einer Gruppe/Umgebung

Hier ist die Frage: Warum setzt der folgende Code die Bedeutung der \pgPtListSteuersequenz 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, \pgPtListum den Überblick darüber zu behalten, wie viele Punkte auf jeder Seite sind. Bei jeder Prüfung \pgPtListfungiert es als Standardparameter für einen anderen Befehl, der eine Tabelle mit Punktwerten erstellt.

Die Punkte auf jeder Seite werden innerhalb einer enumerateUmgebung aktualisiert, weshalb \begingroupund \endgroupim Reprex vorhanden sind. Idealerweise möchte ich die \pgPtListVariable 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 \edefund \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. definitionwird 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 \pgPtListafter \endgroupzu einem Fehler führen.

Alle nachfolgenden (Neu-)Definitionen von \pgPtListsind jedoch ausdrücklich lokal, sodass diese Änderungen nicht erhalten bleiben \endgroupund die Bedeutung von \pgPtListauf 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}

Ausgabe zur Veranschaulichung lokaler/globaler und erweiterter/Standard-Makrodefinitionen

Beachten Sie, dass \defbeim Einsatz des Makros der Wert des Zählers verwendet wird , der möglicherweise nicht dem Wert zum Zeitpunkt der Definition entspricht.\gdef\pgPtListtweak\pgPtList

Im Gegensatz dazu verwendet Ensure \edefden Wert des Zählers zum Zeitpunkt der Definition, auch wenn sich der Wert in der Zwischenzeit geändert hat.\xdef\pgfPtListtweak

Andererseits sind sowohl \defals auch \edeflokale Definitionen. Ihre Wirkung endet, wenn die aktuelle Gruppe endet.

Im Gegensatz dazu sind \gdefund \xdefglobal. Sie sind wirksam, bis eine nachfolgende Definition von \pgfPtListsie ersetzt, unabhängig von der Gruppierung.

verwandte Informationen