如何向“\clist_map_function”传递多个参数?

如何向“\clist_map_function”传递多个参数?

我尝试使用clist来作为函数的参数。然而,一个参数还可以包含函数的其他可选参数。

我怎样才能做到这一点?

\documentclass{article}

\ExplSyntaxOn

\cs_generate_variant:Nn \regex_extract_all:nnN { nx }

\seq_new:N \l__ghs_tmpA_seq
\seq_new:N \l__ghs_tmpB_seq

\NewDocumentCommand{\HPsatz}{mO{}O{}}{
    \regex_extract_all:nxN {([HP+\d]*)} {#1} \l__ghs_tmpA_seq
    \regex_extract_all:nxN {\[(.*)\]} {#1} \l__ghs_tmpB_seq
%   \seq_use:Nn \l__ghs_tmpB_seq {,}
    #1:~
    \str_case_e:nnF { \seq_item:Nn \l__ghs_tmpA_seq { 1 } } {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third\seq_item:Nn \l__ghs_tmpB_seq { 1 }~sentence. }             
    }
    {not found}
    \\
}


\newcommand {\GHStext}[1]
{
    \clist_map_function:nN {#1} \HPsatz
}

\ExplSyntaxOff

\begin{document}
    
    \GHStext{H123, H125[~best][really]}
    
\end{document}

这是regex最干净的方法吗?为什么它一直将[and]放在正则表达式的匹配中,尽管它位于括号之外?

答案1

您可以使用基于正则表达式的方法,但不需要像 那样花哨的东西\regex_extract:nnN。您只需将 a 之前的内容括起来[(如果有的话)。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\HPsatz}{mO{}O{}}
  {
    #1:~
    \str_case_e:nnF { #1 }
      {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third~sentence#2#3. }             
      }
      {not found}
    \par
  }


\NewDocumentCommand{\GHStext}{m}
  {
    \clist_map_function:nN {#1} \__ghs_split:n
  }

\tl_new:N \l__ghs_tmp_tl

\cs_new_protected:Nn \__ghs_split:n
  {
    \tl_set:Nn \l__ghs_tmp_tl { #1 }
    \regex_replace_once:nnN { ([^\[]*) } { \{\1\} } \l__ghs_tmp_tl
    \exp_last_unbraced:NV \HPsatz \l__ghs_tmp_tl
  }

\ExplSyntaxOff

\begin{document}
    
\GHStext{H123, H125[~best][really]}
    
\end{document}

我只是以某种方式使用了可选参数。

在此处输入图片描述

答案2

棘手的是将其转换H125[ best]{H125}[ best]您的命令的正确参数形式。

在此处输入图片描述

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\HPsatz}{mO{}O{}}{
    #1:~
    \str_case_e:nnF { #1 } {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third#2~sentence. }             
    }
    {not found}
    \par
}

\cs_new:Npn\HP_grab:w#1[#2]#3\scan_stop:{\HPsatz{#1}[#2]}

\seq_new:N \l__ghs_seq_numbers
\newcommand {\GHStext}[1]
{
    \clist_map_inline:nn {#1} {\HP_grab:w##1[]\scan_stop:}
}

\ExplSyntaxOff

\begin{document}
    
    \GHStext{H123, H125[~best]}

\end{document}

答案3

以下代码可为您的输入实现合理稳定的解析,前提是可选部分放在前面,而不是放在键后面。它允许相当灵活的输入,但无法处理嵌套[]在可选参数中且没有额外括号的情况(因此,[a[b]c]将其读a[b作可选参数,[{a[b]c}]可以正常工作并读取a[b]c)。

\documentclass{article}

\ExplSyntaxOn

\cs_new:Npn \__ghs_oarg:Nn #1#2
  { \use:e { \exp_not:N #1 \__ghs_oarg_search:n {#2} } }
\cs_new:Npn \__ghs_oarg_search:n #1
  {
    \tl_if_head_eq_meaning:nNTF {#1} [
      { \if_false: { \fi: \__ghs_oarg_collect:w #1 } }
      { {} { \exp_not:n {#1} } }
  }
\cs_new:Npn \__ghs_oarg_collect:w [#1]
  {
    { \exp_not:n {#1} }
    \exp_after:wN \__ghs_oarg_collect_aux:n
      \exp_after:wN { \if_false: } \fi:
  }
\cs_new:Npn \__ghs_oarg_collect_aux:n #1
  {
    \tl_if_single:nTF {#1}
      { \tl_trim_spaces:n {#1} }
      { { \tl_trim_spaces:n {#1} } }
  }

\cs_generate_variant:Nn \regex_extract_all:nnN { nx }

\NewExpandableDocumentCommand \GHStext { m }
  { \clist_map_function:nN {#1} \__ghs_hpsatz_wrapper:n }
\cs_new:Npn \__ghs_hpsatz_wrapper:n #1
  { \__ghs_oarg:Nn \__ghs_hpsatz:nn {#1} }

\NewDocumentCommand{\HPsatz}{mO{}}
  { \__ghs_hpsatz:nn {#2} {#1} }
\cs_new:Npn \__ghs_hpsatz:nn #1#2
  {
    #2:~
    \str_case_e:nnF {#2} {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third#1~sentence. }             
    }
    {not~ found}
    \\
  }

\ExplSyntaxOff

\begin{document}
    
    \GHStext
      {
        H123,
        [~test1]H125,
        [~test2] H125,
        [~test3]{H125},
        [~test4] {H125}
      }
    
\end{document}

相关内容