处理存储在宏中的列表列表

处理存储在宏中的列表列表

我的情况非常相似这个问题:我有一个成对的列表(名字,姓氏),我想处理它以生成姓氏\scshape。它与@egreg的解决方案配合得很好。但是当我想先将列表存储在宏中时,它不再被处理……目的是将命令放在\Bar序言中,然后在文档中稍后处理列表。

我见过带有 expl3 语法的代码(例如这里,仍然是 @egreg!),但我真的不明白 :(

任何帮助都值得感激!

进一步说,是否可以处理没有提供名字的情况?

\documentclass{article}
\usepackage{xparse}

\newcommand{\Bar}[1]{\def\bar{#1}}

\NewDocumentCommand{\foo}{>{\SplitList{;}}m}{%
    \def\respdelim{\def\respdelim{, }}%
    \def\aze##1{\respdelim\fooaux{##1}}%
    \ProcessList{#1}{\aze}%
}
\NewDocumentCommand{\fooaux}{>{\SplitArgument{1}{,}}m}{\fooauxa#1}
\NewDocumentCommand{\fooauxa}{>{\TrimSpaces}m>{\TrimSpaces}m}{\IfValueTF{#1}{\IfValueTF{#2}{#1\space{\scshape #2}}{#1}}{\IfValueTF{#2}{{\scshape#2}}}}

\begin{document}
    \foo{x,1;y;z,2}
    
    \foo{First Name1, Last Name1; First Name2, Last Name2; First Name3; ,Last Name4}
    
    \Bar{First Name1, Last Name1; First Name2, Last Name2; First Name3; ,Last Name4} % store list in \bar
    \foo{\bar} % process \bar
    
\end{document}

答案1

我将采取不同的方法,定义一个\usenames以模板作为参数的命令。

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\IfNotEmpty}{mm}
 {
  \tl_if_empty:nF {#1} { #2 }
 }

\NewDocumentCommand{\addnames}{m}
 {
  \nbur_names:n { #1 }
 }

\NewDocumentCommand{\usenames}{+m}
 {
  \cs_set:Nn \__nbur_names_process:nn { #1 }
  \__nbur_names_process:
 }

\seq_new:N \g_nbur_names_seq
\seq_new:N \l__nbur_names_temp_seq
\cs_new:Nn \__nbur_names_process:nn { }
\cs_generate_variant:Nn \__nbur_names_process:nn { ee }

\cs_new_protected:Nn \nbur_names:n
 {
  \seq_set_split:Nnn \l__nbur_names_temp_seq { ; } { #1 }
  \seq_map_inline:Nn \l__nbur_names_temp_seq
   {
    \seq_gput_right:Nn \g_nbur_names_seq { ##1 }
   }
 }

\cs_new_protected:Nn \__nbur_names_process:
 {
  \seq_map_inline:Nn \g_nbur_names_seq
   {
    \seq_set_split:Nnn \l__nbur_names_temp_seq { , } { ##1 }
    \__nbur_names_process:ee
     { \seq_item:Nn \l__nbur_names_temp_seq { 1 } }% first name
     { \seq_item:Nn \l__nbur_names_temp_seq { 2 } }% last name
   }
 }

\ExplSyntaxOff

\begin{document}

\addnames{First Name1, Last Name1; First Name2, Last Name2; First Name3; ,Last Name4}

\usenames{\IfNotEmpty{#1}{#1 }\IfNotEmpty{#2}{\textsc{#2}}\par}

\end{document}

在此处输入图片描述

在模板中,#1代表名字,#2代表姓氏。

相关内容