前言

本文是对LATEX 2ε for class and package writers的翻译和概括。

可以参考以下链接得到原文档
https://www.jianshu.com/p/12b4a4b3afce?from=singlemessage

也可以参考
https://zhuanlan.zhihu.com/p/19705200

文档编写的介绍从第三部分开始,文档的命令从第四部分开始,参数的传递从第五部分开始。

1.sty和cls文档简介

a.可以使用docstrip生成sty和cls文件

b.如果命令可以在其他tex文件中使用,应该写在sty文件中。
如果命令(排版格式)只适合某一文档,应该写在cls文件中。

2.编写sty和cls

a.tex命令包含三种格式

tex作者使用的,即一般tex文件包含的命令,
sty和cls作者使用的,如\RequirePackge,
tex内部命令,如\@temcnta。
您不可以在tex文件中使用后两种命令。

b.鲁棒性

为了增强文档鲁棒性,使用较为严谨的命令。
文件加载命令:

\LoadClass{cls file name}  %加载cls文件
\LoadClassWithOptions
\RequirePackage{sty file name}  %加载所需要的包
\RequirePackageWithOptions
\input{file name}

不建议使用最后一种,会导致多次加载。

命令定义

\newcommand
\renewcommand
\providecommand
\CheckCommand
\def

上面四个差别不大,不建议使用第四种,会导致意外定义新命令

环境定义

\newenvironment
\renewenvironment\def\foo{...}    \def\endfoo{...}

上面两个均可,不建议使用第三种

c.便携性

文档名尽量不要超过8字符,不包括3个字符的扩展名,
不能和已有的latex标准包重名,
尽量加上首字母前缀,比如XXX thesis.cls

d.重定义document

使用\AtBeginDocument\AtEndDocument重定义docunment

3.cls和sty结构

一个完整的cls或者sty文件通常包含以下的结构。

a.文档介绍

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{包的名称}[时间及其他信息]\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{类名称}[时间及其他信息]

时间使用YYYY/MM/DD格式

b.引用cls或者sty文件

\RequirePackage[options]{package}[date]
\LoadClass[hoptionsi]{hclass-namei}[hdatei]

当载入的文件中options和当前文档相同,使用以下命令:

\LoadClassWithOptions{article}
\RequirePackageWithOptions{graphics}

c.定义选项

使用如下命令定义选项

\DeclareOption{option}{code}

如果出现了选项,则会执行选项中的代码。
使用如下代码,将error变为warning

\DeclareOption*{%
\PackageWarning{fred}{Unknown option ‘\CurrentOption’}%
}

使用如下命令使定义的选项被文档调用执行

\ProcessOptions\relax

d.最小文档

文档必须包括四个内容:
\normalsize\textwidth\textheight,页数的规范
一个最小文档如下例:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{minimal}[1995/10/30 Standard LaTeX minimal class]
\renewcommand{\normalsize}{\fontsize{10pt}{12pt}\selectfont}
\setlength{\textwidth}{6.5in}
\setlength{\textheight}{8in}
\pagenumbering{arabic} % needed even though this class will
% not show page numbers

信件文档如下例:(文档名为neplet.cls)

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{neplet}[1995/04/01 NonExistent Press letter class]\DeclareOption*{\PassOptionsToClass{\CurrentOption}{letter}}
\ProcessOptions\relax
\LoadClass[a4paper]{letter}\renewcommand{\ps@firstpage}{%
\renewcommand{\@oddhead}{letterhead goes here}%
\renewcommand{\@oddfoot}{letterfoot goes here}%
}

4.文档命令

\NeedsTeXFormat {format-name} [release-date]  %文档的定义
\ProvidesClass {class-name} [release-info]%表示当前文档提供了XX类的定义
\ProvidesPackage {package-name} [release-info]%表示当前文档提供了XX包的定义
\ProvidesFile {file-name} [release-info]%表示当前文档提供了XX文件的定义\RequirePackage [options-list] {package-name} [release-info]
\RequirePackageWithOptions {package-name} [release-info]%引用包
\LoadClass [hoptions-listi] {class-name} [release-info]
\LoadClassWithOptions {class-name} [release-info]%引用类\DeclareOption {option-name} {code}%选项定义
\DeclareOption* {code}%对于所有选项都为执行

