我正在阅读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}
,但我还是以示例的方式定义了辅助命令。