我想定义一个带有星号版本的命令并将其传递给\fp_eval:n
进行一些计算。但是,无论我使用星号版本还是常规版本,在里面使用命令时都会出现错误\fp_eval:n
:
! You can't use `\edef' after \the.
<argument> \cs_set_nopar:Npx
完整示例:
\documentclass{standalone}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_new_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff
\begin{document}
\NewDocumentCommand\nostar{}{1}
\fpeval{\nostar} % works fine
\NewDocumentCommand\withstar{s}{\IfBooleanTF{#1}{2}{3}}
\fpeval{\withstar} % does not work
\fpeval{\withstar*} % does not work either
\end{document}
因为\fp_eval:n
来自 LaTeX3,所以我认为定义命令的最佳方式是使用\NewDocumentCommand
from xparse
。它也尝试使用\WithSuffix
或\@ifstar
,但没有成功。
如果我让命令有一个可选参数,似乎会出现同样的问题。强制参数可以正常工作。
答案1
带有 *-variant 的命令通常不能在扩展上下文中工作,而这是 所要求的\fp_eval:n
。
问题在于,宏必须向前查看才能查看后面是否有 *,而唯一安全的方法是使用 进行查看,\futurelet
这会导致构造无法完全展开。这会影响\@ifstar
、\WithSuffix
和\NewDocumentCommand
。
有一个解决方法xparse
,但它要求宏有一个尾随强制参数。之后
\NewExpandableDocumentCommand{\myvar}{sm}{%
\IfBooleanTF{#1}{2}{3}%
}
你可以打电话
\fpeval{\myvar{}}
\fpeval{\myvar*{}}
完整的例子;注意xfp
定义\fpeval
。
\documentclass[border=4]{standalone}
\usepackage{expl3,xparse,xfp}
\NewExpandableDocumentCommand\nostar{m}{1}
\NewExpandableDocumentCommand\withstar{sm}{\IfBooleanTF{#1}{2}{3}}
\begin{document}
\fpeval{\nostar{}} % works fine
\fpeval{\withstar{}} % works fine
\fpeval{\withstar*{}} % works fine
\end{document}
我还定义了\star
一个强制参数来保证一致性。把它想象成 C。