TeX 如何读取你输入的内容

TeX 如何读取你输入的内容

这些问题与这个答案相关: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

相关内容