etoolbox 的 \ifboolexpr 是否使用惰性求值?

etoolbox 的 \ifboolexpr 是否使用惰性求值?

换句话说,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. 愚蠢:布尔值被替换为 1 或 0,具体取决于它们的计算结果为真还是假,然后逻辑or不会停止扫描这些10,即使它已经找到了真。
  2. 半傻:布尔值被评估,但当or它发现一个真值时停止
  3. 并不傻:除非真的需要,否则不会评估布尔值。

在下面的代码片段中,三种不同的语法实现了上面描述的三种可能性:

\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}

相关内容