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.
这很糟糕,因为\pdfoutput
pdfTeX 的原始控制序列始终存在,开箱即用。但在 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 的官方支持。