在cwebmac.tex使用以下结构:
{\def\\{\global\let\spacechar= }\\ }
在cwebmac.tex中\spacechar
只使用了一次,如下代码:
...
\else\ifx\nxt\spacechar \addF\space
...
为什么\spacechar
要用这种奇怪的方式定义?
答案1
原因已由 @David 描述,我们需要说\let\spacetoken=space space
in 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= }\\ }
^ ^