是否可以创建foo
采用参数列表的函数,并且该参数也是一个列表,例如要求以下语义\foo[x:1,z,y:2]
,即它采用三个以逗号分隔的参数x:1
,y:2
和z
,其中x:1
解析为两个参数传递给内部的另一个函数foo
并且1
是可选参数?
例如,假设函数\textoverset
定义如下:
\NewDocumentCommand{\textoverset}{ m m }{%
\tikz[baseline=(Root.base)]{%
\node[inner sep=0pt,
outer sep=0pt,
label={#3}] (Root) {#2};
}%
}
假设textoverset
在里面使用foo
,那么调用\underline{\foo[x:1,z,y:2]}
将给出附件中所示的结果。
答案1
您可以执行一个三阶段过程:第一阶段,您在逗号处拆分;第二阶段在冒号处拆分每个项目,第三阶段调用\textoverset
。
\documentclass{article}
\usepackage{tikz,xparse}
\NewDocumentCommand{\textoverset}{ m m }{%
\tikz[baseline=(Root.base)]{%
\node[
inner sep=0pt,
outer sep=0pt,
label={#2},
] (Root) {#1};%
}%
}
\NewDocumentCommand{\foo}{ >{\SplitList{,}}m }{\ProcessList{#1}{\fooaux}}
\NewDocumentCommand{\fooaux}{ >{\SplitArgument{1}{:}}m } {\fooauxa#1}
\NewDocumentCommand{\fooauxa}{mm}{%
\IfNoValueTF{#2}{\textoverset{#1}{}}{\textoverset{#1}{#2}}%
}
\begin{document}
\textoverset{x}{1}\textoverset{y}{}\textoverset{z}{2}
\foo{x:1,y,z:2}
\end{document}