LaTeX/创建包
如果您定义了大量新的环境和命令,则文档的前言将变得很长。在这种情况下,最好创建一个包含所有命令和环境定义的 LaTeX 包或类。它可以变得足够动态以适合您未来所有文档。
类是.cls文件;包存储在.sty文件中。它们非常相似,主要区别在于您每个文档只能加载一个类。
在决定创建自己的包或类后,您应该考虑该包/类的许可证。许可证非常重要,既可以保护您的文件,也可以使其他人可以使用它。
默认情况下,LaTeX 允许在包和类文件中使用“@”字符作为控制序列,但在最终用户文档中则不允许。这样就可以保护命令,即使它们只能从包中访问。
但是,可以使用 \makeatletter
和 \makeatother
这对命令来覆盖此安全措施。这些命令仅在常规文档中才有意义,在包或类文件中不需要它们。
\documentclass{...}
%...
\begin{document}
\makeatletter
\@author
\makeatother
\end{document}
|
您的包可以使用 \usepackage
命令在您的文档中使用,就像任何其他包一样。编写包基本上就是将文档前言的内容复制到一个以.sty.
让我们写一个第一个custom.sty文件作为示例包
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{custom}[2013/01/13 Custom Package]
\RequirePackage{lmodern}
%% 'sans serif' option
\DeclareOption{sans}{
\renewcommand{\familydefault}{\sfdefault}
}
%% 'roman' option
\DeclareOption{roman}{
\renewcommand{\familydefault}{\rmdefault}
}
%% Global indentation option
\newif\if@neverindent\@neverindentfalse
\DeclareOption{neverindent}{
\@neverindenttrue
}
\ExecuteOptions{roman}
\ProcessOptions\relax
%% Traditional LaTeX or TeX follows...
% ...
\newlength{\pardefault}
\setlength{\pardefault}{\parindent}
\newcommand{\neverindent}{ \setlength{\parindent}{0pt} }
\newcommand{\autoindent}{ \setlength{\parindent}{\pardefault} }
\if@neverindent
\neverindent
\fi
% ...
\endinput
|
\NeedsTeXFormat{...}
指定至少运行包所需的 TeX 或 LaTeX 版本。可选日期可用于更精确地指定版本。
\ProvidesPackage{<name>}[<version>]
包使用此命令自我介绍。<name> 应与文件本身的基本名称 相同。<version> 应以YYYY/MM/DD 格式的日期开头。在开发包时,应保持版本信息更新。- 接下来,您可以编写一些 TeX 或 LaTeX 代码,例如加载包,但只编写下面设置的包选项所需的最低限度代码。
\RequirePackage
等效于\usepackage
。\DeclareOptions
是最终用户参数。每个选项都由一个这样的命令声明。\ExecuteOptions{...}
指定哪些是默认选项。\ProcessOptions\relax
终止选项处理。- 使用您所知的所有 LaTeX 命令,编写您想要的任何内容。通常,您应该定义新的命令或导入其他包。
\endinput
:这必须是最后一个命令。
包准备好后,我们可以在任何文档中使用它。使用已知的命令 \usepackage{mypack}
导入新包。文件custom.sty和您正在编译的 LaTeX 源文件必须位于同一个目录中。
\documentclass{...}
\usepackage[neverindent,sans]{custom}
%...
\begin{document}
Blah...
\end{document}
|
为了方便使用,可以将包放在$TEXMFHOME(默认情况下为~/texmf)中,根据 TeX 目录结构 (TDS)。这将是
$TEXMFHOME/tex/latex/custom/custom.sty
在 Windows 上,“~” 通常是C:\Users\username.
您可能需要运行texhash(或等效命令)以使您的 TeX 发行版为新文件建立索引,从而使新文件可用于任何文档。这将允许您像上面详细说明的那样使用您的包,但不需要它与您的文档位于同一个目录中。
您也可以创建自己的类文件。该过程类似于创建自己的包,您可以在任何文档的前言中使用命令
\documentclass{myclass}
|
然后,类文件的名称为myclass.cls。让我们写一个简单的示例,我们还将使用custom.sty我们在上面定义的
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2011/12/23 My Class]
%% Article options
\DeclareOption{10pt}{
\PassOptionsToClass{\CurrentOption}{article}
}
%% Custom package options
\DeclareOption{sans}{
\PassOptionsToPackage{\CurrentOption}{custom}
}
\DeclareOption{neverindent}{
\PassOptionsToPackage{\CurrentOption}{custom}
}
%% Fallback
\DeclareOption*{
\ClassWarning{myclass}{Unknown option '\CurrentOption'}
}
%% Execute default options
\ExecuteOptions{10pt}
%% Process given options
\ProcessOptions\relax
%% Load base
\LoadClass[a4paper]{article}
%% Load additional packages and commands.
\RequirePackage{custom}
%% Additional TeX/LaTeX code...
\endinput
|
\ProvidesClass
是\ProvidesPackage
的对应命令。\PassOptionsToClass
和\PassOptionsToPackage
用于在加载类或包时自动调用相应的选项。\DeclareOption*
:带星号的版本允许您处理未实现的选项。\ClassWarning
将在 TeX 编译器输出中显示相应的消息。\LoadClass
指定唯一的父类(如果有)。
类和包也有一些钩子。
\AtEndOfPackage
\AtEndOfClass
它们的行为与文档钩子相同。请参阅 LaTeX 钩子。