关于 `\tl_rescan` 的正确使用

关于 `\tl_rescan` 的正确使用

查看下面的代码,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。它是,所以测试是正确的:输出重新扫描即可。

相关内容