以下命令只在定义option的code中使用

\CurrentOption%引用当前选项
\OptionNotUsed%当前选项加入未使用选项列表\PassOptionsToPackage {options-list} {package-name}
\PassOptionsToClass {options-list} {class-name}%意味着如果调用这个包,就会执行optionlist中的选项\AtEndOfClass{code}
\AtEndOfPackage{code}%代码将在执行完整个包之后执行\AtBeginDocument {code}
\AtEndDocument {code}%代码将在执行\begin{document}或者\end{docpment}时执行\AtBeginDvi {specials}
\ProcessOptions%
\ProcessOptions*
\\@options%
\ExecuteOptions {hoptions-listi}

以上只在code中使用

\IfFileExists {file-name} {true} {false}%定义文件不存在时如何操作,这个命令本身不会加载文件
\InputIfFileExists {file-name} {true} {false}%如果存在,执行True中代码,然后加载文件,否则执行faulse\ClassError {class-name} {error-text} {help-text}
\PackageError {package-name} {error-text} {help-text}%如果在引入包中出现错误,将显示text的内容。
%\protect加在命令之前,使得其被打印而不是执行,\MessageBreak打印换行,\space打印空格。\ClassWarning {class-name} {warning-text}
\PackageWarning {package-name} {warning-text}
\ClassWarningNoLine {class-name} {warning-text}
\PackageWarningNoLine {package-name} {warning-text}
\ClassInfo {class-name} {info-text}
\PackageInfo {package-name} {info-text}\DeclareRobustCommand {cmd} [num] [default] {definition}
\DeclareRobustCommand* {cmd} [num] [default] {definition}%定义更加鲁棒的命令,和renewcommand类似。\CheckCommand {cmd} [num] [default] {definition}
\CheckCommand* {cmd} [num] [default] {definition}%定义的同时会检查,如果不同则会产生warning\paperheight
\paperwidth%设定页面大小\MakeUppercase {text}
\MakeLowercase {text}%大小写转换\ignorespacesafterend%取消空格\normalsfcodes%恢复字间距\if@compatibility

可能需要重新定义如下命令

\rm \sf \tt \bf \it \sl \sc
\normalsize
\@normalsize

需要重新定义如下命令

\tiny \footnotesize \small \large
\Large \LARGE \huge \Huge
\tenrm \elvrm \twlrm . . .
\tenbf \elvbf \twlbf . . .
\tensf \elvsf \twlsf . . .

可能需要替换如下命令

\vpt \vipt \viipt . . .
\prm, \pbf, \ppounds, \pLaTeX . . .

以下命令被移除

\footheight
\@maxsep
\@dblmaxsep

5.参数传递

参数传递使得tex写作是不需要重复添加相同的信息。(比如页眉上方的标题)。遗憾的是原文中并没有介绍相关的内容。以下内容均来自于下方链接。
https://blog.csdn.net/RobertChenGuangzhi/article/details/50461514

在cls文件中,使用以下命令定义参数
\newcommand{\\@ang-name}{默认值}
参数名通常为\@后跟tex文件中使用的名称
在cls文件中,使用以下命令关联cls参数和tex参数

