我想使用带有 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
- TeX 不允许在原始条件中进行算术运算;
\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