TeX 如何在不读取 TFM 文件的情况下创建 DVI?

TeX 如何在不读取 TFM 文件的情况下创建 DVI?

我的设置:TeX Live,版本 2014.20141024-2(与 Debian 8 Jessie 一起打包)

考虑 test.tex

A
\bye
$ tex -ini '\input plain \dump'
This is TeX, Version 3.14159265 (INITEX)
(/usr/share/texlive/texmf-dist/tex/plain/base/plain.tex
Preloading the plain format: codes, registers, parameters, fonts, more fonts,
macros, math definitions, output routines, hyphenation
(/usr/share/texlive/texmf-dist/tex/generic/hyphen/hyphen.tex))
Beginning to dump on file plain.fmt
 (preloaded format=plain 2015.4.17)
2021 strings of total length 29135
4990 memory locations dumped; current usage is 110&4877
926 multiletter control sequences
\font\nullfont=nullfont
\font\tenrm=cmr10
\font\preloaded=cmr9
\font\preloaded=cmr8
\font\sevenrm=cmr7
\font\preloaded=cmr6
\font\fiverm=cmr5
\font\teni=cmmi10
\font\preloaded=cmmi9
\font\preloaded=cmmi8
\font\seveni=cmmi7
\font\preloaded=cmmi6
\font\fivei=cmmi5
\font\tensy=cmsy10
\font\preloaded=cmsy9
\font\preloaded=cmsy8
\font\sevensy=cmsy7
\font\preloaded=cmsy6
\font\fivesy=cmsy5
\font\tenex=cmex10
\font\preloaded=cmss10
\font\preloaded=cmssq8
\font\preloaded=cmssi10
\font\preloaded=cmssqi8
\font\tenbf=cmbx10
\font\preloaded=cmbx9
\font\preloaded=cmbx8
\font\sevenbf=cmbx7
\font\preloaded=cmbx6
\font\fivebf=cmbx5
\font\tentt=cmtt10
\font\preloaded=cmtt9
\font\preloaded=cmtt8
\font\preloaded=cmsltt10
\font\tensl=cmsl10
\font\preloaded=cmsl9
\font\preloaded=cmsl8
\font\tenit=cmti10
\font\preloaded=cmti9
\font\preloaded=cmti8
\font\preloaded=cmti7
\font\preloaded=cmu10
\font\preloaded=cmmib10
\font\preloaded=cmbsy10
\font\preloaded=cmcsc10
\font\preloaded=cmssbx10
\font\preloaded=cmdunh10
\font\preloaded=cmr7 at 14.51799pt
\font\preloaded=cmtt10 at 14.4pt
\font\preloaded=cmssbx10 at 14.4pt
\font\preloaded=manfnt
14787 words of font info for 50 preloaded fonts
14 hyphenation exceptions
Hyphenation trie of length 6075 has 181 ops out of 35111
  181 for language 0
No pages of output.
Transcript written on plain.log.

从搜索路径中删除 TFM 文件:

$ sudo mv `kpsewhich cmr10.tfm` /tmp/

这没问题。为什么?

$ tex -fmt plain -progname tex test.tex
This is TeX, Version 3.14159265 (preloaded format=plain)
(./test.tex [1] )
Output written on test.dvi (1 page, 208 bytes).
Transcript written on test.log.

正如预期的那样,这会产生错误:

