创建类文件与使用包

创建类文件与使用包

在我有限的 LaTeX 经验中,我总是发现,只需使用相关的软件包集,即使是更复杂的格式,我也能完成我想要的工作。如果我尝试为其他人创建配置,我很难证明创建类文件是合理的;相反,我只需创建一个config.tex包含相关软件包和命令的文件,然后告诉他们将\input其放在主文件中即可。但是,我确信创建类会带来一些额外的灵活性,所以我的问题是:什么时候真正值得编写类文件?

编辑 进一步澄清我到底在问什么。我的问题更多的是解决需要更专业的类的情况,比如 Alan 的回答中的情况。比如说,在为大学维护论文模板的情况下,创建自定义类而不是仅使用包有什么好处?这个beamer例子是一个很好的例子,整个布局都不同,但在这种情况下,我们要做的是创建一个完全不同的模板。不过,在论文的情况下,我猜基类会执行LoadClassof article(或类似操作),因为我们通常构建一些非常相似的东西。为此,我试图理解为什么这种方法比我上面提到的基于包的配置方法更可取。

答案1

我认为有两种截然不同的类文件:通用类文件(如memoir和 KOMA),它们致力于为文档格式的大多数方面创建统一的接口;以及针对特定文档类型的专用类文件。Peter Wilson 已经在他的回答中提到了第一种类型。

但是还有另一种类,旨在为特定文档类型提供预定义的格式。我为我的大学开设了一门论文课程。作为一所美国机构,它制定了非常特殊和愚蠢的格式指南,所有论文都必须遵循这些指南(除了在标题页等中指定特定措辞之外)。

对于这种用途,类文件非常有用。我提供了一个文档类,人们可以简单地将他们的内容“倒入”其中,知道无需考虑大学指导方针就会得到满足。至关重要的是,该类确实仅有的这个:它不加载其他包,例如字体包或参考书目包等,或者尝试猜测人们需要什么。这是大多数幼稚的类文件出错的地方。

另一个此类是beamer,它提供格式化演示文稿而不是打印文档的方法。仅使用常规包来执行此操作确实不切实际。

创建类和使用包之间的选择部分是概念性的,部分是实践性的。从概念上讲,论文不同的文档类型,因此从用户的角度来看,在命令中定义它\documentclass比在包中定义它更有意义。作为文档类,它提供了我所在大学对标题页等要求的所有特定样板语言,这是文档类所应具备的。该类定义了文档的各种组件,这些组件在逻辑上是文档类的一部分,例如目录格式、附录前的特殊页面、横向页面的格式等。

从实际情况来看,从我作为作者的角度来看,它降低了维护和文档的复杂性:我不必担心人们试图将我的包与可能不兼容的其他类一起使用,或者必须为周围的不同文档类维护额外的代码,因此,我不必记录“必须仅与类 X 一起使用”等内容,根据我的经验,我知道人们往往不会阅读这些内容。

当然,有些专用类用处不大。例如,我从来都不喜欢这个letter类,因为它对允许的环境类型有各种奇怪的限制,我更喜欢使用article我自己的信头包。

因此,在某些用例中,专用类确实非常有用。对于我的大多数文档,我仍然使用基本类 + 包,但对于大型文档,我更喜欢像 这样的一体化类memoir

答案2

我想我必须承认创建这个memoir班级是我有罪的。

在此之前,我曾参与为 ISO(国际标准组织)创建类文件,而他们的要求不断变化。最后,我为他们尝试创建一个灵活的类文件,不需要每隔几个月就进行修改。

我编写了许多软件包,它们帮助我撰写技术文章、报告和书籍,但它们的界面并不一定一致。考虑到 ISO 的经验,我认为如果我在类文件中有效地重现它们的编码,我就可以提供一致的用户界面(同时在代码共享方面创造一些内部效率)。此外,标准bookreport类之间的差异很小,当时很多人都在问如何简单地将文档转换articlereport或反之亦然。因此,我让memoir用户能够轻松地将输出切换为看起来像是由三个主要标准类中的任何一个生成的。实际上,它是三个主要标准类的超集,并且原生提供了大约 31 个常用软件包的功能。

编写新类的缺点是,一些预先存在的或新的包可能与其不兼容。memoir早期的情况就是如此,但我认为随着时间的推移(自首次发布以来已有 14 年)和包编写者的慷慨,这现在只是一个小问题,甚至根本不是问题。

