这是一个错误吗?
以下代码得到BUG STR
并PASS 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