Donald E. Knuth 在以下文章中列出了 DVI 命令的语法和语义(操作码、符号名称、参数数量、含义)计算机与排版E 卷,§585,第 236-239 页。在哪里可以找到 XeTeX 使用的 250-255 范围内的附加命令的类似列表?
可用信息
以下是我得到的信息(信息来自https://github.com/simoncozens/dvipdfm-x/blob/libtexpdf/dvicodes.h):
- 开始反射250. (没有参数???)TeX-XeT 开始反映
- 结束反射251. (没有参数???)TeX-XeT end reflect
- xdv_native_font_def252. 参数???语法???
- xdv_字形253. 参数???可能的值???
- ??? 254. ???
- 目录255. 参数???可能的值???
不用说,dvicodes.h 文件中的信息是缺失的。有人能完成这个吗?(每个命令的含义、参数数量(如果有的话)、可能的值列表)
尝试解密
我打开了一个非常简单的 XDV 文件,它是从以下 TeX 代码获得的:
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage[calendar=gregorian,hijricorrection=1,locale=mashriq]{arabic}
\setmainfont[Script=Arabic,Extension=.ttf]{Amiri-Regular}
\begin{document}
Bonjour\special{ligne x}
\begin{Arabic}يانيس\end{Arabic}
Bonjour
\end{document}
在 XDV 文件中,一些信息是特殊的(命令xxx),没问题。然后有一个xdv_native_font_def命令后跟(a)以下字节:
00 00 00 1E 00 0A 00 00 00 00
(b) 按字母L
和字体的绝对路径,(c) 另外四个00
字节。然后调用字体 30(尽管它尚未在标准中定义fnt_def方式)。
然后是xdv_字形命令,后跟 2 个字节:00
和1F
(???),然后是另一个fnt_def字体 50 的命令(???),然后看起来像很多设置字符命令00
。由于我不知道xdv_native_font_def语法,我可能全都错了。
真正奇怪的是,Bonjour
该文件的字符串从未出现在 XDV 文件中(与 DVI 文件相反,在 DVI 文件中,ASCII 字形被分配给具有 ASCII 位置的数值的操作码)。在Bonjour
应该有字符串的地方,出现了这个字节字符串:
00 25 00 52 00 51 00 4d 00 52 00 58 00 55
我只能得出这样的结论:0025
是字母B
(其 ASCII 码是 0x42 而不是 0x25),0052
是字母o
(其 ASCII 码是 0x6F 而不是 0x52)。 赋值 B → 0x25, o → 0x52 究竟从何而来?
这xdv_native_font_def命令再次出现在后记中。尽管部分文档处于从右到左模式,但我没有看到任何地方开始反射和结束反射命令,但不知道xdv_native_font_def语法可能会扰乱我对整个 XDV 文件的分析。
因此,非常欢迎任何帮助!
对于那些手边没有 Unix 工具的人来说,这里是十六进制转储的测试文件:
00000000 f7 07 01 83 92 c0 1c 3b 00 00 00 00 03 e8 1d 20 |.......;....... |
00000010 58 65 54 65 58 20 6f 75 74 70 75 74 20 32 30 31 |XeTeX output 201|
00000020 39 2e 30 36 2e 31 36 3a 32 31 31 30 8b 00 00 00 |9.06.16:2110....|
00000030 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 ff ff ff ff ef 14 70 64 66 3a 70 |...........pdf:p|
00000060 61 67 65 73 69 7a 65 20 64 65 66 61 75 6c 74 a0 |agesize default.|
00000070 02 79 00 00 8d a0 fd a3 00 00 a0 02 3f 00 00 8d |.y..........?...|
00000080 a0 fd e4 00 00 8d 92 01 2c 53 40 ef 61 70 64 66 |........,[email protected]|
00000090 3a 64 6f 63 69 6e 66 6f 3c 3c 2f 42 49 44 49 2e |:docinfo<</BIDI.|
000000a0 46 75 6c 6c 62 61 6e 6e 65 72 28 54 68 69 73 20 |Fullbanner(This |
000000b0 69 73 20 74 68 65 20 62 69 64 69 20 70 61 63 6b |is the bidi pack|
000000c0 61 67 65 2c 20 56 65 72 73 69 6f 6e 20 33 35 2e |age, Version 35.|
000000d0 37 2c 20 52 65 6c 65 61 73 65 64 20 4d 61 72 63 |7, Released Marc|
000000e0 68 20 33 2c 20 32 30 31 39 2e 20 29 3e 3e 96 02 |h 3, 2019. )>>..|
000000f0 ee 00 fc 00 00 00 1e 00 0a 00 00 00 00 13 2e 2f |.............../|
00000100 41 6d 69 72 69 2d 52 65 67 75 6c 61 72 2e 74 74 |Amiri-Regular.tt|
00000110 66 00 00 00 00 c9 fd 00 1f dd 80 00 07 00 00 00 |f...............|
00000120 00 00 00 00 00 00 05 d2 00 00 00 00 00 00 0a 98 |................|
00000130 80 00 00 00 00 00 0f ca 80 00 00 00 00 00 12 20 |............... |
00000140 00 00 00 00 00 00 17 18 80 00 00 00 00 00 1c 20 |............... |
00000150 00 00 00 00 00 00 25 00 52 00 51 00 4d 00 52 00 |......%.R.Q.M.R.|
00000160 58 00 55 93 fd 00 13 27 c0 00 05 00 00 00 00 00 |X.U....'........|
00000170 00 00 00 00 0a ca 80 00 00 00 00 00 0d 3b 80 00 |.............;..|
00000180 00 00 00 00 0e f4 c0 00 00 00 00 00 11 40 40 00 |.............@@.|
00000190 00 00 00 06 5e 0e 9b 0e 7c 04 ef 05 2d 93 ef 07 |....^...|...-...|
000001a0 6c 69 67 6e 65 20 78 fd 00 1f dd 80 00 07 00 00 |ligne x.........|
000001b0 00 00 00 00 00 00 00 05 d2 00 00 00 00 00 00 0a |................|
000001c0 98 80 00 00 00 00 00 0f ca 80 00 00 00 00 00 12 |................|
000001d0 20 00 00 00 00 00 00 17 18 80 00 00 00 00 00 1c | ...............|
000001e0 20 00 00 00 00 00 00 25 00 52 00 51 00 4d 00 52 | ......%.R.Q.M.R|
000001f0 00 58 00 55 8e 8e 9f 1e 00 00 8d 92 00 e7 92 00 |.X.U............|
00000200 fd 00 05 dc 00 00 01 00 00 00 00 00 00 00 00 01 |................|
00000210 be 8e 8e 8c f8 00 00 00 2c 01 83 92 c0 1c 3b 00 |........,.....;.|
00000220 00 00 00 03 e8 02 79 f2 7f 01 97 00 00 00 03 00 |......y.........|
00000230 01 fc 00 00 00 1e 00 0a 00 00 00 00 13 2e 2f 41 |............../A|
00000240 6d 69 72 69 2d 52 65 67 75 6c 61 72 2e 74 74 66 |miri-Regular.ttf|
00000250 00 00 00 00 f9 00 00 02 14 07 df df df df df df |................|
00000260
答案1
根据dvisvgm 来源和dvipdfm-x 源:真正特定于 XDV 的操作码(截至当前版本 7)只有三个:
252(
fc
):定义字体(代码中称为XDV_NATIVE_FONT_DEF
或XFontDef
),是三者中最复杂的。参数包括:字体编号[4] ptsize[4] 标志[2] psname_len[1] 字体名称[psname_len] 字体索引[4]
其次是最多 (2 + 4 * 65535) 个字节取决于旗帜。
253(
fd
)。这是“带有 X 和 Y 位置的字形 ID 字符串”,在代码中用XDV_GLYPHS
或引用XGlyphArray
。参数包括:w[4] n[2] xy[(4+4)n] g[2n]
其中
w
是字形数组的总宽度,n
是字形的数量,xy
是 (dx, dy) 对的序列(每个字形的相对水平和垂直位置),并且g
包含“要排版的字形的 FreeType 索引”。254 (
fe
):这与此类似,只是它包含“一个 UTF-16 字符的前导数组,用于指定要打印的字形所代表的“实际文本”。它通常包含带有特殊字符(如连字)的文本,这些字符已展开,以便可用于文本搜索、纯文本复制和粘贴等。此 XDV 命令是在 XeTeX 0.99995 中引入的,可以由\XeTeXgenerateactualtext1
”触发。因此其参数为:参数:l[2] t[2l] w[4] n[2] xy[8n] g[2n]
我认为 XeTeX 没有使用 TeX-XeT 命令 250–251 和 pTeX 命令 255,这与您在文件中看不到它们的情况一致。
问题中的十六进制转储以f7
= 247(DVI“pre”命令)开头,下一个字节是 DVI 版本,这里是07
。因此,正如预期的那样,我们正在查看(XDV)版本 7。
因此,当您在文件中看到(在字节偏移量 278 或 423 处)类似 的字节时fd 00 1f dd 80 00 07 00 00 00
,实际上不仅仅是两个字节作为参数,00 1f dd 80
而是瓦,然后00 07
是n(字形数量),则接下来的 56 个字节是xy
或(dx, dy)
(这 7 个字形的偏移量),则接下来的 14 个字节是g
或glyphs
(7 个字形)。不用说,您示例中的这 7 个是Bonjour
:
00 25 00 52 00 51 00 4d 00 52 00 58 00 55
正如您所观察到的,这些不是 ASCII 代码,那么00 25
到 B 等的映射从何而来?嗯,它与常规 DVI 格式相同:这些是字体中字形的位置,字体可以选择将任何字形放在任何位置。这可以通过打开字体并计算位置来确认:也许 FontForge 可以显示它,但我无法在 UI 中找到它,但我可以使用以下方式找到它fonttools
:
$ ttx amiri-regular.ttf
Dumping "amiri-regular.ttf" to "amiri-regular.ttx"...
该文件包含:
<GlyphID id="37" name="B"/>
其中 37 是 0x25,等等。
答案2
并不比你提供的源代码好很多,但是 xetex 输出是由 xdvipdfmx 读取的,而 texlive svn 中的源代码dvicodes.h
有
/* XeTeX ".xdv" codes */
#define XDV_NATIVE_FONT_DEF 252 /* fontdef for native platform font */
#define XDV_GLYPHS 253 /* string of glyph IDs with X and Y positions */
#define XDV_TEXT_AND_GLYPHS 254 /* like XDV_GLYPHS plus original Unicode text */
#define PTEXDIR 255 /* Ascii pTeX DIR command */
这些由同一个目录处理dvi.c
,但我猜你的 C 比我的好:-)
对于 C 中的预期字节布局有一些评论,例如
case XDV_GLYPHS:
need_XeTeX(opcode);
get_and_buffer_bytes(fp, 4); /* width */
len = get_and_buffer_unsigned_pair(fp); /* glyph count */
get_and_buffer_bytes(fp, len * 10); /* 2 bytes ID + 8 bytes x,y-location per glyph */
break;
case XDV_TEXT_AND_GLYPHS:
need_XeTeX(opcode);
len = get_and_buffer_unsigned_pair(fp); /* utf16 code unit count */
get_and_buffer_bytes(fp, len * 2); /* 2 bytes per code unit */
get_and_buffer_bytes(fp, 4); /* width */
len = get_and_buffer_unsigned_pair(fp); /* glyph count */
get_and_buffer_bytes(fp, len * 10); /* 2 bytes ID + 8 bytes x,y-location per glyph */
break;
case XDV_NATIVE_FONT_DEF:
need_XeTeX(opcode);
do_native_font_def(get_signed_quad(dvi_file));
break;
dviasm(尽管它的名字)可以显示 xdv 文件,我不得不更改字体加载来找到字体,但在您的测试文件中它报告
[preamble]
id: 7
numerator: 25400000
denominator: 473628672
magnification: 1000
comment: ' XeTeX output 2019.06.16:2127'
[postamble]
maxv: 633.947250pt
maxh: 407pt
maxs: 3
pages: 1
[font definitions]
fntdef: "/usr/local/texlive/2018/texmf-dist/fonts/truetype/public/amiri/amiri-regular.ttf" at 10pt
[page 1 0 0 0 0 0 0 0 0 0]
xxx: 'pdf:pagesize default'
down: 633pt
push:
down: -605pt
down: 575pt
push:
down: -540pt
push:
right: 300.325195pt
xxx: 'pdf:docinfo<</BIDI.Fullbanner(This is the bidi package, Version 35.8, Released May 1, 2019. )>>'
w: 2.929688pt
fnt: "/usr/local/texlive/2018/texmf-dist/fonts/truetype/public/amiri/amiri-regular.ttf" at 10pt
setglyphs: 31.865234pt gid37(0pt) gid82(5.820312pt) gid81(10.595703pt) gid77(15.791016pt) gid82(18.125000pt) gid88(23.095703pt) gid85(28.125000pt)
w0:
setglyphs: 19.155273pt gid2388(0pt) gid4497(10.791016pt) gid4466(13.232422pt) gid2021(14.956055pt) gid2083(17.250977pt)
w0:
xxx: 'ligne x'
setglyphs: 31.865234pt gid37(0pt) gid82(5.820312pt) gid81(10.595703pt) gid77(15.791016pt) gid82(18.125000pt) gid88(23.095703pt) gid85(28.125000pt)
pop:
pop:
down: 30pt
push:
right: 231.570312pt
setglyphs: 5.859375pt gid447(0pt)
pop:
pop:
使用你提供的 tex 文件,除了将字体行更改为
\setmainfont[Script=Arabic]{Amiri}
答案3
权威来源是 XeTeX 源代码树,特别是xetex网站文件。引用自:
\yskip\noindent 命令 250--255 在普通 .{DVI} 文件中未定义,但以下命令在 .{XDV} 文件中使用。
\yskip\hang\vbox{\halign{#&#\hfil\cr |define_native_font| 252 & |k[4]| |s[4]| |flags[2]| |l1| |n[l]| |i[4]|\cr & |如果 (标志和 COLORED) 则| |rgba[4]|\cr & |如果 (标志和 EXTEND) 则| |extend[4]|\cr & |如果 (标志和 SLANT) 则| |slant[4]|\cr & |如果 (标志和 EMBOLDEN) 则| |embolden[4]|\cr }}
\yskip\hang|set_glyphs| 253 |w[4]| |k[2]| |xy[8k]| |g[2k]|。
\yskip\hang|设置文本和字形| 254 |l[2]| |t[2l]| |w[4]| |k[2]| |xy[8k]| |g[2k]|。
\yskip\noindent 命令 250 和 255 在普通 .{XDV} 文件中未定义。