\NewCommandEnvironment 中的 -No Value- 来自哪里?

\NewCommandEnvironment 中的 -No Value- 来自哪里?

下面的代码产生了-No Value-初始输出。为什么?

\documentclass[10pt]{article}

\ExplSyntaxOn

\NewDocumentEnvironment{intfig} { > { \SplitArgument { 2 } { , } } m O{} }
  {
    \group_begin:
    \intfig_manditoryargs #1

    string\ is\ \l_intfig_astring_str \\
    height\ is\ \fp_eval:n { \l_intfig_height_fp }\\

    \group_end:
}{}

\str_new:N \l_intfig_astring_str
\fp_new:N \l_intfig_height_fp

\NewDocumentCommand{\intfig_manditoryargs}{ m m }
{
  % Side question: why are the braces required? Without the braces, the
  % variable is set to only the first character.
  \str_set:Nn \l_intfig_astring_str { #1 }
  \fp_set:Nn \l_intfig_height_fp  { #2 }
}

\ExplSyntaxOff

\begin{document}

\begin{intfig}{random string,45.3}[ignoreme]
  random body
\end{intfig}

\end{document}

答案1

随着规范的出台\SplitArgument{2}{,},LaTeX 期待最多参数中的两个逗号(在括号级别零处)并将它们作为三元组传递{...}{...}{...}

因此,如果您通过,a,b,c您将获得{a}{b}{c}。如果逗号少于两个,则括号将用 填充-NoValue-

你可能想要\SplitArgument{1}{,}

答案2

我太快回答了这个问题。答案是 \SplitArgument 需要拆分的 TOKEN 数量——上例中是逗号。因此,如果您想要两个 ARGUMENTS,那么只有一个 TOKEN。

这是合理的,也是有道理的,但这是一个明显的陷阱,xparse文档应该指出来。

相关内容