嗨,我正在阅读 Donald E. Knuth 的《The TEXbook》。但在我看来,这本书对于想要学习 TeX 的人来说非常具有教育意义。大部分页面都包含练习。但 TeX 实现如何解析 TeX 代码的许多内容都没有涉及。例如,我想知道为什么控制序列\input MS
读取参数“MS”而不是我怀疑的“M”($\sqrt ab$
是的平方根a
并且b
不在根之外......)。
TeX 解析器按照什么顺序处理第 7 章中听到的 16 个类别中的每个字符......?
是否有人知道完整的参考资料或书籍,可以准确说明 TeX 解析器的工作原理并列出 TeX 中的所有 900 个内置控制序列?
答案1
关于的解释\input
在TeXbook第278页:
在 TeX 中,〈文件名〉 的语法并不是标准的,因为不同的操作系统有不同的约定。你应该向你当地的系统向导询问他们如何决定实现文件名的细节。然而,下面的原则应该普遍适用:〈文件名〉 应该由 〈可选空格〉 和后跟显式字符标记(扩展后)组成。六个或更少的普通字母和/或数字后跟一个空格的序列应该是在所有 TeX 安装中以基本相同的方式工作的文件名。在文件名中,大写字母不被认为等同于小写字母;例如,如果你引用字体
cmr10
和CMR10
,TeX 不会注意到它们之间的任何相似之处,尽管它可能为这两种字体输入相同的字体度量文件。
简而言之,\input
开始扩展标记,忽略空格,直到找到一个非空格的不可扩展标记,该标记应该是字符标记(或\let
字符标记的控制序列)。直到第一个非字符标记的所有内容都将被视为文件名的一部分(继续执行扩展)。
.tex
如果在指定的文件名中找不到扩展名,通常会附加扩展名(但这取决于实现;例如,纹理允许文件名没有扩展名)。
如此奇怪的代码,例如
\let\aletter=a
\input }{\aletter x
将尝试输入一个名为 的文件}{ax.tex
。文件名后的空格标记将被忽略。
特定的实现可以提供略有不同的约定;比如,TeX Live 允许在 之间引用文件名"
;前导"
将使 TeX 寻找另一个(总是进行扩展)并且文件名将由每个字符标记(包括空格标记)组成,直到尾随的"
;两个双引号字符将被删除。
XeTeX 和 LuaTeX 仍然适用不同的约定。例如,LuaTeX 允许\input {file}
并将输入file.tex
;相反,pdftex
将尝试输入{file}.tex
。
请注意,当 TeX 寻找文件名时,即 、\openin
和\openout
时,同样的规则适用\font
。但是,XeTeX 对 中的文件名使用特殊约定,\font
这些约定不适用于寻找 〈文件名〉 的其他情况。
还有其他几种情况下,原始类型的参数不需要括号:例如
\dimen 123 = 1234pt
不会仅仅将其1
作为寄存器,而是会继续(使用宏扩展)直到找到非数字的内容(在本例中是空格)。
在基本上所有这些情况下,尾随空格标记都会被吞掉,被视为所需标记的分隔符。
答案2
这是 Knuth 的
计算机和排版,B 卷,TeX:程序
这是一个“TeX 解释器源代码的文档列表”(即WEB(或Pascal)程序)
但首先,你已经有了一本合适的书:TeXbook。正如约瑟夫所说,它确实回答了你关于的问题\input
。