顯然,當 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}
產生:
兩個問題:
- 我該如何理解這裡發生了什麼事?
- 在環境內部修改值
enumerate
以便修改後的值在環境外部可用的最簡單方法是什麼?我很喜歡在這裡使用 LaTeX 而不是 TeX 工具。我只想要一個有效的簡單解決方案。
為什麼?我正在編寫一個測試,對於每個問題,我都會指定它的得分。當我顯示分數時,我還想更新一個變量,該變量最後會給出總計。有時,我會將分數分配給我在嵌入式環境中列出的子問題。我也希望將這些分數添加到總數中。
目前,我是這樣做的:
\newcount\totalpts
\totalpts = 0
\newcommand{\pts}[1]{(#1 points) \advance \totalpts by #1}
我使用該\pts
命令來顯示每個問題的分數。如果我只使用一個enumerate
環境來顯示問題,它會起作用,因為我可以將總數顯示為最後一個問題的一部分。如果我在嵌入外部問題環境的環境中分配分數,則不起作用enumerate
:我為嵌入環境中的問題列出的分數不會影響外部環境中的總分數。
當然,請隨時向我指出先前的問題。我確信這種問題以前一定在 tex.SE 中討論過,但我無法找到搜尋它的策略。
答案1
預設情況下,所有賦值都是本地的(有一些特殊的 TeX 暫存器是例外)。這表示如果 TeX 群組結束,則暫存器將返回到該組開始時之前的有效值。
如果使用\global
賦值的前綴,則該賦值是全域的,當 TeX 群組結束時它的值將保留。
因此,當您使用暫存器時,請使用\global\advance
替代\advance
或定義\def\gadvance{\global\advance}
並使用\gadvance
替代。如果在 TeX 組中,則使用直接賦值。\advance
\total
\global\total=value
答案2
作為威韋特解釋說,對 TeX 計數暫存器的分配是目前群組的本機值。所有 LaTeX 環境都會建立群組。這包括列表環境,但如果您在figure
、center
等內部推進計數,您會看到相同的效果quotation
。
雖然預設對計數暫存器的直接分配是本地的,但 LaTeX 計數器是全域分配的。因此,如果您使用counter
and \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}
結果。