我想知道是否可以计算\author{}
宏中设置的作者数量。我需要这个来修改标题页的输出。我目前正在硬编码以下内容:
\emph{Author:}\\
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par%
无论是否设置了多个作者,此命令都会打印“Author”。应通过计算传递给宏的作者数量,然后根据结果修改输出来更改此设置。
我想说计算作者的关键在于\and
声明中,但不幸的是我不知道如何在这个关键字处拆分字符串。
答案1
在评论中,您确认您以标准方式收集文档的作者。在这种情况下,您可以使用分隔参数来获取实际的作者数量(作为对您的问题的直接回答):
\newcounter{authors}
\stepcounter{authors}
\def\count@and#1\and#2{%
\ifx#2\@nil\else
\stepcounter{authors}\expandafter\count@and\fi
}
现在,如果你使用\count@and...\and...\and...\and\@nil
,\theauthors
将保存由 分隔的元素数。你可以使用以下补丁\and
将其包括在内,以计算由 定义的作者。\author
\let\latex@author\author
\def\author#1{%
\count@and#1\and\@nil
\latex@author{#1}
}
以类似于@egreg的回答你可以说:
\xpatchcmd{\@maketitle}
{\begin{tabular}}
{\author@or@authors\begin{tabular}}
{}{}
\def\author@or@authors{\textit{Author\ifnum\theauthors>1s\fi:}\\}
完整代码如下:
\documentclass{article}
\usepackage{xpatch}
\makeatletter
\newcounter{authors}
\stepcounter{authors}
\def\count@and#1\and#2{%
\ifx#2\@nil\else
\stepcounter{authors}\expandafter\count@and\fi
}
\let\latex@author\author
\def\author#1{%
\count@and#1\and\@nil
\latex@author{#1}
}
\xpatchcmd{\@maketitle}
{\begin{tabular}}
{\author@or@authors\begin{tabular}}
{}{}
\def\author@or@authors{\textit{Author\ifnum\theauthors>1s\fi:}\\}
\makeatother
\title{title}
\author{John Doe}%\and Jane Doe}
\begin{document}
\maketitle\theauthors
\end{document}
答案2
我不知道您如何修改\@maketitle
,因此我只做了您所说的更改;想法是添加\author@or@authors
而不是\emph{Author:}\\
,并对辅助宏进行以下定义:
\documentclass{article}
\usepackage{xpatch,xstring}
\makeatletter
\xpatchcmd{\@maketitle}
{\begin{tabular}}
{\author@or@authors\begin{tabular}}
{}{}
\newcommand\author@or@authors{%
\emph{Author%
\expandafter\IfSubStr\expandafter{\@author}{\and}{s}{}%
:}\\%
}
\noexpandarg
\makeatother
\begin{document}
\title{A title}
\author{John Doe \and Jane Doe}
\maketitle
\end{document}