% \iffalse meta-comment % % Copyright 1994 the LaTeX3 project and the individual authors. % All rights reserved. For further copyright information see the file % legal.txt, and any other copyright indicated in this file. % % This file is part of the LaTeX2e system. % ---------------------------------------- % % This system is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % % % IMPORTANT NOTICE: % % For error reports in case of UNCHANGED versions see bugs.txt. % % Please do not request updates from us directly. Distribution is % done through Mail-Servers and TeX organizations. % % You are not allowed to change this file. % % You are allowed to distribute this file under the condition that % it is distributed together with all files mentioned in manifest.txt. % % If you receive only some of these files from someone, complain! % % You are NOT ALLOWED to distribute this file alone. You are NOT % ALLOWED to take money for the distribution or use of either this % file or a changed version, except for a nominal charge for copying % etc. % \fi % Filename: clsguide.tex \NeedsTeXFormat{LaTeX2e}[1994/06/01] \documentclass{ltxguide}[1994/05/24] \title{\LaTeXe~for class and package writers} \author{Copyright \copyright~1994 The \LaTeX3 Project\\ All rights reserved} \date{June 1994} \begin{document} \maketitle \tableofcontents \section{Introduction} This document is an introduction to writing classes and packages for \LaTeX{}, with special attention given to upgrading existing \LaTeX~2.09 packages to \LaTeXe{}. The latter subject will also be covered in an article by Johannes Braams to be published in TUGboat later this year. \subsection{Writing classes and packages for \LaTeXe} \LaTeX{} is a document preparation system that enables the document writer to concentrate on the contents of their text, without bothering too much about the formatting of it. For example, chapters are indicated by |\chapter{}| rather than by selecting 18pt bold. The file that contains the information about how to turn logical structure (like `|\chapter|') into formatting (like `18pt bold ragged right') is a \emph{document class}. In addition, some features (such as colour or included graphics) are independent of the document class and these are contained in \emph{packages}. One of the largest differences between \LaTeX~2.09 and \LaTeXe{} is in the commands used to write packages and classes. In \LaTeX~2.09, there was very little support for writing |.sty| files, and so writers had to resort to using low-level commands. \LaTeXe{} provides high-level commands for structuring packages. It is also much easier to build classes and packages on top of each other, for example writing a local technical report class based on |article|. \subsection{Overview} This document contains an overview of how to write classes and packages for \LaTeX{}. It does \emph{not} introduce all of the commands necessary to write packages: these can be found in either \emph{\LaTeXbook} or \emph{\LaTeXcomp}. But it does describe the new commands for structuring classes and packages. \begin{description} \item[Section~\ref{Sec:general}] contains some general advice about writing classes and packages. It describes the difference between classes and packages, the command naming conventions, the use of |doc| and |docstrip|, how \TeX's primitive file and box commands interact with \LaTeX{}. It also contains some hints about general \LaTeX{} style. \item[Section~\ref{Sec:structure}] describes the structure of classes and packages. This includes building classes and packages on top of other classes and packages, declaring options and declaring commands. It also contains example classes. \item[Section~\ref{Sec:commands}] lists the new class and package commands. \item[Section~\ref{Sec:upgrade}] gives detailed advice on how to upgrade existing \LaTeX~2.09 classes and packages to \LaTeXe{}. \end{description} \subsection{Further information} For a general introduction to \LaTeX{}, including the new features of \LaTeXe{}, you should read \emph{\LaTeXbook} by Leslie Lamport~\cite{A-W:LLa94}. A more detailed description of the new features of \LaTeX{}, and an overview of more than 150 packages, is to be found in \emph{\LaTeXcomp} by Michel Goossens, Frank Mittelbach and Alexander Samarin~\cite{A-W:GMS94}. The \LaTeX{} font selection scheme is based on \TeX{}, which is described in \emph{The \TeX book} by Donald E.~Knuth~\cite{A-W:DEK91}. There are a number of documentation files which accompany every copy of \LaTeX{}. A copy of \emph{\LaTeX{} News} will come out with each six-monthly release of \LaTeX{}, and is found in the files |ltnews*.tex|. The author's guide \emph{\usrguide} describes the new \LaTeX{} document features; it is in |usrguide.tex|. The guide \emph{\fntguide} describes the \LaTeX{} font selection scheme for class- and package-writers; it is in |fntguide.tex|. We are gradually turning the source code for \LaTeX{} into a \LaTeX{} document \emph{\sourcecode}. This document includes an index of \LaTeX{} commands and can be typeset from |source2e.tex|. For more information about \TeX{} and \LaTeX{}, please contact your local \TeX{} Users Group, or the international \TeX{} Users Group, P.~O.\ Box~869, Santa Barbara, CA 93102-0869, USA, Fax:~+1 805 963 8358, E-mail:~tug@tug.org. \section{Writing classes and packages} \label{Sec:writing} This section covers some general points concerned with writing \LaTeX{} classes and packages. \subsection{Old versions} If you are upgrading an existing \LaTeX~2.09 style file then we recommend freezing the 2.09 version and no longer maintaining it. Experience with the various dialects of \LaTeX{} which existed in the early 1990's suggests that maintaining packages for different versions of \LaTeX{} is almost impossible. It will, of course, be necessary for some organisations to maintain both versions in parallel for some time but this is not essential for those packages and classes supported by individuals: they should support only the new standard \LaTeXe{}, not obsolete versions of \LaTeX{}. \subsection{Using docstrip and doc} If you are going to write a large class or package for \LaTeX{} then you should consider using the |doc| software which comes with \LaTeX{}. \LaTeX{} classes and packages written using this can be processed in two ways: they can be run through \LaTeX{}, to produce documentation; and they can be processed with |docstrip|, to produce the |.cls| or |.sty| file. The |doc| software can automatically generate indexes of definitions, indexes of command use, and change-log lists. It is very useful for maintaining and documenting large \TeX{} sources. The documented sources of the \LaTeX{} kernel itself ,and of the standard classes, etc, are |doc| documents; they are in the |.dtx| files in the distribution. You can, in fact, typeset the source code of the kernel as one long document, complete with index, by running \LaTeX{} on |source2e.tex|. For more information on |doc| and |docstrip|, consult the files |docstrip.dtx|, |doc.dtx|, and \emph{\LaTeXcomp}. For examples of its use, look at the |.dtx| files. \subsection{Is it a class or a package?} \label{Sec:classorpkg} The first thing to do when you want to put some new \LaTeX{} commands in a file is to decide whether it should be a \emph{document class} or a \emph{package}. The rule of thumb is: \begin{quote} if the commands could be used with any document class, then make them a package; and if not, then make them a class. \end{quote} There are two major types of class: those like |article|, |report| or |letter|, which are free-standing; and those which are extensions or variations of other classes---for example, the |proc| document class, which is built on the |article| document class. Thus, a company might have a local |ownlet| class for printing letters with their own headed notepaper. Such a class would build on top of the existing |letter| class but it cannot be used with any other document class, so we have |ownlet.cls| rather than |ownlet.sty|. The |graphics| package, in contrast, provides commands for including images into a \LaTeX{} document. Since these commands can be used with any document class, we have |graphics.sty| rather than |graphics.cls|. \subsection{Command names} \LaTeX{} has three types of command. There are the author commands, such as |\section|, |\emph| and |\times|: most of these have short names, all in lower case. There are the class and package writer commands: most of these have long mixed-case names such as the following. \begin{verbatim} \InputIfFileExists \RequirePackage \PassOptionsToClass \end{verbatim} Finally, there are the internal commands used in the \LaTeX{} implementation, such as |\@tempcnta|, |\@ifnextchar| and |\@eha|: most of these commands contain |@| in their name, which means they cannot be used in documents, only in class and package files. Unfortunately, for historical reasons the distinction between these commands is often blurred. For example, |\hbox| is an internal command which should only be used in the \LaTeX{} kernel, whereas |\m@ne| is the constant $-1$ and could have been |\MinusOne|. However, this rule of thumb is still useful: if a command has |@| in its name then it is not part of the supported \LaTeX{} language---and its behaviour may change in future releases! If a command is mixed-case, or is described in \emph{\LaTeXbook}, then you can rely on future releases of \LaTeXe{} supporting the command. \subsection{Box commands and colour} \label{Sec:colour} Even if you do not intend to use colour in your own documents, by taking note of the points in this section you can ensure that your class or package is compatible with the |color| package. This may benefit people using your class or package who have access to colour printers. The simplest way to ensure `colour safety' is to always use \LaTeX{} box commands rather than \TeX{} primitives, that is use |\sbox| rather than |\setbox|, |\mbox| rather than |\hbox| and |\parbox| or |\minipage| rather than |\vbox|. The \LaTeX{} box commands have new options which mean that they are now as powerful as the \TeX{} primitives. As an example of what can go wrong, consider that in |{\ttfamily <text>}| the font is restored just \emph{before} the |}|, whereas in the similar looking construction |{\color{green} <text>}| the colour is restored just \emph{after} the final |}|. Normally this distinction does not matter at all; but consider a primitive \TeX{} box assignment such as: \begin{verbatim} \setbox0=\hbox{\color{green} <text>} \end{verbatim} Now the colour-restore occurs after the |}| and so is \emph{not} stored in the box. Exactly what bad effects this can have depends on how colour is implemented: it can range from getting the wrong colours in the rest of the document, to causing errors in the dvi-driver used to print the document. Also of interest is the command |\normalcolor|. This is normally just |\relax| (i.e., does nothing) but you can use it rather like |\normalfont| to set regions of the page such as captions or section headings to the `main document colour'. \subsection{Defining text and math characters} \label{Sec:chars} Because \LaTeXe{} supports different encodings, definitions of commands for producing symbols, accents, composite glyphs, etc.\ must be defined using the commands provided for this purpose and described in \emph{\fntguide}. This part of the system is still under development so such tasks should be undertaken with great caution. Also, |\DeclareRobustCommand| should be used for encoding-independent commands of this type. Note that it is no longer possible to refer to the math font set-up outside math mode: for example, neither |\textfont 1| nor |\scriptfont 2| are guaranteed to be defined in other modes. \subsection{General style} \label{Sec:general} The new system provides many commands designed to help you produce well-structured class and package files that are both robust and portable. This section outlines some ways to make intelligent use of these. \subsubsection{Loading other files} \label{Sec:loading} \LaTeX{} provides the commands |\LoadClass| and |\RequirePackage| for using classes or packages inside other classes or packages. We recommend strongly that you use them, rather than the primitive |\input| command, for a number of reasons. Files loaded with |\input <filename>| will not be listed in the |\listfiles| list. If a package is always loaded with |\RequirePackage| or |\usepackage| then, even if its loading is requested several times, it will be loaded only once. By contrast, if it is loaded with |\input| then it can be loaded more than once; such an extra loading may waste time and memory and it may produce strange results. If a package provides option-processing then, again, strange results are possible if the package is |\input| rather than loaded by means of |\usepackage| or |\RequirePackage|. If the package |foo.sty| loads the package |baz.sty| by use of |\input baz.sty| then the user will get a warning: \begin{verbatim} LaTeX Warning: You have requested package `foo', but the package provides `baz'. \end{verbatim} Thus, for several reasons, using |\input| to load packages is not a good idea. Unfortunately, if you are upgrading the file |myclass.sty| to a class file then you have to make sure that any old files which contain |\input myclass.sty| still work. This is also true of the standard classes (|article|, |book| and |report|), since a lot of existing \LaTeX~2.09 document styles contain |\input article.sty|. The approach which we took was to provide minimal files |article.sty|, |book.sty| and |report.sty|, which load the appropriate class files. For example, |article.sty| contains just the following lines: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \@obsoletefile{article.sty}{article.cls} \LoadClass{article} \end{verbatim} You may wish to do the same or, if you think that it is safe to do so, you may decide to just remove |myclass.sty|. \subsubsection{Make it robust} We consider it good practice, when writing packages and classes, to use \LaTeX{} commands as much as possible. Thus, instead of using |\def...| we recommend using one of |\newcommand|, |\renewcommand| or |\providecommand|; |\CheckCommand| is also useful. Doing this makes it less likely that you will inadvertently redefine a command, giving unexpected results. When you define an environment, use |\newenvironment| or |\renewenvironment| instead |\def\foo{...}| and |\def\endfoo{...}|. If you need to set or change the value of a \m{dimen} or \m{skip} register, use |\setlength|. To manipulate boxes, use \LaTeX{} commands such as |\sbox|, |\mbox| and |\parbox| rather than |\setbox|, |\hbox| and |\vbox|. Use |\PackageError|, |\PackageWarning| or |\PackageInfo| (or the equivalent class commands) rather than |\@latexerr|, |\@warning| or |\wlog|. It is still possible to declare options by defining |\ds@<option>| and calling |\@options|; but we recommend the |\DeclareOption| and |\ProcessOptions| commands instead. These are more powerful and use less memory. So rather than using: \begin{verbatim} \def\ds@draft{\overfullrule 5pt} \@options \end{verbatim} you should use: \begin{verbatim} \DeclareOption{draft}{\setlength{\overfullrule}{5pt}} \ProcessOptions \end{verbatim} The advantage of this kind of practice is that your code is more readable and, more important, that it is less likely to break when used with future versions of \LaTeX{}. \subsubsection{Make it portable} It is also sensible to make your files are as portable as possible. To ensure this; they should contain only visible 7-bit text; and the filenames should contain at most eight characters (plus the three letter extension). It is also useful if local classes or packages have a common prefix, for example the University of Nowhere classes might begin with |unw|. This helps to avoid every University having its own thesis class, all called |thesis.cls|. If you rely on some features of the \LaTeX{} kernel, or on a package, please specify the release-date you need. For example, the package error commands were introduced in the June 1994 release so, if you use them then you should put: \begin{verbatim} \NeedsTeXFormat{LaTeX2e}[1994/06/01] \end{verbatim} \subsubsection{Useful hooks} Some packages and document styles had to redefine the command |\document| or |\enddocument| to achieve their goal. This is no longer necessary. You can now use the `hooks' |\AtBeginDocument| and |\AtEndDocument| (see Section~\ref{Sec:delays}). Again, using these hooks makes it less likely that your code breaks with future versions of \LaTeX{}. It also makes it more likely that your package can work together with someone else's. \section{The structure of a class or package} \label{Sec:structure} \LaTeXe{} classes and packages have more structure than \LaTeX~2.09 style files did. The outline of a class or package file is: \begin{description} \item[Identification] The file says that it is a \LaTeXe{} package or class, and gives a short description of itself. \item[Preliminary declarations] Here the file declares some commands and can also load other files. Usually these commands will be just those needed for the code used in the declared options. \item[Options] The file declares and processes its options. \item[More declarations] This is where the file does most of its work: declaring new variables, commands and fonts; and loading other files. \end{description} \subsection{Identification} The first thing a class or package file does is identify itself. Package files do this as follows: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{<package>}[<date> <other information>] \end{verbatim} For example: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{latexsym}[1994/06/01 Standard LaTeX package] \end{verbatim} Class files do this as follows: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{<class-name>}[<date> <other information>] \end{verbatim} For example: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{article}[1994/06/01 Standard LaTeX class] \end{verbatim} The \m{date} should be given in the form `\textsc{yyyy/mm/dd}'. This date is checked whenever a user specifies a date in their |\documentclass| or |\usepackage| command. For example, if you wrote: \begin{verbatim} \documentclass{article}[1995/12/23] \end{verbatim} then users at a different location would get a warning that their copy of |article| was out of date. The description of a class is displayed when the class is used. The description of a package is put into the log file. These descriptions are also displayed by the |\listfiles| command. \subsection{Using classes and packages} The first major difference between \LaTeX~2.09 style files and \LaTeXe{} packages and classes is that \LaTeXe{} supports \emph{modularity}, in the sense of building files from small building-blocks rather than using large single files. A \LaTeX{} package or class can load a package as follows: \begin{verbatim} \RequirePackage[<options>]{<package>}[<date>] \end{verbatim} For example: \begin{verbatim} \RequirePackage{ifthen}[1994/06/01] \end{verbatim} This command has the same syntax as the author command |\usepackage|. It allows packages or classes to use features provided by other packages. For example, by loading the |ifthen| package, a package writer can use the `if\dots then\dots else\dots' commands provided by that package. A \LaTeX{} class can load one other class as follows: \begin{verbatim} \LoadClass[<options>]{<class-name>}[<date>] \end{verbatim} For example: \begin{verbatim} \LoadClass[twocolumn]{article} \end{verbatim} This command has the same syntax as the author command |\documentclass|. It allows classes to be based on the syntax and appearance of another class. For example, by loading the |article| class, a class writer only has to change the bits of |article| they don't like, rather than writing a new class from scratch. \subsection{Declaring options} The other major difference between \LaTeX~2.09 styles and \LaTeXe{} packages and classes is in option handling. Packages and classes can now declare options and these can be specified by authors; for example, the |twocolumn| option is declared by the |article| class. An option is declared as follows: \begin{verbatim} \DeclareOption{<option>}{<code>} \end{verbatim} For example, the |dvips| option to the |graphics| package is implemented as: \begin{verbatim} \DeclareOption{dvips}{\input{dvips.def}} \end{verbatim} This means that when an author writes |\usepackage[dvips]{graphics}|, the file |dvips.def| is loaded. As another example, the |a4paper| option is declared in the |article| class to set the |\paperheight| and |\paperwidth| lengths: \begin{verbatim} \DeclareOption{a4paper}{% \setlength{\paperheight}{297mm}% \setlength{\paperwidth}{210mm}% } \end{verbatim} Sometimes a user will request an option which the class or package has not explicitly declared. By default this will produce a warning (for classes) or error (for packages); this behaviour can be altered as follows: \begin{verbatim} \DeclareOption*{<code>} \end{verbatim} For example, to make the package |fred| produce a warning rather than an error for unknown options, you could specify: \begin{verbatim} \DeclareOption*{% \PackageWarning{fred}{Unknown option `\CurrentOption'}% } \end{verbatim} Then, if an author writes |\usepackage[foo]{fred}|, they will get a warning \texttt{Package fred Warning: Unknown option `foo'.} As another example, the |fontenc| package tries to load a file |<ENC>enc.def| whenever the \m{ENC} option is used. This can be done by writing: \begin{verbatim} \DeclareOption*{% \input{\CurrentOption enc.def}% } \end{verbatim} It is possible to pass options on to another package or class, using the command |\PassOptionsToPackage| or |\PassOptionsToClass|. For example, to pass every unknown option on to the |article| class, you can use: \begin{verbatim} \DeclareOption*{% \PassOptionsToClass{\CurrentOption}{article}% } \end{verbatim} If you do this then you should make sure you load the class at some later point, otherwise the options will never be processed! So far, we have explained only how to declare options, not how to execute them. To process the options with which the file was called, you should use: \begin{verbatim} \ProcessOptions \end{verbatim} This executes the \m{code} for each option that was both specified and declared (see Section~\ref{Sec:commands.options} for details of how this is done). For example, if the |jane| package file contains: \begin{verbatim} \DeclareOption{foo}{\typeout{Saw foo.}} \DeclareOption{baz}{\typeout{Saw baz.}} \DeclareOption*{\typeout{What's \CurrentOption?}} \ProcessOptions \end{verbatim} and an author writes |\usepackage[foo,bar]{jane}|, then they will see the messages \texttt{Saw foo.} and \texttt{What's bar?} \subsection{Declarations} Most of the work of a class or package is in defining new commands, or changing the appearance of documents. This is done in the body of the package, using commands such as |\newcommand| or |\setlength|. \LaTeXe{}provides several new commands to help class and package writers; these are described in detail in Section~\ref{Sec:commands}. There are three things that every class file \emph{must} contain: these are a definition of |\normalsize| and values for |\textwidth| and |\textheight|. So a minimal document class file is: \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{minimal}[1994/04/01 Minimal class] \renewcommand{\normalsize}{\fontsize{10}{12}\selectfont} \setlength{\textwidth}{6.5in} \setlength{\textheight}{8in} \end{verbatim} However, this class file will not support footnotes, marginals, floats, etc. nor will it provide any of the 2-letter font commands such as |\rm|; thus most classes will contain more than this minimum! \subsection{Example: a local letter class} A company may have its own letter class, for setting letters in the company style. This section shows a simple implementation of such a class, although a real class would need more structure. The class begins by announcing itself as |neplet.cls|. \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{neplet}[1995/04/01 NonExistent Press letter class] \end{verbatim} Then this next bit passes any options on to the |letter| class, which is loaded with the |a4paper| option. \begin{verbatim} \DeclareOption*{\PassOptionsToClass{\CurrentOption}{letter}} \ProcessOptions \LoadClass[a4paper]{letter} \end{verbatim} In order to use the company letter head, it redefines the |firstpage| page style: this is the page style that is used on the first page of letters. \begin{verbatim} \renewcommand{\ps@firstpage}{% \renewcommand{\@oddhead}{<letterhead goes here>}% \renewcommand{\@oddfoot}{<letterfoot goes here>}% } \end{verbatim} And that's it! \subsection{Example: a newsletter class} A simple newsletter can be typeset with \LaTeX{}, using a variant of the |article| class. The class begins by announcing itself as |smplnews.cls|. \begin{verbatim} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{smplnews}[1995/04/01 The Simple News newsletter class] \newcommand{\headlinecolor}{\normalcolor} \end{verbatim} It passes most specified options on to the |article| class: apart from the |onecolumn| option, which is switched off, and the |green| option, which sets the headline in green. \begin{verbatim} \DeclareOption{onecolumn}{\OptionNotUsed} \DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}} \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} \ProcessOptions \end{verbatim} It then loads the class |article| with the option |twocolumn|. \begin{verbatim} \LoadClass[twocolumn]{article} \end{verbatim} Since the newsletter is to be printed in colour, it now loads the |color| package. The class does not specify a device driver option since this should be specified by the user of the |smplnews| class. \begin{verbatim} \RequirePackage{color} \end{verbatim} The class then redefines |\maketitle| to produce the title in 72pt Helvetica bold oblique, in the appropriate colour. \begin{verbatim} \renewcommand{\maketitle}{% \twocolumn[% \fontsize{72}{80}\fontfamily{phv}\fontseries{b}% \fontshape{sl}\selectfont\headlinecolor \@title ]% } \end{verbatim} It redefines |\section| and switches off section numbering. \begin{verbatim} \renewcommand{\section}{% \@startsection {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}% {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}% } \setcounter{secnumdepth}{0} \end{verbatim} It also sets the three essential things. \begin{verbatim} \renewcommand{\normalsize}{\fontsize{9}{10}\selectfont} \setlength{\textwidth}{17.5cm} \setlength{\textheight}{25cm} \end{verbatim} In practice, a class would need more than this: it would provide commands for issue numbers, authors of articles, page styles and so on; but this skeleton gives a start. The |ltnews| class file is not much more complex than this one. \section{Commands for class and package writers} \label{Sec:commands} This section describes briefly each of the new commands for class and package writers. To find out about other aspects of the new system, you should also read \emph{\LaTeXbook}, \emph{\LaTeXcomp} and \emph{\usrguide}. \subsection{Identification} The first group of commands discussed here are those used to identify your class or package file. \begin{decl} |\NeedsTeXFormat| \arg{format-name} \oarg{release-date} \end{decl} This command tells \TeX{} that this file should be processed using a format with name \m{format-name}. You can use the optional argument \m{release-date} to further specify the earliest release date of the format that is needed. When the release date of the format is older than the one specified a warning will be generated. The standard \m{format-name} is \texttt{LaTeX2e}. The date, if present, must be in the form \textsc{yyyy/mm/dd}. Example: \begin{verbatim} \NeedsTeXFormat{LaTeX2e}[1994/06/01] \end{verbatim} \begin{decl} |\ProvidesClass| \arg{class-name} \oarg{release-info} \\ |\ProvidesPackage| \arg{package-name} \oarg{release-info} \end{decl} This declares that the current file contains the definitions for the document class \m{class-name} or package \m{package-name}. The optional \m{release-info}, if used, must contain: \begin{itemize} \item the release date of this version of the file, in the form \textsc{yyyy/mm/dd}; \item optionally followed by a space and a short description, possibly including a version number. \end{itemize} The above syntax should be followed exactly so that this information can be used by |\LoadClass| or |\documentclass| (for classes) or |\RequirePackage| or |\usepackage| (for packages) to test that the release is not too old. The whole of this \m{release-info} information is displayed by |\listfiles| and should therefore not be too long. Example: \begin{verbatim} \ProvidesClass{article}[1994/06/01 v1.0 Standard LaTeX class] \ProvidesPackage{ifthen}[1994/06/01 v1.0 Standard LaTeX package] \end{verbatim} \begin{decl} |\ProvidesFile| \arg{file-name} \oarg{release-info} \end{decl} This is similar to the two previous commands except that here the full filename, including the extension, must be given. It is used for declaring any files other than main class and package files. Example: \begin{verbatim} \ProvidesFile{T1enc.def}[1994/06/01 v1.0 Standard LaTeX file] \end{verbatim} \subsection{Loading files} This group of commands can be used to create your own document class or package by building on existing classes or packages. \begin{decl} |\RequirePackage| \oarg{options-list} \arg{package-name} \oarg{release-info} \end{decl} Packages and classes should use this command to load other packages. Its use is the same as the author command |\usepackage|. Example: \begin{verbatim} \RequirePackage{ifthen}[1994/06/01] \end{verbatim} \begin{decl} |\LoadClass| \oarg{options-list} \arg{class-name} \oarg{release-info} \end{decl} This command is for use \emph{only} in class files, it cannot be used in packages files. It is used in the same way as |\documentclass|, to load a class file. Also, it can be used at most once within a class file. Example: \begin{verbatim} \LoadClass{article}[1994/06/01] \end{verbatim} \subsection{Option declaration} \label{Sec:commands.options.dec} The following commands deal with the declaration and handling of options to document classes and packages. There are some commands designed especially for use within the \m{code} argument of these commands (see below). \begin{decl} |\DeclareOption| \arg{option-name} \arg{code} \end{decl} This makes \m{option-name} a `declared option' of the class or package in which it is put. The \m{code} argument contains the code to be executed if that option is specified for the class or package; it can contain any valid \LaTeXe{} construct. Example: \begin{verbatim} \DeclareOption{twoside}{\@twosidetrue} \end{verbatim} \begin{decl} |\DeclareOption*| \arg{code} \end{decl} This declares the \m{code} to be executed for every option which is specified for, but otherwise not explicitly declared by, the class or package; this code is called the `default option code' and it can contain any valid \LaTeXe{} construct. If a class file contains no |\DeclareOption*| then, by default, all specified but undeclared options for that class will be silently passed to all packages (as will the specified and declared options for that class). If a package file contains no |\DeclareOption*| then, by default, each specified but undeclared option for that package will produce an error. \subsection{Within option code commands} \label{Sec:within.code} These two commands can be used only within the \m{code} argument of either |\DeclareOption| or |\DeclareOption*|. Other commands commonly used within these arguments can be found in the next few subsections. \begin{decl} |\CurrentOption| \end{decl} This expands to the name of the current option. \begin{decl} |\OptionNotUsed| \end{decl} This causes the current option to be added to the list of `unused options'. \subsection{Moving options around} These two commands are also very useful within the \m{code} argument of |\DeclareOption| or |\DeclareOption*|. \begin{decl} |\PassOptionsToPackage| \arg{options-list} \arg{package-name}\\ |\PassOptionsToClass| \arg{options-list} \arg{class-name} \end{decl} The command |\PassOptionsToPackage| passes the options in \m{options-list} to package \m{package-name}. This means that it adds the \m{option-list} to the list of options used by any future |\RequirePackage| or |\usepackage| command for package \m{package-name}. Example: \begin{verbatim} \PassOptionsToPackage{foo,bar}{fred} \RequirePackage[baz]{fred} \end{verbatim} is the same as: \begin{verbatim} \RequirePackage[foo,bar,baz]{fred} \end{verbatim} Similarly, |\PassOptionsToClass| may be used in a class file to pass options to another class to be loaded with |\LoadClass|. \subsection{Delaying code} \label{Sec:delays} These first two commands are also intended primarily for use within the \m{code} argument of |\DeclareOption| or |\DeclareOption*|. \begin{decl} |\AtEndOfClass| \arg{code}\\ |\AtEndOfPackage| \arg{code} \end{decl} These commands declare \m{code} that is saved away internally and then executed after processing the whole of the current class or package file. Repeated use of these commands is permitted: the code in the arguments is stored (and later executed) in the order of their declarations. \begin{decl} |\AtBeginDocument| \arg{code}\\ |\AtEndDocument| \arg{code} \end{decl} These commands declare \m{code} to be saved internally and executed while \LaTeX{} is executing |\begin{document}| or |\end{document}|. The \m{code} specified in the argument to |\AtBeginDocument| is executed near the end of the |\begin{document}| code, \emph{after} the font selection tables have been set up. It is therefore a useful place to put code which needs to be executed after everything has been prepared for typesetting and when the normal font for the document is the current font. The \m{code} specified in the argument to |\AtEndDocument| is executed at the beginning of the |\end{document}| code, \emph{before} the final page is finished and before any leftover floating environments are processed. If some of the \m{code} is to be executed after these two processes, you should include a |\clearpage| at the appropriate point in \m{code}. Repeated use of these commands is permitted: the code in the arguments is stored (and later executed) in the order of their declarations. \subsection{Option processing} \label{Sec:commands.options} \begin{decl} |\ProcessOptions| \end{decl} This command executes the \m{code} for each selected option. We shall first describe how |\ProcessOptions| works in a package file, and then how this differs in a class file. To understand in detail what |\ProcessOptions| does in a package file, you have to know the difference between \emph{local} and \emph{global} options. \begin{itemize} \item \textbf{Local options} are those which have been explicitly specified for this particular package in the \m{options} argument of any of these: \begin{quote} |\PassOptionsToPackage{<options>}| \ |\usepackage[<options>]|\\ |\RequirePackage[<options>]| \end{quote} \item \textbf{Global options} are any other options that are specified by the author in the \m{options} argument of |\documentclass[<options>]|. \end{itemize} For example, suppose that a document begins: \begin{verbatim} \documentclass[german,twocolumn]{article} \usepackage{gerhardt} \end{verbatim} whilst package |gerhardt| calls package |fred| with: \begin{verbatim} \PassOptionsToPackage{german,dvips,a4paper}{fred} \RequirePackage[errorshow]{fred} \end{verbatim} then: \begin{itemize} \item |fred|'s local options are |german|, |dvips|, |a4paper| and |errorshow|; \item |fred|'s only global option is |twocolumn|. \end{itemize} When |\ProcessOptions| is called, the following happen. \begin{itemize} \item \emph{First}, for each option so far declared in |fred.sty| by |\DeclareOption|, it looks to see if that option is either a global or a local option for |fred|: if it is then the corresponding code is executed. This is done in the order in which these options were declared in |fred.sty|. \item \emph{Then}, for each remaining \emph{local} option, the command |\ds@<option>| is executed if it has been defined somewhere (other than by a |\DeclareOption|); otherwise, the `default option code' is executed. If no default option code has been declared then an error message is produced. This is done in the order in which these options were specified. \end{itemize} Throughout this process, the system ensures that the code declared for an option is executed at most once. Returning to the example, if |fred.sty| contains: \begin{verbatim} \DeclareOption{dvips}{\typeout{DVIPS}} \DeclareOption{german}{\typeout{GERMAN}} \DeclareOption{french}{\typeout{FRENCH}} \DeclareOption*{\PackageWarning{fred}{Unknown `\CurrentOption'}} \ProcessOptions \end{verbatim} then the result of processing this document will be: \begin{verbatim} DVIPS GERMAN Package fred Warning: Unknown `a4paper'. Package fred Warning: Unknown `errorshow'. \end{verbatim} Note the following: \begin{itemize} \item the code for the |dvips| option is executed before that for the |german| option, because that is the order in which they are declared in |fred.sty|; \item the code for the |german| option is executed only once, when the declared options are being processed; \item the |a4paper| and |errorshow| options produce the warning from the code declared by |\DeclareOption*| (in the order in which they were specified), whilst the |twocolumn| option does not: this is because |twocolumn| is a global option. \end{itemize} In a class file, |\ProcessOptions| works in the same way, except that: \emph{all} options are local; and the default value for |\DeclareOption*| is |\OptionNotUsed| rather than an error. \begin{decl} |\ProcessOptions*| |\@options| \end{decl} This is like |\ProcessOptions| but it executes the options in the order specified in the calling commands, rather than in the order of declaration in the class or package. For a package this means that the global options are processed first. The |\@options| command from \LaTeX~2.09 has been made equivalent to this in order to ease the task of updating old document styles to \LaTeXe{} class files. \begin{decl} |\ExecuteOptions| \arg{options-list} \end{decl} For each option in the \m{options-list}, in order, this command simply executes the command |\ds@<option>| (if this command is not defined, then that option is silently ignored). It can be used to provide a `default option list' just before |\ProcessOptions|. For example, suppose that in a class file you want to set up the default design to be: two-sided printing; 11pt fonts; in two columns. Then it could specify: \begin{verbatim} \ExecuteOptions{11pt,twoside,twocolumn} \end{verbatim} \subsection{Safe File Commands} These commands deal with file input; they ensure that the non-existence of a requested file can be handled in a user-friendly way. \begin{decl} |\IfFileExists| \arg{file-name} \arg{true} \arg{false} \end{decl} If the file exists then the code specified in \m{true} is executed. If the file does not exist then the code specified in \m{false} is executed. This command does \emph{not} input the file. \begin{decl} |\InputIfFileExists| \arg{file-name} \arg{true} \arg{false} \end{decl} This inputs the file \m{file-name} if it exists and, immediately before the input, the code specified in \m{true} is executed. If the file does not exist then the code specified in \m{false} is executed. It is implemented using |\IfFileExists|. \subsection{Generating errors} These commands should be used by third party classes and packages to report errors, or to provide information to authors. \begin{decl} |\ClassError| \arg{class-name} \arg{error-text} \arg{help-text}\\ |\PackageError| \arg{package-name} \arg{error-text} \arg{help-text} \end{decl} These produce an error message. The \m{error-text} is displayed and the |?| error prompt is shown. If the user types |h|, they will be shown the \m{help-text}. Within the \m{error-text} and \m{help-text}: |\protect| can be used to stop a command from expanding; |\MessageBreak| causes a line-break; and |\space| prints a space. Note that the \m{error-text} will have a full stop added to it, so do not put one into the argument. For example: \begin{verbatim} \newcommand{\foo}{FOO} \PackageError{ethel}{% Your hovercraft is full of eels,\MessageBreak and \protect\foo\space is \foo }{% Oh dear! Something's gone wrong.\MessageBreak \space \space Try typing \space <<return>> \space to proceed, ignoring \protect\foo. } \end{verbatim} produces this display: \begin{verbatim} ! Package ethel Error: Your hovercraft is full of eels, (ethel) and \foo is FOO. See the ethel package documentation for explanation. \end{verbatim} If the user types |h|, this will be shown: \begin{verbatim} Oh dear! Something's gone wrong. Try typing <<return>> to proceed, ignoring \foo. \end{verbatim} \begin{decl} |\ClassWarning| \arg{class-name} \arg{warning-text}\\ |\PackageWarning| \arg{package-name} \arg{warning-text}\\ |\ClassWarningNoLine| \arg{class-name} \arg{warning-text}\\ |\PackageWarningNoLine| \arg{package-name} \arg{warning-text}\\ |\ClassInfo| \arg{class-name} \arg{info-text}\\ |\PackageInfo| \arg{package-name} \arg{info-text} \end{decl} The four |Warning| commands are similar to the error commands, except that they produce only a warning on the screen, with no error prompt. The first two, |Warning| versions, also show the line number where the warning occurred, whilst the second two, |WarningNoLine| versions, do not. The two |Info| commands are similar except that they log the information only in the transcript file, including the line number. There are no |NoLine| versions of these two. Within the \m{warning-text} and \m{info-text}: |\protect| can be used to stop a command from expanding; |\MessageBreak| causes a line-break; and |\space| prints a space. Also, these should not end with a full stop as one is automatically added. \subsection{Defining commands} \label{Sec:commands.define} \LaTeXe{} provides some extra methods of (re)defining commands that are intended for use in class and package files. \begin{decl} |\DeclareRobustCommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \end{decl} This command takes the same arguments as |\newcommand| but it declares a robust command, even if some code within the\m{definition} is fragile. You can use this command to define new robust commands, or to redefine existing commands and make them robust. A log is put into the transcript file if a command is redefined. For example, if |\seq| is defined as follows: \begin{verbatim} \DeclareRobustCommand{\seq}[2][n]{% \ifmmode #1_{1}\ldots#1_{#2}% \else \PackageWarning{fred}{You can't use \protect\seq\space in text}% \fi } \end{verbatim} Then the command |\seq| can be used in moving arguments, even though |\ifmmode| cannot, for example: \begin{verbatim} \section{Stuff about sequences $\seq{x}$} \end{verbatim} Note also that there is no need to put a |\relax| before the |\ifmmode| at the beginning of the definition; this is because the protection given by this |\relax| against expansion at the wrong time will be provided internally. \begin{decl} |\CheckCommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \end{decl} This takes the same arguments as |\newcommand| but, rather than define \m{cmd}, it just checks that the current definition of \m{cmd} is exactly as given by \m{definition}. An error is raised if these definitions differ. This command is useful for checking the state of the system before your package starts altering the definitions of commands. It allows you to check, in particular, that no other package has redefined the same command. \subsection{Layout parameters} \begin{decl} |\paperheight|\\ |\paperwidth| \end{decl} These two parameters are usually set by the class to be the size of the paper being used. This should be actual paper size, unlike |\textwidth| and |\textheight| which are the size of the main text body within the margins. \section{Upgrading \LaTeX~2.09 classes and packages} \label{Sec:upgrade} This section describes the changes you may need to make when you upgrade an existing \LaTeX{} style to a package or class but we shall start in optimistic mode. Many existing style files will run with \LaTeXe{} without any modification to the file itself. When everything is running OK, please put a note in the newly created package or class file to record that it runs with the new standard \LaTeX{}; then distribute it to your users. \subsection{Try it first!} \label{Sec:try-it} The first thing you should do is to test your style in `compatibilty mode'. The only change you need to make in order to do this is, possibly, to change the extension of the file to |.cls|: you should make this change only if your file was used as a main document style. Now, without any other modifications, run \LaTeXe{} on a document that uses your file. This assumes that you have a suitable collection of files that tests all the functionality provided by your style file. (If you haven't, now is the time to make one!) You now need to change the test document files so that they are \LaTeXe{} documents: see \emph{\usrguide} for details of how to do this and then try them again. You have now tried the test documents in both \LaTeXe{} native mode and \LaTeX~2.09 compatibility mode. \subsection{Troubleshooting} \label{Sec:trouble} If your file does not work with \LaTeXe{}, there are two likely reasons. \begin{itemize} \item \LaTeX{} now has a robust, well-defined designer's interface for selecting fonts, which is very different from the \LaTeX~2.09 internals. \item Your style file may have used some \LaTeX~2.09 internal commands which have changed, or which have been removed. \end{itemize} When you are debugging your file, you will probably need more information than is normally displayed by \LaTeXe. This is achieved by resetting the counter |errorcontextlines| from its default value of $-1$ to a much higher value, e.g.~999. \subsection{Font commands} Some font and size commands are now defined by the document class rather than by the \LaTeX{} kernel. If you are upgrading a \LaTeX~2.09 document style to a class that does not load one of the standard classes, then you will probably need to add definitions for these commands. \begin{decl} |\rm| |\sf| |\tt| |\bf| |\it| |\sl| |\sc| \end{decl} None of these short-form font selection commands are defined in the \LaTeXe{} kernel. They are defined by all the standard class files. If you want to define them in your class file, there are several reasonable ways to do this. One possible definition is: \begin{verbatim} \newcommand{\rm}{\rmfamily} ... \newcommand{\sc}{\scshape} \end{verbatim} This would make the font commands orthogonal; for example |{\bf\it text}| would produce bold italic, thus: \textbf{\textit{text}}. It will also make them produce an error if used in math mode. Another possible definition is: \begin{verbatim} \DeclareOldFontCommand{\rm}{\rmfamily}{\mathrm} ... \DeclareOldFontCommand{\sc}{\scshape}{\mathsc} \end{verbatim} This will make |\rm| act like |\rmfamily| in text mode (see above) and it will make |\rm| select the |\mathrm| math alphabet in math mode. Thus |${\rm math} = X + 1$| will produce `${\rm math} = X + 1$'. If you do not want font selection to be orthogonal then you can follow the standard classes and define: \begin{verbatim} \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} ... \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\mathsc} \end{verbatim} This means, for example, that |{\bf\it text}| will produce medium weight (rather than bold) italic, thus: \textit{text}. \begin{decl} |\normalsize| \\ |\@normalsize| \end{decl} The command |\@normalsize| is retained for compatibility with \LaTeX~2.09 packages which may have used its value; but redefining it in a class file will have no effect since it is always reset to have the same meaning as |\normalsize|. This means that classes \emph{must} now redefine |\normalsize| rather than redefining |\@normalsize|; for example (a rather incomplete one): \begin{verbatim} \renewcommand{\normalsize}{\fontsize{10}{12}\selectfont} \end{verbatim} Note that |\normalsize| is defined by the \LaTeX{} kernel to be an error message. \begin{decl} |\tiny| |\footnotesize| |\small| |\large|\\ |\Large| |\LARGE| |\huge| |\Huge| \end{decl} None of these other `standard' size-changing commands are defined in the kernel: each needs to be defined in a class file if you need it. They are all defined by the standard classes. This means you should use |\renewcommand| for |\normalsize| and |\newcommand| for the other size-changing commands. \subsection{Obsolete commands} Some packages will not work with \LaTeXe{}, normally because they relied on an internal \LaTeX{} command which was never supported and has now changed, or been removed. In many cases there will now be a robust, high-level means of achieving what previously required low-level commands. Please consult Section~\ref{Sec:commands} to see if you can now use the \LaTeXe{} class and package writers commands. Also, of course, if your package or class redefined any of the kernel commands (i.e.~those defined in the files |latex.tex|, |slitex.tex|, |lfonts.tex|, |sfonts.tex|) then you will need to check it very carefully against the new kernel in case the implementation has changed or the command no longer exists in the \LaTeX2e{} kernel. Too many of the internal commands of \LaTeX~2.09 have been re-implemented or removed to be able to list them all here. You must check any that you have used or changed. We shall, however, list some of the more important commands which are no longer supported. \begin{decl} |\tenrm| |\elvrm| |\twlrm| \dots\\ |\tenbf| |\elvbf| |\twlbf| \dots\\ |\tensf| |\elvsf| |\twlsf| \dots\\ \qquad$\vdots$ \end{decl} The (approximately) seventy internal commands of this form are no longer defined. If your class or package uses them then \emph{please} replace them with new font commands described in \emph{\fntguide}. For example, the command |\twlsf| should be replaced by: \begin{verbatim} \fontsize{12}{14}\normalfont\sffamily\selectfont \end{verbatim} Another possibility is to use the |rawfonts| package, described in \emph{\usrguide}. Also, remember that many of the fonts pre-loaded by \LaTeX~2.09 fonts are no longer pre-loaded. \begin{decl} |\vpt| |\vipt| |\viipt| \dots \end{decl} These were the internal size-selecting commands in \LaTeX~2.09. (They can still be used in \LaTeX~2.09 compatibility mode.) Please use the command |\fontsize| instead: see \emph{\fntguide} for details. For example, |\vpt| should be replaced by: \begin{verbatim} \fontsize{5}{6}\normalfont\selectfont \end{verbatim} \begin{decl} |\prm|, |\pbf|, |\ppounds|, |\pLaTeX| \dots \end{decl} \LaTeX~2.09 used several commands beginning with |\p| in order to provide `protected' commands. For example, |\LaTeX| was defined to be |\protect\pLaTeX|, and |\pLaTeX| was defined to produce the \LaTeX{} logo. This made |\LaTeX| robust, even though |\pLaTeX| was not. These commands have now been reimplemented using |\DeclareRobustCommand| (described in Section~\ref{Sec:commands.define}). If your package redefined one of the |\p|-commands then you must remove the redefinition and use |\DeclareRobustCommand| to redefine the non-|\p| command. \begin{decl} |\footheight|\\ |\@maxsep|\\ |\@dblmaxsep| \end{decl} These parameters are not used by \LaTeXe{} so they have been removed, except in \LaTeX~2.09 compatibility mode. Classes should no longer set them. \begin{thebibliography}{1} \bibitem{A-W:GMS94} Michel Goossens, Frank Mittelbach, and Alexander Samarin. \newblock {\em The {\LaTeX} Companion}. \newblock Addison-Wesley, Reading, Massachusetts, 1994. \bibitem{A-W:DEK91} Donald~E. Knuth. \newblock {\em The \TeX book}. \newblock Addison-Wesley, Reading, Massachusetts, 1986. \newblock Revised to cover \TeX3, 1991. \bibitem{A-W:LLa94} Leslie Lamport. \newblock {\em {\LaTeX:} A Document Preparation System}. \newblock Addison-Wesley, Reading, Massachusetts, second edition, 1994. \end{thebibliography} \newpage \thispagestyle{empty} \section*{\LaTeXe{} Summary sheet: updating old styles} Section references below are to \emph{\clsguide}. \begin{enumerate} \item Should it become a class or a package? See Section~\ref{Sec:classorpkg} for how to answer this question. \item If it uses another style file, then you will need to obtain an updated version of this other file. Look at Section~\ref{Sec:loading} for information on how to load other class and package files. \item Try it: see Section~\ref{Sec:try-it}. \item It worked? Excellent, but there are probably still some things you should change in order to make your file into a well-structured \LaTeXe{} file that is both robust and portable. So you should now read Section~\ref{Sec:writing}, especially~\ref{Sec:general}. You will also find some useful examples in Section~\ref{Sec:structure}. If your file sets up new fonts, font-changing commands or symbols, you should also read \emph{\fntguide}. \item It did not work? There are three possibilities here: \begin{itemize} \item error messages are produced whilst reading your file; \item error messages are produced whilst processing test documents; \item there are no errors but the output is not as it should be. \end{itemize} Don't forget to check carefully for this last possibility. If you have got to this stage then you will need to read Section~\ref{Sec:upgrade} to find the solutions that will make your file work. \end{enumerate} \end{document}