Cómo evitar restablecer definiciones de macros dentro de un grupo/entorno

Cómo evitar restablecer definiciones de macros dentro de un grupo/entorno

Aquí está la pregunta: ¿por qué el siguiente código restablece el significado de la \pgPtListsecuencia 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 \pgPtListpara realizar un seguimiento de cuántos puntos hay en cada página. En cada examen, \pgPtListactú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 enumerateentorno, por lo que \begingroupy \endgroupestán presentes en el reprex. Idealmente, me gustaría poder actualizar la \pgPtListvariable 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 \edefy \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, definitionse 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 \pgPtListafter \endgroupdaría como resultado un error.

Sin embargo, todas las (re)definiciones posteriores de \pgPtListson explícitamente locales, por lo que esos cambios no sobreviven después \endgroupy el significado de \pgPtListvuelve 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}

salida que ilustra definiciones de macros locales/globales y expandidas/estándar

Tenga en cuenta que \defasegú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\pgPtListtweak\pgPtList

Por el contrario, \edefy \xdefasegurar \pgfPtListutiliza el valor del contador tweaken el momento de la definición, incluso si el valor ha cambiado mientras tanto.

Por otro lado, tanto \defy \edefson definiciones locales. Su efecto termina cuando termina el grupo actual.

Por el contrario, \gdefy \xdefson globales. Son eficaces a menos y hasta que alguna definición posterior de \pgfPtListlos reemplace, independientemente de su agrupación.

información relacionada