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 鉤子。
