LaTeX/Creating Packages

< LaTeX

If you define a lot of new environments and commands, the preamble of your document will get quite long. In this situation, it is a good idea to create a LaTeX package or class containing all your command and environment definitions. It can be made dynamic enough to fit to all your future documents.

Classes are .cls files, packages are stored in .sty files. They are very similar, the main difference being that you can load only one class per document.

After deciding to create an own package or class, you should think about which license the package/class has. A license is of great importance, either to protect your file, or to make it available for others.


makeatletter and makeatother

By default, LaTeX will allow the use of the '@' characters for control sequences from within package and class files, but not from within an end-user document. This way it is possible to protect commands, i.e. to make them accessible from packages only.

However it is possible to override this security with the duo \makeatletter and \makeatother. These commands only make sense in a regular document, they are not needed in package or class files.

\documentclass{...}
%...

\begin{document}

\makeatletter
\@author
\makeatother

\end{document}

Creating your own package

Your package can be made available in your document just like any other package: using the \usepackage command. Writing a package basically consists of copying the contents of your document preamble into a separate file with a name ending in .sty.

Let's write a first custom.sty file as an example package:

\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

Once your package is ready, we can use it in any document. Import your new package with the known command \usepackage{mypack}. The file custom.sty and the LaTeX source you are compiling must be in the same directory.

\documentclass{...}
\usepackage[neverindent,sans]{custom}
%...

\begin{document}

Blah...

\end{document}


For a more convenient use, it is possible to place the package within $TEXMFHOME (which is ~/texmf by default) according to the TeX Directory Structure (TDS). That would be

$TEXMFHOME/tex/latex/custom/custom.sty

On Windows '~' is often C:\Users\username.

You may have to run texhash (or equivalent) to make your TeX distribution index the new file, thus making it available for use for any document. It will allow you to use your package as detailed above, but without it needing to be in the same directory as your document.

Creating your own class

It is also possible to create your own class file. The process is similar to the creation of your own package, you can call your own style file in the preamble of any document by the command:

\documentclass{myclass}

The name of the class file is then myclass.cls. Let's write a simple example:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2011/12/23 My Class]

%% Article options
\DeclareOption{10pt}{
  \PassOptionsToClass{\CurrentOption}{article}
}

%% Custom package options
\DeclareOption{sansserif}{
  \PassOptionsToPackage{\CurrentOption}{paxcommands}
}
\DeclareOption{neverindent}{
  \PassOptionsToPackage{\CurrentOption}{paxcommands}
}

%% 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


Hooks

There are also hooks for classes and packages.

They behave as the document hooks. See LaTeX Hooks.

This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.