TeX 變數在清單環境中成為本地變數?

TeX 變數在清單環境中成為本地變數?

顯然,當 TeX 計數器的值在enumerate環境(毫無疑問還有許多其他上下文)內修改時,它的作用就像一個局部變量,因此對它的任何修改都是環境局部的。例如,這段程式碼

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

產生: 由前面的原始碼產生的 La​​TeX 影像,顯示當總計數器的值被 \advance 修改時,它就成為每個枚舉環境的本機計數器。

兩個問題:

  • 我該如何理解這裡發生了什麼事?
  • 在環境內部修改值enumerate以便修改後的值在環境外部可用的最簡單方法是什麼?我很喜歡在這裡使用 LaTeX 而不是 TeX 工具。我只想要一個有效的簡單解決方案。

為什麼?我正在編寫一個測試,對於每個問題,我都會指定它的得分。當我顯示分數時,我還想更新一個變量,該變量最後會給出總計。有時,我會將分數分配給我在嵌入式環境中列出的子問題。我也希望將這些分數添加到總數中。

目前,我是這樣做的:

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

我使用該\pts命令來顯示每個問題的分數。如果我只使用一個enumerate環境來顯示問題,它會起作用,因為我可以將總數顯示為最後一個問題的一部分。如果我在嵌入外部問題環境的環境中分配分數,則不起作用enumerate:我為嵌入環境中的問題列出的分數不會影響外部環境中的總分數。

當然,請隨時向我指出先前的問題。我確信這種問題以前一定在 tex.SE 中討論過,但我無法找到搜尋它的策略。

1

答案1

預設情況下,所有賦值都是本地的(有一些特殊的 TeX 暫存器是例外)。這表示如果 TeX 群組結束,則暫存器將返回到該組開始時之前的有效值。

如果使用\global賦值的前綴,則該賦值是全域的,當 TeX 群組結束時它的值將保留。

因此,當您使用暫存器時,請使用\global\advance替代\advance或定義\def\gadvance{\global\advance}並使用\gadvance替代。如果在 TeX 組中,則使用直接賦值。\advance\total\global\total=value

答案2

作為威韋特解釋說,對 TeX 計數暫存器的分配是目前群組的本機值。所有 LaTeX 環境都會建立群組。這包括列表環境,但如果您在figurecenter等內部推進計數,您會看到相同的效果quotation

雖然預設對計數暫存器的直接分配是本地的,但 LaTeX 計數器是全域分配的。因此,如果您使用counterand \addtocounter{}{},則對基礎計數暫存器的分配將全域進行並保留在目前群組之外。

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

使用此解決方案,您還可以重新定義\thetotal以修改格式,就像您可以修改節號、腳註、方程式編號等的外觀一樣\thetotal\arabic{total}結果。

在此輸入影像描述

相關內容