根据 TeXbook,以下两个标记\if
被展开并进行比较?那么看起来应该与返回的\if\char98\char98 T \else F \fi
相同。我的解释有什么问题?\if bb T \else F \fi
T
答案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
需要使用眼睛可以识别的语法,为此,我们有^^
。