新的 LuaMetaTeX 排版引擎自诩为“精简而强大”,但它附带的 ConTeXt 包实际上相当庞大(安装后大约 270 MiB)。为了对其工作原理有基本的了解,我想使用“hello world”测试所需的最小文件子集来运行它,将 TeXbook 中著名的“短篇小说”示例转换为 PDF(“很久很久以前,在一个遥远的星系 Ööç,住着一台名叫 RJ Drofnats 的计算机……”)。
使用 pdfTeX,这很简单(参见手册
https://ftp.tu-chemnitz.de/pub/tex/systems/doc/pdftex/manual/pdftex-a.pdf)。创建一个C:\TeX
没有任何子目录的单独文件夹,并将以下文件复制到其中:
二进制文件:
pdftex.exe
,,pdftex.dll
(kpathsealib.dll
来自 http://mirrors.ctan.org/systems/win32/w32tex/pdftex-w32.tar.xz)。字体规格和轮廓:
cm*.tfm
和cm*.pfb
(来自 https://ctan.org/tex-archive/fonts/cm/tfm和 https://ctan.org/tex-archive/fonts/cm/ps-type1/bakoma/pfb)。TeX 文件:
plain.tex
,,hyphen.tex
(story.tex
来自 https://ctan.org/tex-archive/macros/plain/base)。字体映射文件
pdftex.map
(手动创建):cmbx10 CMBX10 <cmbx10.pfb cmr10 CMR10 <cmr10.pfb cmsl10 CMSL10 <cmsl10.pfb [...]
打开命令提示符窗口,更改目录并将环境变量设置为当前文件夹:
cd C:\TeX set t1fonts=. set texfontmaps=. set texfonts=. set texformats=. set texinputs=. set texmf=. set texmfcnf=. set tfmfonts=.
创建内存转储格式文件
plain.fmt
:pdftex --ini ./plain.tex \dump
排版文档
story.pdf
:pdftex --fmt=plain --output-format=pdf ./story.tex \end
现在用 LuaTex 做同样的事情(见手册 http://www.pragma-ade.com/general/manuals/luatex.pdf):
下载并解压档案 http://lmtx.pragma-ade.nl/install-lmtx/context-win64.zip 到另一个文件夹并运行包含的
install.bat
脚本。将luatex.exe
和复制luametatex.exe
到C:\TeX
测试文件夹。创建内存转储格式文件
plain.fmt
:luatex --ini ./plain.tex \dump
排版文档
story.pdf
:luatex --fmt=plain --output-format=pdf ./story.tex \end
问题出在新的 LuaMetaTeX 引擎上(见手册 http://www.pragma-ade.com/general/manuals/luametatex.pdf)。 命令
luametatex --ini ./plain.tex \dump
给出错误消息
startup error : missing find_log_file callback
和
startup error : missing open_data_file callback
除非还加载了定义回调函数的 Lua 初始化文件lmtx-ini.lua
,但显然这些是不够的:
callback.register ("find_log_file", function () return "plain.log" end)
callback.register ("open_data_file", function () return true end)
因为现在,命令
luametatex --lua=lmtx-ini.lua --ini ./plain.tex \dump
导致真正根本性的失败:
This is LuaMetaTeX, Version 2.09.33 (INITEX)
runtime error : input file './plain.tex' is not found, quitting
那么,如何story.pdf
在这个最小环境中使用 LuaMetaTeX 排版?
[编辑] 正如@Marcel 指出的那样,必须使用 Lua 重建 TeX 和 PDF 后端的基本输入输出功能。为了以某种方式唤醒 LuaMetaTeX 引擎,我的问题改为:如何获取他提取的 LuaMetaLaTeX 脚本集合 (https://github.com/zauguin/luametalatex) 是否在上述独立文件夹中运行?此命令失败:
luametatex --lua=./luametaplain-init.lua --ini ./plain.tex \dump
答案1
LuaMetaTeX 积极地移除了许多可以用 Lua 实现的部分,从而使引擎本身变得更小,并将职责从引擎转移到宏/Lua 格式。这允许显著地进行更多的定制,而不会浪费不再使用的引擎功能的空间。但这也意味着实际使用引擎需要更多的组件。毕竟,引擎本身不再存在的许多东西仍然需要由某人提供。
一些例子:
- 您必须实现所有回调才能正确查找和读取文件。例如,
find_log_file
必须返回日志文件的有效路径,open_data_file
必须返回实现文件读取器接口的表。(当然,如果您true
从回调中返回或另一个无效值(例如open_data_file
用于打开输入文件的回调),则这将被视为错误,在这种情况下,引擎认为文件丢失)这使引擎本身不再包含特定于分发的文件查找例程,例如 TeX Live 的 kpathsea。 - 除了包含 PDF、DVI 或任何其他后端之外,任何输出当前页面的尝试都会被忽略,并且加载的宏包必须自己实现输出驱动程序。
- 该引擎不包含从 TFM 文件读取字体的代码,如果您想加载此类字体,则必须编写 TFM 文件解析器。
- 一些原语,包括相当重要的原语,如文件 i/o 支持(
\openin
/\openout
/\read
/\readline
/\write
/\ifeof
/\closein
/\closeout
),不再包含在内,并且必须通过格式来实现(如果需要)。 - 连字符模式不再是转储格式的一部分,Lua 和/或 TeX 代码负责在必要时加载它们。
- ...
总的来说,如果你想要一个不需要太多支持代码就可以使用的引擎,那么 LuaMetaTeX 就不合适你了。如果你正在寻找一个或多或少与 LuaTeX 兼容的实现,这些实现大部分独立于 ConTeXt 版本,你可以看看我的LuaMetaLaTeXrepo(其中还包括一个 luametaplain 格式,它使用相同的代码来表示纯 TeX 而不是 LaTeX)。