关于 cwebmac.tex 中 \spacechar 的问题

关于 cwebmac.tex 中 \spacechar 的问题

cwebmac.tex使用以下结构:

{\def\\{\global\let\spacechar= }\\ }

在cwebmac.tex中\spacechar只使用了一次,如下代码:

...
\else\ifx\nxt\spacechar \addF\space
...

为什么\spacechar要用这种奇怪的方式定义?

答案1

原因已由 @David 描述,我们需要说\let\spacetoken=space spacein order to set space-token to the control series \spacetoken。有更优雅的方法可以做到这一点:

\def\tmp/{\let\spacetoken= }\tmp/ %
or
\edef\tmp{\let\noexpand\spacetoken= \space}\tmp
or
\lowercase{\let\spacetoken= }

在我看来,最优雅的方式就是永远不要使用\spacetoken\ifx测试可以通过

\expandafter\ifx\space\nxt ...

所以,你不需要任何\spacetoken

答案2

LaTeX 有非常相似的定义

\def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token

如果你想\spacechar成为一个隐式的人,x你可以使用

\let\spacechar x

或者

\let\spacechar=x

或者

\let\spacechar = x

因为在语法中,csname后的空格字符被吸收,\spacechar并且后面一个可选空格被忽略。=\let

因此,为了获得空间,x您需要

\let\spacechar =[space][space]

其中[space]是空格标记。第一个被丢弃作为可选空格,第二个被作为值。

输入两个空格标记比较棘手,因为如果您输入两个空格字符,它们只会形成一个标记,但您可以间接添加它们,在标记的定义中添加一个空格,在标记\\后添加一个空格\\

 \def\\{\global\let\spacechar= }\\ }
                              ^   ^

相关内容