我有一个 (递归) 函数,它接受一个 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
布尔值被实现为\chardef
token \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 }