查看下面的代码,6. 中的设置必须是什么才能返回 F?此外,为什么 2. 返回 F ,换句话说\group_begin:
和\c_group_begin_token
有何不同?
\begin{enumerate}
\item \tl_if_head_is_N_type:nTF{{foo}}{T}{F} % 1. F
\item \tl_if_head_eq_catcode:nNTF{{foo}}\group_begin:{T}{F} % 2. F
\item \tl_if_head_eq_catcode:nNTF{{foo}}\c_group_begin_token{T}{F} % 3. T
\item \token_if_group_begin:NTF\c_group_begin_token{T}{F} % 4. T
\item \tl_if_head_is_N_type:nTF{[foo]}{T}{F} % 5. T
\item \tl_if_head_is_N_type:nTF % 6. T
{\tl_rescan:nn
{\char_set_catcode_group_begin:N [
\char_set_catcode_group_end:N ]}
{[foo]}}{T}{F}
\end{enumerate}
更新:
我第一次不明白的是,使用诸如作为\tl_if_head_eq_catcode:nNTF
第二个参数之类的谓词\tl_rescan
来检测设置中指定的 catcode 的任何更改并不是一个好主意,因为它们本身会受到更改的影响。话虽如此,也许这个新的 MWE 更好地解释了我试图引出的内容。此外,[我现在清楚\group_begin:
vs 了\c_group_begin_token
]。
\char91 % [
\char93 % ]
\cctab_const:Nn \c__erw_setup_cctab
{
\cctab_select:N \c_code_cctab
\char_set_catcode:nn {91}{1}
\char_set_catcode:nn {93}{2}
}
\tl_rescan:nn{\c__erw_setup_cctab}
{\tl_if_head_eq_catcode:nNTF {{foo}}
\c_group_begin_token{T}{F}} % T
\exp_args:Nnx
\tl_rescan:nn{\c__erw_setup_cctab}
{\tl_if_head_eq_catcode:nNTF {[foo]}
\c_group_begin_token{T}{F}} % F
PS:如果仍然不清楚,请随意删除该问题。
答案1
TeX 提供两种创建组的方法:使用\begingroup
/\endgroup
和使用{
/ }
。后者可以使用一对标记\let
来实现{
/ }
。expl3
换句话说,\begingroup
是\group_begin:
和{
是\c_group_begin_token
。这些是不同的概念,因此在测试时会得出不同的结果。
当你这样做时\tl_if_head_is_N_type:nTF { \tl_rescan:nn ...
,论点是不是展开:你问的是\tl_rescan:nn
它本身是否是N
-type。它是,所以测试是正确的:输出重新扫描即可。