这有效:
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}%