有没有可以比较两个 dvi 文件的工具。我想在对源 tex 文件进行一些更改后检查它们是否相同。
答案1
TeX 在 DVI 文件中添加注释,例如:
TeX output 2013.02.15:1010
它包含使 DVI 文件的比较变得复杂化的日期和时间:
\year
可以通过设置、\month
、\day
和来明确设置时间戳\time
。如果用于比较的两个文件具有相同的值,则 DVI 文件中的时间戳相同,您可以使用常用程序(diff
、comp
、...)比较文件。注释在 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 文件的文本表示,作为dvitype
在egreg 的回答,您也可以使用dviasm
。
我发现输出比 更短且更易读dvitype
。
例如,对于文件d.dvi
,dviasm 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
输出在某些情况下可能更有用(但绝对不是供人类使用),因为它还输出计算出的坐标。