我发现 LaTeX 在这方面有点不一致。请进行以下实验:
代码
a.% b
会产生
a.b
,而代码a. b
将产生
a. b
。注释符号似乎%
删除了行末的回车符。然而,代码
\ta% u
会产生错误(假设你没有定义
\ta
),就像\ta u
但是
%
这里是否也应该删除回车符并将两行合并为有意义的\tau
?
答案1
与几乎所有编程语言一样,注释解释会发生后标记化。
\ta%
生成的令牌\ta
在被看到之前将无法扩展并产生错误u
。
这与 C 或 javascrpt 等没有什么不同,在这些语言中,不能在函数名称中间使用注释,或者在 XML/HTML 中,不能在元素名称中间使用注释。
答案2
它符合规则。当 TeX 找到操作系统确定的记录结束标记(如果您愿意,可以称为行结束标记)时,它会将其与可能的尾随空格和制表符一起丢弃;然后附加当前的\endlinechar
,通常是 ASCII 13(在 TeX 中表示为^^M
)。在此阶段,标记化尚未发生。
现在开始标记化。在正常情况下,%
类别代码为 14(注释),而 ASCII 13 的类别代码为 5。当 TeX 找到类别代码为 14 的字符时,它会丢弃该字符以及该行后面的所有内容。类别代码为 5 的字符会插入一个空格,丢弃该行后面的内容,并触发查找和删除下一行中的空格;如果在删除之后找到另一个类别代码为 5 的字符,\par
则会插入一个标记,否则将从找到的字符开始处理。
使用输入
a%
b
字母“a”和“b”在排版时没有任何中间空格,因为插入的空格^^M
跟在注释字符后面。
使用输入
a
b
插入的空格^^M
被视为并插入到输出中。
为了理解发生了什么
\ta%
u
你应该记住控制序列是如何形成的。如果反斜杠后面的字符是字母,TeX 会用它后面的所有字母来形成名称,当发现非字母(TeXnically,类别代码不同于 11 的字符)时停止。如果反斜杠后面的字符不是字母,则该单个字符将形成控制序列名称。
由于%
类别代码为 14,它会停止寻找控制序列名称,所以您会得到\ta
后面跟着的u
,而不是\tau
。
请注意,规则暗示输入如下
a\
b
使 TeX 形成控制序列\^^M
,实际上,普通 TeX 和 LaTeX 定义\^^M
为相同\
(反斜杠空格)。