将 expl3 clist 映射到命令序列列表

将 expl3 clist 映射到命令序列列表

我正在尝试使用 \csname \endcsname 将一个 clist 映射到一个命令序列 clist,然后使用 clist_use 打印该列表:

以下是 MWE:

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\csI{}{Command~1}
\NewDocumentCommand\csII{}{Command~2}
\NewDocumentCommand\csIII{}{Command~3}

\ExplSyntaxOn

\DeclareExpandableDocumentCommand\exin{m}{\dgmn_expressed_in:n { #1 }}

\cs_new:Npn \dgmn_expressed_in:n #1
{
\clist_clear_new:N \l_clist_abbs
\clist_put_left:Nn \l_clist_abbs { #1 }
\clist_remove_duplicates:N \l_clist_abbs
\clist_map_inline:Nn \l_clist_abbs { \csname cs#1\endcsname }
\clist_use:Nnnn \l_clist_abbs { ~and~ }{ ,~ }{ ,~and~ }
}

\ExplSyntaxOff

\begin{document}
What I get:
\begin{itemize}
    \item \exin{I}
    \item \exin{II,I}
    \item \exin{II,I,III}
\end{itemize}

What I want:
\begin{itemize}
    \item \csI
    \item \csII\ and \csI
    \item \csII, \csI, and \csIII
\end{itemize}
\end{document}

输出如下:

答案1

您的\exin\dgmn_expressed_in:n并非完全可扩展;这样声明并不能改变事实。

您首先要映射作为参数给出的逗号列表,填充 clist,然后输出它。

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand\csI{}{Command~1}
\NewDocumentCommand\csII{}{Command~2}
\NewDocumentCommand\csIII{}{Command~3}

\ExplSyntaxOn

\NewDocumentCommand\exin{m}
 {
  \dgmn_expressed_in:n { #1 }
 }

\clist_new:N \l_dmgn_abbs_clist

\cs_new_protected:Npn \dgmn_expressed_in:n #1
 {
  \clist_clear:N \l_dmgn_abbs_clist
  % map the input
  \clist_map_inline:nn { #1 }
   {
    \clist_put_right:Nx \l_dmgn_abbs_clist
     {
      \use:c 
       {
        cs ##1
       }
     }
   }
  \clist_remove_duplicates:N \l_dmgn_abbs_clist
  \clist_use:Nnnn \l_dmgn_abbs_clist { ~and~ }{ ,~ }{ ,~and~ }
}

\ExplSyntaxOff

\begin{document}
What I get:
\begin{itemize}
    \item \exin{I}
    \item \exin{II,I}
    \item \exin{II,I,III}
\end{itemize}

What I want:
\begin{itemize}
    \item \csI
    \item \csII\ and \csI
    \item \csII, \csI, and \csIII
\end{itemize}
\end{document}

在此处输入图片描述

相关内容