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,\LoadClassWithOptions 和 \RequirePackage,\RequirePackageWithOptions 加载。我们通常将 .cls 文件称之为类(classes)文件,将 .sty 文件称之为风格(style)文件或者包(package)。
不同点
虽然它们都可以包含任意的 TeX 和 LaTeX 代码,但是它们的使用方式不同。我们必须通过 \documentclass 加载一个类文件,并且在一个 LaTeX 文件中只能出现一次,通常也是第一个出现的命令。而另一方面,包是一个可选项,它可以根据我们的需求加载任意多个(在开始文档之前)。
编写原则
什么时候编写一个类文件?什么时候编写一个风格文件?或者说什么命令应该放到 .cls 文件?什么命令应该放到 .sty 文件中呢?一个经验法则是:
如果一个命令是用来控制文档结构的,则应该放到类文件中;否则应该放到包文件中。
如果一个命令可以被其他所有的文档使用,那么将这个命令放置到一个包中;如果不是,则将它放到一个类文件中。
当一个命令使上述两条规则冲突的时候,优先考虑第一条规则。如
\section命令几乎在所有的文档中都使用,但因为其是用来控制文档结构的,我们将其放置到类文件中。
一般情况下,类文件主要分为两个部分:一种是标准类文件,如:article,report 或者 letter;另一种是基于标准类文件的扩展文件,如基于 article 的 proc 文件类。当然我们也可以不基于任何标准类编写全新的类文件,通常这比较复杂,需要我们重新定义大量常用的命令,因此不建议这么做。
额外说明:如果我们要自己定义一个不基于标准类的类文件,应确保至少包含以下四个部分:定义 \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文件有何区别?的更多相关文章
- Latex中画出函数文件的调用关系拓扑图
流程图,思维导图,拓扑图通常能把我们遇到的一些复杂的关系结构用图形的方式展现出来.在Latex中要想画这样的拓扑图,有一个很好用的绘图工具包 pgf/tikz . 1.pgf/tikz的安装:pgf/ ...
- 在Latex中插入Python代码
这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...
- latex之在windows环境下能够在latex中使用中文
今天要把前段时间的实验用英语先记录下来,自己就想根据原来会议的模版弄一个简易的页面(英语),突然想到之前用英文模板时是不能输入中文的,于是想着怎么在latex中输入中文,折腾了许久,终于成功了,现在分 ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- paper 48: Latex中如何制作参考文献
文章写到现在,最后一步就要大功告成了!reference,let's go! 一.用Google来做Latex的bib文件 1. 打开scholar.google.com 2. 定制 Schola ...
- The usage method of reference with bibtex in Latex【latex中参考文献的使用方法】
如何在latex中以Bibtex文件方式引用参考文献? 以IEEEtran模板为例: 1.制作bibtex参考文献库.方法如下: ①建立myreference.bib文件: ②在Google scho ...
- 读书笔记-详解C程序开发中 .c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- latex中pdflatex与xelatex的区别
1. PDFTeX程序:Tex语言的一个实现,也就是把Tex语言转换为排版的一个程序.它会把TeX 语言写的代码直接编译成 PDF文件. 2. PDFLaTeX命令:PDFTeX程序中的命令,用来编译 ...
- LaTeX中的各种距离设置总结
LaTeX中的各种距离设置总结 1. 页面设置 A4 会给你一个较小的页面,为了使用更多的控制,可用 geometry宏包 和 命令 \layout . 2. 改变长度 在latex里改变长度 ...
随机推荐
- Pedestrian Attributes Recognition Paper List
Pedestrian Attributes Recognition Paper List 2018-12-22 22:08:55 [Note] you may also check the upda ...
- 李宏毅机器学习笔记3:Classification、Logistic Regression
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- linux上如何自动获取ip及连接互联网
1.讲与虚拟机连接网卡设置为net连接 2.BOOTPROTO=dhcp 3.注释原来的ip 4.最后一句网关注释 5.重启网卡 service network restart
- Redis自学笔记:3.2入门-字符串类型
3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...
- Max Factor 2710 最大的合数的质数因子
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2710 思路:用类似“埃氏筛法”求素数的方法 只是不在把合数标记为1 而是标记为他是因子数. 最后比较大小即 ...
- Scrapy基础(十二)————异步导出Item数据到Mysql中
异步导出数据到Mysql中 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞:关于堵塞和非堵塞,同步和异 ...
- mongoDB,mongoose,没有数组就添加,如果有了数组,就向数组中添加新元素
db.getCollection('photos').findOneAndUpdate("5b028e71f32bd5004f905879", //findByIdAndUpd ...
- MySQL JDBC简单使用
首先需要去MySQL官网下载MySQL JDBC驱动 导入jar包 String driver = "com.mysql.jdbc.Driver"; String url = &q ...
- 论文泛读 A Novel Ensemble Learning-based Approach for Click Fraud Detection in Mobile Advertising [1/10]
title:新的基于集成学习的移动广告作弊检测 导语:基于buzzcity数据集,我们提出了对点击欺诈检测是基于一组来自现有属性的新功能的一种新方法.根据所得到的精度.召回率和AUC对所提出的模型进行 ...
- pytorch写一个LeNet网络
我们先介绍下pytorch中的cnn网络 学过深度卷积网络的应该都非常熟悉这张demo图(LeNet): 先不管怎么训练,我们必须先构建出一个CNN网络,很快我们写了一段关于这个LeNet的代码,并进 ...