与包和环境相比,定义类有哪些优点/缺点?
我最近开始清理我信件前言中的一些杂乱内容。最简单的解决方案可能是创建一个包含我所有“标准”设置的包,结果如下:
\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-*
则可以直接加载一个或多个包。这样,您就为用户提供了很大的灵活性,而不会不必要地限制他/她。