宏包与类编写

如果你总是把同一批宏复制到导言区,不妨把它们整理成自己的 宏包(用 \usepackage 读取的 .sty 文件)或 .cls)。本页展示基本骨架:标识行、选项处理、依赖宏包加载,以及宏包和类的区别。

.sty 文件的骨架

宏包就是项目中(或已安装)的 .sty 文件。开头先声明自己是什么,然后定义宏。\NeedsTeXFormat{LaTeX2e} 声明所需格式,\ProvidesPackage{name}[date version description] 标识宏包名和版本(名称必须与文件 basename 一致;日期会出现在日志中,也用于版本检查)。之后用 \newcommand\newenvironment 等定义内容。

latex
% mypackage.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}[2026/01/01 v1.0 My helpers]
\newcommand{\hello}{こんにちは、\LaTeX!}

加载依赖宏包 — \RequirePackage

当你的 .sty 依赖其他宏包时,使用 \RequirePackage{...},它相当于 .sty 内部的 \usepackage。需要颜色就加载 xcolor,需要绘图就加载 tikz,依此类推。如果选项处理依赖这些功能,就放在 \ProcessOptions 之前;否则放在之后。

latex
\RequirePackage{xcolor}

接收选项 — \DeclareOption

要接收 \usepackage[option]{name} 这样的选项,用 \DeclareOption{option}{code} 声明每个选项,用 \DeclareOption*{...} 捕获未知选项(发出警告,或传给已加载的类等),最后用 \ProcessOptions\relax 确定处理。若需要 key=value 形式的选项,使用现代的 \DeclareKeys(l3keys)或 kvoptions 宏包。

latex
\DeclareOption{color}{\renewcommand\hello{\textcolor{red}{こんにちは}}}
\DeclareOption*{\PackageWarning{mypackage}{Unknown option '\CurrentOption'}}
\ProcessOptions\relax

类(.cls)与宏包的区别

.cls 文件(用 \ProvidesClass 声明),定义整篇文档的类型。它用 \documentclass 加载,每篇文档只能有一个。许多类会通过 \LoadClass{article} 基于现有类构建。相比之下,宏包.sty)是在上面增加功能,可以 加载任意多个。标识和选项处理机制几乎相同。类的实际制作另有专页介绍。