在 \ExplSyntaxOn/Off 对中,\tl_set_rescan:Nnn 将每个空格输入吞噬为 ~

在 \ExplSyntaxOn/Off 对中,\tl_set_rescan:Nnn 将每个空格输入吞噬为 ~

在 中\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  ).

相关内容