如何使用 \cs_generate_variant:Nn 比较标记列表?

如何使用 \cs_generate_variant:Nn 比较标记列表?

我想处理这个问题按照我的方法。下面的例子是一些来自interface3.pdf;但会引发错误:

 ! LaTeX3 错误:变体形式‘VV’已弃用基本形式‘\tl_if_eq:NNTF’。

\documentclass{article}
\usepackage{expl3}

\begin{document}
\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl { abc }
\tl_set:Nx \l_tmpb_tl { \tl_to_str:n { abc } }
\cs_generate_variant:Nn \tl_if_eq:NNTF { VV } % without this line, the result is falue, I want to get true with this line.
\tl_if_eq:VVTF \l_tmpa_tl \l_tmpb_tl { true } { false }
\ExplSyntaxOff
\end{document}

答案1

您有两个问题。首先,参数V作为参数的变体实际上没有意义N(这就是它被弃用的原因)。当您获取V变量的值时,结果不一定是单个标记,因此参数N将失败。这就是为什么您只能制作参数V的变体n

第二个是,一个令牌列表包含字母标记 abc\tl_analysis_show:N \l_tmpa_tl显示):

The token list \l_tmpa_tl contains the tokens:
>  a (the letter a)
>  b (the letter b)
>  c (the letter c)

而第二个标记列表包含字符标记 abc\tl_analysis_show:N \l_tmpb_tl):

The token list \l_tmpb_tl contains the tokens:
>  a (the character a)
>  b (the character b)
>  c (the character c)

所以他们在做代币列表比较。你需要细绳比较这里:

\str_set:Nn \l_tmpa_str { abc }
\str_set:Nx \l_tmpb_str { \tl_to_str:n { abc } }
\str_if_eq:VVTF \l_tmpa_str \l_tmpb_str { true } { false }

请注意是多余的。 (和其他函数)\str_set:Nx \l_tmpb_str { \tl_to_str:n { abc } }的参数已经通过了。\str_set:Nxstr\tl_to_str:n

答案2

没有理由定义变体(除了在这种情况下一开始就是错误的):

\tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl {true} {false}

已经是要做的事情(并且在您的情况下结果是错误的)。

您可能会考虑对显式标记列表和标记列表变量(的内容)进行比较,定义变体\tl_if_eq:nnTF

你可以做

\prg_generate_conditional_variant:Nnn \tl_if_eq:nn {Vn,nV} { T,F,TF }

现在就像

\tl_if_eq:nVTF {abc} \l_tmpb_tl {true} {false}
\tl_if_eq:VnTF \l_tmpa_tl {abc} {true} {false}

将会起作用(在您的情况下,前者产生错误,后者产生真实)。

该函数\prg_generate_conditional_variant:Nnn是一个包装器\cs_generate_variant:Nn,用于定义条件函数的变体(签名以TFT或结尾F);它避免了多次应用基本函数。

使用上面的代码可以定义所有变体

\tl_if_eq:nVTF
\tl_if_eq:nVT
\tl_if_eq:nVF
\tl_if_eq:VnTF
\tl_if_eq:VnT
\tl_if_eq:VnF

一次。请注意,定义\tl_if_eq:VVTF是无用的,因为它与 相同\tl_if_eq:NNTF,只是速度较慢且不能完全扩展。

相关内容