换句话说,bool{testB}
在这个示例代码中是否完全进行了评估?
\newbool{testA}
\newbool{testB}
\booltrue{testA}
\booltrue{testB}
\ifboolexpr{ bool{testA} or bool{testB} }{OK}{Something's wrong...}
(我太懒了(双关语;))没有检查源代码,文档似乎没有提到这一点——也许有人只是知道而不必分析源代码(我确实研究过,但乍一看并不明白)?如果这不是显而易见的事情,我会很乐意做功课,深入研究源代码并尝试建立这一点。)
答案1
评价是不是懒惰,通过扫描何时.log
发现跟踪宏扩展:
%\begingroup
\tracingmacros1
\ifboolexpr{ bool{testA} or bool{testB} }{OK}{Something's wrong...}
%\endgroup
也就是说,对 的完整求值bool{testA}
之后是 对 的等效求值bool{testB}
,然后是 对 的求值or
,从而输出\@firstoftwo{OK}{Something's wrong...}
。
根据您对宏扩展的检查,您可能需要使用一个组来将输出限制为.log
。
答案2
这回答给出的是沃纳。xintexpr知道电子工具箱布尔值和切换。不同的语法允许不同级别的惰性:
[抱歉,我误解了“懒惰”的意思;因此我改用“傻”]
- 愚蠢:布尔值被替换为 1 或 0,具体取决于它们的计算结果为真还是假,然后逻辑
or
不会停止扫描这些1
或0
,即使它已经找到了真。 - 半傻:布尔值被评估,但当
or
它发现一个真值时停止 - 并不傻:除非真的需要,否则不会评估布尔值。
在下面的代码片段中,三种不同的语法实现了上面描述的三种可能性:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{xintexpr}
\begin{document}
\newbool{testA}
\newbool{testB}
\newbool{testC}
\booltrue{testA}
\booltrue{testB}
\booltrue{testC}
%\tracingmacros1
% silly
\xintifboolexpr{ bool(testA) | bool(testB) | bool(testC) }{OK}{Something's wrong...}
% semi-silly
\xintifboolexpr{ any(bool(testA),bool(testB),bool(testC)) }{OK}{Something's wrong...}
% not silly
\xintifboolexpr{ bool(testA)?1{bool(testB)?1{bool(testC)}} }{OK}{Something's wrong...}
\end{document}