如何将几个以逗号分隔的参数列表传递给 \docsvlist?

如何将几个以逗号分隔的参数列表传递给 \docsvlist?

我有一个宏test,它接受两个参数并在以下情况下翻译一个单词:

  1. 这个词是“减号”(第一个参数)
  2. 第二个参数是“翻译”

我需要将逗号分隔的列表传递给此宏。当只有一个参数时,\docsvlist来自包的参数etoolbox工作得很好。如果有多个参数,则无法编译。有人可以向我解释如何传递参数列表\docsvlist吗?

平均能量损失

应该给出“moins, non traduit, plus, plus”作为输出。

\documentclass{article}

\usepackage{etoolbox}

\begin{document}
    
    \newcommand{\test}[2]{%
        \ifstrequal{#1}{minus}{%
            \ifstrequal{#2}{traduire}{moins}{non traduit}
        }{#1}%
    }
    
    \newcommand{\testList}[2]{%
        \def\nextitem{\def\nextitem{, }}%
        \renewcommand*{\do}[2]{\nextitem\test{##1}{##2}}%
        \docsvlist{#1}%
    }

    \testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}

    The function above should print the same results as:

    \testorder{minus}{traduire}
    
    \testorder{minus}{non défini}
    
    \testorder{plus}{traduire}
    
    \testorder{plus}{non défini}
    
\end{document}

答案1

你可以这样做expl3

\documentclass{article}

%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later

\ExplSyntaxOn
\NewExpandableDocumentCommand{\testorder}{mm}
 {
  \alma_testorder:nn { #1 } { #2 }
 }
\NewDocumentCommand{\testorderList}{mm +O{~}}
 {
  \alma_testorder_list:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l__alma_testorder_list_a_seq
\seq_new:N \l__alma_testorder_list_b_seq
\seq_new:N \l__alma_testorder_list_seq

\cs_new:Nn \alma_testorder:nn
 {
  \str_if_eq:nnTF { #1 } { minus }
   {
    \str_if_eq:nnTF { #2 } { traduire } { moins } { non~traduit }
   }
   { #1 }
 }

\cs_new_protected:Nn \alma_testorder_list:nnn
 {
  \seq_set_from_clist:Nn \l__alma_testorder_list_a_seq { #1 }
  \seq_set_from_clist:Nn \l__alma_testorder_list_b_seq { #2 }
  \seq_clear:N \l__alma_testorder_list_seq
  \seq_mapthread_function:NNN \l__alma_testorder_list_a_seq \l__alma_testorder_list_b_seq \__alma_testorder_add:nn
  \seq_use:Nn \l__alma_testorder_list_seq { #3 }
 }

\cs_new_protected:Nn \__alma_testorder_add:nn
 {
  \seq_put_right:Nn \l__alma_testorder_list_seq { \alma_testorder:nn { #1 } { #2 } }
 }


\ExplSyntaxOff

\begin{document}
    
\testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}[\par]

The function above should print the same results as:

\testorder{minus}{traduire}
    
\testorder{minus}{non défini}
    
\testorder{plus}{traduire}
    
\testorder{plus}{non défini}
    
\end{document}

\testorderList一个尾随可选参数来指定项目之间的分隔符(默认为空格)。

简单命令\testorder使用 进行像您这样的字符串比较\str_if_eq:nnTF,它是 的精确模拟\ifstrequal

对于复杂命令,我们将两个列表保存到可以映射在一起的序列中:我们构建一个然后可以“使用”的新序列。

在此处输入图片描述

答案2

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{expl3}

\begin{document}
    
    
\ExplSyntaxOn
  \newcommand{\testorder}[2]{
    \str_if_eq:nnTF {#1} {minus} {
      \str_if_eq:nnTF {#2} {traduire} {moins} {non~traduit}
    } {
      #1
    }
  }
  
  \tl_new:N \l_doc_tmpa_tl
  \tl_new:N \l_doc_tmpb_tl
  \clist_new:N \l_doc_tmpa_clist
  \clist_new:N \l_doc_tmpb_clist
  \seq_new:N \l_doc_tmpa_seq
  
  \newcommand{\testorderList}[2]{
    \clist_set:Nn \l_doc_tmpa_clist {#1}
    \clist_set:Nn \l_doc_tmpb_clist {#2}
    \seq_clear:N \l_doc_tmpa_seq
    \bool_do_until:nn {\clist_if_empty_p:N \l_doc_tmpa_clist} {
      \clist_pop:NN \l_doc_tmpa_clist \l_doc_tmpa_tl
      \clist_pop:NN \l_doc_tmpb_clist \l_doc_tmpb_tl
      \seq_put_right:Nx \l_doc_tmpa_seq {
        \exp_args:NVV \testorder \l_doc_tmpa_tl \l_doc_tmpb_tl
      }
    }
    \seq_use:Nn \l_doc_tmpa_seq {,\space}
  }  
\ExplSyntaxOff
    
    
\testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}

The function above should print the same results as:

\testorder{minus}{traduire}

\testorder{minus}{non défini}

\testorder{plus}{traduire}

\testorder{plus}{non défini}
    
\end{document}

相关内容