Variáveis ​​TeX tornam-se locais em ambientes de lista?

Variáveis ​​TeX tornam-se locais em ambientes de lista?

Aparentemente, quando o valor de um contador TeX é modificado dentro de um enumerateambiente (e sem dúvida em muitos outros contextos), ele atua como uma variável local, de modo que quaisquer modificações nele são locais para o ambiente. Por exemplo, 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}

produz: Imagem LaTeX gerada pelo código-fonte anterior, mostrando que o contador total se torna local para cada ambiente enumerado quando seu valor é modificado por \advance.

Duas questões:

  • Como devo entender o que está acontecendo aqui?
  • Qual é a maneira mais simples de modificar um valor dentro de um enumerateambiente para que o valor modificado esteja disponível fora do ambiente? Estou bem em usar o LaTeX em vez das instalações do TeX aqui. Eu só quero uma solução simples que funcione.

Por que? Estou escrevendo um teste e, para cada questão, especifico quantos pontos vale. Ao exibir os pontos, também quero atualizar uma variável que me dará um total no final. Às vezes atribuo pontos a subquestões que listo em um ambiente incorporado. Quero esses pontos adicionados ao total também.

Atualmente eu faço assim:

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

e uso o \ptscomando para exibir o número de pontos de cada questão. Funciona se eu usar apenas um enumerateambiente para exibir as perguntas, pois posso exibir o total como parte da última pergunta. Não funciona se eu atribuir pontos em um enumerateambiente incorporado no ambiente de perguntas externas: os pontos que listo para perguntas no ambiente incorporado não afetam o total no ambiente externo.

Claro, sinta-se à vontade para me indicar perguntas anteriores. Tenho certeza de que esse tipo de questão deve ter sido discutido anteriormente no tex.SE, mas não consigo descobrir uma estratégia para procurá-la.

1

Responder1

Todas as atribuições são locais por padrão (existem alguns registros TeX especiais que são uma exceção). Isso significa que se um grupo TeX terminar, o registro retornará ao seu valor anterior, válido quando o grupo for iniciado.

Se você usar o \globalprefixo da atribuição, então a atribuição é global, seu valor será mantido quando o grupo TeX terminar.

Portanto, use \global\advanceem vez disso \advanceou defina \def\gadvance{\global\advance}e use \gadvancequando \advanceestiver trabalhando com o \totalregistro. E use atribuição direta \global\total=valuese estiver em um grupo TeX.

Responder2

Comolimpar explicado, as atribuições aos registradores de contagem do TeX são locais para o grupo atual. Todos os ambientes LaTeX criam grupos. Isso inclui ambientes de lista, mas você veria o mesmo efeito se avançasse a contagem dentro de figure, center, quotationetc.

Embora as atribuições diretas aos registradores de contagem sejam locais por padrão, os contadores LaTeX são atribuídos globalmente. Portanto, se você usar a countere \addtocounter{}{}, as atribuições ao registro de contagem subjacente serão feitas globalmente e persistirão fora do grupo atual.

\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}

Com esta solução, você também pode redefinir \thetotalpara modificar a formatação, da mesma forma que você pode modificar a aparência dos números das seções, notas de rodapé, números de equações, etc. É por isso que é melhor usar \thetotaldo que escrever \arabic{total}diretamente, mesmo que estes seriam atualmente produzem o mesmo resultado.

insira a descrição da imagem aqui

informação relacionada