我有以下代码,尝试检查字符串中是否存在字母:
\documentclass{article}
\ExplSyntaxOn
\begin{document}
\str_gset:Nn \ABCstring {ABC} % Setting the test string to 'ABC'
\tl_gset:Nn \my_tl {C} % Setting the token list to the single letter 'C'
C\ in\ ABC:~
\str_if_in:NnTF \ABCstring {C}{yes!}{no!}\\ % just the letter 'C'
\textbackslash my_tl(\my_tl)\ in\ ABC:~
\str_if_in:NnTF \ABCstring {\my_tl}{yes!}{no!}\\ % the letter 'C' from the tl
\end{document}
\ExplSyntaxOff
它生成以下输出:
ABC 中的 C:是的!
ABC 中的 \my_tl(C):不!
当我将 a 放入C
的第二个参数时\str_if_in:NnTF
,代码按预期工作(产生yes!
),而标记列表中的相同字符不起作用。
这LaTeX3 文档给出以下签名:
\str_if_in:NnTF ⟨str var⟩ {⟨token list⟩} {⟨true code⟩} {⟨false code⟩}
并附有以下描述:
将 ⟨token list⟩ 转换为 ⟨string⟩ 并测试是否在 ⟨str var⟩ 的内容中找到该 ⟨string⟩。
根据我对文档的理解,上述两个 if 都应该产生yes!
什么问题?
我发现它可以适用于
\cs_generate_variant:Nn \str_if_in:NnTF {NVTF}
但为什么这是必要的呢?
答案1
正如文档所述,第二个参数\str_if_in:NnTF
是{⟨token list⟩}
。您传递的标记列表是\my_tl
,它恰好是一个标记。然后,当我们进行基于字符串的比较时,它会被去标记化,然后我们得到字符串\my_tl
,它包含六个“其他”标记。相反,您想要与内容,这\my_tl
是单个标记C
(catcode 11,“字母”)。当您使用V
-type 扩展时,它会传递价值存储在 中\my_tl
。并且它是您想要比较的。