新的 luatex 原语 \deferred 有什么作用?

新的 luatex 原语 \deferred 有什么作用?

我最近注意到一个新的原始\deferredluatex 中添加了一个新的原语(相关的 texlive git 更改)。 这luatex 手册在大多数事情的例子和解释上都很严肃,我基本上没有看到\deferred除了提到作为字首在第 47 页(不确定这是否是同一件事)以及它在第 207 页的原语大列表中的出现。

它有什么\deferred用?根据 git 更改,我天真地猜测它是\immediate,可能与新的“晚期特殊”功能有关。除了它的作用之外,是否有人有示例文档,其中使用新原语来执行以前不可能完成的事情?

附言如果你的 texlive 不够新,你可以看到它实际上是一个正确的“命令”,这个例子在 texlive.net 上。

答案1

正如 muzimuzhi 所说:\deferred是关键字的 LuaTeX 替代品shipout。也就是说,两者应该做同样的事情。

关键字shipout是在 pdfTeX 中实现的(并复制粘贴移植到 XeTeX、e(u)-pTeX 和 Aleph),因为我们需要对 进行“后期扩展” \special。当 Hans 为 LuaTeX 实现它时,他可能认为前缀\deferred更好,因为它与 对称\immediate。muzimuzhi 已经准确地回答了你的问题,所以这里解释了\deferredshipout关键字的用途:

当您使用 时\special,它会完全扩展参数(非常类似于\expanded),然后将扩展的标记列表作为 whatsit 节点添加到输出列表中。然后,该节点将按原样写入输出.pdf或引擎生成的任何格式。

问题在于,当 TeX 读取你的 时\special,它不知道\special将放置在哪个页面,因此使用诸如此类的东西\thepage有时会提供错误的信息。

在下面的示例(pdfTeX)文档中,我们正在排版一个跨越三页的长段落:当 TeX 读取\special(当它为段落构建水平列表时)时,它仍在处理第 1 页的第一个段落(首先它构建节点列表,然后将列表分成行,然后将这些行跨页面),所以\count0(页码)为 1,所以它将文本涂成红色。

如果切换到 ,\special shipout它将保持标记列表不展开,直到页面输出(当所有内容都处于页面中的最终位置时),然后它才会扩展标记列表,并评估 的值\count0。此时,TeX 已经知道它在页面上,因此它将颜色设为蓝色。

\input color.tex

\hsize=5cm \pdfpagewidth=10cm
\vsize=5cm \pdfpageheight=10cm

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\special{pdf:%
% \special shipout{pdf:%
  \ifnum\count0=1 1 \else 0 \fi 0 \ifnum\count0=1 0 \else 1 \fi rg
  \ifnum\count0=1 1 \else 0 \fi 0 \ifnum\count0=1 0 \else 1 \fi RG}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

\bye

\special

在此处输入图片描述

使用\special shipout(或\deferred\special在 LuaTeX 中):

在此处输入图片描述

所有这些功能在没有这些扩展的情况下都已经可以实现,但它需要您多次运行 TeX,让 TeX\special在页面上写下您的内容,然后找出它最终出现的位置,然后使用该信息(存储在临时文件中)在稍后做出正确的选择。此扩展允许您一次性完成所有操作,无需额外的数据结构和构建步骤。

答案2

结合 TeX Live Guide---2023,第 9.2 节目前:2023 年

跨引擎扩展(原始 TeX 和 e-TeX 除外):\special后跟一个新的关键字“ shipout”会延迟参数标记的扩展,直到\shipout时间,就像非一样\immediate\write

和 LuaTeX 参考手册 (2023 年 2 月,v1.16),第 3.2.1 节更少的原语

[...] 这里我们展示了可以传递给扩展的选项。该shipout选项是一个兼容性功能。相反,可以使用deferred前缀。

\pdfextension literal
  [shipout] [ direct | page | raw ] { tokens }
...

我认为这意味着,例如

  • \pdfextension literal shipout direct {<tokens>}(使用新选项shipout)和
  • \deferred\pdfextenion literal direct {<tokens>}(使用新的原语\deferred作为前缀)

做同样的事。

因此,在 LuaTeX 参考手册中,最好使用\deferred而不是当前的deferred

相关内容