如何将带星号的命令传递给 \fp_eval:n

如何将带星号的命令传递给 \fp_eval:n

我想定义一个带有星号版本的命令并将其传递给\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,所以我认为定义命令的最佳方式是使用\NewDocumentCommandfrom 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。

相关内容