tex
在终端输入时,有preloaded format=tex
。preloaded format=tex
相等吗? 在命令后plain.tex
输入时,有&plain \input story
tex
Sorry, I can't find the format `plain.fmt'; will try `tex.fmt'.
什么是tex.fmt
? 为什么不&plain
调用plain.tex
? 调用了什么&plain
? 如果使用plain.tex
为默认,我们应该改成什么&plain \input story
?
答案1
如果在命令行上您使用教科书所调用的initex
但现在不是一个单独的程序,tex --ini
那么您可以看到操作中的步骤。
tex --ini plain
这将输入 plain.tex 并处理其中的所有宏,最后*
等待更多输入。
$ tex --ini plain.tex
This is TeX, Version 3.141592653 (TeX Live 2023) (INITEX)
(/usr/local/texlive/2023/texmf-dist/tex/plain/base/plain.tex
Preloading the plain format: codes, registers, parameters, fonts, more fonts,
macros, math definitions, output routines, hyphenation
(/usr/local/texlive/2023/texmf-dist/tex/generic/hyphen/hyphen.tex))
*
此时您可以输入\dump
并将此时 tex 内部存储器状态的二进制转储转储到文件中。
Beginning to dump on file plain.fmt
(preloaded format=plain 2023.11.9)
2022 strings of total length 29204
4991 memory locations dumped; current usage is 110&4878
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.
plain.fmt
您的当前目录中现在有一个。
如果你使用,&plain
它将被加载,因此 TeX 的内部状态将恢复到\dump
没有不得不plain.tex
重读
$ tex '&plain' story
This is TeX, Version 3.141592653 (TeX Live 2023) (preloaded format=plain)
(/usr/local/texlive/2023/texmf-dist/tex/plain/knuth-lib/story.tex [1])
*\bye
Output written on story.dvi (1 page, 680 bytes).
Transcript written on story.log.
Modern Tex 设置为使用基于程序名称的默认格式,因此程序tex
需要tex.fmt
texlive 构建设置重命名plain.fmt
为的默认格式,tex.fmt
以便它可以工作,因此plain.fmt
通常不存在,但是如果您尝试使用它,则会添加一个特殊情况,以便它无论如何都会使用tex.fmt
,并显示您显示的警告。
答案2
在古代,TeX(可执行文件)有两种变体,即initex
和virtex
。
前一种变体具有不同的内存分配设置,主要是为了将连字模式打包成有效的内部结构并用于构建格式。
例如,命令行
initex '\input plain \dump'
会产生一个名为的文件plain.fmt
,以便您稍后可以调用
virtex "&plain" <filename>
处理输入文件。不,plain.tex
和plain.fmt
不一样:后者是一个二进制文件,可以比plain.tex
在运行时输入和修改连字模式更快地消化。
后来,人们发现了如何生成已预先简化的可执行文件plain.fmt
,从而实现更快的启动。可执行文件开始被简单地调用tex
。请注意,此过程依赖于操作系统,因此必须针对不同的机器和操作系统进行定制。
最终,随着该库的引入kpathsea
,一个标准开始出现,基本上每个类 Unix 操作系统都开始使用基于该库的 teTeX 发行版。
一个非常有成效的想法是,不要为每种已知格式(例如纯 TeX、LaTeX、AMS-TeX、zzTeX、lollipop 等)设置单独的可执行文件,而是提供根据调用文件的名称virtex
加载适当.fmt
文件的能力。例如,latex
被制作成指向 的符号链接virtex
,因此这个可执行文件实际上会运行
virtex "&latex"
加载latex.fmt
,但对用户来说更透明。并且virtex
可执行文件开始被简单地称为tex
,因此它不是被设计为initex
生成,而是plain.fmt
被设计为生成tex.fmt
。
然而,为了与 TeXbook “兼容”,可执行文件在调用时tex
可能还会尝试使用tex.fmt
tex "&plain"
当前的 TeX Live 似乎没有;我的实验告诉我,TeX Live 在 2019 版中停止了这种做法。也许 MiKTeX 仍然这样做。