为什么“\if\char98\char98 T \else F \fi”返回 F 而不是 T?

为什么“\if\char98\char98 T \else F \fi”返回 F 而不是 T?

根据 TeXbook,以下两个标记\if被展开并进行比较?那么看起来应该与返回的\if\char98\char98 T \else F \fi相同。我的解释有什么问题?\if bb T \else F \fiT

答案1

\char原语不可扩展,因此其“扩展”是其本身,而不是“代码为 98 的字符”。由于之后的 98 未被使用,因此下一个标记是9,这与该\char标记不同,因此您击中了错误路径。

按照您的需要执行此操作的一种方法是\chardef\x=98; 然后\if\x\x返回 true。另一种方法是执行\if ^^62^^62; 作为TeX 按主题分类在第 44 页上告诉我,^^语法在扩展之前就被解析了(它实际上是一种输入语法),因此是^^62一个字符。请注意(参见 egreg 的评论)^^62十六进制\char98十进制(0x62 = 98)。

也许我应该扩展一下“输入语法”的评论。TeX 中有两种字符:输入字符,即您在文件中写入的内容.tex,以及可打印字符,即向 TeX 发出排版指令的内容。在 TeXbook 的术语中,输入字符属于 TeX 的“眼睛”,而输出字符属于它的“胃”。这两者之间是“嘴巴”,宏语言就生活在这里,并\if属于该语言。相比之下,虽然\char被眼睛识别为一个令牌,它的实际功能直到胃才被人知道,胃吸收了它的论点,并成为一个可打印特点。

像这样的普通字符a在通常的 catcode 下既可以输入也可以打印,因此\if aa可以按预期工作,但要获取输入字符作者:charcode\if需要使用眼睛可以识别的语法,为此,我们有^^

相关内容