我正在尝试将\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}