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}

生成: 由上述源代码生成的 LaTeX 图像显示,当总计数器的值被 \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

作为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},即使它们目前会产生相同的结果。

在此处输入图片描述

相关内容