以一致的方式定义文档标题、副标题、作者、所属机构、摘要等

以一致的方式定义文档标题、副标题、作者、所属机构、摘要等

许多文档类似乎都有自己的定义文档标题和作者信息的方式,通常只有细微的差别。(\title与相比,似乎在任何地方都是标准的\author。)是否曾努力为这种元数据创建一致的接口?这可能是许多文档类支持的所有元数据的联合,具有现有文档类的适配器,如果不支持设置,可能会发出警告。类似于:

\title{Document title}
\subtitle{Document subtitle}
\author{First Author, [email protected], affiliation=..., }
\abstracttext{...}
\AtBeginDocument{\maketitleandabstract}

这种接口的好处是:

  • 用户只需学习一种定义文档元数据的方法
  • 支持此接口的两个文档类可以互换使用
  • 对于不支持此接口的文档类,可以通过包提供包装器

在我们的网站上,我们有一个自主开发的解决方案,非标准语法。我想知道其他人是否以及如何解决这个问题。

答案1

这里实际上有两个问题:如何定义接口以及如何实现它。我只解决前者,因为实现它需要几个小时的工作。

首先,您必须决定是否使用非标准命令,例如用\Title\Author代替\title\author。有许多类和不同的实现。例如,标准类(articlereportbook)仅允许一个\author命令,其他类则希望不同的作者使用不同的\author命令(amsart这样做)。

我假设您使用\title多个\author命令以获得最大的灵活性。我认为最好的方法是使用键值语法。

一个文件总是有一个标题,有时还有一个简短的标题作为标题或副标题。我会这样做

\title[
  subtitle=A subtitle,
  short-title=A short title
]{The very long title of this document}

而不是提供一堆命令,例如\subtitle\shorttitle:这样所有的数据都集中在一个地方。作者信息也类似:

\author[
  affiliation=University of Someplace,
  affiliation-secondary=Institute of Silly Investigations,
  address=42, Hidden Road, Someplace,
  [email protected],
  [email protected],
  abbreviated-name=A. Uthor,
  thanks=Research grant 1234567890,
]{Abigail Uthor}

\author[
  key=writer,
  corresponding,
  affiliation=University of Nowhere,
  [email protected],
  long-name=Winfried Riter,
]{W. Riter}

\author[
  share=writer,
  [email protected],
]{B. C. Dull}

请注意,我使用了几个可以由您的班级使用或不使用的键。例如,key=writer可以使两个或多个作者之间共享隶属关系信息。信息越详细和分类,就越容易实现一组处理它的命令。

说到用户界面,像 这样的内容\AtBeginDocument{\maketitleandabstract}肯定不是文档作者应该输入的内容。这将由班级完成;\maketitle也可以使用经典方法。

我也希望把这些信息 \begin{document}。如果你这样做,你可以摆脱添加命令的负担\maketitle:只需定义一个articledata环境,其结束时会自动发出\maketitle。所以

\documentclass{myclass}
<packages>
<definitions>

\begin{document}
\begin{articledata}
\title[...]{...}

\author[...]{...}

\author[...]{...}

\abstract{
  this is the abstract
}

\keywords{
  a list of keywords
}
\end{articledata}

<paper starts here>

\end{document}

使用一个简单的开关,您可以警告诸如\author\title等命令\abstract必须进入环境articledata(或发出错误消息)。 还可以很容易地提供一个带有选项的包,compatibility该选项可以重新定义命令和环境,以便文档与 兼容article

答案2

我有一个类可以做到这一点。它被想象地称为myclass。我写这篇文章是因为我对期刊课程的学习方式感到沮丧,因为所有课程都以不同的方式获取相同的信息。原因如下:

  1. 当我开始写文章时,我很少知道要投稿给哪家期刊。因此,根据期刊的要求进行定制是最后要做的事情。

  2. 遗憾的是,我经常会向多家期刊提交一篇文章。对于是否应该以“内部风格”提交,我始终有点模棱两可,早期我会以内部风格提交,以防万一。但更改期刊风格可能会对文档造成较大改动,因此采用更“即插即用”的方法是有意义的。

  3. 文章有多个版本的情况并不罕见:一个用于提交,一个用于 arXiv,一个用于其他存储库;每个版本都有自己的特点。因此,能够更改一个选项会让生活变得轻松很多。

  4. 不幸的是,期刊不仅仅提供课程。它们还倾向于提供大量“有用”的宏。这些宏经常与我自己的宏发生冲突 - 但由于我在写作时不知道要提交给哪本期刊,所以我不想在写作时考虑这些冲突。理想情况下,我根本不想考虑它们。

基本理念是:在撰写文章时,我希望能够利用 LaTeX 中所有使撰写文章变得容易的功能。考虑要向哪个期刊投稿与此相冲突。但是一旦我写完了文章,我就不想浪费大量时间(根据上述第 4 点,这确实可能很多)来改变一切。

我的课程不是很优雅或复杂。它是在我偶然发现这个网站之前很久写的,从那时起我学到了很多东西。所以我现在可能会做完全不同的事情。尽管如此,它还是一个例子。

(顺便说一句,有些期刊接受输入的方式确实很奇怪。让它们正确无误……很困难。)

至于为什么是类而不是包,它使界面更简单。我所需要做的就是将一个选项更改为我的类。如果我将它设为包,那么我必须更改类,并且可能还要更改包中的一些选项。工作量太大了!

答案3

我确实多次想到了这个问题。但是,我做梦也没有想到要尝试一个通用的解决方案。思考这个问题引起了与@tohecz 表达的类似担忧。但是,看到@egregs 的解决方案后,我受到了启发,决定对其进行扩展。

剩下的问题是,使用一组有限的命令来收集元数据的接口无法覆盖所有情况。因此,理想的接口必须能够提供允许用户创建自定义元数据命令(例如“ \newmetacmd”)的命令,可以重新定义现有命令的命令,以及基本重新设计外观的命令。使用这种方法会出现如何将自定义命令的信息包含在标题中的问题。(如果它们是自定义的,则无法预先编码\maketitle。好吧,有可能,但非常有限......)我解决这个问题的想法是将来自一个宏的每个信息集合视为\title[...]{...}一个块。因此,\title宏将在幕后产生类似的东西。所有这些块/块都将在(或可能)环境\block1的末尾使用循环收集。顺序将由序言中s(或更好的s)的出现决定,并且它将以某种方式受到影响 - 也与预定义命令、和有关。详细来说它看起来像articledatadocumentdata\newmetacmd\newttlblock\title\author\date

\newttlblock[integer]{newinfo}[kv1][kv2][kv3][kv4]

(其中整数参数给出块的序数位置;如果为空,它将是最后一个块之后的下一个块),然后将用作

\begin{docdata}
\title[...]{...}
...
\newinfo[kv1=...]{...}
\end{docdata}

正如上文所述,可能会出现类似

\ttlblocksetup{newinfo}{<space below>}{<alignment>}{<font>}

并且

\renewttlblock[<n>]{title/author/date}[kv1][kv2][kv3][kv4]

功能当然也可以包括多位作者(指向 AMS 类)的使用。

相关内容