\obeylines 与 \obeyspaces 有何不同?

\obeylines 与 \obeyspaces 有何不同?

让我们看看附录 D 中的肮脏伎俩 #3电子书

以下代码产生第 12 类空间:

\def\uncatcodespecials{\def\do##1{\catcode`##1=12 }\dospecials}
\def\setupverbatim{\tt
  \obeylines
  \obeyspaces
  \uncatcodespecials
}
\def\listing#1{\par\begingroup\setupverbatim\input#1 \endgroup}
\listing{\jobname.tex}
\bye

这会将空间类别更改为 13:

\def\uncatcodespecials{\def\do##1{\catcode`##1=12 }\dospecials}
\def\setupverbatim{\tt
  \obeylines
  \uncatcodespecials
  \obeyspaces
}
\def\listing#1{\par\begingroup\setupverbatim\input#1 \endgroup}
\listing{\jobname.tex}
\bye

由此我们得出结论,\uncatcodespecials在更改 catcode 后放置会将其更改回类别 12,但\uncatcodespecials在更改 catcode 之前放置则不会对其产生影响。

相反,无论我们把 放在什么位置- 在其之前或之后,\obeylines都有效。 它与 有何不同?\uncatcodespecials\obeylines\obeyspaces

答案1

plain.tex

% Here is a list of the characters that have been specially catcoded:
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
% (not counting ascii null, tab, linefeed, formfeed, return, delete)
% Each symbol in the list is preceded by \do, which can be defined
% if you want to do something to every item in the list.

另一方面\obeylines

\catcode`\^^M\active \let^^M\par

其中,定义是用^^Mactive 来完成的,用于\let^^M\par工作。

因此,您的问题的答案是,\dospecials您调用的\uncatcodespecials不会改变\catcode13,因此即使在 之后发出 也不会对 的操作产生影响\obeylines。另一方面,如果 在其之后发出 ,它会改变,\catcode32因此会取消\obeyspaces\catcode`\ \active)。

相关内容