counts 与 numexpr 有何不同

counts 与 numexpr 有何不同

要对数字进行基本算术运算,可以利用 TeX 计数,

\newcount\c
\c=2
\advance\c 3
\typeout{\the\c}

LaTeX 计数器

\newcounter{c}
\setcounter{c}{2}
\addtocounter{c}{3}
\typeout{\thec}

\numexpr宏。

\edef\c{\numexpr 2 + 5 \relax}
\typeout{\the\c}

除了语法之外,它们还有哪些不同?它们最适合哪些用例?性能上有差异吗?如上例所示,对于基本整数运算,应该首选哪一个?

答案1

TeX 有固定数量(经典 TeX 中为 256 个,etex 和 xetex 中为 32768 个,luatex 中为 65536 个)寄存器存储整数值。

\newcount\c将名称分配\c给这些寄存器之一,然后\advance对其进行操作,请注意,这里的加法涉及将值赋值回寄存器,因此它不是可扩展手术。

LaTeX\newcounter可以看作是 的语法包装器\newcount\newcounter{abc}将名称分配\c@abc给使用 分配的原始 TeX 寄存器\newcount。但是,通常情况下,额外的抽象层会提供一些有用的功能,特别是定义了辅助宏(例如\theabc定义打印格式的宏),并将计数器放在重置列表中,以便例如递增section自动设置subsection为零。使用类似的列表来保存机制的计数器\include

TeX 基本操作可能当地的或者全球的

\c=2 { \advance\c 1 } \the\c

将产生 2,因为增量将在}

\c=2 { \global\advance\c 1 } \the\c

将产生 3,因为全局分配将在所有分组级别上看到。

LaTeX 计数器分配始终是全局的,这反映了它们的顶级用途,例如计数器figure,标题通常位于形成组的框内,但您希望计数器具有全局文档范围。

这意味着您经常会看到原始寄存器用于本地“临时”算术,而乳胶计数器用于顶层结构文档计数器。

\numexpr\advance是一个 e-tex 扩展,它提供与、等原语(或多或少)相同的算术运算\multiply,但被归类为可扩展运算并且不会自动将值分配回寄存器。

因为它是可扩展的,所以它的工作方式\edef如您所示(已更正)

\edef\c{\the\numexpr 2 + 5 \relax}

 \show\c

例子。

相关内容