我正在尝试使用 \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}