LuaMetaTeX 的最小测试环境

LuaMetaTeX 的最小测试环境

新的 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没有任何子目录的单独文件夹,并将以下文件复制到其中:

  1. 二进制文件:pdftex.exe,,pdftex.dllkpathsealib.dll来自 http://mirrors.ctan.org/systems/win32/w32tex/pdftex-w32.tar.xz)。

  2. 字体规格和轮廓:cm*.tfmcm*.pfb(来自 https://ctan.org/tex-archive/fonts/cm/tfmhttps://ctan.org/tex-archive/fonts/cm/ps-type1/bakoma/pfb)。

  3. TeX 文件:plain.tex,,hyphen.texstory.tex来自 https://ctan.org/tex-archive/macros/plain/base)。

  4. 字体映射文件pdftex.map(手动创建):

     cmbx10 CMBX10 <cmbx10.pfb
     cmr10 CMR10 <cmr10.pfb
     cmsl10 CMSL10 <cmsl10.pfb
     [...]
    
  5. 打开命令提示符窗口,更改目录并将环境变量设置为当前文件夹:

     cd C:\TeX
     set t1fonts=.
     set texfontmaps=.
     set texfonts=.
     set texformats=.
     set texinputs=.
     set texmf=.
     set texmfcnf=.
     set tfmfonts=.
    
  6. 创建内存转储格式文件plain.fmt

     pdftex --ini ./plain.tex \dump
    
  7. 排版文档story.pdf

     pdftex --fmt=plain --output-format=pdf ./story.tex \end
    

现在用 LuaTex 做同样的事情(见手册 http://www.pragma-ade.com/general/manuals/luatex.pdf):

  1. 下载并解压档案 http://lmtx.pragma-ade.nl/install-lmtx/context-win64.zip 到另一个文件夹并运行包含的install.bat脚本。将luatex.exe和复制luametatex.exeC:\TeX测试文件夹。

  2. 创建内存转储格式文件plain.fmt

     luatex --ini ./plain.tex \dump
    
  3. 排版文档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)。

相关内容