如何在没有字符?

如何在没有字符?

这有效:

a^^M%
^^M%
b

但之后仍然需要一个真正的换行符%。如果我删除换行符并使用

a^^M^^Mb

结果只是一个字母a。似乎第一个字母之后的所有内容^^M都被忽略了,因为^^M这是行尾!

有没有办法更改 catcodes 或设置\endlinechar或做其他事情,以便我可以写一行但它就像多行输入一样工作?没有实际用途,我只是对此感到好奇。

答案1

答案是否定的。当 TeX 发现记录结束信号(由操作系统决定)时,它会丢弃输入行上剩余的内容并插入 (字符代码, 类别代码)对的值确定\endlinechar放入输入流并读取它。

的值\endlinechar通常为 13 ( ^^M),它(通常)对应类别代码为 5 的字符。这使得 TeX 能够识别空行,并插入标记\par

输入流中的显式类别代码 5 字符优先于记录结束信号;因此,当 TeX 发现

a^^Mb

并且^^M类别代码为 5,则b丢弃。如果^^M类别代码不同,则读取并消化或按原样存储。

您所能做的就是在一个文件中写入多条记录:

\newlinechar`\^^J
\newwrite\linewrite
\immediate\openout\linewrite=lines.dat
\immediate\write\linewrite{a^^Jb^^c}
\immediate\closeout\linewrite
\input lines.dat

或者使用 e-TeX 引擎pdftex,例如

\newlinechar`\^^J
\scantokens{a^^Jb^^Jc}

这与之前所做的相同。

注意:当前的 TeX 引擎能够区分不同的记录结束信号,从而超越操作系统;但是一旦确定了记录结束信号类型(通过检查输入文件的开头),该信号就会在整个文件中使用。但这实际上对之前所说的没有任何影响,因为操作系统信号或在运行时确定的信号无论如何都会被丢弃。

答案2

^^M通常 catcode 为 5,这就是它结束行的原因,您可以给它 catcode(例如)13,然后定义它来执行任何您想要的操作。标准verbatim环境将其 catcode 设为 13,并定义为\par(或多或少)。尝试

\obeycr

\\\relax然后 ^^M 将与 LaTeX相同:

{\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M13 \def^^M{\\\relax}%
    \@gobblecr}%

相关内容