下面有一行在取消注释后不起作用,因为我猜想宏的输出不会被解析为字符串。有办法解决这个问题吗?我仍然希望有一个可以通用地作用于 变量\AB@authlist
的方法authblk
。
\documentclass{article}
\usepackage{authblk}
\makeatletter
\def\getfirst#1,#2\relax{{#1}}
\def\ABfirstauthor{
%\getfirst \expandafter{\AB@authlist}\relax % this line doesn't work if it is uncommented
\getfirst First Author, Second Author, Third Author\relax
}
\makeatother
\author{First Author}
\author{Second Author}
\author{Third Author}
\begin{document}
\ABfirstauthor
\end{document}
答案1
我认为最好\author
以干净的形式获取作者姓名,以便可以随时检索。
\documentclass{article}
\usepackage{authblk}
\NewCommandCopy{\authblkauthor}{\author}
\ExplSyntaxOn
\seq_new:N \g_bamberg_authors_seq
\RenewDocumentCommand{\author}{om}
{
\seq_gput_right:Nn \g_bamberg_authors_seq { #2 }
\IfNoValueTF { #1 } { \authblkauthor{#2} } { \authblkauthor[#1]{#2} }
}
\NewExpandableDocumentCommand{\ABgetauthor}{m}
{
\seq_item:Nn \g_bamberg_authors_seq { #1 }
}
\ExplSyntaxOff
\author{First Author}
\author{Second Author}
\author{Third Author}
\begin{document}
\ABgetauthor{1}
\ABgetauthor{3}
\end{document}
答案2
如果你使用
\makeatletter \show\AB@authlist \makeatother
您会发现该命令的内容相当复杂,不符合“第一作者,第二作者”的想法。
看起来作者总是在 a\Authfont
和 a之间\protect
,因此您可以尝试使用正则表达式来提取作者:
\documentclass{article}
\usepackage{authblk}
\ExplSyntaxOn\makeatletter
\seq_new:N\l__john_tmpa_seq
\cs_new_protected:Nn \john_getfirst_authblk:n
{
\regex_extract_once:nnN
{ \c{Authfont}([^\c{protect}]+)}
{#1}\l__john_tmpa_seq
\seq_item:Nn \l__john_tmpa_seq {2}
}
\newcommand\ABfirstauthor{%
\exp_args:No \john_getfirst_authblk:n{\AB@authlist}
}
\ExplSyntaxOff
\makeatother
\author{First Author}
\author{Second Author}
\author{Third Author}
\makeatletter \show\AB@authlist \makeatother
\begin{document}
\ABfirstauthor
\end{document}