从键值处理逗号分隔列表 (expl3)

从键值处理逗号分隔列表 (expl3)

我正在尝试将\SplitList包装器命令的参数中的\ProcessList一组clist设置为键的值。

不幸的是,原始命令(\mycmd如下)似乎没有将它接收的输入识别为实际列表,而是将其视为一个“项目”(参见输出中水平规则上方的内容)。

很抱歉我的行为有些笨拙,但如果能提供任何帮助我将非常感激。

\documentclass{article}

\usepackage{xparse}

\NewDocumentCommand{\mycmd}{ >{\SplitList{,}} m }{
    \ProcessList{#1}{\myprocessline}
}
\NewDocumentCommand{\myprocessline}{m}{
    \noindent #1, and\par
}
\ExplSyntaxOn
\keys_define:nn{mykeys}{
    mylist .clist_set:N = \l_mykeys_mylist_tl
}
\NewDocumentCommand{\wrapper}{ O{} }{
    \keys_set:nn{mykeys}{#1}
    \mycmd{\l_mykeys_mylist_tl}
}
\ExplSyntaxOff

\begin{document}

\wrapper[mylist={line one, line two, line three}]

\noindent\hrulefill

\mycmd{line one, line two, line three}

\end{document}

输出的屏幕截图

答案1

你传递的不是逗号分隔的列表,而是包含以逗号分隔的列表。

\documentclass{article}

\usepackage{xparse}

\NewDocumentCommand{\mycmd}{ >{\SplitList{,}} m }{%
    \ProcessList{#1}{\myprocessline}%
}
\NewDocumentCommand{\myprocessline}{m}{%
    \noindent #1, and\par
}
\ExplSyntaxOn
\keys_define:nn{mykeys}
  {
    mylist .clist_set:N = \l_mykeys_mylist_clist
  }
\NewDocumentCommand{\wrapper}{ O{} }
  {
    \keys_set:nn{mykeys}{#1}
    \exp_args:NV \mycmd \l_mykeys_mylist_clist
  }
\ExplSyntaxOff

\begin{document}

\wrapper[mylist={line one, line two, line three}]

\noindent\hrulefill

\mycmd{line one, line two, line three}

\end{document}

在此处输入图片描述

但是,我会使用不同的方法,因为\SplitList它仅适用于“简单”情况。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\mycmd}{ m }
  {
    \steve_mycmd_main:n { #1 }
  }

\NewDocumentCommand{\wrapper}{ O{} }
  {
    \keys_set:nn{mykeys}{#1}
    \steve_mycmd_main:V \l_mykeys_mylist_clist
  }

\cs_new_protected:Nn \steve_mycmd_main:n
  {
    \clist_map_function:nN { #1 } \steve_mycmd_processline:n
  }
\cs_generate_variant:Nn \steve_mycmd_main:n { V }

\cs_new:Nn \steve_mycmd_processline:n
  {
    \noindent #1, ~ and\par
  }

\keys_define:nn{mykeys}
  {
    mylist .clist_set:N = \l_mykeys_mylist_clist
  }
\ExplSyntaxOff

\begin{document}

\wrapper[mylist={line one, line two, line three}]

\noindent\hrulefill

\mycmd{line one, line two, line three}

\end{document}

答案2

您需要扩展宏\mycmd中的参数\wrapper

使用

\exp_args:Nx \mycmd {\l_mykeys_mylist_tl}

相关内容