\SplitList 生成的是什么?

\SplitList 生成的是什么?

我正在阅读xparse 的文档我对 很感兴趣\SplitList。但是描述中有些地方我不太明白:

此处理器会拆分每次出现 ⟨token(s)⟩ 时给出的参数,其中项数不固定。然后将每个项括在 #1 内的括号中。结果是可以使用映射函数进一步处理已处理的参数。

\NewDocumentCommand \foo 
{ > { \SplitList { ; } } m }
{ \MappingFunction #1 }

如果只使用单个字符 ⟨token⟩ 进行拆分,则在拆分之前,将替换与 ⟨token⟩ 匹配的任何类别代码 13(活动)字符。解析的每个项目两端的空格都会被修剪。

因此,有两个关键的事情我不明白,并且稍后我会解决一个潜在的困惑:

  • 我不明白每个项目“用括号括起来”是什么意思。作为一项简短的调查,我写了以下内容:
    \documentclass{article}
    \usepackage{xparse}
    \NewDocumentCommand\test{>{\SplitList{,}}o}{#1}
    \begin{document}
    \test[1,2,3]
    \end{document}
    
    这表明,无论这是什么,它似乎都没有出现在最终文件中。这肯定是某种数据便利,但我不知道它是什么。
  • 我不知道这\MappingFunction是什么。它要么是真正的宏,要么只是代表某种特定宏的示例占位符。我找到了几个看似独立的宏,\MappingFunction但没有文档,这些稀少的示例对我来说难以理解。

总的来说,我只是对这里的类型有疑问。什么类型的对象是#1什么类型的对象\MappingFunction?有人告诉我,由于 tex 的历史,latex 并没有真正扎实或有原则的类型系统,而是无休止的快速修复和补丁大杂烩,这可能会让这个问题变得有点无意义。然而,我觉得我真的不知道如何处理这个对象或如何与它交互,因为我不知道它是什么类型以及它如何融入更广泛的系统。

那么这个例子中的东西是什么样的#1?我如何与它交互?

答案1

如果你在定义主体中使用\showtokens{#1}而不是,你会看到 TeX 将在控制台上打印#1

> {1}{2}{3}.
\test code #1->\showtokens {#1}

这意味着物品被收集起来并支撑

通常,您希望将其传递给另一个命令,该命令使用每个项目并对其执行某些操作。\MappingFunction文档中的 是一个占位符。

另一方面,处理项目的通用方法是通过

\ProcessList{#1}{\SomeDocumentFunction}

其中,再次\SomeDocumentFunction是一个占位符,代表一个带有一个参数的命令。

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand\test{>{\SplitList{,}}m}{%
  \ProcessList{#1}{\testaux}%
}
\NewDocumentCommand{\testaux}{m}{%
  \fbox{#1}%
}

\begin{document}

\test{1,2,3}

\end{document}

这里可以直接使用\ProcessList{#1}{\fbox},但我还是以示例的方式定义了辅助命令。

在此处输入图片描述

相关内容