与文档相反,为什么 LaTeX3 方法不适用于标记列表参数?

与文档相反,为什么 LaTeX3 方法不适用于标记列表参数?

我有以下代码,尝试检查字符串中是否存在字母:

\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。并且它是您想要比较的。

相关内容