我的情况非常相似这个问题:我有一个成对的列表(名字,姓氏),我想处理它以生成姓氏\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
代表姓氏。