(expl3)展开定义中的函数结果

(expl3)展开定义中的函数结果

如果我这么做:

\ExplSyntaxOn
\NewDocumentCommand{\foo}{m}
 {
    [ \fp_eval:n { #1 } ] 
 }
\ExplSyntaxOff
...
\edef\bar{\foo{#1} }
\edef\baz{\foo{#1+1} }

如果参数#1是 42,并且我写:

\typeout{\bar}
\typeout{\baz}

我得到:

\foo{42}
\foo{42+1}

而我想要得到的结果是foo,即:

[42]
[43]

这肯定是我忽略的一个问题expandafter

我该如何处理?

编辑:

好的,抱歉,我不知道那NewDocumentCommand是什么protected。我刚刚发现了 expl3... 谢谢你们的帮助。 NewExpandableDocumentCommand工作正常。

编辑(2):

正如 @wipet 告诉我的,我们可以简单地这样写:

\newcommand\foo[1]{%
[\the\numexpr #1\relax ]%
}

答案1

用 定义的宏\NewDocumentCommand\protected,因此它们不会在 中扩展\edef。您需要

\NewExpandableDocumentCommand{\foo}...

当然,如果要\foo在中使用\edef,其动作必须是完全可扩展的(具体例子中就是这种情况)。

顺便说一句,\fp_eval:n如果您只想对整数进行算术运算,并且 LaTeX 内核提供了expl3函数,那么这样做就有点小题大做\int_eval:n了,而且还提供了用户级宏\inteval

你可以做到,没有\ExplSyntaxOn

\NewExpandableDocumentCommand{\foo}{m}{%
  [\inteval{#1}]%
}

\edef\baz{\foo{#1+1}}

会导致\baz扩展为[43]

我认为这\inteval{42+1}比 更清楚\the\numexpr42+1\relax

相关内容