我正在尝试在 LaTeX 中实现一个受计数器foreach
值限制的循环totcount
,但这根本不起作用,而且我不明白为什么。
这到底能不能做到?如果能,怎么做?
这是一个最简单的失败例子:
\documentclass{scrartcl}
\usepackage{totcount}
\usepackage{pgffor}
\begin{document}
% dummy totcount counter
\newtotcounter{dummycounter}
\addtocounter{dummycounter}{10}
Total of dummy counter = \total{dummycounter}
% for loop with explicit number
\foreach\index in {1,...,10}{repeat }
% for loop with number taken from totcount counter
\foreach\index in {1,...,\total{dummycounter}}{repeat}
\end{document}
输出结果如下:
Total of dummy counter = 10
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat
repeat10pt¿1pt10pt
控制台上的错误消息如下:
! Missing number, treated as zero.
<to be read again>
\def
l.15 ...ex in {1,...,\total{dummycounter}}{repeat}
因此,在 的上下文中\foreach
, 的输出似乎\total
不被解释为数字。这非常令人费解,因为根据定义,它是一个数字。
包裹澄清:
- 使用的目的
totcount
是在第一次运行期间添加一些值,然后将其写入文件.aux
并可在第二次运行时使用(我已经在其他地方成功使用它) pgffor
是实现循环的一种可能方法,如在本网站其他问题的答案中所发现的;我确实尝试了其他方法,但对于这个特定的问题没有任何成功,但pgffor
似乎总体上更容易实现
答案1
\total
无法扩展,这可能是这里的问题。然而,
\foreach\index in {1,...,\totvalue{dummycounter}}{repeat}
有效,因为\totvalue
是可扩展的,并且扩展为一个可以测试的数字(第一次运行时为 -1)。
\documentclass{scrartcl}
\usepackage{totcount}
\usepackage{pgffor}
\begin{document}
% dummy totcount counter
\newtotcounter{dummycounter}
\addtocounter{dummycounter}{10}
Total of dummy counter = \total{dummycounter}
% for loop with explicit number
\foreach\index in {1,...,10}{repeat }
% for loop with number taken from totcount counter
\foreach\index in {1,...,\totvalue{dummycounter}}{repeat}
\end{document}
答案2
正如克莱门斯所解释的,\total
是不可扩展的,因为它使用了内部的\def
,从而阻止了扩展——最后,它不能在数字扩展上下文中使用,而这在条件中是\if
检查循环结束所必需的。
我也在这里申请\totvalue
,但是以传统的方式TeX
\loop
:
旁注:counters
最好在序言中定义,而不是在文档正文的某个地方。
\documentclass{article}
\usepackage{totcount}
\newcounter{loopcntr}
\newtotcounter{dummycounter}
\begin{document}
\addtocounter{dummycounter}{10}
Total of dummy counter = \total{dummycounter}
\loop\unless\ifnum\value{loopcntr}>\numexpr\totvalue{dummycounter}-1%
\stepcounter{loopcntr}
\theloopcntr\ repeat
\repeat
\end{document}