涉及 splitlist 的奇怪的 xparse 问题

涉及 splitlist 的奇怪的 xparse 问题
\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}

我不确定您是否应该忽略用户想要空参数的意愿:通常,没有参数和空的可选参数应该表现得不同。

相关内容