让我们看看附录 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
其中,定义是用^^M
active 来完成的,用于\let^^M\par
工作。
因此,您的问题的答案是,\dospecials
您调用的\uncatcodespecials
不会改变\catcode13
,因此即使在 之后发出 也不会对 的操作产生影响\obeylines
。另一方面,如果 在其之后发出 ,它会改变,\catcode32
因此会取消\obeyspaces
(\catcode`\ \active
)。