显然,当 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
作为wipet 解释figure
,对 TeX 计数寄存器的分配是当前组的本地分配。所有 LaTeX 环境都会创建组。这包括列表环境,但如果您在、center
等内部推进计数,您会看到相同的效果quotation
。
虽然默认情况下对计数寄存器的直接赋值是本地的,但 LaTeX 计数器是全局赋值的。因此,如果您使用 和counter
,\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}
,即使它们目前会产生相同的结果。