这记录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