Latex中cls和sty文件有何区别?

Latex中cls和sty文件有何区别?


 

资源

本文对 LaTeX 中 .cls 和 .sty 文件进行介绍,主要参考了 What are .cls and .sty files?How are they different? 以及 LaTeX2e for class and package writers

什么是 .cls 和 .sty 文件?

一般来说,.cls.sty 文件都是增加 LaTeX 功能的补足文件。它们在我们排版文章是时对应的使用 documentclass{}usepackage{} 加载,在包内部则对应的使用 LoadClass,LoadClassWithOptionsRequirePackage,RequirePackageWithOptions 加载。我们通常将 .cls 文件称之为类(classes)文件,将 .sty 文件称之为风格(style)文件或者包(package)。

不同点

虽然它们都可以包含任意的 TeX 和 LaTeX 代码,但是它们的使用方式不同。我们必须通过 documentclass 加载一个类文件,并且在一个 LaTeX 文件中只能出现一次,通常也是第一个出现的命令。而另一方面,包是一个可选项,它可以根据我们的需求加载任意多个(在开始文档之前)。

编写原则

什么时候编写一个类文件?什么时候编写一个风格文件?或者说什么命令应该放到 .cls 文件?什么命令应该放到 .sty 文件中呢?一个经验法则是:

如果一个命令是用来控制文档结构的,则应该放到类文件中;否则应该放到包文件中。

如果一个命令可以被其他所有的文档使用,那么将这个命令放置到一个包中;如果不是,则将它放到一个类文件中。

当一个命令使上述两条规则冲突的时候,优先考虑第一条规则。如 section 命令几乎在所有的文档中都使用,但因为其是用来控制文档结构的,我们将其放置到类文件中。

一般情况下,类文件主要分为两个部分:一种是标准类文件,如:article,report 或者 letter;另一种是基于标准类文件的扩展文件,如基于 articleproc 文件类。当然我们也可以不基于任何标准类编写全新的类文件,通常这比较复杂,需要我们重新定义大量常用的命令,因此不建议这么做。

额外说明:如果我们要自己定义一个不基于标准类的类文件,应确保至少包含以下四个部分:定义 ormalsize 命令,设置 extwidth, extheight 的值以及设置页编码方式.下面给出一个最小类文件的例子,当然对于大部分类其包含的命令是远远多于以下类文件的:

NeedsTeXFormat{LaTeX2e}
ProvidesClass{minimal}[1995/10/30 Standard LaTeX minimal class]

enewcommand{
ormalsize}{fontsize{10pt}{12pt}selectfont}
setlength{	extwidth}{6.5in}
setlength{	extheight}{8in}
pagenumbering{arabic} % needed even though this class will
                       % not show page numbers

对于包,或者说是风格文件,它用来提供所有其他类文件不提供的命令。它们广义上被分为两类:对类文件进行修正,或者添加额外功能。

例如 graphicx 包提供包含图像的方法和将所有图形效果应用到文档元素中。这个包本质上可以应用到所有类文件上。另一个例子——sectsty 包。该包提供了方法用来自定义标准类文件(article,report,book)中的段落开头(section headers)。所以,如果试图将它和 memoir 包一起使用,将导致它重写 memoir 的创建段落开头的方法,进而导致出现严重错误。

总结

.cls.sty 文件都可以使用 LaTeX 中的任意代码以提供一些功能和命令。类文件一般用来控制文档的结构并提供该类特有的命令,如段落命令、字体命令、特定的页眉页脚设置等。包文件用来提供其他的所有的功能和命令。

大部分情况下我们应该考虑将我们的命令放置到包中,这样我们可以根据需求任意的选择是否加载这些包。如果我们真的需要编写类文件,应该基于现有的标准类文件进行编写,这样可以节省我们很多命令的定义(如上面提到的 section命令以及其他常用的字体选择命令)。同时类文件的内容不宜过多,当我们类文件的内容过多时,我们应该考虑是否将其中部分命令单独提取出来作为一个包。





参考:https://www.jianshu.com/p/12b4a4b3afce
原文地址:https://www.cnblogs.com/tsingke/p/10373382.html