可用信息

可用信息

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 个字节:001F(???),然后是另一个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_DEFXFontDef),是三者中最复杂的。参数包括:

    字体编号[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 07n(字形数量),则接下来的 56 个字节是xy(dx, dy)(这 7 个字形的偏移量),则接下来的 14 个字节是gglyphs(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} 文件中未定义。

排版版本

相关内容