是否有一个包提供如下完全可扩展条件的集合:
\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
我不确定是否有提供仅有的测试请求,但作为更通用工具包的一部分,两个明显的候选者是etoolbox
和expl3
。该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
用于可扩展的布尔表达式。etoolbox
和expl3
也都这样做,但是实现和接口不同。