用于实验的系统:Debian buster (i386)、vanilla TeX Live 2020
目前,使用 LuaLaTeX 创建 .dvi 文件对我作为最终用户来说似乎没有实际用处,因为由于缺乏开放类型字体支持,没有 .dvi 查看器可以正确显示它们,也没有转换器(如 xdvipdfmx)可以正确转换它们。
请不要误解我的意思:由于 xdvipdfmx 的开发版本对 luatex dvi 有一些初步支持,所以 LuaLaTeX 的 .dvi 文件对于开发人员来说根本没有意义。
无论如何:玩弄这些.dvi 文件很有趣。
在 .dvi 模式下使用 LuaLaTeX 编译 MWE 时
\documentclass{article}
\begin{document}
Hello World!
\end{document}
,保存为test.tex
,即,执行时 ,将创建lualatex --output-format=dvi test.tex
一个没有错误消息的文件。test.dvi
申请dviasm test.dvi -o testluadvidump.txt
创建人类可读的转储文件可获得以下结果testluadvidump.txt
:
[preamble]
id: 2
numerator: 25400000
denominator: 473628672
magnification: 1000
comment: ' LuaTeX output 2021.02.08:1924'
[postamble]
maxv: 633pt
maxh: 407pt
maxs: 3
pages: 1
[font definitions]
fntdef: [/usr/local/texlive/2020/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf] at 10pt
[page 1 0 0 0 0 0 0 0 0 0]
push:
xxx: 'header=l3backend-dvips.pro'
pop:
push:
push:
push:
right: 77pt
down: 63pt
fnt: [/usr/local/texlive/2020/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf] at 10pt
set: '>2HHQ'
right: 3.330002pt
set: 'q'
right: -0.830002pt
set: 'Q`H/5'
pop:
pop:
push:
right: 232pt
down: 633pt
set: 'R'
pop:
pop:
当使用 pdflatex 进行编译时,即,也会创建一个没有错误消息的pdflatex --output-format=dvi test.tex
文件。test.dvi
但是dviasm
通过应用 -dump得到的dviasm test.dvi -o testpdefdvidump.txt
结果testpdfdvidump.txt
是略有不同:
[preamble]
id: 2
numerator: 25400000
denominator: 473628672
magnification: 1000
comment: ' TeX output 2021.02.08:1918'
[postamble]
maxv: 633pt
maxh: 407pt
maxs: 3
pages: 1
[font definitions]
fntdef: cmr10 at 10pt
[page 1 0 0 0 0 0 0 0 0 0]
push:
xxx: 'header=l3backend-dvips.pro'
pop:
down: 633pt
push:
down: -605pt
down: 575pt
push:
down: -540pt
push:
right: 77pt
fnt: cmr10 at 10pt
set: 'Hello'
right: 3.333328pt
set: 'W'
right: -0.833344pt
set: 'orld!'
pop:
pop:
down: 30pt
push:
right: 232pt
set: '1'
pop:
pop:
fnt:
- 和-指令之间的差异fntdef:
似乎很明显。
set:
令我困惑的是字符串指令之间的差异:
使用 pdflatex-dvi 的转储,您有
set: 'Hello'
[...]
set: 'W'
[...]
set: 'orld!'
[...]
set: '1'
使用 lualatex-dvi 的转储,您有
set: '>2HHQ'
[...]
set: 'q'
[...]
set: 'Q`H/5'
[...]
set: 'R'
并且在 LuaLaTeX-dvi-dump ( testluadvidump.txt
) 中,您需要将fnt:
-directives 和set:
-directives 都替换为 pdfLaTeX-dvi-dump 中的指令,然后重新创建 .dvi 文件,dviasm testluadvidump.txt -o testb.dvi
以便testb.dvi
正确显示。
似乎用 LuaLaTeX 创建的 -directives中的 stest.dvi
的编码与用 pdfLaTeX 创建的s的编码不同。⟨string⟩
set: '⟨string⟩'
⟨string⟩
test.dvi
这是什么原因呢?
lmroman10-regular.otf
当 的字体编码与 的字体编码不同时,字符串是否反映字体编码cmr10
?
答案1
LuaTeX 通过该文件管理 lmroman-regular10 的编码lmroman-regular10.lua
,例如,我们可以看到它有
[72]={
["boundingbox"]=12,
["index"]=62,
["name"]="H",
["unicode"]=72,
["width"]=750,
},
它将字母指向H
otf 字体中的索引 62,即 的 ASCII >
。您会发现大多数字符都有类似的映射,这表明 LuaTeX 没有使用字符的 unicode 点,而是使用 otf 中字符的绝对索引。
还有一个.luc 文件,我猜它是.lua 文件的二进制编译版本。
答案2
我在开发过程中遇到了 fntdef 和 set/put 命令的这个问题dvi 解码用于 LuaTeX。
以下是源代码注释中的一段摘录,讨论了我发现的内容:
“dvilualatex 生成的 DVI 文件中包含的字体名称可以是专有名称,也可以是文件名,具体取决于用于选择它们的 fontspec 命令。由于 dvi-decode 无法访问 luatex 字体加载器,因此它只能接受在字体名称字符串中使用文件名的 DVI 文件。
确保这种情况的最佳方法是使用 fontspec 命令 \setmainfont、setmathfont 等以文件名形式在 LaTeX 源中明确定义字体,适用于文档中使用的所有字体。
dvilualatex 生成的 DVI 文件中包含的字体名称字符串还会在字体名称末尾附加编码字体特征的额外文本。我们将此字符串与字体名称分开,并将其返回到输出字体对象的 fontFeatures 字段中。
此外,字体特征模式和整形器会影响 dvilualatex 生成的 set 和 put 命令的参数含义。参数可能表示 Unicode 代码,也可能表示字形索引,也可能表示两者,具体取决于值是否在特定范围内。
据我所知,这些参数编码的变化并没有得到完整的记录,而且由于 LuaTeX 源的抽象层次太多,我无法从中发现各种编码方案。
因此,我选择 harf 和 ot 作为 dvi-decode 将支持的模式和整形器,而不是尝试编写所有可能的模式和整形器选项。可以通过在 LaTeX 源的字体定义中包含 Renderer=OpenType 来指定这些功能。如果在任何字体的 FontFeatures 字符串中未找到这些功能,dvi-decode 将中止处理。"
最后我除了读取字体文件之外还必须读取 .lua 文件才能找到正确的字形索引。