\bool_set:Nn 将变量设置为其自身会产生错误

\bool_set:Nn 将变量设置为其自身会产生错误

我有一个 (递归) 函数,它接受一个 bool 作为参数,并首先将其复制到某个本地 boolean 变量 (使用分组,以便在函数调用后恢复该值)。进行递归调用时,它会传递此变量的 (可能已修改的) 值。

missing number treated as zero奇怪的是,这会导致在下一个递归步骤中设置布尔值时出现错误。

我将其归结为以下最小工作示例:

\documentclass{article}

\begin{document}


\ExplSyntaxOn

\bool_new:N \my_bool

\bool_set_true:N \my_bool

\bool_set:Nn \my_bool { \my_bool }

\ExplSyntaxOff

\end{document}

这会尝试将设置\my_bool为自身。我原本以为这不会产生任何效果。

那么,为什么会导致这样的错误?从手册中,我得出结论,这\my_bool是一个有效的<boolean expression>,并且设置\l_tmpa_bool这个表达式也可以完成工作,错误行为似乎来自自我引用。

对于这种情况,我是否应该使用其他布尔集函数?或者是否有更好的方法可以递归传递我在局部变量中拥有的布尔值?

答案1

布尔值被实现为\chardeftoken \bool_set:Nn,在底层是\chardef。TeX 的规则之一是,在执行

\chardef\cs=<number>

暂时设置\cs\relax。这是为了避免发生诸如

\def\cs{100}
\chardef\cs=10\cs

请参阅 TeXbook 第 278 页。

所以答案是您想要设置的布尔值不能出现在的<boolean expression>参数中\bool_set:Nn,因为在评估表达式时控制序列并不代表布尔值。

在特定情况下,由于业务的实施方式,代码最终会变成

\chardef\my_bool=\my_bool

这在 TeX 中是非法的。

解决方法:

\bool_set:Nn \my_bool { \my_bool && \c_true_bool }

相关内容