如何比较两个 dvi 文件?

如何比较两个 dvi 文件?

有没有可以比较两个 dvi 文件的工具。我想在对源 tex 文件进行一些更改后检查它们是否相同。

答案1

TeX 在 DVI 文件中添加注释,例如:

 TeX output 2013.02.15:1010

它包含使 DVI 文件的比较变得复杂化的日期和时间:

  • \year可以通过设置、\month\day和来明确设置时间戳\time。如果用于比较的两个文件具有相同的值,则 DVI 文件中的时间戳相同,您可以使用常用程序(diffcomp、...)比较文件。

  • 注释在 DVI 文件格式的前言部分中有一个固定的位置。第十五字节包含后面注释的长度。在通常的标准情况下,只需忽略文件的前 42 个字节。分子、分母和放大倍数的缺失值无论如何都会在后言部分中重复出现。在 Linux 中,可以tail通过将选项设置-c为文件长度减 42 来完成剥离。

  • 另一种可能性是以dvitype更人性化的方式输出 DVI 内容,这里可以在比较中忽略带有 DVI 注释和时间戳的第八行。

答案2

您可以使用dvitype,将 DVI 文件转换为“人类可读”格式。获取的文件开头为

This is DVItype, Version 3.6 (TeX Live 2012)
Options selected:
  Starting page = * 
  Maximum number of pages = 1000000
  Output level = 4 (the works)
  Resolution = 300.00000000 pixels per inch
numerator/denominator=25400000/473628672
magnification=1000;       0.00006334 pixels per DVI unit
' TeX output 2013.02.15:1014'

因此,您应该忽略直到最后一行为止的行,因为时间戳肯定会有所不同。

该文件的其余部分将包含类似

Postamble starts at byte 353.
maxv=41484288, maxh=26673152, maxstackdepth=13, totalpages=1
Font 14: cmtt10---loaded at size 655360 DVI units 
Font 7: cmr10---loaded at size 655360 DVI units 

42: beginning of page 1 
87: down4 41484288 v:=0+41484288=41484288, vv:=2628 
92: push 
level 0:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
93: down4 -39649280 v:=41484288-39649280=1835008, vv:=116 
98: down4 37683200 v:=1835008+37683200=39518208, vv:=2503 
103: push 
...

它们是将字体与唯一编号关联以及在页面上设置类型的低级指令。

答案3

dvii公用事业可以计算每个页面的消息摘要,例如

dvii -p -M1 filex > before.md
cat before.md
[message digest: simple sum (ignore font)]
p:[1/1]::9C8E26458F1B019011D2F28DA18B18CC
p:[2/2]::9C8E26468F1B029011D2F28DA18B18CC
p:[3/3]::9C8E26478F1B039011D2F28DA18B18CC
p:[4/4]::9C8E26488F1B049011D2F28DA18B18CC

然后,您可以比较.md文件,而不是.dvi

答案4

如果你想转储/获取 DVI 文件的文本表示,作为dvitypeegreg 的回答,您也可以使用dviasm

我发现输出比 更短且更易读dvitype

例如,对于文件d.dvidviasm d.dvi生成以下内容(41 行):

[preamble]
id: 2
numerator: 25400000
denominator: 473628672
magnification: 1000
comment: ' TeX output 2024.02.07:0323'

[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]
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.277786pt
      set: 'orld'
    pop:
  pop:
  down: 30pt
  push:
    push:
      right: 232pt
      set: '1'
    pop:
  pop:
pop:

产生dvitype d.dvi以下内容(60行):

This is DVItype, Version 3.6 (TeX Live 2023/Arch Linux)
Options selected:
  Starting page = * 
  Maximum number of pages = 1000000
  Output level = 4 (the works)
  Resolution = 300.00000000 pixels per inch
numerator/denominator=25400000/473628672
magnification=1000;       0.00006334 pixels per DVI unit
' TeX output 2024.02.07:0323'
Postamble starts at byte 171.
maxv=41484288, maxh=26673152, maxstackdepth=3, totalpages=1
Font 23: cmr10---loaded at size 655360 DVI units 
 
42: beginning of page 1 
87: down4 41484288 v:=0+41484288=41484288, vv:=2628 
92: push 
level 0:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
93: down4 -39649280 v:=41484288-39649280=1835008, vv:=116 
98: down4 37683200 v:=1835008+37683200=39518208, vv:=2503 
103: push 
level 1:(h=0,v=39518208,w=0,x=0,y=0,z=0,hh=0,vv=2503) 
104: down4 -35389440 v:=39518208-35389440=4128768, vv:=262 
109: push 
level 2:(h=0,v=4128768,w=0,x=0,y=0,z=0,hh=0,vv=262) 
110: right3 5046272 h:=0+5046272=5046272, hh:=320 
[ ]
114: fntdef1 23: cmr10 
135: fntnum23 current font is cmr10 
136: setchar104 h:=5046272+364090=5410362, hh:=343 
137: setchar101 h:=5410362+291271=5701633, hh:=361 
138: setchar108 h:=5701633+182045=5883678, hh:=373 
139: setchar108 h:=5883678+182045=6065723, hh:=385 
140: setchar111 h:=6065723+327681=6393404, hh:=406 
141: right3 218453 h:=6393404+218453=6611857, hh:=419 
145: setchar119 h:=6611857+473316=7085173, hh:=449 
146: right2 -18205 h:=7085173-18205=7066968, hh:=448 
149: setchar111 h:=7066968+327681=7394649, hh:=469 
150: setchar114 h:=7394649+256683=7651332, hh:=485 
151: setchar108 h:=7651332+182045=7833377, hh:=497 
152: setchar100 h:=7833377+364090=8197467, hh:=520 
[hello world]
153: pop 
level 2:(h=0,v=4128768,w=0,x=0,y=0,z=0,hh=0,vv=262) 
154: pop 
level 1:(h=0,v=39518208,w=0,x=0,y=0,z=0,hh=0,vv=2503) 
155: down3 1966080 v:=39518208+1966080=41484288, vv:=2628 
159: push 
level 1:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
160: push 
level 2:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
161: right4 15204352 h:=0+15204352=15204352, hh:=963 
166: setchar49 h:=15204352+327681=15532033, hh:=984 
[ 1]
167: pop 
level 2:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
168: pop 
level 1:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
169: pop 
level 0:(h=0,v=41484288,w=0,x=0,y=0,z=0,hh=0,vv=2628) 
170: eop 

此外,缩进也使其更易于阅读。另一方面,dvitype输出在某些情况下可能更有用(但绝对不是供人类使用),因为它还输出计算出的坐标。

信用:https://tex.stackexchange.com/a/305550/250119

相关内容