clist_if_in:nV 在 str 变量上失败

clist_if_in:nV 在 str 变量上失败

这是一个错误吗?

以下代码得到BUG STRPASS TL

\documentclass{article}
\ExplSyntaxOn
\str_set:Nn \l_tmpa_str { b }
\clist_if_in:nVTF { a, b } \l_tmpa_str
  { \tl_show:n { PASS~STR } }
  { \tl_show:n { BUG~STR } }
\tl_set:Nn \l_tmpa_tl { b }
\clist_if_in:nVTF { a, b } \l_tmpa_tl
  { \tl_show:n { PASS~TL } }
  { \tl_show:n { BUG~TL } }
\ExplSyntaxOff

\begin{document}

\end{document}

答案1

我发现将str变量视为与 TeX 中的其他任何数据类型不同的数据类型很有用,因此它们只能相互比较,而不能与其他数据类型进行比较,除非它们被“字符串化”。

这当然不是“事实”。实际上,TeX 中的任何字符标记在进入 TeX 的口中时(更专业的术语是标记化之后)都会被分配一个类别代码。在变量中,str所有字符标记(除了空格标记,其保留其类别代码 10)都被分配类别代码 12。

然而,您要检查是否存在的变量a内部在正常情况下具有类别代码 11。clist

您可以定义一个(可能很慢的)例程来检查是否包含clist某些“字符串化”与您想要测试的内容相同的内容。

\ExplSyntaxOn

\bool_new:N \l__zhiyuan_clist_str_bool
\prg_new_protected_conditional:Nnn \zhiyuan_clist_str_if_in:nn { T, F, TF }
 {
  \bool_set_false:N \l__zhiyuan_clist_str_bool
  \__zhiyuan_clist_str_check:ne { #1 } { \tl_to_str:n { #2 } }
  \bool_if:NTF \l__zhiyuan_clist_str_bool
   { \prg_return_true: }
   { \prg_return_false: }
 }

\cs_new_protected:Nn \__zhiyuan_clist_str_check:nn
 {
  \clist_map_inline:nn { #1 }
   {
    \str_if_eq:eeT { \tl_to_str:n { ##1 } } { #2 }
     {
      \clist_map_break:n { \bool_set_true:N \l__zhiyuan_clist_str_bool }
     }
   }
 }
\cs_generate_variant:Nn \__zhiyuan_clist_str_check:nn { ne }

\prg_generate_conditional_variant:Nnn \zhiyuan_clist_str_if_in:nn { nV, VV } { T, F, TF }

\str_set:Nn \l_tmpa_str { b }

\zhiyuan_clist_str_if_in:nVTF { a,b } \l_tmpa_str
 { \iow_term:n { YES } }
 { \iow_term:n { NO } }

\zhiyuan_clist_str_if_in:nVTF { a,c } \l_tmpa_str
 { \iow_term:n { YES } }
 { \iow_term:n { NO } }

\ExplSyntaxOff

\stop

这将打印在控制台上

YES
NO

相关内容