![为什么不能用变量定义“totcounter”的名称](https://linux22.com/image/404993/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E7%94%A8%E5%8F%98%E9%87%8F%E5%AE%9A%E4%B9%89%E2%80%9Ctotcounter%E2%80%9D%E7%9A%84%E5%90%8D%E7%A7%B0.png)
我想在每个主题的开头打印某个计数器的总和,并且希望它能够自动完成。
我决定使用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}}}