处理逻辑运算符时 \int_compare 和 \fp_compare 之间存在不一致

处理逻辑运算符时 \int_compare 和 \fp_compare 之间存在不一致

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

并且不允许使用逻辑运算符。

相关内容