\int_compare_p:nNn {...}{...}{...}
我理解,比较多个整数逻辑语句的不太自动化的解决方案是使用和\bool_if:nTF {condition(s)}{true}{false}
。我的问题是,为什么\fp_compare:nTF {...}{...}{...}
和 逻辑运算符配合使用效果很好,但\int_compare:nTF {...}{...}{...}
即使使用的所有值都是整数,也会产生错误?
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\compare}{mmm}{
\fp_compare:nTF {#1}{#2}{#3}
}
\NewDocumentCommand{\compareHardcode}{mm}{
\bool_if:nTF {
\int_compare_p:nNn {1} < {2} && \int_compare_p:nNn {2} < {3}
}{#1}{#2}
}
\NewDocumentCommand{\compareError}{mmm}{
%will not work using \int_compare:nTF
\int_compare:nTF {#1}{#2}{#3}
}
\ExplSyntaxOff
\begin{document}
\compare{1 < 2 && 2 < 3}{yes}{no} % prints yes
\compareHardcode{yes}{no} % prints yes
% Erroneous line commented:
% \compareError{1 < 2 && 2 < 3}{yes}{no}
\end{document}
答案1
类似于2<3
是有效的 ⟨fp expr⟩ 并\fp_eval:n { 2<3 }
返回 1。您还可以使用逻辑运算符。示例:
\documentclass{article}
\begin{document}
\fpeval{1<2}
\fpeval{1<2 && 2<3}
\fpeval{1<2 || 3<2}
\fpeval{1>2 || 3<2}
\end{document}
这将打印
1
1
1
0
因此\fp_compare:nTF { 1<2 && 2<3 } { yes } { no }
返回“是”,因为评估结果是 1,非零。
相反,1<2
不是有效的⟨int expr⟩。此外,你不能使用\int_compare:nTF { 1<2 && 2<3 } { yes } { no }
,因为参数无效:参数必须采用以下形式
⟨int expr⟩⟨关系⟩⟨int expr⟩⟨关系⟩…⟨int expr⟩⟨关系⟩⟨int expr⟩
并且不允许使用逻辑运算符。