我想在这样的循环中创建计数器(使用包multido
,totcount
):
\newcounter{compteurChi}% first counter
\regtotcounter{compteurChi}% define the first counter as a totalcounter
\newcounter{compteurChii}% second iteration
\regtotcounter{compteurChii}
\newcounter{compteurChiii}% third iteration
\regtotcounter{compteurChiii}
所以我写了这个:
\newcounter{AuxCounter}
\renewcommand{\theAuxCounter}{\roman{AuxCounter}}
\multido{\i=1+1}{3}{%
\setcounter{AuxCounter}{\i}
\newcounter{compteurCh\theAuxCounter}
\regtotcounter{compteurCh\theAuxCounter}
}
但这不起作用:它仅创建最后一个计数器compteurChiii
。我需要找到一种方法来循环执行此操作,因为我需要很多计数器,而为每个计数器编写它对我来说不是一个解决方案。
我已经在网上找到了类似问题的答案,但我真的不明白我找到的代码如何使它们适应循环中的计数器定义。
更具体地说:此示例显示了它如何不起作用。我使用totcount
包来存储计数器的较大值,除了循环创建的最后一个计数器外,它不会存储任何值。如您所见:
\documentclass{article}
\usepackage{multido,totcount}
\newcounter{AuxCounter}
\renewcommand{\theAuxCounter}{\roman{AuxCounter}}
\multido{\i=1+1}{3}{%
\setcounter{AuxCounter}{\i}
\newtotcounter{compteurCh\theAuxCounter}}
\begin{document}
For the first counter : (after compiling two times)
\thecompteurChi
\setcounter{compteurChi}{17}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi
For the last counter created (the only that works) :
\thecompteurChiii
\setcounter{compteurChiii}{17}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii
\end{document}
给出输出:
感谢帮助。
答案1
这是中的扩展问题\regtotcounter
;我将研究是否有可能避免繁琐的代码,但这里有一个可行的解决方案:
\documentclass{article}
\usepackage{multido,totcount}
\multido{\i=1+1}{3}{%
\begingroup\edef\x{\endgroup
\noexpand\newtotcounter{compteurCh\romannumeral\i}%
}\x
}
\begin{document}
\thecompteurChi
\setcounter{compteurChi}{17}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi / \total{compteurChi}
\refstepcounter{compteurChi}
\thecompteurChi
The third counter:
\thecompteurChiii
\setcounter{compteurChiii}{17}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii / \total{compteurChiii}
\refstepcounter{compteurChiii}
\thecompteurChiii
\end{document}
您也可以使用\newcounter{AuxCounter}
,但直接使用\romannumeral
更经济。
问题出在哪里?\regtotcounter
宏(也由命令隐式调用\newtotcounter
)将代码延迟到\AtEndDocument
:
\def\regtotcounter@mainaux#1{%
%% Create a new counter holding the total number of the actual counter:
\expandafter\ifx\csname c@#1@totc\endcsname\relax%
\newcounter{#1@totc}%
\setcounter{#1@totc}{-1}%
\fi%
%% At the end of the document write code in the auxiliary file to update the
%% total counter with the value of the actual counter:
\AtEndDocument{%
\def\sp{ }%
\immediate\write\@mainaux{%
\string\expandafter\string\ifx%
\string\csname\sp c@#1@totc\string\endcsname\string\relax%
\string\newcounter{\string #1@totc}%
\string\fi%
\string\setcounter{\string #1@totc}{\number\value{#1}}%
}%
}%
}
更好的版本是
\newcommand\regtotcounter@mainaux[1]{%
\@ifundefined{c@#1@totc}{%
\newcounter{#1@totc}%
\setcounter{#1@totc}{-1}%
}{}%
\AtEndDocument{%
\immediate\write\@mainaux{%
\string\@ifundefined{c@#1@totc}{\string\newcounter{#1@totc}}{}%
\string\setcounter{#1@totc}{\number\value{#1}}%
}%
}%
}
但是两个版本都存在同样的问题:当 时,#1
它会被立即执行的和指令\romannumeral\i
完全展开,但当传递给时不会。因此,在文档结束时,将使用值 16,因为当字体编码为 OT1 时,内核会将其定义为。\newcounter
\setcounter
\romannumeral\i
\AtEndDocument
\romannumeral\i
\i
\chardef\i=16
上面的技巧\romannumeral\i
在执行指令之前会展开,因此一切顺利,.aux
文件将具有
\@ifundefined{c@compteurChi@totc}{\newcounter{compteurChi@totc}}{}\setcounter{compteurChi@totc}{20}
\@ifundefined{c@compteurChii@totc}{\newcounter{compteurChii@totc}}{}\setcounter{compteurChii@totc}{0}
\@ifundefined{c@compteurChiii@totc}{\newcounter{compteurChiii@totc}}{}\setcounter{compteurChiii@totc}{20}
使用我的宏版本或使用原始版本的更复杂的代码。
答案2
我没有发现您的代码有什么实际问题。\newtotcounter
它创建了一个计数器并totcount
一次性注册它,这将节省一些编码。这里有一个完整的文档来展示它的工作原理。
\documentclass{article}
\usepackage{multido,totcount}
\newcounter{AuxCounter}
\renewcommand{\theAuxCounter}{\roman{AuxCounter}}
\multido{\i=1+1}{3}{%
\setcounter{AuxCounter}{\i}
\newtotcounter{compteurCh\theAuxCounter}}
\begin{document}
\thecompteurChi
\refstepcounter{compteurChii}
\thecompteurChii
\setcounter{compteurChiii}{17}
\thecompteurChiii
\end{document}
生产