Writing Custom Latex Packages And Classes: Tutorials And Documentation
Defining the Core Problem
When authors need to format documents in specialized ways not supported by standard LaTeX classes and packages, customizing LaTeX can be challenging due to the difficulty in package development and the learning curve required. LaTeX offers robust typesetting capabilities through its use of document classes such as articles and books, as well as numerous packages that provide formatting extensions. However, authors often face situations requiring highly specific layouts for which no existing packages apply, necessitating the creation of new packages and classes.
Package development requires learning LaTeX programming approaches and best practices. Creating and debugging custom packages can be time consuming for authors without a strong LaTeX development background. However, with focused effort on understanding package basics and structure along with LaTeX's capabilities for defining custom commands and handling formatting and layout, authors can create tailored packages to meet their unique document preparation needs.
Package Basics
At a fundamental level, LaTeX packages consist of .sty files that contain LaTeX commands, parameters, and formatting instructions. LaTeX document classes use .cls files to influence overall document structure in terms of elements like margins, chapters, sections, and floats. Both .sty and .cls files use the LaTeX programming language to modify how LaTeX typesets documents. Packages represent reusable sets of formatting rules focused on specific tasks like creating captions, hyperlinks, and bibliographies. Classes influence document structure and organization for broad publication types like books and articles.
When custom formatting needs arise, authors must decide whether a package or class approach works best depending on the requirements. For minor layout modifications or adding specialized structures like custom lists or theorem environments, a package offers the most direct path. For major structural changes like adapting multi-page conference proceedings documents to use LaTeX, creating a custom document class aligns better with significant adjustments to sections, margins, headers and footers, and inserts like tables and figures.
In both cases, authors should adhere to best practices like using descriptive names and appropriate organization for package files and directories. This facilitates reuse and distribution of the custom packages and classes.
Package Structure
LaTeX packages rely on several structural elements spanning required components like package names and identifiers to optional entries for executing initialization and finalization code. At minimum, valid .sty files must specify the LaTeX package command along with a package name. This can optionally include parameters like declaring dependencies on other packages. Packages should also initialize any new commands and settings they define. Using a clearly organized modular structure supports readability and maintainability of custom packages.
Recommended components like macros to execute code during package loading and unloading further extend package capabilities. By integrating hooks and well-defined interfaces, packages can call external functions in other packages which facilitates reusable templating. Following conventions for files, directories, licensing, and documentation enables smoothly distributing custom packages for other LaTeX users to leverage.
Defining New Commands
A major aspect of LaTeX customization involves introducing new commands through packages. This relies heavily on understanding and properly implementing LaTeX command syntax, arguments, and defaults. Defining commands in LaTeX requires indicating the starting delimiter (\), followed by the command name. Optional arguments passed to commands require syntax like square brackets surrounding them.
For example, a custom command to include a logo image would need to set the image width as a parameter. This entails defining the command using syntax like \includelogo[width=2cm]{logo}. The opening and closing curly braces indicate the file path to the image to include. Authors can set default widths to simplify command usage by passing an optional width parameter.
Specifying reasonable defaults while allowing arguments makes custom commands more robust. Validation checking arguments with error handling also helps avoid issues when users apply new commands. Following naming conventions and documenting all new commands in a package readme enables intuitive discovery and proper usage.
Formatting and Layout
The ability to control document layout represents a primary application for LaTeX custom packages. This includes setting the physical page dimensions like paper size, adjusting margins, selecting font styles, and determining the look of structural elements like section headings and numbered captions on tables and figures.
Creating custom page layouts often requires changing the page dimensions and margins. LaTeX includes parameters for setting the paper height, width, top margin, and other elements. Packages can modify these measurements by including the \setlength command along with the parameter name and desired size like \setlength{\topmargin}{-1cm}.
Likewise, custom font styles and sizes can be activated for specific structures with commands like \usepackage{times} and \fontsize{12pt}{14pt}. Section, subsection, and caption numbering and appearance also depend on counters, lengths, and templates packages can adjust. This helps conform to unique style guides or publishing requirements related to custom document types.
Integration and Distribution
After creating a custom LaTeX package, authors can integrate it into their document processing workflows by installing the package files locally on systems where they compile LaTeX documents. This involves placing the .sty and associated files in directories LaTeX recognizes and updating the TeX path configuration.
For broader sharing, LaTeX packages can be submitted to the Comprehensive TeX Archive Network (CTAN) repository. This requires extensive documentation including usage examples and addressing licensing considerations. CTAN also facilitates discovery through search and acts as a distribution channel when publishers require submitting custom class and package files to support publishing scholarly manuscripts and books.
Careful documentation, version control, and explicitly declaring package dependencies facilitates reuse. This also helps with reporting issues as users provide feedback from applying custom packages. Maintaining packages by adding features and fixing bugs encourages ongoing valuable exchange with the LaTeX community.
Example Package Code
The simplest viable custom LaTeX package requires only declaring the package name and including any commands defined by the package. This minimal working example shows the format using a sample package for inserting hypothes.is annotations:
\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{hypothesisfile}[2023/02/15 Custom hypothes.is package] \newcommand{\annotate}[2]{Text #1 annotated with {#2}}
Real-world packages expand on this pattern by adding additional elements discussed previously like optional arguments, default values, and documentation. As a more complex illustration, a custom LaTeX package for introducing a new linguistics citation command with formatted output might leverage:
\RequirePackage{lingmacros} \newcommand{\lingcite}[2][]{{% \lingformatchars{#1} reported in #2\/} }
Here the \lingcite command passes the formatted linguistic example as an optional first argument and the bibliographic citation as the second argument. This demonstrates a modular approach customizing LaTeX based on the document formatting needs required.
Additional Resources
Many online package development tutorials exist to support creating custom LaTeX classes and packages. The LaTeX project documentation offers extensive guides for working through examples. LaTeX community forums also provide answers to common package authoring issues.
Typically the most challenging aspects relate to debugging error messages during testing. LaTeX developer tools like showing the meaning of errors helps decipher issues. Rendering packages step-by-step to isolate problems also aids troubleshooting. Finding similar packages to model structure after facilitates progress.
Authors learning LaTeX packages should also consider contributing to existing packages. Enhancing these by adding features or documentation enables publishers to meet specialized formatting needs. Participating in the broader open-source ecosystem around customizing LaTeX documents for novel use cases both leverages and strengthens available resources.