我应该使用计数器还是宏来存储数值数据?同时使用的计数器数量是否有限制或其他注意事项?
我还想对数据执行简单的算术运算——我知道如何使用计数器来做到这一点。
例子
使用宏:
\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),我想是的,但不确定)。如果可以的话,我认为最好使用宏。