很长一段时间以来,我都在试图理解为什么我们需要这些文件fmtutil
,以及为什么这些文件被称为格式?它们来自哪里(除了语言包)?例如,我检查了我的整个系统fmtutil.conf
,发现了类似这样的行
dviluatex luatex language.def,language.dat.lua dviluatex.ini
luajittex luajittex language.def,language.dat.lua luatex.ini
mf mf-nowin - -translate-file=cp227.tcx mf.ini
pdftex pdftex language.def -translate-file=cp227.tcx *pdfetex.ini
etex pdftex language.def -translate-file=cp227.tcx *etex.ini
pdfetex pdftex language.def -translate-file=cp227.tcx *pdfetex.ini
tex tex - tex.ini
等等。直觉告诉我,这些是与特定语言相关的文件(好吧,像 language.def 这样的路径显示了这一点),但总体目的和字段就像独角兽一样神奇,它们是用来做什么的呢?
答案1
我将只解释格式及其在 TeX Live 中的处理。我猜 MikTeX 的方法不同。
为了补充 David 的解释,格式是在所谓的 中定义的,这些是您可以在(位于)TLPOBJ
中看到的节(段落)。例如:texlive.tlpdb
PATH/TO/TEXLIVE/2019/tlpkg/texlive.tlpdb
name aleph
category Package
revision 50602
...
execute AddFormat name=aleph engine=aleph options=*aleph.ini fmttriggers=cm,hyphen-base,knuth-lib,plain
execute AddFormat name=lamed engine=aleph patterns=language.dat options=*lambda.ini fmttriggers=cm,hyphen-base,antomega,lambda,latex,latex-fonts,omega
...
这添加了两个格式定义。在 TLPDB 中,我们使用key=value
对,从中fmtutil.cnf
生成。(暂时忽略fmttriggers
,它们是触发重建的内部功能)
这些定义反过来来自宏包编写者,并由我们(TL 团队)放入 tlpobj 的源文件中。
大多数格式在相应的引擎包中定义:
aleph
引擎在aleph
包中并定义aleph
并且lamed
context
软件包提供各种cont-XX
格式cslatex
包提供cslatex
和pdfcslatex
格式- ...
然而,某些格式,特别是基础乳胶格式,会得到特殊处理。
关于语言问题:正如David所说,连字模式只能在创建格式时加载,此外不同的引擎(二进制程序)使用不同格式的连字模式定义,因此我们需要在配置文件中加载要加载的文件。
答案2
格式文件只是一组预加载的定义,用于加快文档处理速度。例如,“pdflatex”就是latex.ltx
预加载了定义的“pdftex”。实际上,现在不在每个文档上加载 latex.ltx 只能节省几分之一秒,而当系统设计时,它可以为每个文档节省数十分钟。
与此相关,\patterns
设置特定于语言的连字符的指令只能在 initex 模式下加载(为转储格式设置),这就是为什么您会在配置文件中看到要加载哪些文件的规范。