如果我这么做:
\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
。