实施的最佳方式是什么认证随机LaTeX 中的合著者。有一个潜在的执行来自comp.text.tex
usenet 组,可以使用perltex
并进行如下修改:
\usepackage{perltex}
\perlnewcommand{\shuffleauthors}[1]{
@authlist = split /\\.*?\{c\}/, $_[0];
foreach (1 .. 3) {
foreach $i (0 .. $#authlist) {
$r = int(rand(@authlist));
($authlist[$i], $authlist[$r]) = ($authlist[$r], $authlist[$i]);
}
}
return join(" \\textcircled{r} ", @authlist);
}
\title{Test of Random Authors}
\author{\shuffleauthors{Arthur Won \and Ardur Tu \and Auzer Trea}}
\begin{document}
\maketitle
\end{document}
不幸的是,\thanks
脚注在此实现中不起作用,而且我的latex
编码能力不足以使其工作。此外,理想的实现不需要perltex
。
答案1
您可以使用expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\shuffleauthors}{m}
{
\seq_set_split:Nnn \l_tedto_shuffle_authors_seq { \and } { #1 }
\seq_shuffle:N \l_tedto_shuffle_authors_seq
\seq_use:Nn \l_tedto_shuffle_authors_seq { \and }
}
\seq_new:N \l_tedto_shuffle_authors_seq
\ExplSyntaxOff
\begin{document}
\title{Test of Random Authors}
\author{\shuffleauthors{%
Arthur Won\thanks{Supported by somebody} \and Ardur Tu \and Auzer Trea%
}}
\maketitle
\end{document}
如果您想\textcirled{r}
在每个作者之后添加,则必须修改\thanks
在零宽度框中排版标记的行为。
\documentclass{article}
\usepackage{xparse,etoolbox}
\patchcmd{\maketitle}{\rlap}{\mbox}{}{} % we want \thanks not to occupy zero width
\ExplSyntaxOn
\NewDocumentCommand{\shuffleauthors}{m}
{
\seq_set_split:Nnn \l_tedto_shuffle_authors_seq { \and } { #1 }
\seq_shuffle:N \l_tedto_shuffle_authors_seq
\seq_use:Nn \l_tedto_shuffle_authors_seq { \,\textcircled{r}\and }
\,\textcircled{r}
}
\seq_new:N \l_tedto_shuffle_authors_seq
% fix the seed
\sys_gset_rand_seed:n { 42 }
\ExplSyntaxOff
\begin{document}
\title{Test of Random Authors}
\author{\shuffleauthors{%
Arthur Won\thanks{Supported by somebody} \and Ardur Tu \and Auzer Trea%
}}
\maketitle
\end{document}
我还添加了如何通过设置种子来确保持续排版。