\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\catcode`#=11
\str_set:Nn \l_tmpa_str {#}
\tl_analysis_show:N \l_tmpa_str
\str_set:Nn \l_tmpb_str {#}
\tl_analysis_show:N \l_tmpb_str
\ExplSyntaxOff
上面的代码给出了
The token list \l_tmpa_str contains the tokens:
> # (the character #)
> # (the character #).
<recently read> }
l.7 \tl_analysis_show:N \l_tmpa_str
?
The token list \l_tmpb_str contains the tokens:
> # (the character #).
<recently read> }
l.9 \tl_analysis_show:N \l_tmpb_str
?
#
为什么中有两个\l_tmpa_str
而 中只有一个\l_tmpb_str
?
答案1
不要忘记,\ExplSyntaxOn
行尾没有空格,因此您的输入基本与以下内容相同:
\catcode`#=11\str_set:Nn\l_tmpa_str{#}
然后 TeX 寻找整数 的终止符11
,展开\str_set:Nn
,抓住,冻结其 catcode,然后将其翻倍(在 中),然后看到。使用适当的函数更改 catcodes 可以解决问题(或在行尾添加 ):#6
\tl_to_str:n
\str_set:Nn
\tl_analysis_show:N
#12#12
expl3
~
\char_set_catcode_letter:N \#
% \catcode`\#=11~
\str_set:Nn \l_tmpa_str {#}
\tl_analysis_show:N \l_tmpa_str