我在创建新条件时遇到了一个问题。条件的含义\foo_if_eq
是检查全局变量\g_my_tl
是否符合某个字符串bar
,结果是真假。条件已创建并起作用,但当将其插入另一个条件时,在构建阶段会产生错误 -缺失数字,视为零。我无法理解错误的原因。
\documentclass{article}
\usepackage {expl3}
\ExplSyntaxOn
\tl_new:N \g_my_tl
\tl_gset:Nn \g_my_tl {bar}
\prg_new_conditional:Npnn \foo_if_eq:n #1 {p, T, F, TF}
{
\tl_if_eq:NnTF \g_my_tl {#1}
{ \prg_return_true: }
{ \prg_return_false: }
}
\NewDocumentCommand {\testNewConditional} {}
{
\foo_if_eq:nTF {bar} % OK
{TRUE}{FALSE} \\
\bool_if:nTF { \foo_if_eq_p:n {bar} } % FAIL (Missing number, treated as zero)
{TRUE}{FALSE} \\
}
\ExplSyntaxOff
\begin{document}
\testNewConditional
\end{document}
\endinput
如果我在新检查中使用\str_if_eq
而不是\tl_if_eq
,则构建不会出错,并且一切正常。为什么?
\documentclass{article}
\usepackage {expl3}
\ExplSyntaxOn
\tl_new:N \g_my_tl
\tl_gset:Nn \g_my_tl {bar}
\prg_new_conditional:Npnn \foo_if_eq:n #1 {p, T, F, TF}
{
\str_if_eq:VnTF \g_my_tl {#1}
{ \prg_return_true: }
{ \prg_return_false: }
}
\NewDocumentCommand {\testNewConditional} {}
{
\foo_if_eq:nTF {bar} % OK
{TRUE}{FALSE} \\
\bool_if:nTF { \foo_if_eq_p:n {bar} } % OK
{TRUE}{FALSE} \\
}
\ExplSyntaxOff
\begin{document}
\testNewConditional
\end{document}
\endinput
答案1
您不能创建使用不完全可扩展的函数的谓词(在 中用星号标记interface3
)。这里,\tl_if_eq:nn
是不可扩展的,因此它不能可以在谓词定义中使用。相反,\str_if_eq:nn
是可扩展的,因此可以。