在 TeXbook 第 349 页,\magstep
给出的定义如下
\def\magstep#1{\ifcase#1 1000\or
1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
但是在plain.tex
texlive 中第 391 行写道:
\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
为什么说\@m
(定义为\mathchardef\@m=1000
)而不是1000
?
因此,文件 plain.tex 中的版本号\def\fmtversion{3.141592653}
与 TeXbook 中的版本号相同。
答案1
据我所知的定义\magstep
一直是。\@m
查看 SAIL 档案http://www.saildart.org/[TEX,SYS]/我们可以看到它\magstep
出现在 1983-07-27 的版本中,代码是
\def\magstephalf{1095 }
\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
TeXbook 时不时会撒谎。通常都是善意的小谎言,就像这个例子一样。使用可以\@m
在内存中节省三个标记。另一方面,附录 B 中的代码显示了1000
可读性。
plain.tex
同样地,
\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
\def\rm{\fam\z@\tenrm}
\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
\def\cal{\fam\tw@}
但 TeXbook 仍然保持着
\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
\def\rm{\fam0 \tenrm}
\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
\def\mit{\fam1 } \def\oldstyle{\fam1 \teni}
\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
\def\cal{\fam2 }
一个 token 而不是两个。1983 年及更早的时候(以及之后的几年),内存非常短缺,即使节省一个 token 也是有价值的。因此,“浪费”一个\dimen
保存\newdimen\z@ \z@=0pt
了很多记忆,允许在很多地方用(用空格)或\z@
代替。0
0pt
谢谢弗鲁贡,下面是来自 TeXbook (第 342 页) 的一段恰当的引文:
您应该能够在计算机系统的某个地方找到一个名为 的文件,
plain.tex
该文件包含已预加载到您使用的运行 TeX 系统中的内容。本附录的其余部分旨在讨论 的内容plain.tex
。但是,我们不会逐字逐句地描述,因为该文件的某些部分太无聊,并且实际的宏已针对内存空间和运行时间进行了“优化”。未优化版本的宏更容易被人类理解,因此我们将处理这些宏;plain.tex
包含在机器上运行更好的等效结构。