LuaTeX 0.85 \pdf* 原语变更及格式文件生成

LuaTeX 0.85 \pdf* 原语变更及格式文件生成

TeX Live 2015 附带 LuaTeX 0.80。由于 LuaTeX 0.85 上个月已经发布,而我本该去做其他事情,因此我觉得这是一个绝佳的机会,可以尝试一下 0.85 版本来拖延时间。

构建可执行文件没有问题。但为了避免

(Fatal format file error; I'm stymied)

错误,必须重新生成格式文件。

fmtutils-sys --all

但无法重新生成与 LuaTeX 相关的格式文件。通过以下方式手动执行:

luatex -ini   -jobname=luatex -progname=luaex luatex.ini

发现第一行就失败了:

! Undefined control sequence.
l.4 \pdfoutput
            =1
? 
! Emergency stop.

这很糟糕,因为\pdfoutputpdfTeX 的原始控制序列始终存在,开箱即用。但在 LuaTeX 0.85 中似乎不再存在。事实上,LuaTeX 手册第 8.1.7 节解释说,除了三个原始控制序列外,其余所有\pdf*原始控制序列都已消失。

在同一节中,手册提供了一系列命令来恢复传统的 pdfTeX基元。但是,只有在启用了 LuaTeX 中的 eTeX 基元后,才可以\pdf*使用。这种情况发生在\protected

/usr/local/texlive/2015/texmf-dist/tex/generic/config/luatexiniconfig.tex

这是第一件事

/usr/local/texlive/2015/texmf-dist/tex/plain/config/luatex.ini

加载。luatexiniconfig.tex使用命令列表进行扩展几乎成功。列表中的最后一个命令使用\newdimen不是原始命令。它是在纯 TeX 格式中定义的。

由于luatex.ini加载pdfetex.ini依次加载etex.src加载plain.src命令\newdimen序列,因此直到所有文件处理完毕后才可用。但是pdfetex.ini当然以\dump结束结束在处理完毕\endinput后添加某些内容pdfetex.ini是没有意义的。

因此,我的修改版本luatex.ini如下所示:

% $Id: luatex.ini 26647 2012-05-24 23:54:05Z karl $
% Karl Berry, originally written 2008. Public domain.
% PDF output by default.

% must be done first (activation of primitives)
\input luatexiniconfig.tex
\input luatex-unicode-letters.tex
\input pdftexconfig.tex
\input etex.src
\input pdftexmagfix.tex
\newdimen\pdfeachlineheight
\newdimen\pdfeachlinedepth
\newdimen\pdflastlinedepth
\newdimen\pdffirstlineheight
\newdimen\pdfignoreddimen
\dump
\endinput

现在fmtutils-sys已成功生成luatex.fmt格式文件。但lualatex.fmt仍然失败。

也可以使用命令列表进行扩展。但是,请执行以下lualatex.ini操作\pdf*

\protected\def\pdfliteral{\pdfextension literal}

至少需要

\catcode`\{=1
\catcode`\}=2

因为我们处于 iniTeX 模式。但是首先要latex.ltx检查的是

\ifnum\catcode`\{=1
  \errmessage
  {LaTeX must be made using an initex with no format preloaded}
\fi

而现在,这种情况已经触发。因此,lualatex.ini需求和额外的

\catcode`\{=2

现在看起来像这样:

% $Id: lualatex.ini 38624 2015-10-12 23:38:27Z karl $
% Originally written 2008 by Karl Berry. Public domain.

\begingroup
  \catcode`\{=1 %
  \catcode`\}=2 %
% JAW: Enable 'extra' pdfTeX primitives only in .ini file
% latex.ltx enables the extra primitives bu a subset of those from
% pdfTeX are needed to do the configuration below (pdftexconfig.tex).
% Rather than list them all, just enable those classed as 'pdftex'.
    \directlua{tex.enableprimitives('',tex.extraprimitives('pdftex', 'luatex', 'etex'))}
% JAW: Set up job name quoting before latex.ltx
% Web2c pdfTeX/XeTeX quote job names containing spaces, but LuaTeX does
% not do this at the engine level. The behaviour can be changed using
% a callback. Originally this code was loaded via lualatexquotejobname.tex
% but that required a hack around latex.ltx: the behaviour has been altered
% to allow the callback route to be used directly.
  \global\everyjob{\directlua{require("lualatexquotejobname.lua")}}
\endgroup

\catcode`\{=1
\catcode`\}=2

% recreate the traditional pdfTeX primitives here REMOVED FOR BREVITY

\catcode`\{=2

% settings inherited from pdftex
\input pdftexconfig.tex
% pdf output by default

\input latex.ltx

再次latex.ltx结束\dump\endinput因此必要的\newdimen命令:

\newdimen\pdfeachlineheight
\newdimen\pdfeachlinedepth
\newdimen\pdflastlinedepth
\newdimen\pdffirstlineheight
\newdimen\pdfignoreddimen

不能插入到该\input latex.ltx行之后,否则就太晚了。删除最后两行latex.ltx

\dump
\endinput

并将它们放入lualatex.ini如下位置

% settings inherited from pdftex
\input pdftexconfig.tex
% pdf output by default

\input latex.ltx

\newdimen\pdfeachlineheight
\newdimen\pdfeachlinedepth
\newdimen\pdflastlinedepth
\newdimen\pdffirstlineheight
\newdimen\pdfignoreddimen

\dump
\endinput

允许fmtutil-sys --all重新生成lualatex.fmt格式文件。但是现在 LaTeX 源已经改变,所有其他格式当然都损坏了。

一定有更好的方法!有什么想法吗?

答案1

从 v0.85 开始,LuaTeX 基本上删除了所有 pdfTeX“后端”原语,转而采用三个新接口:

  • \pdfextension
  • \pdffeedback
  • \pdfvariable

与此同时,Lua 方面还进行了其他一些重命名和更改(原始token库被删除,newtoken库将取而代之,这意味着不再有库newtoken)。这些更改需要在格式构建过程中(许多受影响的原语不会被最终用户使用)、LaTeX 内核的某些部分(库的更改会token影响这些部分)和软件包(最明显的是图形驱动程序和ifpdf)进行大量工作。

以透明的方式“修复”所有这些问题并非易事。(不仅要考虑 LaTeX:普通的 LuaTeX 也会受到影响。)LaTeX 团队已经与 TeX Live 维护者合作了一段时间,决定如何最好地处理所需的调整。在撰写本文时,我们已经决定了“拼图”的几个部分,但仍在实施它们。软件包支持存在一些特殊问题:至少在短期内很可能需要一个“兼容性”软件包。(核心团队并不控制使用 PDF 后端原语的所有软件包!)还需要与 MiKTeX、TeX Live 管理实用程序等进行协调。

所有这些意味着,LuaTeX v0.85+ 的官方(CTAN 版本)支持“暂时”不会实现。目前的计划是在 2016 年初实现,但必须满足 TL'16 的所有要求。在此期间进行测试的任何人都应与团队/我联系,加入 CC 列表进行讨论。

要明确的是:除非你非常舒适手动重建格式并弄乱你的 TeX 树,不要尝试 LuaTeX v0.85,而是等待 TeX Live 的官方支持

相关内容