\DeclareDocumentCommand\test{o}{\IfNoValueOrEmptyTF{#1}{No value or empty!}{-#1-}}
有效,但是当我们尝试使用拆分列表时,NoValueOrEmpty 测试失败:
\DeclareDocumentCommand\test{ > { \SplitList { , } }o}{\IfNoValueOrEmptyTF{#1}{No value or empty!}{-#1-}}
看起来空的拆分列表与空的不一样?
\makeatletter
\newcommand{\IfNoValueOrEmptyTF}[3]
{
\IfNoValueTF{#1}{#2}
{
\def\@tempa{#1}
\ifx\@tempa\@empty#2\else#3\fi
}
}
\makeatother
答案1
在 之后\SplitList
,最初为空的参数会产生{}
,即带有一个项目的标记列表,该列表为空。因此,用 替换空性测试\tl_if_eq:nnTF {#1} { {} }
。即,
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\IfNoValueOrSplitEmptyTF}{mmm}
{
\IfNoValueTF {#1}
{#2}
{ \tl_if_eq:nnTF {#1} { {} } {#2} {#3} }
}
\ExplSyntaxOff
\NewDocumentCommand{\test} { > { \SplitList { , } } o }
{\IfNoValueOrSplitEmptyTF {#1} {No value} {-#1-}}
\begin{document}
\test
\test[]
\test[,]
\test[a,b,{c=d,e,f},g]
\end{document}
我不确定您是否应该忽略用户想要空参数的意愿:通常,没有参数和空的可选参数应该表现得不同。