自定义类相对于包和环境的优势

自定义类相对于包和环境的优势

与包和环境相比,定义类有哪些优点/缺点?

我最近开始清理我信件前言中的一些杂乱内容。最简单的解决方案可能是创建一个包含我所有“标准”设置的包,结果如下:

\documentclass{letter}
\usepackage{myletter}
\begin{document}%
    \begin{letter}{To Name\\To Address}
        \opening{Dear}
        A letter based on the letter class and a package.
        \closing{Sincerely,}
        \encl{Some enclosure}
    \end{letter}%
\end{document}%

但是我也可以创建一个自定义字母类,它建立在字母类之上,从而给我:

\documentclass{myletter}
\begin{document}%
    \begin{letter}{To Name\\To Address}
        \opening{Dear}
        A letter based on a custom class.
        \closing{Sincerely,}
        \encl{Some enclosure}
    \end{letter}%
\end{document}%

最后,我似乎可以创建一个包,复制大量的字母类并定义一个名为字母的环境,它将允许类似以下操作:

\documentclass{anyclass}
\usepackage{myletter}
\begin{document}%
    \begin{letter}{To Name\\To Address}
        \opening{Dear}
        A letter based on a package that works in any class.
        \closing{Sincerely,}
        \encl{Some enclosure}
    \end{letter}%
\end{document}%

其中,myletter 包可以在任何或几乎任何文档类中使用。

我不明白包和类之间的区别是什么,以及何时应该使用它们。在我看来,前两个解决方案基本相同,myletter.sty 的代码与 myletter.cls 的代码非常相似。在最后一种情况下,我认为包的代码需要 letter.cls 中的大部分代码。这种方法的优点是,我可以将字母包含在任何文档类中。还有其他我遗漏的区别吗?

答案1

包和类之间的关系更多的是概念上的,而不是技术上的差异。类旨在用于做出设计决策的地方,通常用于特定的输出格式。另一方面,包包含更多的编程代码,通常适用于几种不同的情况。

在 give 的情况下,您似乎以一种非常具体的方式进行了修改,与字母的概念紧密相关。这对我来说意味着自定义类是合适的。

答案2

我认为,这取决于 的目的myletter:如果您在其中包含通常有用的宏,那么我认为将其作为一个包(以便您可以在其他地方使用它)。如果您真的只是修改 的行为letter,那么最好将其作为一个类。

当然,你可以混合使用这两种方法:myletter.sty使用通常有用的宏创建一个包。然后创建一个类myletter.cls,该类首先修改该类letter.cls,然后自动包含你的包\usepackage{myletter}。但这可能太复杂了。

答案3

我不明白包和类之间有什么区别以及何时应该使用它们。

这很简单:只有一个类(但是,可以基于另一个类(也可以基于另一个类等)),但可以有多个包。

如果您的代码适用于任何类,则应将其放入包中。如果它特定于某个类,您确实应该创建自己的类来加载原始类。这样,您可以最大限度地减少文档中的代码量以及使用错误的风险。就像本主题中已经提到的那样,您可以将代码拆分为特定宏和通用宏,并将第一个宏放入类中,将第二个宏放入包中。然后类可以加载包,而包也可以与其他类一起使用。

我为我的ydoc包做了这件事,它提供了一个ydoc类,但也提供了一个ydoc包,该包实际上只加载了几个ydoc-*包含专用宏的包。如果有人想编写文档ydoc(例如包/类文档),他/她可以简单地使用该类ydoc。如果ydoc宏应该与另一个类一起使用,则ydoc可以加载包。如果只需要特定功能,ydoc-*则可以直接加载一个或多个包。这样,您就为用户提供了很大的灵活性,而不会不必要地限制他/她。

相关内容