if 条件带有数学表达式

if 条件带有数学表达式

我想使用带有 if 条件的数学表达式。例如:\x*\y > \m*\n

\documentclass{standalone}
\def\x{3}
\def\y{3}
\def\m{2}
\def\n{4}
\typeout{\x,\y}
\typeout{\m,\n}

\typeout{"test"}
\ifnum{\x*\y > \m*\n}
    \typeout{"greater"}
\else
    \typeout{"less"}
\fi
\begin{document}
\end{document}

当前代码编译错误:

3,3
2,4
"test"
! Missing number, treated as zero.
<to be read again> 
                   {
l.10 \ifnum{
            \x*\y > \m*\n}

这样的 if 语句应该怎样正确书写?

答案1

  1. TeX 不允许在原始条件中进行算术运算;
  2. \ifnum不想戴着牙套接受测试。

第二部分很容易修复;对于第一部分,您可以使用\inteval

\documentclass{article}

\def\x{3}
\def\y{3}
\def\m{2}
\def\n{4}
\typeout{\x,\y}
\typeout{\m,\n}

\typeout{"test"}
\ifnum\inteval{\x*\y} > \inteval{\m*\n}
    \typeout{"greater"}%
\else
    \typeout{"less"}%
\fi
\stop

控制台将打印

3,3
2,4
"test"
"greater"

\def但你根本不应该使用。

\documentclass{article}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\intcompareTF}{mmm}
 {
  \int_compare:nTF { #1 } { #2 } { #3 }
 }
\NewDocumentCommand{\defineinteger}{mm}
 {
  \int_const:cn { c_lucky_integer_#1_int } { #2 }
 }
\NewExpandableDocumentCommand{\useint}{m}
 {
  \int_use:c { c_lucky_integer_#1_int }
 }
\ExplSyntaxOn

\defineinteger{x}{3}
\defineinteger{y}{3}
\defineinteger{m}{2}
\defineinteger{n}{4}
\typeout{\useint{x},\useint{y}}
\typeout{\useint{m},\useint{n}}

\typeout{"test"}

\intcompareTF{ \useint{x} *\useint{y} > \useint{m} * \useint{n} }
 {\typeout{"greater"}}
 {\typeout{"less"}}

\stop

借助这些更强大的工具,您可以在测试中进行算术运算。而且您不必担心使用 覆盖重要命令\def

输出与以前完全相同。

答案2

你可以使用包etoolbox。这样你就可以编写:

\ifnumgreater{\x*\y}{\m*\n}{cond. true}{cond. false}

代码

\documentclass{standalone}
\usepackage{etoolbox}

\newcommand{\x}{3}
\newcommand{\y}{3}
\newcommand{\m}{2}
\newcommand{\n}{4}
\typeout{\x,\y}
\typeout{\m,\n}

\typeout{"test"}
\ifnumgreater{\x*\y}{\m*\n}{
    \typeout{"greater"}
}{
    \typeout{"less"}
}
\begin{document}
\end{document}

答案3

\ifnum原语接受两个数字,不带括号,且它们之间带有<>=。您可以使用 eTeX 原语扩展为这两个数字\numexpr

\ifnum \numexpr\x*\y > \numexpr\m*\n \relax TRUE \else FASLE\fi

相关内容