$ dvipdfmx test.dvi
test.dvi -> test.pdf
[1
dvipdfmx:fatal: Unable to find TFM file "cmr10".

Output file removed.

这没问题。为什么?

$ xdvi test.dvi

答案1

cmr10 的 tfm 文件已读取,相关数据已转储到格式中,并且不会再次读取。您可以看到在 initex 运行中读取的所有字体。

所有这些的 tfm 都加载到以下格式中:

\font\tenrm=cmr10
\font\preloaded=cmr9
\font\preloaded=cmr8
\font\sevenrm=cmr7
\font\preloaded=cmr6
\font\fiverm=cmr5
\font\teni=cmmi10
\font\preloaded=cmmi9
\font\preloaded=cmmi8
\font\seveni=cmmi7
\font\preloaded=cmmi6
\font\fivei=cmmi5
\font\tensy=cmsy10
\font\preloaded=cmsy9
\font\preloaded=cmsy8
\font\sevensy=cmsy7
\font\preloaded=cmsy6
\font\fivesy=cmsy5
\font\tenex=cmex10
\font\preloaded=cmss10
\font\preloaded=cmssq8
\font\preloaded=cmssi10
\font\preloaded=cmssqi8
\font\tenbf=cmbx10
\font\preloaded=cmbx9
\font\preloaded=cmbx8
\font\sevenbf=cmbx7
\font\preloaded=cmbx6
\font\fivebf=cmbx5
\font\tentt=cmtt10
\font\preloaded=cmtt9
\font\preloaded=cmtt8
\font\preloaded=cmsltt10
\font\tensl=cmsl10
\font\preloaded=cmsl9
\font\preloaded=cmsl8
\font\tenit=cmti10
\font\preloaded=cmti9
\font\preloaded=cmti8
\font\preloaded=cmti7
\font\preloaded=cmu10
\font\preloaded=cmmib10
\font\preloaded=cmbsy10
\font\preloaded=cmcsc10
\font\preloaded=cmssbx10
\font\preloaded=cmdunh10
\font\preloaded=cmr7 at 14.51799pt
\font\preloaded=cmtt10 at 14.4pt
\font\preloaded=cmssbx10 at 14.4pt
\font\preloaded=manfnt

答案2

你的测试没有结论。考虑文件

\nopagenumbers
\font\ptm=ptmr8r
\ptm a
\bye

并使用 进行编译tex -recorder,这样就会创建一个.fls包含已加载文件信息的文件;我只删除了报告工作目录的第一行

PWD <not shown>
INPUT /usr/local/texlive/2014/texmf.cnf
INPUT /usr/local/texlive/2014/texmf-dist/web2c/texmf.cnf
INPUT /usr/local/texlive/2014/texmf-var/web2c/tex/tex.fmt
INPUT igortest.tex
OUTPUT igortest.log
INPUT /usr/local/texlive/2014/texmf-dist/fonts/map/fontname/texfonts.map
INPUT /usr/local/texlive/2014/texmf-dist/fonts/map/fontname/texfonts.map
INPUT /usr/local/texlive/2014/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm
OUTPUT igortest.dvi

texfonts.map文件是 TeX 的一个“扩展”,它使某些 TFM 文件名可以改名(目前仅用于 LaTeX 在图片模式下使用的“圆形字体”,过去曾遭受过名称更改)。因此,您会看到 TFM 文件已加载。正如其他人已经回答的那样,数据cmr10.tfm已存储在格式中,因此在作业开始时就已加载到内存中。

接下来我们看igortest.dvi一下dvitype

This is DVItype, Version 3.6 (TeX Live 2014)
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 2015.04.17:1112'
Postamble starts at byte 140.
maxv=43725786, maxh=30785863, maxstackdepth=2, totalpages=1
Font 50: ptmr8r---loaded at size 655360 DVI units 

42: beginning of page 1 
87: push 
level 0:(h=0,v=0,w=0,x=0,y=0,z=0,hh=0,vv=0) 
88: down3 -917504 v:=0-917504=-917504, vv:=-58 
92: pop 
level 0:(h=0,v=0,w=0,x=0,y=0,z=0,hh=0,vv=0) 
93: down4 42152922 v:=0+42152922=42152922, vv:=2670 
98: push 
level 0:(h=0,v=42152922,w=0,x=0,y=0,z=0,hh=0,vv=2670) 
99: down4 -41497562 v:=42152922-41497562=655360, vv:=42 
104: push 
level 1:(h=0,v=655360,w=0,x=0,y=0,z=0,hh=0,vv=42) 
105: right3 1310720 h:=0+1310720=1310720, hh:=83 
[ ]
109: fntdef1 50: ptmr7t 
131: fntnum50 current font is ptmr7t 
132: setchar97 h:=1310720+290976=1601696, hh:=101 
[a]
133: pop 
level 1:(h=0,v=655360,w=0,x=0,y=0,z=0,hh=0,vv=42) 
134: pop 
level 0:(h=0,v=42152922,w=0,x=0,y=0,z=0,hh=0,vv=2670) 
135: down3 1572864 v:=42152922+1572864=43725786, vv:=2770 
139: eop 

DVI 文件不包含有关所用字体的度量信息;在应用字距和连字之后,TeX 在设置框时已经使用了所需的信息。

另一方面,DVI 驱动程序可能会查找并读取 TFM 文件,因为它们可能包含对它们来说至关重要的信息。这种情况发生在dvips,因为

dvips -d -1 igortest.dvi 2>igortest.dls

生成包含以下内容的文件

kdebug:fopen(/usr/local/texlive/2014/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm, rb) => 0x7fff7d7f5338
kdebug:fclose(0x7fff7d7f5338) => 0

(请注意,-d -1与选项类似-recorder,有关更多信息,请参阅 Kpathsea 手册)。

我不会报告完整的日志dvipdfmx --kpathsea-debug -1 igortest 2>igortest.dls。但是,

kdebug:search([ptmr7t.tfm]) => /usr/local/texlive/2014/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm

告诉我们还dvipdfmx读取TFM文件。

请注意,还会dvitype查找 TFM 文件,如

kdebug:fopen(/usr/local/texlive/2014/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm, rb) => 0x7fff7d7f5338
kdebug:fclose(0x7fff7d7f5338) => 0

以与之前类似的方式获得。

答案3

运行时信息tfm保存在.fmt文件中。tex -ini

输出dvi包括

  • 当前排版点的偏移量(由内部单位以数字形式指定)。这些命令用于单词间间距、字母间间距以及 TeX 生成的其他垂直/水平间距)
  • 从字体的插槽中排版字符的命令。这些命令不指定字符排版后当前排版点的移位。假定驱动程序dvi知道字符宽度。

PostScript 中也是一样:(text) show在 PostScript 中使用 命令时,t将排版 ,并且当前排版点将偏移 的宽度。此信息以字体轮廓格式作为参数t保存。.pfbwx

xdvi使用 中的这些 PostScript 字体pfb,因此它知道字符宽度,并且可以实现 而dvi无需重新读取tfm。但是dvipdfmx(或dvips)会进行更多检查以确认所有数据是否一致,因此它会tfm再次读取文件。

相关内容