循环创建新的计数器

循环创建新的计数器

我想在这样的循环中创建计数器(使用包multidototcount):

    \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}

生产

示例输出

相关内容