删除宏生成的逗号分隔列表中的前导逗号

删除宏生成的逗号分隔列表中的前导逗号

以下程序的目标是对 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只是为了输出经过处理后的选项集。对于您来说,您可能会将其传递给其他函数进行处理。

在此处输入图片描述

相关内容