注释符号 % 是否会删除行末的回车符?

注释符号 % 是否会删除行末的回车符?

我发现 LaTeX 在这方面有点不一致。请进行以下实验:

  1. 代码

    a.%
    b
    

    会产生a.b,而代码

    a.
    b
    

    将产生a. b。注释符号似乎%删除了行末的回车符。然而,

  2. 代码

    \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为相同(反斜杠空格)。

相关内容