Plain TeX 中 \magstep 的定义

Plain TeX 中 \magstep 的定义

在 TeXbook 第 349 页,\magstep给出的定义如下

\def\magstep#1{\ifcase#1 1000\or
  1200\or 1440\or 1728\or 2074\or 2488\fi\relax}

但是在plain.textexlive 中第 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@代替。0pt 

谢谢弗鲁贡,下面是来自 TeXbook (第 342 页) 的一段恰当的引文:

您应该能够在计算机系统的某个地方找到一个名为 的文件,plain.tex该文件包含已预加载到您使用的运行 TeX 系统中的内容。本附录的其余部分旨在讨论 的内容plain.tex。但是,我们不会逐字逐句地描述,因为该文件的某些部分太无聊,并且实际的宏已针对内存空间和运行时间进行了“优化”。未优化版本的宏更容易被人类理解,因此我们将处理这些宏; plain.tex包含在机器上运行更好的等效结构。

相关内容