是否有类似 \renewcounter 或 \providecounter 的东西?

是否有类似 \renewcounter 或 \providecounter 的东西?

是否有命令可以创建计数器,或者如果计数器已经存在,则重新定义它?问题是我正在使用嵌套循环。但是第二个循环在命令中。这意味着如果我想在第二个循环中使用第二个计数器,我需要在第一个循环之前定义它,并将其作为命令中的参数,这似乎有点麻烦。

例如:

\newcommand\recursiveloop[2]{% do loop with counter #2, #1 times
  \setcounter{#2}{0}
  {\loop\unless\ifnum\value{#2}=#1
    \stepcounter{#2}
    % do something
  \repeat}
}

\newcounter{loop}     % counter for first loop
\newcounter{recloop}  % counter for recursive loop

\loop\unless\ifnum\theloop=4  % start the first loop
  \stepcounter{loop}  % counter loop +1
  % do something
  \recursiveloop{3}{recloop}  % call command to run second loop
\repeat

在这个例子中,这当然不是什么大问题。但我的命令已经有 3 个参数,还会添加更多参数。有没有办法 (1) 检查计数器是否存在以运行适当的命令:\setcounter\newcounter(2) 一个可以自行执行的命令。

答案1

不,\renewcounter它们\providecounter不存在,也不应该存在。

举个例子,假设你说

\providecounter{page}

\loop\unless\ifnum\value{loop}=4  % start the first loop
  \stepcounter{loop}  % counter loop +1
  % do something
  \recursiveloop{3}{page}  % call command to run second loop
\repeat

\recursiveloop确实如此\stepcounter{page}:即使循环在一组中,也会出现混乱,因为\stepcounter\addtocounter总是\setcounter起作用全球

当然,您不会使用page,但如果您选择一个已经引用在您加载的包中定义并存储一些重要值的计数器的名称,会发生什么?

始终在序言中分配自己的计数器或使用 LaTeX (\@tempcnta\@tempcntb) 提供的临时计数器。

顺便说一句,不要将其\theloop用于数字测试,而是\value{loop}以独立于值表示的形式存储值。

答案2

如果你真的需要,\renewcounter那么写起来很简单: \def\renewcounter#1{\expandafter\ifcsname c@#1\endcsname\else\newcounter{#1}\fi \setcounter{#1}{0}。然而,它的用例确实很少见。前面的答案声称它“永远”不应该被使用,这通常是夸大其词;一个特定用例的例子是一个考试文件,其中包括一些练习文件,每个文件都可以(通过\renewcounter)定义自己的独立question计数器。

答案3

我在一些 tikz 图片中使用计数器,由于我更喜欢​​将它们放在单独的 .tikz 文件中,因此我也发现 \renewcounter 很有用。我同意不应使用它来尝试提供当地的陣容 註釋 .

这是我的解决方案:

\ifdefined\theint
\else
  \newcounter{int}
\fi

我想这\@ifundefined{theint}{\newcounter{int}}{}也会起作用。

相关内容