我需要做出这样的条件:
IF #1 > \variable OR #1 = 0
THEN
PRINT "True"
ELSE
PRINT "False"
如果#1
大于\variable
或等于0
,则为真。该值仅包含 0 或更大的整数。绝不会有任何小数。
我在纯 TeX 中有这个条件,它检查是否#1
大于\variable
,但我不知道如何添加该#1 = 0
部分。
\ifnum0#1>\variable
True
\else
False
\fi
如何创建一个条件来检查其中至少有一个条件是否为真?
答案1
\if\ifnum#1>\variable T\else\ifnum#1=0 T\else F\fi\fi T%
TRUE
\else
FALSE
\fi
\if
扩展标记,直到剩下两个不可扩展的标记。如果其中一个条件为真,则扩展为T
,否则为。将其与 行中的F
最后一个进行比较。T
优点:
TRUE
不会像\ifnum#1>\variable TRUE \else \ifnum#1=0 % TRUE \else FALSE \fi \fi
优点:所有数字解析都由定义良好的标记停止。示例:标记
T
停止扫描数字\variable
。如果该TRUE
部分以数字开头123abc
,并\variable
定义为5
\def\variable{5} \ifnum#1>\variable 123abc \fi
则
#1
必須大于5123
!根据对数字
\variable
的评估定义,可能会跳过该部分的第一个空格。\variable
TRUE
优点:条件匹配良好,因此此构造也可以在其他条件中使用。如果 TeX 跳过条件分支,它只会检查命令标记中的真实
\if...
基元、、\else
和\fi
(\or
对于\ifcase
)。例如,以下宏
\ifOR
就不太匹配:\ifOR{\ifnum#1>\variable}{\ifnum#1=0} TRUE \else FALSE \fi
\ifOR
不算作宏,但是有两个\ifnum
,但只有一个\fi
。缺点:
\if
条件不易读取。
答案2
这里有一种方法,其中第一个宏基本上是lambda.sty
由 Alan Jeffrey 编写的:
\def\True#1#2{#1}
\def\False#1#2{#2}
\def\Or#1#2{#1\True{#2}}
\def\gobblefalse\else\gobbletrue\fi#1#2{\fi#1}
\def\gobbletrue\fi#1#2{\fi#2}
\def\TeXif#1{#1\gobblefalse\else\gobbletrue\fi}
\def\Morethan#1#2{\TeXif{\ifnum#1>#2 }}
\def\Equals#1#2{\TeXif{\ifnum#1=#2 }}
\def\Test#1{%
\Or
{\Morethan{#1}\variable}
{\Equals{#1}0}
{True}
{False}}
\newcount\variable
\variable=5
\Test{2} \Test{5} \Test{10} \Test{0}
\variable=2
\Test{2} \Test{5} \Test{0} \Test{1}
\bye
我有一种感觉,在这里的某个地方,有可能实现 Schemesque 精神的更高层次的抽象cond
……
答案3
您可以使用
\def\variable{5}
\def\test#1{%
\ifnum0#1>\variable
True
\else
\ifnum0#1=0
True
\else
False
\fi
\fi
}
\test{6} \par
\test{5} \par
\test{4} \par
\test{3} \par
\test{2} \par
\test{1} \par
\test{0}
输出
True
False
False
False
False
False
True
请注意,这只适用于正整数。
答案4
我的解决方案是这样的沃纳的回答但稍微延伸一下:
\def\variable{5}
% Solution 1
\def\ifOr#1#2{%
\csname%
\ifnum#1%
iftrue%
\else%
\ifnum#2%
iftrue%
\else%
iffalse%
\fi%
\fi%
\endcsname%
}
\def\test#1{%
\ifOr{0#1>\variable}{#1=0}%
True%
\else%
False%
\fi%
}
% Solution 2
\def\ifOR#1#2{%
\csname%
#1%
iftrue%
\else%
#2%
iftrue%
\else%
iffalse%
\fi%
\fi%
\endcsname%
}
\def\Test#1{%
\ifOR{\ifnum0#1>\variable}{\ifnum#1=0}%
True%
\else%
False%
\fi%
}
\test{8} \Test{8} \par
\test{4} \Test{4} \par
\test{3} \Test{3} \par
\test{2} \Test{2} \par
\test{1} \Test{1} \par
\test{0} \Test{0}