\newcommand{\tex-cmd}[参数数目][默认值]{\renewcommand{\\@avg-name1}{#1}\renewcommand{\\@avg-name2}{#2}\renewcommand{\\@avg-name3}{#3}
...
}

命令名通常为\加上tex文件中引用的名称。
在cls文件中使用\@avg-name1...调用参数

在tex文件中使用如下代码获取参数:
\tex-cmd{参数1的值}{参数2的值}{参数3的值}..

总结

以上是文档的大概内容,我会更新一篇报告的cls文件。

sty和cls文档编写指南相关推荐

  1. android技术文档怎么写,技术文档编写指南

    技术文档编写指南 首先请阅读文案风格指南 ##学习产品使用方式 最重要的必备的条件就是: 一定要亲自使用这个产品,至少是一遍通顺的流程要走完,不要求每一个接口都一定使用过,但是一个完整的功能片段是使用 ...

  2. Vue 文档编写指南

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 原文:https://v3.cn.vuejs.org/guide/contributing/writing-gu ...

  3. Vue 3.0文档编写指南

    译者:本章节大部分内容是针对母语是英文的读者,中文用户可略读,除非你想以英文文档编写者的身份参与 Vue docs 的编写, 编写文档是一种换位思考的练习.我们并不是在描述客观现实--源代码已经做到了 ...

  4. api 开源文档编写_如何为您的开源项目编写有效的文档

    api 开源文档编写 不幸的是,好的代码并不能说明一切. 即使是解决世界上最紧迫问题的设计最精美,编写最出色的代码库,也不会自己采用. 开源创建者您需要为您的代码说话,并为您的创作注入生命. 那就是技 ...

  5. 程序设计文档编写_编写有效的设计系统文档的6个技巧

    程序设计文档编写 重点 (Top highlight) I wrote this article to document what I'm learning professionally while ...

  6. 项目文档编写规范与代码规范

    往往越是规模大的公司,其项目工作中的每一个环节都有相应的规范进行管理,这些规范都是都前辈呕心沥血,披荆斩棘所获的的经验总结,而非普通文书工作者的推猜可得. 当然,如果刚刚创业起步的小公司如能更早的抓住 ...

  7. Google开发人员文档样式指南

    为方便查看,使用Google翻译从 Google开发人员文档样式指南 搬运而来 一般原则 风格和作者的语气 https://developers.google.cn/style/tone 交谈而不轻浮 ...

  8. 面向对象的前端开发_20多种面向前端开发人员的文档和指南(第9号)

    面向对象的前端开发 It's that time again to get learning! As before, I've collected a number of different lear ...

  9. 20个为前端开发者准备的文档和指南

    是时候重新学习了!和以前一样,我收集了很多不同的学习资源,包括学习指南,学习文档,和其他有用的网站来帮助你在前端开发的不同领域里快速地进入状态. 所以请尽情享受我们的文档和指南系列的第九部分,并且不要 ...

  10. show一下自己的文档编写功底

    以我为例,我绝对相信,"才华"和颜值成反比."才华"二字加了引号了,自知跟优秀有孙大圣一个筋斗云的距离,不过某些细节方面表现得被认为还不错,这里我要秀一下我的文 ...

最新文章

  1. c是编译语言吗,将语言编译为C是一个好主意吗?
  2. scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了
  3. ps如何修改图片大小尺寸_PS新手入门教程:学习如何修改画布的大小
  4. python壁纸超清全面屏_iOS 关于全面屏适配的方案及UI在不同尺寸下适配方案
  5. 清除所有多余的桌面右键菜单
  6. 代码行云流水..这位刚高中毕业的 UP 主,告诉我人的学习能力没有上限
  7. C语言开发里指针到底快还是不快?(底层汇编解释)
  8. 谷歌android q 安装,谷歌修复了Pixel智能机安装Android Q Beta 4后循环重启的bug
  9. html调用矢量小图标的方法,微信小程序里引入SVG矢量图标的方法
  10. Spring的装配方式
  11. redspider无法启动,并行配置不正确
  12. java摩托游戏_盘点那些JAVA游戏第3期
  13. 谷歌io开发者大会2018:强大的AI帝国
  14. Base64加解密__完整版有解释
  15. 我的飞桨学习赛:英雄联盟大师预测
  16. 如何投稿iMeta期刊?ScholarOne投审稿系统作者使用教程
  17. 资产负债表编制 (by shany shang)
  18. 【uniapp Uview】 IndexList用法 姓氏分组方法
  19. android 拨打多个电话号码,和多号如何使用副号打电话/发短信
  20. 尝试自己制作一个网页版的单机冒险岛!!

热门文章

  1. android手机wifi快的办法,手机wifi如何设置网速变快(这样设置网速瞬间堪比5G)...
  2. FPGA作为电力电子设备控制器的实践
  3. java替换图片文字_Java 替换PPT文档中的文本和图片
  4. python中的sep函数_python sep函数是什么?怎么用?
  5. Java实现图表趋势图的展现
  6. 【Python】用matplotlib函数绘制股票趋势图
  7. andorid 源码北京公交线路查询(离线)
  8. 四川麻将java_四川麻将纯AI算法------最优拆牌
  9. 街头篮球 服务器中断,win7系统下玩街头篮球卡机如何解决
  10. html5迷宫小游戏,JS实现的走迷宫小游戏完整实例