使用计数器或宏

使用计数器或宏

我应该使用计数器还是宏来存储数值数据?同时使用的计数器数量是否有限制或其他注意事项?

我还想对数据执行简单的算术运算——我知道如何使用计数器来做到这一点。

例子

使用宏:

\def\minnumber{24}
...
\ifnum\currentnumber<\minnumber\xdef\minnumber{\currentnumber}\fi

使用计数器:

\newcounter{minnumber}
\setcounter{minnumber}{24}
...
\ifnum\currentnumber<\theminnumber\setcounter{minnumber}{\currentnumber}\fi

答案1

使用计数器在逻辑意义方面有一些优势。在某些情况下,它还显示出更好的稳健性:有些地方计数器正确终止非常重要。例如,尝试

\documentclass{article}
\begin{document}
\newcounter{demo}
\setcounter{demo}{10}
\newcounter{minnumber}
\setcounter{minnumber}{1}
\ifnum\value{demo}>\value{minnumber}11 correct\else oops\fi
\end{document}

相对

\documentclass{article}
\begin{document}
\newcommand*\demo{10}
\newcommand*\minnumber{1}
\ifnum\demo>\minnumber 11 correct\else oops\fi
\end{document}

发生这种情况的原因是,宏中存储的数字可能是“部分的”,因此 TeX 会在宏之后继续寻找数字的结尾。计数器不会发生这种情况,因为 TeX 认为计数器是“完整的”。

需要注意的一点是 LaTeX 计数器始终是全局设置的:

\documentclass{article}
\begin{document}
\newcounter{demo}
\begingroup
\setcounter{demo}{10}
\endgroup
\the\value{demo}
\end{document}

这种效果也意味着计数器的性能(执行速度)可能比宏更好。

如果您想要一个本地值,可以使用宏或使用普通的 TeX 计数寄存器类型:

\documentclass{article}
\begin{document}
\newcount\demo
\begingroup
\demo10\relax
\endgroup
\the\demo
\end{document}

(如您所见,TeX 计数寄存器的语法与 LaTeX 计数器不同。)

答案2

是的,计数器数量有限制(256),但你可以\usepackage{etex}添加一些计数器(65536),我想是的,但不确定)。如果可以的话,我认为最好使用宏。

相关内容