如何创建一个条件来检查纯 TeX 中一个或另一个条件是否为真?

如何创建一个条件来检查纯 TeX 中一个或另一个条件是否为真?

我需要做出这样的条件:

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的评估定义,可能会跳过该部分的第一个空格。\variableTRUE

  • 优点:条件匹配良好,因此此构造也可以在其他条件中使用。如果 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}

相关内容