我们处理任意用户输入并尝试以编程方式生成 LaTeX 进行编译。我们有时会遇到一个问题,即用户编写了非常长的文本行(段落),从而导致错误:
! Unable to read an entire line
明智的(但可能有点幼稚的)解决方案似乎是我们设置一些行长度限制,然后自己用空格换行。例如,给定:
foo bar baz
并且行数限制为 5 个字符,我们最终会得到:
foo bar
baz
...应该只是呈现相同的内容,因为空格和换行符是可以互换的。
这对于宏来说也很好用:
\textit{foo
bar baz}
然而,这在全部情况如何?换行符和空格符的处理方式是否有所不同?或者它们可以完全互换吗?
答案1
默认 catcode 机制中的单行结尾会产生一个空格标记。
在逐字逐句的环境中或更普遍的范围内,\obeylines
它将在输出中产生强制换行。
在特殊环境中\endlinechar
,可以设置为负数,那么行尾根本不会产生标记。(另外,在 expl3 中,空格字符也不会产生标记,因此在这种情况下行尾仍然充当空格)
另一个案例是长评论
\LaTeX\ code % very very very long comment
如果你在传递给 tex 之前简单地用 perl 或 python 等换行,你最终会得到
\LaTeX\ code % very very
very long comment
然后你最终取消了文本的注释。