标题已经说明了整个问题。Joseph Wright 已在http://www.texdev.net/2009/11/17/tex-counts-and-latex-counters/,但我还没有看到相应的答案在这里tex.stackexchange.com然而。
答案1
在 LaTeX 级别,计数器使用以下方式创建
\newcounter{mycounter}
这将创建一个初始化为零的计数器,然后可以使用
\setcounter{mycounter}{4} % Or whatever
或使用\stepcounter
和操纵\addtocounter
\setcounter{mycounter}{0} % Value is 0
\stepcounter{mycounter} % Value is 1
\stepcounter{mycounter} % Value is 2
\addtocounter{mycounter}{3} % Value is 5
然后有一些方法可以取回计数器值。LaTeX\the...
为每个计数器创建一个函数,它将打印当前值。在 TeX 需要数字的地方,还有这个\value
函数:
\themycounter % Prints the current value
\ifnum\value{mycounter} > \value{myothercounter}%
% Do stuff!
\fi
LaTeX 的计数器是全局设置的。这使得它们适合跟踪覆盖整个文档的内容,但不适合进行局部计算。
使用以下方式创建 TeX 计数
\newcount\mycount
其中 name 是包含反斜杠的名称。设置计数非常简单:没有 set 函数
\mycount 4\relax
注意\relax
这里的 。如果没有它,TeX 将继续在它找到的下一个东西中寻找数字。这可能会产生一些奇怪的效果,最好避免。然后可以使用\advance
\mycount 0\relax % Value is 0
\advance\mycount 1\relax % Value is 1
\advance\mycount 1\relax % value is 2
\advance\mycount 3\relax % Value is 5
类似的终止方式是,在数字后加一个空格
\mycount 4 % Comment used to show that there is a deliberate space
\the
可以使用或恢复计数寄存器的值\number
,并且可以在 TeX 需要数字的地方使用名称本身。
\the\mycount % Prints the current value
\number\mycount % The same result
\ifnum\mycount > \myothercount
% Do stuff!
\fi
最大的区别在于 TeX 在本地设置计数寄存器。因此,要进行全局分配,你必须刻意这样做
\global\mycount 3\relax
由于 LaTeX 是基于 TeX 构建的,您可能会猜测 LaTeX 的计数器是 TeX 计数寄存器的接口,但目前还不清楚这是如何实现的。其工作原理是,LaTeX 在所有计数器名称前加上前缀c@
,因此如果我这样做
\newcount\c@mycounter
\newcounter{mycounter}
LaTeX 会发出一条错误消息:计数器已定义。然后其他 LaTeX 函数在此基础上构建,以便操作内部计数器。这一切都是全局完成的,并进行了一些错误检查。例如,的定义\addtocounter
是
\def\addtocounter#1#2{%
\@ifundefined{c@#1}%
{\@nocounterr{#1}}%
{\global\advance\csname c@#1\endcsname #2\relax}}
这将检查计数器是否存在,如果存在则全局推进它。