我想知道 LaTeX 中的整数是什么。我从 pdfTeX 发行说明 (2005-08-01) 中得到这个信息
\pdfelapsedtime
是一个只读整数,它(最初)返回自本次运行开始以来经过的时间量。该量以“缩放秒数”给出:值 65536 计为一秒。如果经过的时间超过 32767 秒,则将返回 (2^31)-1。\pdfresettimer
更新内部计时器,以便后续调用\pdfelapsedtime
将从 0 重新开始。
所以我猜想返回值\pdfelapsedtime
是一个整数。我必须使用\the\pdfelapsedtime
将其转换为字符串值(请根据 LaTeX 惯例更正我的话,我希望每个人都知道我的意思)。为了进一步阐明我的问题,请查看以下 MWE:
\documentclass{minimal}
\newcount\benchmarkcount
\begin{document}
\pdfelapsedtime
\benchmarkcount
\end{document}
第一个错误是,! You can't use '\pdfelapsedtime' in vertical mode.
而第二个错误给出! Missing number, treated as zero.
所以整数与计数器也不相同。
有什么东西——让我称它为\foo
——可以将字符串转换为整数,例如\foo\the\pdfelapsedtime
。
或者,这也能解决我的问题,有没有可以\directlua{tex.print(...)}
返回整数的类似物?
背景:我正在研究答案对这个问题并尝试使 lualatex\pdfelapsedtime
宏尽可能与 pdflatex 宏相同。
答案1
我猜想您能得到的最佳近似值是仅在 a 的上下文中允许的,<number>
而不是“单独”的。
按照你的定义
\newcommand{\elapsedtime}{%
\directlua{
tex.print((os.clock()-x)*65536)
}}
你将数字序列推入 token 流,而不是“抽象数字”。我建议这样做
\protected\def\elapsedtime{\numexpr\directlua{
tex.print(math.floor(os.clock()*65536+0.5))}\relax}
这个会不是\pdfelapsedtime
在两个方面等同于:
\elapsedtime
当 LuaTeX 搜索数字时,case 不出现的错误消息是! You can't use `\numexpr' in vertical mode.
这样的错误使用
\elapsedtime
会将数字留在标记流中(\pdfelapsedtime
在错误的地方则不会)。
相反,\the\elapsedtime
会做预期的事情。
如果我想添加一个\resetelapsedtime
,我会在\elapsedtime
“条件减法”中进行操作,也就是说,-x
只有当x
给定一个值时我才会这样做。
答案2
这里的区别\pdfelapsedtime
在于只读整数,而\benchmarkcount
是读写寄存器。在这两种情况下,内容都是“内部整数”,因此您需要\the
或\number
将值插入输入流。但是,TeX 允许您将值分配给\benchmarkcount
\benchmarkcount <optional => <integer denotation> <optional space>
因此,当您像之前那样使用它时,TeX 会寻找一个数字,但找不到。另一方面,您无法分配\pdfelapsedtime
。这意味着您根本无法像之前那样使用它,因此 TeX 会抱怨。因此,虽然可以解释差异,但您得到相同错误的唯一方法是创建一个新的\pdfelapsedtime
TeX 计数。那里的问题是该值是动态的,因此通常的复制和重命名方法将失败。