这些问题与这个答案相关:web2cTeX 中的回车和换行
假设 TeX 正在读取一个输入文件,并且位于新行的开头,处于状态 N。新的行尾字符必须转换为\par
标记。但这发生在从文件中读取行之后(即不在 TeX 的“眼中”),对吗?我的意思是,这种替换不能在 readln 过程中发生,不是吗?如果不是,那么这种替换发生在 TeX 的哪个部分?
还有一个问题:如果将行尾字符附加到每个行缓冲区,这是否意味着行尾字符在之前\par
?
我解释一下:
假设 TeX 刚刚从输入文件中读取了一行。现在行缓冲区末尾有一个行尾字符。现在 TeX 读取一个空行并将其转换为\par
。所以 TeX 现在有行尾字符和\par
标记,对吗?我的意思是,行尾字符后跟的是,\par
被删除了吗,还是它只是留在那里,不会以任何方式影响输出?
答案1
系统相关的“记录结束”按照以下说明确定 web2cTeX 中的回车和换行(至少在 Web2C 实现中)。
现在适用 TeXbook 第 46 页解释的规则:
TeX 会删除输入行右端出现的任何 ⟨space⟩ 字符(编号 32)。然后,它会在行的右端插入一个 ⟨return⟩ 字符(编号 13),但它不会在错误恢复期间用“I”插入的行尾放置任何其他内容。请注意,⟨return⟩ 被视为行中实际存在的字符;您可以通过更改其 catcode 来获得特殊效果。
这应该通过以下事实来补充:Web2C 实现也删除了 ⟨tab⟩ 字符(第 9 个)以及 TeXbook 第 48 页的段落:
每行末尾插入的特殊字符不一定是 ⟨return⟩;TeX 实际上插入了一个名为 的整数参数的当前值
\endlinechar
,该值通常等于 13,但可以像任何其他参数一样更改。如果 的值为\endlinechar
负数或大于 255,则不会附加任何字符,效果就像每行都以 结尾%
(即以注释字符结尾)。
在 LuaTeX 和 XeLaTeX 上,\endlinechar
允许最多为"10FFFF
,即 1114111。
执行上述替换后,“系统相关的记录结束”不再相关。请注意,对的更改\endlinechar
不会反映在当前行上,因为只要需要,就会逐行读取(而不是标记)。例如,此代码将导致句号后出现三个 P,但P
在“x”之前没有。
This text will not have a P \endlinechar=`P before
x.
\endlinechar=13
\bye
还要注意的是,只有在状态中找到类别代码字符否将触发插入\par
。