我必须在不同的地方打印作者列表。在封面中,作者应该打印为
Name1 \\
Name2 \\
Name3
但在其他地方,它应该以内联方式打印。
Name1, Name2 and Name3
我有一个构建第一个要求的宏
%%% 多作者命令
\newcommand{\listof@authors}{}
\RequirePackage{etoolbox}
\newcommand{\mainauthor}[1]{%
\ifdefempty{\listof@authors}{%
\gappto\listof@authors{#1}
}{%
\gappto\listof@authors{\\#1}
}
}
但是现在,我认为我需要将名称存储在类似对象的数组中,并创建两个不同的宏来打印名称。我可以使用哪个包?(注意:我需要能够检测要添加的列表的最后一个元素,and
而不是,
)。
答案1
此类列表可以非常轻松地使用expl3
及其clist
或seq
设施来定义。这里,我seq
以一个例子来说明:
首先定义一个全局变量,例如,\g_textnik_listofauthors_seq
每位作者都添加到列表中\seq_put_right:Nn
\printauthorstacked
显示列表(嗯,序列)\seq_use:Nn
并\printauthorinline
以内联方式执行,使用单独的分隔符。第一个分隔符,
用于两个元素,第二个用于两个以上的元素,最后一个用于最后两个元素,根据 OP,这应该是“and”
如果必须在另一个上下文中访问最后一项,请在适当的包装命令中使用\seq_get_right:NN
宏。expl3
\documentclass{article}
%\RequirePackage{etoolbox}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_textnik_listofauthors_seq
\newcommand{\mainauthor}[1]{%
\seq_put_right:Nn \g_textnik_listofauthors_seq {#1}
}
\newcommand{\printauthorstacked}{%
\seq_use:Nn \g_textnik_listofauthors_seq {\par}
}
\newcommand{\printauthorinline}{%
\seq_use:Nnnn \g_textnik_listofauthors_seq {,\ } {,\ } {\ and\ }
}
\ExplSyntaxOff
\begin{document}
\mainauthor{Groucho}
\mainauthor{Zeppo}
\mainauthor{Harpo}
\mainauthor{Gummo}
\mainauthor{Chico}
\printauthorstacked
\printauthorinline\ wrote this paper
\end{document}
答案2
此类列表可以非常轻松地通过 TeX 原语定义:
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\readauthors#1{\def\authorsL{}\readauthorsA#1,,}
\def\readauthorsA#1,{\ifx,#1,\else\addto\authorsL{\data{#1}}%
\expandafter\readauthorsA\fi}
\def\printstacked{\par\def\data##1{\hbox{##1}}\authorsL}
\def\printinline{\def\data##1{##1%
\def\data####1####2{\ifx####2\relax\space and ####1\else , ####1\fi####2}}%
\authorsL\relax
}
\readauthors{First,Second,Third}
\printstacked
Test: \printinline
\bye
该列表存储在表单中\data{First}\data{Second}...
,您所需要的只是定义\data
宏的正确含义。