Aparentemente, cuando el valor de un contador TeX se modifica dentro de un enumerate
entorno (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:
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
enumerate
entorno 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 \pts
comando para mostrar la cantidad de puntos para cada pregunta. Funciona si solo uso un enumerate
entorno para mostrar preguntas, porque puedo mostrar el total como parte de la última pregunta. No funciona si asigno puntos en un enumerate
entorno 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.
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 \global
prefijo de la asignación, entonces la asignación es global, su valor se mantendrá cuando finalice el grupo TeX.
Por lo tanto, use \global\advance
en lugar \advance
o defina \def\gadvance{\global\advance}
y use \gadvance
en lugar \advance
cuando esté trabajando con el \total
registro. Y use la asignación directa \global\total=value
si 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
, quotation
etc.
Mientras que las asignaciones directas para contar registros son locales de forma predeterminada, los contadores LaTeX se asignan globalmente. Entonces, si usa a counter
y \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 \thetotal
para 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 \thetotal
que escribir \arabic{total}
directamente, aunque estos Actualmente produce el mismo resultado.