编辑:这是对 Vyas 编辑的回应。回到我的 ISO 工作,我创建了一个“通用 ISO”类文件,用于处理整体 ISO 要求和术语。例如,他们使用术语如 Clause、Sub-Clause、Sub-Sub-Clause 等,我认为,直到 Sub-Sub-Sub-Sub-Sub-Clause,用于 LaTeX 中通常用\chapter\section等表示的内容,所以我创建了标题宏,如\clause\sclause\ssclause它们更类似于要求的语言。另一个通用项目是封面页,其中包含有关文档的管理详细信息。它由一系列矩形框组成,其中包含相应的文本。通用宏仅适用于文本,班级将它们放在正确的框中。该课程还处理了一个棘手的问题,即 ISO 要求在 A4 纸上提供文档,但许多参与者将在美国使用信纸,他们需要文档的格式,以便他们可以阅读并且不会超出纸张边缘。

我深度参与了 ISO 10303工业系统和自动化---产品数据的表示和交换标准包含许多部分和数千页。为此,我编写了一个程序包,处理所有 10303 样板文本、封面文本等。10303 是一个非常正式的标准,使用 EXPRESS 信息建模语言(在 10303-11 中定义),为此开发了一些编译器来检查和实现模型。该程序包包含对整个文档(包括所有文本和 EXPRESS 代码)进行排版的规定,或者仅输出 EXPRESS 代码,然后可以通过其他机制进行处理。

这可能对 Vyas 没有太大帮助,但我认为他的问题的答案是“这完全取决于......”

答案3

我认为答案取决于你使用 LaTeX 的目的。使用一些常见的用户定义宏创建“通用格式”文档是一回事。创建一组具有相同完全定义、自定义、“可打印”格式的文档是另一回事。

对于一次性使用,我认为没有太大的实际区别。无论哪种方式,功能都是相同的,尽管您不需要在类文件中\makeatletter\makeatother

但是请考虑这样的情况:您已经积累了许多不同的config.tex文件,其中一些文件只能在特定的文档类中正确使用,或者只有在使用文档类的特定选项时才能正常工作(例如,您的文件config.tex只能在特定的纸张尺寸下正常工作,或者只能在双栏文档下正常工作)。

由于您可以使用现有类为基础创建新的文档类\LoadClass,因此您可以轻松创建创建确切地使用单个无参数\documentclass命令即可获得所需的文档格式,而不必记住指定选项foobar文档类baz,然后config.tex从您的集合中包含正确的文件。

答案4

类对于设置某些功能必不可少的环境非常有用。这也意味着保守地不希望外部工具影响结果。从beamer前面提到的例子中,某些包无法使用,beamer因为它们对项目化等环境的假设发生了改变。或者在这种情况下memoir,页面设置不太喜欢无处不在的geometry包,因为它想要与相同的目标一起工作。

这看起来像是一个问题,但在很多情况下,这是因祸得福,因为包冲突更难发现,更不用说解决。相反,类可以是一个非常严格的沙箱,重新定义所有相关内容,而其余部分则完全开放。这包括例如重新定义所有常用宏,如\author\maketitle,用户应该能够使用这些宏创建类所需的结果。如果规范是以严格的方式定义的,您肯定不希望用户尝试复制标题页。相反,用户提供内容,类负责所有微调。

类的最后一个优点是memoirkoma您可以规范化前端,使所有设置和命名统一,而不必尝试记住每个包的所有不同宏名称。这种统一对于作为包加载来说毫无用处,因为您可能不想加载其中某些包。

此外,如果一个类只是软件包声明的汇编,那么它就毫无用处了。然后你可以复制粘贴软件包列表,这样就大功告成了。以一种相当迂腐的方式来说,如果一个类没有做与该特定结果相关的非琐碎声明,那么它在有意义的意义上是不实用的。

如果这些非平凡的声明不与典型的 TeX/LaTeX 宏冲突,那么从概念上讲,它又是一个伪装的包,使类变得无用。


另一方面,包则追求灵活性,并试图几乎不留下任何痕迹。在理想世界中,无论它在哪个类中运行,它都能正常工作。因此,它是一种正交方式的防御方法,包会尽可能地避免创建自己的宏名、在本地组中定义危险的宏以及在退出组时恢复原始宏等。您应该能够在表格或标题中使用它,而无需\protect处理扩展深度等。

这样,它可以与尽可能多的类相结合,而不会牺牲功能。

相关内容