以下程序的目标是对 cs 列表中某些键的值应用某些修改。除了删除前导逗号外,它运行良好。尝试使用/不使用行 A 和行 B。
\documentclass{report}
\usepackage{xparse}
%https://tex.stackexchange.com/questions/523083/keyval-parse-for-dummies/523085#523085
\ExplSyntaxOn
\cs_new_protected:Npn \my_keyval_parser:nn #1 #2
{
\group_begin:
\str_clear:N \l_tmpa_str
\str_case:nnTF { #1 }
{
{ foo } {,\tl_put_right:Nn \l_tmpa_str {#1=(#2)}}
{ bar } {,\tl_put_right:Nn \l_tmpa_str {#1=[#2]}}
}
{}
{\tl_put_right:Nn \l_tmpa_str{#1=#2}}
% \exp_args:NV \str_tail:n\l_tmpa_str
\l_tmpa_str
\group_end:
}
\cs_new_protected:Npn \my_key_parser:n #1
{
\str_case:nnTF { #1 }
{
{ qux } {,QUX}
}
{}
{}
}
\begin{document}
\exp_args:Nf % A
\str_tail:n % B
{
\keyval_parse:NNn
\my_key_parser:n
\my_keyval_parser:nn
{
foo=World,
bar=Universe,
qux
}
}%WANTED: foo=(World),bar=[Universe],QUX
\ExplSyntaxOff
\end{document}
答案1
您的代码存在一些问题。这是一个可运行的版本,稍后会添加注释。
\documentclass{report}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\test}{m}
{
\seq_clear:N \l_tmpa_seq
\keyval_parse:NNn \my_key_parser:n \my_keyval_parser:nn { #1 }
\seq_use:Nn \l_tmpa_seq { , }
}
\cs_new_protected:Npn \my_keyval_parser:nn #1 #2
{
\str_case:nnF { #1 }
{
{ foo } {\seq_put_right:Nn \l_tmpa_seq {#1=(#2)}}
{ bar } {\seq_put_right:Nn \l_tmpa_seq {#1=[#2]}}
}
{\seq_put_right:Nn \l_tmpa_seq {#1=#2}}
}
\cs_new_protected:Npn \my_key_parser:n #1
{
\str_case:nn { #1 }
{
{ qux } {\seq_put_right:Nn \l_tmpa_seq {QUX}}
}
}
\ExplSyntaxOff
\begin{document}
\test{
foo=World,
bar=Universe,
qux
}
\end{document}
第一个问题:\keyval_parse:NNn
不可扩展,因此\exp_args:Nf
没有任何实际用处。
其次,更容易添加逗号而不是删除它们,我在 的帮助下做到了这一点\seq_use:Nn
。
您不应该混合字符串和标记列表。
这里我使用该命令\test
只是为了输出经过处理后的选项集。对于您来说,您可能会将其传递给其他函数进行处理。