我的设置: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
保存。.pfb
wx
xdvi
使用 中的这些 PostScript 字体pfb
,因此它知道字符宽度,并且可以实现 而dvi
无需重新读取tfm
。但是dvipdfmx
(或dvips
)会进行更多检查以确认所有数据是否一致,因此它会tfm
再次读取文件。