迭代 seq 并使用 \str_case 和 seq 的内容不起作用

迭代 seq 并使用 \str_case 和 seq 的内容不起作用

我尝试使用逗号分隔列表 ( ) 为函数提供多个参数clist。这似乎有效,我也可以使用 迭代元素seq。但是,将 的元素用作seq另一个函数的参数,然后使用\str_case似乎不起作用。

为什么?

\documentclass{article}

\ExplSyntaxOn

\newcommand{\HPsatz}[1]{
    #1:~
    \str_case:nn { #1 } {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third~sentence. }             
    }
}

\int_new:N \l__ghs_test_int
\int_new:N \l__ghs_tmpa_int
\seq_new:N \l__ghs_seq_numbers
\newcommand {\GHStext}[1]
{
    % generate seq from clist argument 1
    \seq_set_from_clist:Nn \l__ghs_seq_numbers { #1 }
    
    % set number of elements in seq
    \int_set:Nn \l__ghs_test_int { \seq_count:N \l__ghs_seq_numbers }
    
    % reset loop counter to 1
    \int_set:Nn \l__ghs_tmpa_int { 1 }
    
    % int_do_while of seq for each element
    \int_do_while:nn { \l__ghs_tmpa_int <= \l__ghs_test_int }
    {
        % print sentence from \HPsatz
        \HPsatz{\seq_item:Nn \l__ghs_seq_numbers { \l__ghs_tmpa_int }}

%       \seq_item:Nn \l__ghs_seq_numbers { \l__ghs_tmpa_int }

        % increment loop counter
        \int_incr:N \l__ghs_tmpa_int
    }
}

\ExplSyntaxOff

\begin{document}
    Sentences (clist):

    \GHStext{H123, H125}
    
    Sentences (manual):

    \HPsatz{H123}
    \HPsatz{H125}   
\end{document}

答案1

你可以使用

    \exp_args:Ne \str_case:nn { #1 } {

或者声明一个\str_case:en 变体(它会做同样的事情),以便#1在字符串比较之前进行扩展。

但更简单的方法是直接映射到 clist 上,避免所有的计数。

\documentclass{article}

\ExplSyntaxOn

\newcommand{\HPsatz}[1]{
    #1:~
    \exp_args:Ne \str_case:nn { #1 } {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third~sentence. }             
    }
}

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

\ExplSyntaxOff

\begin{document}
    Sentences (clist):

    \GHStext{H123, H125}
    
    Sentences (manual):

    \HPsatz{H123}
    \HPsatz{H125}   
\end{document}

答案2

你甚至可以让一切变得完全可扩展。

指南建议将用户界面与内部实现分开。

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\HPsatz}{m}
  {
    \ghs_satz:n { #1 } 
  }

\NewExpandableDocumentCommand{\GHStext}{m}
  {
    \ghs_text:n { #1 }
  }

\cs_new:Nn \ghs_satz:n
  {
    #1:~
    \str_case_e:nn { #1 } {
        { H123 }{ First~sentence. }
        { H124 }{ Second~sentence. }
        { H125 }{ Third~sentence. }             
    }
  }

\cs_new:Nn \ghs_text:n
  {
    \clist_map_function:nN { #1 } \__ghs_text:n
  }

\cs_new:Nn \__ghs_text:n
  {
    \ghs_satz:n { #1 }~
  }

\ExplSyntaxOff

\begin{document}

Sentences (clist):

\GHStext{H123, H125}
    
Sentences (manual):

\HPsatz{H123}
\HPsatz{H125}   

\end{document}

在此处输入图片描述

仅供参考:使用两个计数器定义的循环可以更简单地用\seq_map_inline:Nn或来完成\seq_map_function:NN

相关内容