在 TeX 中“plain.fmt”等于“plain.tex”吗?

在 TeX 中“plain.fmt”等于“plain.tex”吗?

tex在终端输入时,有preloaded format=texpreloaded format=tex相等吗? 在命令后plain.tex输入时,有&plain \input storytex

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(可执行文件)有两种变体,即initexvirtex

前一种变体具有不同的内存分配设置,主要是为了将连字模式打包成有效的内部结构并用于构建格式。

例如,命令行

initex '\input plain \dump'

会产生一个名为的文件plain.fmt,以便您稍后可以调用

virtex "&plain" <filename>

处理输入文件。不,plain.texplain.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 仍然这样做。

相关内容