许多文档类似乎都有自己的定义文档标题和作者信息的方式,通常只有细微的差别。(\title
与相比,似乎在任何地方都是标准的\author
。)是否曾努力为这种元数据创建一致的接口?这可能是许多文档类支持的所有元数据的联合,具有现有文档类的适配器,如果不支持设置,可能会发出警告。类似于:
\title{Document title}
\subtitle{Document subtitle}
\author{First Author, [email protected], affiliation=..., }
\abstracttext{...}
\AtBeginDocument{\maketitleandabstract}
这种接口的好处是:
- 用户只需学习一种定义文档元数据的方法
- 支持此接口的两个文档类可以互换使用
- 对于不支持此接口的文档类,可以通过包提供包装器
在我们的网站上,我们有一个自主开发的解决方案,非标准语法。我想知道其他人是否以及如何解决这个问题。
答案1
这里实际上有两个问题:如何定义接口以及如何实现它。我只解决前者,因为实现它需要几个小时的工作。
首先,您必须决定是否使用非标准命令,例如用\Title
和\Author
代替\title
和\author
。有许多类和不同的实现。例如,标准类(article
、report
和book
)仅允许一个\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
。我写这篇文章是因为我对期刊课程的学习方式感到沮丧,因为所有课程都以不同的方式获取相同的信息。原因如下:
当我开始写文章时,我很少知道要投稿给哪家期刊。因此,根据期刊的要求进行定制是最后要做的事情。
遗憾的是,我经常会向多家期刊提交一篇文章。对于是否应该以“内部风格”提交,我始终有点模棱两可,早期我会以内部风格提交,以防万一。但更改期刊风格可能会对文档造成较大改动,因此采用更“即插即用”的方法是有意义的。
文章有多个版本的情况并不罕见:一个用于提交,一个用于 arXiv,一个用于其他存储库;每个版本都有自己的特点。因此,能够更改一个选项会让生活变得轻松很多。
不幸的是,期刊不仅仅提供课程。它们还倾向于提供大量“有用”的宏。这些宏经常与我自己的宏发生冲突 - 但由于我在写作时不知道要提交给哪本期刊,所以我不想在写作时考虑这些冲突。理想情况下,我根本不想考虑它们。
基本理念是:在撰写文章时,我希望能够利用 LaTeX 中所有使撰写文章变得容易的功能。考虑要向哪个期刊投稿与此相冲突。但是一旦我写完了文章,我就不想浪费大量时间(根据上述第 4 点,这确实可能很多)来改变一切。
我的课程不是很优雅或复杂。它是在我偶然发现这个网站之前很久写的,从那时起我学到了很多东西。所以我现在可能会做完全不同的事情。尽管如此,它还是一个例子。
(顺便说一句,有些期刊接受输入的方式确实很奇怪。让它们正确无误……很困难。)
至于为什么是类而不是包,它使界面更简单。我所需要做的就是将一个选项更改为我的类。如果我将它设为包,那么我必须更改类,并且可能还要更改包中的一些选项。工作量太大了!
答案3
我确实多次想到了这个问题。但是,我做梦也没有想到要尝试一个通用的解决方案。思考这个问题引起了与@tohecz 表达的类似担忧。但是,看到@egregs 的解决方案后,我受到了启发,决定对其进行扩展。
剩下的问题是,使用一组有限的命令来收集元数据的接口无法覆盖所有情况。因此,理想的接口必须能够提供允许用户创建自定义元数据命令(例如“ \newmetacmd
”)的命令,可以重新定义现有命令的命令,以及基本重新设计外观的命令。使用这种方法会出现如何将自定义命令的信息包含在标题中的问题。(如果它们是自定义的,则无法预先编码\maketitle
。好吧,有可能,但非常有限......)我解决这个问题的想法是将来自一个宏的每个信息集合视为\title[...]{...}
一个块。因此,\title
宏将在幕后产生类似的东西。所有这些块/块都将在(或可能)环境\block1
的末尾使用循环收集。顺序将由序言中s(或更好的s)的出现决定,并且它将以某种方式受到影响 - 也与预定义命令、和有关。详细来说它看起来像articledata
documentdata
\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 类)的使用。