请参阅下面的示例。
预期的行为\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}
其行为将会如您所期望的那样。