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,\LoadClassWithOptions\RequirePackage,\RequirePackageWithOptions 加载。我们通常将 .cls 文件称之为类(classes)文件,将 .sty 文件称之为风格(style)文件或者包(package)。

不同点

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

编写原则

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

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

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

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

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

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

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{minimal}[// Standard LaTeX minimal class]
\renewcommand{\normalsize}{\fontsize{10pt}{12pt}\selectfont}
\setlength{\textwidth}{.5in}
\setlength{\textheight}{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

Latex中cls和sty文件有何区别?的更多相关文章

  1. Latex中画出函数文件的调用关系拓扑图

    流程图,思维导图,拓扑图通常能把我们遇到的一些复杂的关系结构用图形的方式展现出来.在Latex中要想画这样的拓扑图,有一个很好用的绘图工具包 pgf/tikz . 1.pgf/tikz的安装:pgf/ ...

  2. 在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  3. latex之在windows环境下能够在latex中使用中文

    今天要把前段时间的实验用英语先记录下来,自己就想根据原来会议的模版弄一个简易的页面(英语),突然想到之前用英文模板时是不能输入中文的,于是想着怎么在latex中输入中文,折腾了许久,终于成功了,现在分 ...

  4. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  5. paper 48: Latex中如何制作参考文献

    文章写到现在,最后一步就要大功告成了!reference,let's go! 一.用Google来做Latex的bib文件 1. 打开scholar.google.com 2. 定制   Schola ...

  6. The usage method of reference with bibtex in Latex【latex中参考文献的使用方法】

    如何在latex中以Bibtex文件方式引用参考文献? 以IEEEtran模板为例: 1.制作bibtex参考文献库.方法如下: ①建立myreference.bib文件: ②在Google scho ...

  7. 读书笔记-详解C程序开发中 .c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  8. latex中pdflatex与xelatex的区别

    1. PDFTeX程序:Tex语言的一个实现,也就是把Tex语言转换为排版的一个程序.它会把TeX 语言写的代码直接编译成 PDF文件. 2. PDFLaTeX命令:PDFTeX程序中的命令,用来编译 ...

  9. LaTeX中的各种距离设置总结

    LaTeX中的各种距离设置总结   1. 页面设置 A4 会给你一个较小的页面,为了使用更多的控制,可用 geometry宏包  和  命令 \layout . 2. 改变长度 在latex里改变长度 ...

随机推荐

  1. 拯救者Y720-gtx1050-window10-配置tensorflow-gpu环境

    https://www.cnblogs.com/31415926535x/p/10536572.html 概述 因为选修了数字图像这门课,,要做一个人脸识别的项目,和室友打算利用tensorflow来 ...

  2. Apache Atlas

    atlas英 [ˈætləs] 阿特拉斯. 美 [ˈætləs] n.地图集;〈比喻〉身负重担的人 == Apache Atlas Version: 1.1.0 Last Published: 201 ...

  3. [python]Flask-migrate简单入门

    Flask-Migrate是用于处理SQLAlchemy 数据库迁移的扩展工具.当Model出现变更的时候,通过migrate去管理数据库变更. Migrate主要有3个动作,init.migrate ...

  4. 机器学习系列-tensorflow-03-线性回归Linear Regression

    利用tensorflow实现数据的线性回归 导入相关库 import tensorflow as tf import numpy import matplotlib.pyplot as plt rng ...

  5. Android 如何判断指定服务是否在运行中 “Service”

    如何判断一个服务是否正在运行中: /** * 判断某个服务是否正在运行的方法 * * @param mContext * @param serviceName 是包名+服务的类名 * @return ...

  6. [JOI2017/2018]美術展

    [JOI2017/2018]美術展 题目大意: 有\(n(n\le5\times10^5)\)个物品,每个物品有两个属性:尺寸\(A_i\)和收益\(B_i\).从中选取一个子集,总收益为\(\sum ...

  7. Python3从零开始爬取今日头条的新闻【四、模拟点击切换tab标签获取内容】

    Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...

  8. C++学习笔记52:查找

    //函数查找 template <class T> int seqSearch(const T list[], int n, const T &key) { ; i < n; ...

  9. Prime Path[POJ3126] [SPFA/BFS]

    描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了.zydsg要做些改变,他想去和素数小姐姐约会. 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样 ...

  10. Java Web 域名

    虽然可以直接通过IP地址来访问WWW的每一台主机,但是32位IP地址非常难记.所以,为了便于记忆,按照一定的规则给Internet上的计算机起了名字即域名.通俗地说,域名相当于一个房屋的门牌号码,别人 ...