为什么不能用变量定义“totcounter”的名称

为什么不能用变量定义“totcounter”的名称

我想在每个主题的开头打印某个计数器的总和,并且希望它能够自动完成。

我决定使用totcount-package。然后我定义一个计数器,如下所示:
\newtotcounter{pointsInSubject\Alph{subject}},其中subject是另一个计数器。

奇怪的是,这确实成功定义了计数器pointsInSubjectA,但我无法调用\total{pointsInSubjectA}。 (我甚至还没有尝试调用\total{\pointsInSubjec\Alph{subject}}。)

以下是 MWE

\documentclass{article}
\usepackage{totcount}         \parindent=0pt

\newtotcounter{subject}
\def\subject{%
    \refstepcounter{subject}%
    \newtotcounter{pointsInSubject\Alph{subject}} \setcounter{pointsInSubject\Alph{subject}}{0}
    Subject \thesubject\hfill\\}

\def\point#1{%
    Subsubject (#1 points)%
    \addtocounter{pointsInSubject\Alph{subject}}{#1}%
    }

\begin{document}
There are a total of \total{subject} subjects.

\bigskip
\subject This subject has a total of \total{pointsInSubject\Alph{subject}} points\\
\point3\\ 
\point4\\
Now \texttt{\textbackslash thepointsInSubjectA}=\expandafter\csname thepointsInSubject\Alph{subject}\endcsname

\bigskip
\subject lorem ipsum

\end{document}

它给出以下输出:

为什么计数器已定义但我不能使用\total

答案1

该命令的以下修改版本\subject有效:

\def\subject{%
    \refstepcounter{subject}%
    \edef\ptscountername{pointsInSubject\Alph{subject}}%
    \expandafter\newtotcounter\expandafter{\ptscountername}%
    \setcounter{pointsInSubject\Alph{subject}}{0}%
    Subject \thesubject\hfill\\}

原因:该包的工作方式totcount是,对于每个新的“totcounter”,它会创建一个名为

<countername>@totc 

并在文档末尾将.aux最终值写入<countername>该变量。然而,代码确实不是<countername>在定义点处扩展。

这意味着当你打电话时

\newtotcounter{pointsInSubject\Alph{subject}} 

它创建的新计数器有名称

pointsInSubject\Alph{subject}@totc

并不是

pointsInSubjectA@totc

第一次调用时。现在快进到文件末尾,此时subject等于 2。当代码将.aux最终值写入文件时,它会展开pointsInSubject\Alph{subject}@totc 在那时候由于subject等于 2,所以.aux文件仅有的记录(两次) 和 的总计数(pointsInSubjectB@totc从不)pointsInSubjectA@totc

要解决这个问题,您需要确保包创建的辅助计数器具有正确的名称;为此,您需要确保在将计数器名称提供给 之前,该名称已正确扩展\newtotcounter。 有多种方法可以做到这一点,一种方法是创建一个新命令,存储完整的计数器名称,并在将其放入 时\edef强制首先对其进行扩展,这就是我上面所做的。\ea\newtotcounter

正如 egreg 在下面指出的那样,更好的方法是最新的 TeX 发行版用单个调用替换以\edef...和开头的两行\expandafter...

\expanded{\noexpand\newtotcounter{pointsInSubject\Alph{subject}}} 

相关内容