\quark_if_nil:NTF 似乎在奇怪的地方找到了 \q_nil 夸克

\quark_if_nil:NTF 似乎在奇怪的地方找到了 \q_nil 夸克

请参阅下面的示例。

预期的行为\foo是的,\fop但是\foo{\textbf{a}, \textbf{b}, \textbf{c}}我在不应该出现的地方出现了 [THE END]。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\MappingFunction}{m}
{
  \quark_if_nil:NTF #1
  {[THE~END]~}
  {|#1|\quad}
}

\NewDocumentCommand \Foo
{ > { \SplitList { , } } m }
{ \ProcessList { #1 } { \MappingFunction } }

\NewDocumentCommand \foo { m }
{
  \Foo {#1,\q_nil}
}

%%%%% ---------------------------------------------------------------------
\NewDocumentCommand{\MappingFunctionI}{m}
{
  \tl_if_eq:nnTF {#1}{@@@}
  {[THE~END]~}
  {|#1|\quad}
}

\NewDocumentCommand \Fop
{ > { \SplitList { , } } m }
{ \ProcessList { #1 } { \MappingFunctionI } }

\NewDocumentCommand \fop { m }
{
  \Fop {#1,@@@}
}
\ExplSyntaxOff

\begin{document}
\fop{ a, b, c, d }\par
\fop{\textbf{a}, \textbf{b}, \textbf{c}}

\foo{ a, b, c, d }\par
\foo{\textbf{a}, \textbf{b}, \textbf{c}}
\end{document}

我很高兴能够得到一个解释。

答案1

问题是你没有将N-type 参数传递给\quark_if_nil:NTF。相反,\quark_if_nil:NTF看到的是:

\quark_if_nil:NTF \textbf
  {a}
  {[THE~END]~}

之后,尾随的{|\textbf{a}|\quad}.\quark_if_nil:NTF将确定\textbf不是夸克,因此吞噬T分支(删除{a})并使用F分支(留[THE~END]~在输入流中)。因此[THE~END]~打印 ,并且由于还有一个尾随,{|\textbf{a}|\quad}因此随后打印一个。

正确的方法是使用\quark_if_nil:nTF来测试任意标记列表是否完全正确\q_nil。因此您的代码应该是:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\MappingFunction}{m}
{
  \quark_if_nil:nTF {#1}
  {[THE~END]~}
  {|#1|\quad}
}

\NewDocumentCommand \Foo
{ > { \SplitList { , } } m }
{ \ProcessList { #1 } { \MappingFunction } }

\NewDocumentCommand \foo { m }
{
  \Foo {#1,\q_nil}
}

%%%%% ---------------------------------------------------------------------
\NewDocumentCommand{\MappingFunctionI}{m}
{
  \tl_if_eq:nnTF {#1}{@@@}
  {[THE~END]~}
  {|#1|\quad}
}

\NewDocumentCommand \Fop
{ > { \SplitList { , } } m }
{ \ProcessList { #1 } { \MappingFunctionI } }

\NewDocumentCommand \fop { m }
{
  \Fop {#1,@@@}
}
\ExplSyntaxOff

\begin{document}
\fop{ a, b, c, d }\par
\fop{\textbf{a}, \textbf{b}, \textbf{c}}

\foo{ a, b, c, d }\par
\foo{\textbf{a}, \textbf{b}, \textbf{c}}
\end{document}

其行为将会如您所期望的那样。

相关内容