在 latex 中将字符转换为整数

在 latex 中将字符转换为整数

我想知道 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在两个方面等同于:

  1. \elapsedtime当 LuaTeX 搜索数字时,case 不出现的错误消息是! You can't use `\numexpr' in vertical mode.

  2. 这样的错误使用\elapsedtime会将数字留在标记流中(\pdfelapsedtime在错误的地方则不会)。

相反,\the\elapsedtime会做预期的事情。

如果我想添加一个\resetelapsedtime,我会在\elapsedtime“条件减法”中进行操作,也就是说,-x只有当x给定一个值时我才会这样做。

答案2

这里的区别\pdfelapsedtime在于只读整数,而\benchmarkcount是读写寄存器。在这两种情况下,内容都是“内部整数”,因此您需要\the\number将值插入输入流。但是,TeX 允许您将值分配给\benchmarkcount

\benchmarkcount <optional => <integer denotation> <optional space>

因此,当您像之前那样使用它时,TeX 会寻找一个数字,但找不到。另一方面,您无法分配\pdfelapsedtime。这意味着您根本无法像之前那样使用它,因此 TeX 会抱怨。因此,虽然可以解释差异,但您得到相同错误的唯一方法是创建一个新的\pdfelapsedtimeTeX 计数。那里的问题是该值是动态的,因此通常的复制和重命名方法将失败。

相关内容