¿Las variables TeX se vuelven locales dentro de los entornos de lista?

¿Las variables TeX se vuelven locales dentro de los entornos de lista?

Aparentemente, cuando el valor de un contador TeX se modifica dentro de un enumerateentorno (y sin duda en muchos otros contextos), actúa como una variable local, de modo que cualquier modificación que se le haga es local para el entorno. Por ejemplo, este código

\documentclass{article}

\newcount\total
\total = 5

\begin{document}

At first total = \number\total

\begin{enumerate}
\item \advance \total by 10
      Now total = \number\total
\item \advance \total by 10
      Now total = \number\total
\end{enumerate}

Outside of the enumerate environment, total reverts to its
original value: \number\total\\

Does the same thing happen in embedded environments?
\begin{enumerate}
\item \advance \total by 100
      Now total = \number\total
      \begin{enumerate}
      \item \advance \total by 1000
      Now total = \number\total
      \end{enumerate}
      That didn't do anything to this total = \number\total
\item \advance \total by 100
      Now total = \number\total
\end{enumerate}
Yes.  Now total = \number\total

\end{document}

produce: Imagen de LaTeX generada por el código fuente anterior, que muestra que el contador total se vuelve local para cada entorno de enumeración cuando su valor es modificado por \advance.

Dos preguntas:

  • ¿Cómo debería entender lo que está pasando aquí?
  • ¿Cuál es la forma más sencilla de modificar un valor dentro de un enumerateentorno para que el valor modificado esté disponible fuera del entorno? Estoy de acuerdo con usar LaTeX en lugar de las instalaciones de TeX aquí. Sólo quiero una solución simple que funcione.

¿Por qué? Estoy escribiendo una prueba y para cada pregunta, especifico la cantidad de puntos que vale. Cuando muestro los puntos, también quiero actualizar una variable que me dará un total al final. A veces asigno puntos a subpreguntas que enumero en un entorno integrado. Quiero que esos puntos se sumen al total también.

Actualmente lo hago así:

\newcount\totalpts
\totalpts = 0
\newcommand{\pts}[1]{(#1 points) \advance \totalpts by #1}

y uso el \ptscomando para mostrar la cantidad de puntos para cada pregunta. Funciona si solo uso un enumerateentorno para mostrar preguntas, porque puedo mostrar el total como parte de la última pregunta. No funciona si asigno puntos en un enumerateentorno que está integrado en el entorno de preguntas externo: los puntos que enumero para las preguntas en el entorno integrado no afectan el total en el entorno externo.

Por supuesto, no dude en señalarme las preguntas anteriores. Estoy seguro de que este tipo de preguntas deben haberse discutido anteriormente en tex.SE, pero no puedo encontrar una estrategia para buscarlas.

1

Respuesta1

Todas las asignaciones son locales de forma predeterminada (hay algunos registros TeX especiales que son una excepción). Significa que si un grupo TeX finaliza, el registro vuelve a su valor anterior válido cuando comienza el grupo.

Si usa el \globalprefijo de la asignación, entonces la asignación es global, su valor se mantendrá cuando finalice el grupo TeX.

Por lo tanto, use \global\advanceen lugar \advanceo defina \def\gadvance{\global\advance}y use \gadvanceen lugar \advancecuando esté trabajando con el \totalregistro. Y use la asignación directa \global\total=valuesi está en un grupo TeX.

Respuesta2

Comolimpiar explicado, las asignaciones a registros de recuento TeX son locales para el grupo actual. Todos los entornos LaTeX crean grupos. Esto incluye entornos de lista, pero vería el mismo efecto si avanzara el recuento dentro de figure, center, quotationetc.

Mientras que las asignaciones directas para contar registros son locales de forma predeterminada, los contadores LaTeX se asignan globalmente. Entonces, si usa a countery \addtocounter{}{}, las asignaciones al registro de recuento subyacente se realizarán globalmente y persistirán fuera del grupo actual.

\documentclass{article}
\newcounter{total}
\setcounter{total}{5}

\begin{document}

At first total = \thetotal

\begin{enumerate}
  \item \addtocounter{total}{10}
  Now total = \thetotal
  \item \addtocounter{total}{10}
  Now total = \thetotal
\end{enumerate}

Outside of the enumerate environment, total reverts to its
original value: \thetotal % never end a paragraph with \\

Does the same thing happen in embedded environments?
\begin{enumerate}
  \item \addtocounter{total}{100}
  Now total = \thetotal
  \begin{enumerate}
    \item \addtocounter{total}{1000}
    Now total = \thetotal
  \end{enumerate}
  That didn't do anything to this total = \thetotal
  \item \addtocounter{total}{100}
  Now total = \thetotal
\end{enumerate}
Yes.  Now total = \thetotal

\end{document}

Con esta solución, también puedes redefinir \thetotalpara modificar el formato, de la misma manera puedes modificar la apariencia de los números de sección, notas al pie, números de ecuación, etc. Por eso es mejor usar \thetotalque escribir \arabic{total}directamente, aunque estos Actualmente produce el mismo resultado.

ingrese la descripción de la imagen aquí

información relacionada