为什么 luatex85 包和 luatex 手册对 \pdf 的定义不同……?

为什么 luatex85 包和 luatex 手册对 \pdf 的定义不同……?

你可以在luatex85文档中读到:

LuaTEX 0.85 和 0.87 与 TEXLive 2014 中的 LuaTEX 0.80 相比有很多变化。最值得注意的是,几乎所有有名称的 pdfTEX 扩展原语\pdf...都已被重命名或删除。

[...]

LuaTEX 手册列出了可以进行的适当兼容性定义,以便文档可以继续使用旧名称。这个包主要由这些定义组成,在某些情况下会进行微小更改。(主要是在使用 \protected 或 \edef 时的选择不同。)

除了“编程品味”之外,还有其他原因导致这些不同的选择吗?

答案1

这些luatex85定义的优点是,它们以代码形式存在,并且在更多情况下经过测试(在乳胶中实际使用),因此可以在更多情况下发挥作用。

\def 在最初的几个版本中,对几个定义进行了调整。通常,使用或\edef或 是否使用\protected以及使用空格或 来终止数字都无关紧要\numexpr...\relax。但是,如果您在足够多的真实世界文档中尝试模拟,并执行足够多奇怪的扩展上下文,那么您就会发现不同的命令需要不同类型的模拟。

例如你在评论中提到的案例

\def\pdffontname{\pdffeedback fontname}              % (luatex85.sty)
\def\pdffontname{\numexpr\pdffeedback fontname\relax}% manual

在几乎所有情况下,它都会被用作数字,例如

\count@=\pdffontname

任何一种定义都可以,但 pdftex 允许在所有上下文中将其扩展为数字,并且不需要\the这个纯 tex 文档

\pdffontname\font

\bye

是否无错误,排版是否正确 1

\numexpr版本将产生

! You can't use `\numexpr' in vertical mode.
\pdffontname ->\numexpr 
                        \pdffeedback fontname\relax 
l.5 \pdffontname
              \font
? 

除非你加上前缀\the

但没有的版本

\def\pdffontname{\pdffeedback fontname}

\pdffontname\font

\bye

做正确的事。

有时就像

{\outputmode=1
         \xdef\pdfcreationdate   {\pdffeedback creationdate}
}

我们更加努力地在一个扩展步骤中扩展到正确的东西,因为有人有一个真正的包

....\expandafter\something\pdfcreationdate 

并且\something需要访问扩展日期而不仅仅是的第一级扩展\pdffeedback creationdate,并且 pdftex 使得它在 PDF 和 DVI 模式下都可用,而 LuaTeX 反馈仅在\outputmode为 1 时可用。

目前尚不清楚这些为了实现在野外工作的强健仿真而做出的考虑是否必然会澄清手册,该手册给出了如何解决 LuaTeX 0.85 中发生的名称更改的基本思想,因此我们从未认为有必要将这些差异推回给 LuaTeX 团队以编写手册。

相关内容