在 中\ExplSyntaxOn
,~
波浪字符被设置为类别代码 10(空格)。但随后\tl_set_rescan:Nnn
会吞噬每个空格输入~
。
- 如果将空格字符的分类代码恢复为10,然后用来
输入空格,则可以正常工作。
- 若将其他字符,例如点字符的类别码
.
改为10,然后用该字符输入空格,也会出现同样的问题。
例子:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
% case 1, use ~, every space is gobbled
\tl_set_rescan:Nnn \x {} { ~ a ~ b ~ }
|\x| % print "|ab|"
% case 2, restore catcode of space char
\group_begin:
\char_set_catcode_space:n {`\ }
\tl_set_rescan:Nnn \x {} { a b }
|\x| % print "| a b |"
\group_end:
% case 3, set catcode of . to 10
\group_begin:
\char_set_catcode_space:n {`\.}
\tl_set_rescan:Nnn \x {} { . a . b . }
|\x| % print "|ab|"
\group_end:
\ExplSyntaxOff
\end{document}
答案1
这是意料之中的。
一旦空格被标记化,例如当形成用于确定命令参数的标记列表时,空格标记就会使用字符代码 32 和类别代码 10 进行规范化。
“重新扫描”是如何工作的?你必须想象一个虚拟文件被创建并输入,TeX 使用当前类别代码数组再次对其进行标记(第二个参数可以\tl_set_rescan:Nnn
包含用于更改类别代码的代码)。因此,~
输入中的 a 被读入为空格,其下方\ExplSyntaxOn
为 9(忽略)。
如果你想在重新扫描时保留空格,你可以这样做
\tl_set_rescan:Nnn \l_tmpa_tl { \char_set_catcode_space:n {`\ } } { ~ a ~ b ~ }
\tl_analysis_show:N \l_tmpa_tl
将在终端上输出
The token list \l_tmpa_tl contains the tokens:
> (blank space )
> a (the letter a)
> (blank space )
> b (the letter b)
> (blank space ).