这是模块 454 的内容(扫描fil
单元;goto attach_fraction
如果找到):
if scan_keyword ("fil") then
begin
cur_order ← fil;
while scan_keyword ("l") do
begin
if cur_order = filll then
begin
print_err("Illegal unit of measure (");
print("replaced by filll)");
help1("I dddon´t go any higher than filll."); error;
end
else
incr (cur_order);
end;
goto attach_fraction;
end
当检测到错误的附加信息时l
,程序会报告“非法计量单位(由 filll 替换)”。难道不能简单地通过 来完成吗print_err("Illegal unit of measure (replaced by filll)")
?
答案1
TeX 的字符串处理基于 20 世纪 70 年代计算的一些限制(特别是,它没有让某些标准库处理字符串的分配,而是将它们全部保存在一个静态分配的数组中,Knuth 将其称为字符串池。有关这方面的说明,请参阅§50。结果是生成的 Pascal 代码中的实际调用不是例如,print("replaced by filll)"
而是实际上print(447)
(或实际的字符串编号)。相关代码在第 5 部分(§54–71)。
正如 Barbara 所说,Illegal Unit of measure (
在 tex.web 中出现了三次(您可以在 weave 的输出中检查索引)。这可以节省几个字节,这在内存通常以 GB 为单位的当今时代似乎是一种愚蠢的优化,但多用户系统的总可寻址内存以兆字节为单位的情况并不罕见,甚至在 80 年代也是如此。原始 TeX 具有 16 位内存寻址是有原因的。