提供完全可扩展条件的包

提供完全可扩展条件的包

是否有一个包提供如下完全可扩展条件的集合:

\newcommand\myif@num[1]
{\ifnum#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}

背景:假设我想编写一个可扩展的递归宏\foo,其中包含嵌套使用\ifnum。那么它可能看起来像这样:

\def\foo#1#2%
{%
  ... some stuff ...
  \ifnum\bar=\z@% exit condition
    \expandafter\expandafter\expandafter\@gobbletwo
   \else
    \ifnum\baz>\quux% another exit condition
      \expandafter\expandafter\expandafter\@gobbletwo
     \else
       \expandafter\expandafter\expandafter\foo
    \fi
  \fi
  \expandafter{\the\numexpr...}{stuff}%
}

但即使这样也行不通,因为最后一个\fi并不总是会被摧毁。所以只能用\romannumeral诡计了……

使用上述宏,这个条件如下所示:

\def\foo#1#2%
{%
  ... some stuff ...
  \myif@num{\bar=\z@}
  {}
  {%
    \myif@num{\baz>\quux}
    {}
    {\expandafter\foo\expandafter{\the\numexpr...}{stuff}}%
  }%
}

干净多了,不是吗?

答案1

我不确定是否有提供仅有的测试请求,但作为更通用工具包的一部分,两个明显的候选者是etoolboxexpl3。该etoolbox包的范围不如那么大expl3,并且使用更“传统”的 TeX 语法。在这种情况下,你会有

\newcommand{\myif@num}[3]{%
  \ifnumcomp{#1}{#2}{#3} % eg "1 + 1", "=" and "2" would take the TRUE branch
}

其中两个整数值是表达式,但必须分别给出。

LaTeX3expl3软件包提供了一整套编程语言,其中可扩展测试只是其中的一部分。这里合适的定义是

 \ExplSyntaxOn
 \cs_new_eq:NN \my@ifnum \int_compare:nTF
 \ExplSyntaxOff

as\int_compare:nTF接受单个参数(例如1 + 1 = 2)并评估测试以根据需要吸收 TRUE 或 FALSE 分支。(请注意,还有一个稍快的\int_compare:nNnTF,它\ifnumcomp需要三个参数。)LaTeX3 条件语句有“仅 TRUE”或“仅 FALSE”版本,例如 \int_compare:nT,以避免需要空组。


也许与想要的有点相切,但你也可以看看boolexpr用于可扩展的布尔表达式。etoolboxexpl3也都这样做,但是实现和接口不同。

相关内容