我正在写一篇学术论文,手动格式化作者列表没有问题,例如
\startnarrower[middle]
\startalignment[middle]
Author One\thanks{[email protected]},
Author Two\thanks{[email protected]},
Author Three\thanks{[email protected]}
\stopalignment
\stopnarrow
当然,这有点令人讨厌。最好将此结构抽象为以下内容:
\author{Author One}{[email protected]}
\author{Author Two}{[email protected]}
\author{Author Three}{[email protected]}
\placeauthorlist
但是,我不知道如何实现这样的结构。我用谷歌搜索并查看了 ConTeXt wiki,但找不到太多内容。有人知道一些可能有用的资源或类似的实现吗?
编辑:我找到了一个可以满足我需求的解决方案。我不确定它是否符合惯用方式,而且鉴于我从未编写过模块代码,我不知道它是否真正“正确”,但它确实产生了所需的输出。
如果您能以任何方式改进它,请随意,我会给您答案。
答案1
我会设计这样的界面:
\defineauthor[john][name={John Doe}, email={[email protected]}, affiliation={....}]
\defineauthor[jill][name=..., email=..., affiliation=...]
\setupdocument
[title={....},
authors={john, jill}]
\startdocument
....
\stopdocument
请注意,ConTeXt 已经定义了用于处理文档元数据的\setupdocument
and \startdocument
...命令。calls和calls ,因此您不需要明确添加它们(尽管添加它们没有坏处)。为了使上述设置正常工作,您需要定义:\stopdocument
\startdocument
\starttext
\stopdocument
\stoptext
\startsetups document:start
\documentvariable{title} % Use this to get the document title
\documentvariable{author} % Use this to get the list of authors
\stopsetups
\startsetups document:stop
% If you want to place something at the end of a document
\stopsetups
因此,剩下的就是定义\defineauthor
命令。如果您使用的是 MkIV,您可以简单地使用:
\definenamespace
[documentauthor] % name of internal varialbles
[type=module,
name=author,
command=yes, % Create \defineauthor
style=yes, % Create \useauthorstyleandcolor
setup=list, % Create \setupauthor
parent=documentauthor,
]
这将创建所需的命令。
上述操作对于添加作者来说可能显得有些过度,但它确实为您提供了以下功能:
跨作者继承密钥。假设您有多个作者来自同一个机构,并且您不想每次都传递隶属关系。那么您可以这样做:
\defineauthor[univ1][afficiation={TeX University}] \defineauthor[john][univ1][name=..., email=...] \defineauthor[jill][univ1][name=..., email=...]
并且
john
和都jill
将继承 的从属关系univ1
。创建作者数据库:您可以在单独的文件中创建作者数据库并使用
\environment author-database
在所有文件中。这样,您只需定义一次作者,即可在所有文档中使用它们。
编辑:这是一个完整的例子:
\definenamespace
[documentauthor] % name of internal varialbles
[type=module,
name=author,
command=yes, % Create \defineauthor
style=yes, % Create \useauthorstyleandcolor
setup=list, % Create \setupauthor
parent=documentauthor,
]
\define[1]\useauthor
{\edef\currentauthor{#1}%
{\useauthorstyleandcolor{style}{color}
\authorparameter{name}}%
\space
(\mono{\authorparameter{email}})}
\startsetups document:start
\startalignment[middle]
{\ssbfc\setupinterlinespace
\documentvariable{title}
\endgraf}
\blank[medium]
\processcommacommand[\documentvariable{author}]\useauthor
\blank[big]
\stopalignment
\stopsetups
\startsetups document:stop
% If you want to place something at the end of a document
\stopsetups
\setupauthor[style=sansbold]
\defineauthor[john][name={John Doe}, email={[email protected]}]
\defineauthor[jill][name={Jill Doe}, email={[email protected]}]
\setupdocument[title={Random title}, author={john,jill}]
\startdocument
\input knuth
\stopdocument
答案2
因此,我弄清楚了如何使作者列表如上所述工作;但是,我不确定它是否是惯用的 ConTeXt:
\unprotect
\newcount\authcount
\authcount0\relax
\define[2]\author{\advance\authcount1\relax
\expandafter\def\csname getauthor\the\authcount\endcsname{#1}
\expandafter\def\csname getemail\the\authcount\endcsname{#2}}
\define[1]\putauthor{\csname getauthor#1\endcsname\thanks{\csname getemail\recurselevel\endcsname}}
\define[]\placeauthors{
\startnarrower[middle]
\startalignment[middle]
\doloop{
\ifnum\recurselevel<\authcount
\ifnum\recurselevel>1
\mbox{\putauthor{\recurselevel}},
\else
\putauthor{\recurselevel},
\fi
\else \exitloop \fi
}
\ifnum\authcount>1 and
\mbox{\putauthor{\the\authcount}}
\else
\putauthor{\the\authcount}
\fi
\stopalignment
\stopnarrower
}
\protect
使用方法:
\author{Name One}{[email protected]}
\author{Name Two}{[email protected]}
\author{Name Three}{[email protected]}
\author{Name Four}{[email protected]}
\placeauthors
这将生成以下输出(尽管命令的转换设置\thanks
可能会改变脚注符号):
Name One∗, Name Two†, Name Three‡, and Name Four∗∗
位于页面中央,脚注中包含电子邮件地址。
我希望这对我以外的人也有帮助。