处理分隔列表的分隔列表

处理分隔列表的分隔列表

是否可以创建foo采用参数列表的函数,并且该参数也是一个列表,例如要求以下语义\foo[x:1,z,y:2],即它采用三个以逗号分隔的参数x:1y:2z,其中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}

在此处输入图片描述

相关内容