\NewDocumentCommand:强制类型 r / R 及其“默认值”

\NewDocumentCommand:强制类型 r / R 及其“默认值”

记录xparse状态(重点是我的):

r给定r⟨token1⟩⟨token2⟩,这表示“必需的”分隔参数,其中分隔符为⟨token1⟩⟨token2⟩⟨token1⟩如果缺少打开分隔符,-NoValue-则在适当的错误后将插入默认标记。
R鉴于R⟨token1⟩⟨token2⟩{⟨default⟩},这是一个“必需的”分隔参数,至于r但它有一个用户可定义的恢复,⟨default⟩而不是-NoValue-

但在这两种情况下,如果未指定参数,则会产生错误。而且我看不出r和之间的错误消息有什么区别R

  • 这究竟是如何默认标记-NoValue-干预?
  • 这个附加项的目的是什么{⟨default⟩}?有任何用例吗?

是否是为了避免在#N使用相应参数时出现其他错误?或者(对于R)以某种方式用该默认值记录参数?最后r和之间有什么明显的区别吗?R

注意:我已经了解相关的可选类型d/ D

答案1

我们来做一个测试:

\documentclass{article}

\NewDocumentCommand{\test}{r<>}{?#1?}

\begin{document}

\test<X>

\test X

\end{document}

运行 LaTeX 后我们得到

! LaTeX cmd Error: Required argument missing for command '\test'.

For immediate help type H <return>.
 ...

l.9 \test X

输出为

在此处输入图片描述

您会发现,为了从错误中恢复,LaTeX<-NoValue>在 后插入\test,因此处理可以继续,而不会因缺少 而导致进一步错误>。无论如何,输出都是无效的。

第二次测试。

\documentclass{article}

\NewDocumentCommand{\test}{R<>{what}}{?#1?}

\begin{document}

\test<X>

\test X

\end{document}

错误消息是相同的,但现在输出是

在此处输入图片描述

除了“what”,您还可以使用其他内容来吸引 PDF 文件中的注意力。比 更好-NoValue-。如果您对参数执行更复杂的操作,这可能也很有用,因此您也许可以避免进一步的错误消息。

答案2

谢谢埃格尔非常详细的回答!
我想添加我刚刚发现的另一个有趣的用例,用于必需参数默认标记/值。

假设我想拆分一个参数并能够传递 1、2 或 3 个值:

\test{1, 2, 3}
\test{1, 2}
\test{1}

使用:

\NewDocumentCommand{\test}{ >{ \SplitArgument{2}{,} } m }{\impl #1}

\impl将分别收到

\impl{1}{2}{3}
\impl{1}{2}{-NoValue-}
\impl{1}{-NoValue-}{-NoValue-}

可选参数在这里将失败,因为无论如何都会传递参数{}

\NewDocumentCommand\impl{m m m}{%
    \#1 = #1,
    \#2 = \IfValueTF{#2}{#2}{default},
    \#3 = \IfValueTF{#3}{#3}{default}
}

输出:

#1 = 1, #2 = 2, #3 = 3
#1 = 1, #2 = 2, #3 = default
#1 = 1, #2 = default, #3 = default

相关内容