摘要作者列表

摘要作者列表

我正在写一篇学术论文,手动格式化作者列表没有问题,例如

\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 已经定义了用于处理文档元数据的\setupdocumentand \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∗∗

位于页面中央,脚注中包含电子邮件地址。

我希望这对我以外的人也有帮助。

相关内容