使用宏构建和打印名称列表

使用宏构建和打印名称列表

我必须在不同的地方打印作者列表。在封面中,作者应该打印为

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及其clistseq设施来定义。这里,我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宏的正确含义。

相关内容