我想处理这个问题按照我的方法。下面的例子是一些来自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:Nx
str
\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
,用于定义条件函数的变体(签名以TF
、T
或结尾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
,只是速度较慢且不能完全扩展。