Aquí está la pregunta: ¿por qué el siguiente código restablece el significado de la \pgPtList
secuencia de control cuando finaliza el grupo?
\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}
Aquí está el resultado que produce:
pgPtList is: 8
pgPtList is: 8, 5
Empty environment has ended.
pgPtList is:
Mi comprensión actual es que esto tiene algo que ver con cómo funcionan los grupos, por lo que una posible pregunta de seguimiento es la siguiente: ¿cómo puedo redefinir la secuencia de control de modo que el cambio se mantenga una vez que finalice el grupo?
Este es el contexto más amplio: estoy tratando de componer un examen y realizar un seguimiento de la cantidad de puntos en cada página, y estoy actualizando continuamente \pgPtList
para realizar un seguimiento de cuántos puntos hay en cada página. En cada examen, \pgPtList
actúa como parámetro predeterminado para otro comando que crea una tabla de valores de puntos.
Los puntos de cada página se actualizan dentro de un enumerate
entorno, por lo que \begingroup
y \endgroup
están presentes en el reprex. Idealmente, me gustaría poder actualizar la \pgPtList
variable dentro de este entorno, aunque el comando de la tabla de puntos se llamará fuera de él.
Mi principal punto de confusión es alrededor \edef
y \gdef
. Mi ingenuo entendimiento es que estos comandos están destinados a hacer que las secuencias de control resultantes sean accesibles fuera del grupo actual, pero el resultado que obtengo del código anterior sugiere que algo más está sucediendo.
Respuesta1
\def\macroname<argument specification>{definition}
es una definición estándar local;\edef\macroname<argument specification>{definition}
es una definición local ampliada, es decir,definition
se amplía antes de asignar\macroname
;\gdef\macroname<argument specification>{definition}
es una definición estándar global;\xdef\macroname<argument specification>{definition}
es una definición global y ampliada.
En su caso, la definición inicial\gdef\pgPtList{}
hacesobrevivir al grupo local. Si no fuera así, el uso de \pgPtList
after \endgroup
daría como resultado un error.
Sin embargo, todas las (re)definiciones posteriores de \pgPtList
son explícitamente locales, por lo que esos cambios no sobreviven después \endgroup
y el significado de \pgPtList
vuelve a la definición vacía inicial.
El siguiente ejemplo puede resultar útil:
\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}
Tenga en cuenta que \def
asegúrese de utilizar el valor del contador cuando se utilice la macro, que podría no ser el valor en el momento de la definición.\gdef
\pgPtList
tweak
\pgPtList
Por el contrario, \edef
y \xdef
asegurar \pgfPtList
utiliza el valor del contador tweak
en el momento de la definición, incluso si el valor ha cambiado mientras tanto.
Por otro lado, tanto \def
y \edef
son definiciones locales. Su efecto termina cuando termina el grupo actual.
Por el contrario, \gdef
y \xdef
son globales. Son eficaces a menos y hasta que alguna definición posterior de \pgfPtList
los reemplace, independientemente de su agrupación.