From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 info/dtxtut/dtxtut.tex | 2107 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 2107 insertions(+)
 create mode 100644 info/dtxtut/dtxtut.tex

(limited to 'info/dtxtut/dtxtut.tex')

diff --git a/info/dtxtut/dtxtut.tex b/info/dtxtut/dtxtut.tex
new file mode 100644
index 0000000000..cf9d73698e
--- /dev/null
+++ b/info/dtxtut/dtxtut.tex
@@ -0,0 +1,2107 @@
+%%% ====================================================================
+%%%  @LaTeX-file{
+%%%     author          = "Scott Pakin",
+%%%     version         = "2.1",
+%%%     date            = "13 September 2015",
+%%%     time            = "23:06:32 MDT",
+%%%     filename        = "dtxtut.tex",
+%%%     checksum        = "38789 2107 7734 71546"
+%%%     email           = "scott+dtx@pakin.org (Internet)",
+%%%     codetable       = "ISO/ASCII",
+%%%     keywords        = "LaTeX, packages, .ins files, .dtx files,
+%%%                        literate programming",
+%%%     supported       = "yes",
+%%%     abstract        = "This tutorial is intended for advanced
+%%%                        LaTeX 2e users who want to learn how to
+%%%                        create .ins and .dtx files for distributing
+%%%                        their homebrewed classes and style files.",
+%%%     docstring       = "The checksum field above contains a CRC-16
+%%%                        checksum as the first value, followed by
+%%%                        the equivalent of the standard UNIX wc
+%%%                        (word count) utility output of lines,
+%%%                        words, and characters.  This is produced by
+%%%                        Robert Solovay's checksum utility.  This file
+%%%                        header was produced with the help of Nelson
+%%%                        Beebe's filehdr utility.  Both checksum and
+%%%                        filehdr are available from CTAN
+%%%                        (http://www.ctan.org)."
+%%%
+%%%  }
+%%% ====================================================================
+
+\documentclass[11pt]{ltxguide}
+\usepackage{varioref}
+\usepackage{makeidx}
+\usepackage{alltt}
+\usepackage{tocbibind}
+\usepackage[bookmarksopen]{hyperref}
+\usepackage{hyperxmp}
+
+% Define this document's metadata.
+\title{How to Package Your \LaTeX{} Package}
+\author{Scott Pakin \texttt{<scott+dtx@pakin.org>}}
+\date{13 September 2015}
+\hypersetup{%
+  pdftitle={How to Package Your LaTeX Package},
+  pdfauthor={Scott Pakin},
+  pdfcontactemail={scott+dtx@pakin.org},
+  pdfcontacturl={http://www.pakin.org/\xmptilde scott},
+  pdfsubject={Writing .ins and .dtx files for LaTeX},
+  pdfkeywords={LaTeX package documentation, literate programming, typesetting, installer files},
+  pdfcaptionwriter={Scott Pakin},
+  pdfcopyright={Copyright (C) 2015 Scott Pakin},
+  pdflicenseurl={http://latex-project.org/lppl/},
+  pdflang={en-US}
+}
+
+% Define a term.
+\newcommand{\defn}[2][X]{%
+  \ifx#1X
+    \emph{#2}\index{#2}%
+  \else
+    \emph{#2}\index{#1}%
+  \fi
+}
+
+% Make a version of \dots that allows a subsequent line break.
+\newcommand{\dotsbrk}{\dots\linebreak[0]}
+
+% If we have url.sty loaded, use that for formatting URLs.
+\ifx\url\undefined
+\else
+  \let\URL=\url
+\fi
+
+% Define formatting for various packages.
+\newcommand{\DOC}{\textsf{Doc}\index{Doc@\textsf{Doc}}}
+\newcommand{\ds}{\textsf{DocStrip}\index{DocStrip@\textsf{DocStrip}}}
+\newcommand{\svrb}{\texttt{shortvrb}\index{shortvrb@\texttt{shortvrb}}}
+
+% Customize varioref's messages.
+\def\reftextbefore{on the preceding page}
+\def\reftextfacebefore{on the preceding page}
+\def\reftextcurrent{above}   % We promise not to make any forward references.
+
+% Define some macros to help automate indexing.
+\makeindex
+{\catcode`\|=0 \catcode`\\=12
+ |gdef|bslash{\}}
+\newcommand{\defmacro}[1]{%                   % Define a macro.
+  \texttt{\bslash#1}%
+  \index{#1@\texttt{\string\bslash{}#1}}%
+}
+\newcommand{\usemacro}[1]{%                   % Use a macro.
+  \texttt{\bslash#1}%
+  \index{#1@\texttt{\string\bslash{}#1}}%
+}
+\newcommand{\indexmacro}[1]{%                 % Index a macro (no display).
+  \index{#1@\texttt{\string\bslash{}#1}}%
+}
+{\catcode`\|=12                               % Same as \indexmacro, but
+  \gdef\indexmacroBegin#1{%                   % for ranges of text
+    \index{#1@\texttt{\string\bslash{}#1}|(}%
+  }
+  \gdef\indexmacroEnd#1{%
+    \index{#1@\texttt{\string\bslash{}#1}|)}%
+  }
+}
+\newcommand{\defthing}[1]{%                   % Define a non-macro thing.
+  \texttt{#1}%
+  \index{#1@\texttt{#1}}%
+}
+\newcommand{\usething}[1]{%                   % Use a non-macro thing.
+  \texttt{#1}%
+  \index{#1@\texttt{#1}}%
+}
+\newcommand{\indexthing}[1]{%                 % Index a non-macro thing.
+  \index{#1@\texttt{#1}}%
+}
+{\catcode`\|=12                               % Same as \indexthing, but
+  \gdef\indexthingBegin#1{%                   % for ranges of text
+    \index{#1@\texttt{#1}|(}%
+  }
+  \gdef\indexthingEnd#1{%
+    \index{#1@\texttt{#1}|)}%
+  }
+}
+
+% Define shortcuts to index commonly used terms.
+\newcommand{\insfile}{%
+  \texttt{.ins}\index{installer file}}
+\newcommand{\dtxfile}{%
+  \texttt{.dtx}\index{documented LaTeX file@documented \string\LaTeX{} file}}
+\newcommand{\styfile}{%
+  \texttt{.sty}\index{style file}}
+\newcommand{\clsfile}{%
+  \texttt{.cls}\index{class file}}
+\newcommand{\CTAN}{%
+  CTAN\index{Comprehensive \string\TeX{} Archive Network}}
+\newcommand{\swiftexel}{%
+  \texttt{swiftex.el}\index{swiftex.el@\texttt{swiftex.el}}}
+\newcommand{\Emacs}{%
+  Emacs\index{Emacs}}
+\newcommand{\latex}[1][\LaTeX]{%
+  #1\index{LaTeX@\LaTeX}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+\sloppy
+\maketitle
+
+\begin{abstract}
+  This tutorial is intended for advanced \latex[\LaTeXe]{} users who
+  want to learn how to create \insfile{} and \dtxfile{} files for
+  distributing their homebrewed classes and style files.
+\end{abstract}
+
+
+\section{Introduction}
+
+\paragraph{Requirements}
+We assume that you already know how to \emph{program} in \latex\@.
+That is, you should know how to use \usemacro{newcommand},
+\usemacro{newenvironment}, and preferably a smidgen of \TeX\@.  You
+should also be familiar with ``\clsguide'', which is available from
+\CTAN{} (\URL{http://www.ctan.org}) and comes with most
+\latex[\LaTeXe]{} distributions in a file called |clsguide.dvi|.
+Finally, you should know how to install packages\index{package} that
+are shipped as a \dtxfile{} file plus a \insfile{} file.
+
+\index{package|(}
+\paragraph{Terminology}
+A \defn[style file]{style \textnormal{(\styfile{})} file} is primarily a
+collection of macro and environment definitions.  One or more style
+files (\eg a main style file that \usemacro{input}s or
+\usemacro{RequirePackage}s multiple helper files) is called a
+\defn{package}.  Packages are loaded into a document with
+\usemacro{usepackage}|{<main .sty file>}|\index{style file}.  In the
+rest of this document, we use the notation ``\m{package}'' to
+represent the name of your package.
+\index{package|)}
+
+\paragraph{Motivation}
+The important parts of a package\index{package} are the code, the
+documentation of the code, and the user documentation.  Using the
+\DOC{} and \ds{} programs, it's possible to combine all three of these
+into a single, \defn[documented LaTeX file@documented \string\LaTeX{}
+file]{documented \LaTeX \textnormal{(\dtxfile{})} file}.  The primary
+advantage of a \dtxfile{} file is that it enables you to use arbitrary
+\latex{} constructs to comment\index{comments} your code.  Hence,
+macros, environments, code stanzas, variables, and so forth can be
+explained using tables, figures, mathematics, and font changes.  Code
+can be organized into sections using \latex's sectioning commands.
+\index{indexing|(}
+\DOC{} even facilitates generating a unified index that indexes both
+macro definitions (in the \latex{} code) and macro descriptions (in
+the user documentation).
+\index{indexing|)}
+This emphasis on writing verbose, nicely typeset
+comments\index{comments} for code---essentially treating a program as
+a book that describes a set of algorithms---is known as \defn{literate
+programming}~\cite{Knuth1984:literate} and has been in use since the
+early days of \TeX.
+
+This tutorial will teach you how to write basic \dtxfile{} files and
+the \insfile{} files that manipulate them.  Although there is much
+overlap with chapter~14 of \emph{The \latex{}
+Companion}~\cite{Goossens1994:companion}, this document is structured
+as a step-by-step tutorial, while \emph{The \latex{} Companion} is
+more reference-like.  Furthermore, this tutorial shows how to write a
+single file that serves as both documentation and driver file, which
+is a more typical usage of the \DOC{} system than using separate
+files.
+
+
+\index{installer file|(}
+
+\section{The \texttt{.ins} file}
+\label{sec:ins-file}
+
+The first step in preparing a package for distribution is to write an
+\defn[installer file]{installer \textnormal{(\insfile{})} file}.  An
+installer file extracts the code from a \dtxfile{} file, uses \ds{} to
+strip off the comments\index{comments} and documentation, and outputs
+a \styfile{} file.  The good news is that a \insfile{} file is
+typically fairly short and doesn't change significantly from one
+package\index{package} to another.
+
+\index{license|(}
+\insfile{} files usually start with comments\index{comments}
+specifying the copyright\index{copyright} and license information:
+
+\begin{verbatim}
+    %%
+    %% Copyright (C) <year> by <your name>
+    %%
+    %% This file may be distributed and/or modified under the
+    %% conditions of the LaTeX Project Public License, either
+    %% version 1.3 of this license or (at your option) any later
+    %% version.  The latest version of this license is in:
+    %%
+    %%    http://www.latex-project.org/lppl.txt
+    %%
+    %% and version 1.3 or later is part of all distributions of
+    %% LaTeX version 2005/12/01 or later.
+    %%
+\end{verbatim}
+
+\noindent
+\index{package|(}
+The \latex{} Project Public License\index{LaTeX Project Public
+License@\LaTeX{} Project Public License} (LPPL) is the license under
+which most packages---and \latex{} itself---are distributed.  Of
+course, you can release your package under any license you want; the
+LPPL is merely the most common license for \latex{} packages.  The
+LPPL specifies that a user can do whatever he wants with your
+package---including sell it and give you nothing in return.  The only
+restrictions are that he must give you credit for your work, and he
+must change the name of the package if he modifies anything to avoid
+versioning confusion.
+\index{package|)}
+\index{license|)}
+\index{LPPL|see{\LaTeX{} Project Public License}}
+
+The next step is to load \ds:
+
+\begin{verbatim}
+    \input docstrip.tex
+\end{verbatim}
+
+
+\indexmacroBegin{keepsilent} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{keepsilent}
+\end{decl}
+
+By default, \ds{} gives a line-by-line account of its activity.  These
+messages aren't terribly useful, so most people turn them off:
+
+\begin{verbatim}
+    \keepsilent
+\end{verbatim}
+
+\indexmacroEnd{keepsilent}   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{usedir} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{usedir} \arg{directory}
+\end{decl}
+
+A system administrator can specify the base directory under which all
+\TeX-related files should be installed, \eg |/usr/share/texmf|.  (See
+``\usemacro{BaseDirectory}'' in the \ds{} manual.)  The \insfile{}
+file specifies where its files should be installed relative to that.
+The following is typical:
+
+\begin{verbatim}
+    \usedir{tex/latex/<package>}
+\end{verbatim}
+
+\indexmacroEnd{usedir}   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{preamble} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{endpreamble}
+
+\begin{decl}
+  \defmacro{preamble}    \\
+  \m{text}               \\
+  \defmacro{endpreamble}
+\end{decl}
+
+\index{comments|(}
+The next step is to specify a \defn{preamble}, which is a block of
+commentary that will be written to the top of every generated file:
+
+\begin{verbatim}
+    \preamble
+
+    This is a generated file.
+
+    Copyright (C) <year> by <your name>
+
+    This file may be distributed and/or modified under the
+    conditions of the LaTeX Project Public License, either
+    version 1.3 of this license or (at your option) any later
+    version.  The latest version of this license is in:
+
+       http://www.latex-project.org/lppl.txt
+
+    and version 1.3 or later is part of all distributions of
+    LaTeX version 2005/12/01 or later.
+
+    \endpreamble
+\end{verbatim}
+
+\index{comments|)}
+
+\noindent
+The preceding preamble would cause |<package>.sty|\index{style file}
+to begin as follows:
+
+\begin{verbatim}
+    %%
+    %% This is file `<package>.sty',
+    %% generated with the docstrip utility.
+    %%
+    %% The original source files were:
+    %%
+    %% <package>.dtx  (with options: `package')
+    %%
+    %% This is a generated file.
+    %%
+    %% Copyright (C) <year> by <your name>
+    %%
+    %% This file may be distributed and/or modified under the
+    %% conditions of the LaTeX Project Public License, either
+    %% version 1.3 of this license or (at your option) any later
+    %% version.  The latest version of this license is in:
+    %%
+    %%    http://www.latex-project.org/lppl.txt
+    %%
+    %% and version 1.3 or later is part of all distributions of
+    %% LaTeX version 2005/12/01 or later.
+    %%
+\end{verbatim}
+
+\indexmacroEnd{endpreamble}
+\indexmacroEnd{preamble}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{generate} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{file}
+\indexmacroBegin{from}
+
+\begin{decl}
+  \defmacro{generate}
+    |{|\defmacro{file} |{<style-file>}|
+    |{|\defmacro{from} |{<dtx-file>}| |{<tag>}}}|
+\end{decl}
+
+We now reach the most important part of a \insfile{} file: the
+specification of what files to generate from the \dtxfile{} file.  The
+following tells \ds{} to generate |<package>.sty|\index{style file}
+from |<package>.dtx| by extracting only those parts marked as
+``|package|'' in the \dtxfile{} file.  (Marking parts of a \dtxfile{}
+file is described in Section~\ref{sec:dtx-file}.)
+
+\label{code:generate}
+\begin{verbatim}
+    \generate{\file{<package>.sty}{\from{<package>.dtx}{package}}}
+\end{verbatim}%
+\index{style file}
+
+\noindent
+\usemacro{generate} can extract any number of files from a given
+\dtxfile{} file.  It can even extract a single file from multiple
+\dtxfile{} files.  See the \ds{} manual for details.
+
+\indexmacroEnd{from}
+\indexmacroEnd{file}
+\indexmacroEnd{generate}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{Msg} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{Msg} \arg{text}
+\end{decl}
+
+The next part of a \insfile{} file consists of commands to output a
+message to the user, telling him what files need to be installed and
+reminding him how to produce the user documentation.  The following
+set of \usemacro{Msg} commands is typical:
+
+\begin{verbatim}
+    \obeyspaces
+    \Msg{****************************************************}
+    \Msg{*                                                  *}
+    \Msg{* To finish the installation you have to move the  *}
+    \Msg{* following file into a directory searched by TeX: *}
+    \Msg{*                                                  *}
+    \Msg{*     <package>.sty                                 *}
+    \Msg{*                                                  *}
+    \Msg{* To produce the documentation run the file        *}
+    \Msg{* <package>.dtx through LaTeX.                      *}
+    \Msg{*                                                  *}
+    \Msg{* Happy TeXing!                                    *}
+    \Msg{*                                                  *}
+    \Msg{****************************************************}
+\end{verbatim}%
+\index{style file}%
+
+\indexmacroEnd{Msg}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Note the use of \usemacro{obeyspaces} to inhibit \TeX{} from
+collapsing multiple spaces into one.
+
+
+\indexmacroBegin{endbatchfile} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \usemacro{endbatchfile}
+\end{decl}
+
+Finally, we tell \ds{} that we've reached the end of the \insfile{} file:
+
+\begin{verbatim}
+    \endbatchfile
+\end{verbatim}
+
+\indexmacroEnd{endbatchfile}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+Appendix~\ref{sec:skeleton-ins-file-style} lists a complete, skeleton
+\insfile{} file.  Appendix~\ref{sec:skeleton-ins-file-class} is
+similar but contains slight modifications intended to produce a class
+(\clsfile) file instead of a style (\styfile) file.
+
+\index{installer file|)}
+\index{documented LaTeX file@documented \LaTeX{} file|(}
+
+
+\section{The \texttt{.dtx} file}
+\label{sec:dtx-file}
+
+\index{package|(}
+A \dtxfile{} file contains both the commented source code and the user
+documentation for the package.  Running a \dtxfile{} file through
+|latex| typesets the user documentation, which usually also includes a
+nicely typeset version of the commented\index{comments} source code.
+\index{package|)}
+
+Due to some \DOC{} trickery, a \dtxfile{} file is actually evaluated
+\emph{twice}.  The first time, only a small piece of \latex{} driver
+code is evaluated.  The second time, \emph{comments}\index{comments}
+in the \dtxfile{} file are evaluated, as if there were no ``|%|''
+preceding them.  This can lead to a good deal of confusion when
+writing \dtxfile{} files and occasionally leads to some awkward
+constructions.  Fortunately, once the basic structure of a \dtxfile{} file
+is in place, filling in the code is fairly straightforward.
+
+
+\subsection{Prologue}
+
+\index{comments|(}
+
+\dtxfile{} files generally begin with a copyright\index{copyright} and
+license\index{license} comment:
+
+\begin{verbatim}
+    % \iffalse meta-comment
+    %
+    % Copyright (C) <year> by <your name>
+    %
+    % This file may be distributed and/or modified under the
+    % conditions of the LaTeX Project Public License, either
+    % version 1.3 of this license or (at your option) any later
+    % version.  The latest version of this license is in:
+    %
+    %    http://www.latex-project.org/lppl.txt
+    %
+    % and version 1.3 or later is part of all distributions of
+    % LaTeX version 2005/12/01 or later.
+    %
+    % \fi
+\end{verbatim}
+
+\index{comments|)}
+
+\noindent
+The \usemacro{iffalse} and |\fi| are needed because the second time
+the \dtxfile{} file is processed, |%| characters at the beginning of lines
+are ignored.  To prevent the
+copyright\index{copyright}/license\index{license} from being evaluated
+as \latex{} code, we have to surround it with
+\usemacro{iffalse}\dotsbrk|\fi|.  Adding ``\usething{meta-comment}''
+after ``\usemacro{iffalse}'' is nothing more than a convention for
+indicating that the comment\index{comments} is intended to be read by
+a human, not by \DOC{}, \ds{}, or \latex.
+
+\indexmacroBegin{NeedsTeXFormat} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{ProvidesPackage}
+
+\begin{decl}
+  \defmacro{NeedsTeXFormat}  \arg{format-name} \oarg{release-date} \\
+  \defmacro{ProvidesPackage} \arg{package-name} \oarg{release-info}
+\end{decl}
+
+The next few lines are also surrounded by
+\usemacro{iffalse}\dotsbrk|\fi| so as not to be processed by |latex|
+on the second pass through the \dtxfile{} file.  However, these lines are
+intended not for a human reader, but for \ds{} (hence, no
+``\usething{meta-comment}''):
+
+\label{code:ProvidesPackage}
+\begin{verbatim}
+    % \iffalse
+    %<<package>>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+    %<<package>>\ProvidesPackage{<package>}
+    %<<package>>   [<YYYY>/<MM>/<DD> v<version> <description>]
+    %
+\end{verbatim}%
+\indexmacro{NeedsTeXFormat}%
+\indexmacro{ProvidesPackage}
+
+\noindent
+(We'll encounter the |\fi| shortly.)
+
+Remember the \usemacro{generate} line in the \insfile{} file
+(page~\pageref{code:generate})?  It ended with the tag ``|package|''.
+This tells \ds{} to write lines that begin with ``|%<<package>>|'' to
+the \styfile{} file, stripping off the ``|%<<package>>|'' in the
+process.  Hence, our \styfile{} file will begin with the following:
+
+\begin{verbatim}
+    \NeedsTeXFormat{LaTeX2e}[2005/12/01]
+    \ProvidesPackage{<package>}
+       [<YYYY>/<MM>/<DD> v<version> <description>]
+\end{verbatim}%
+\indexmacro{NeedsTeXFormat}%
+\indexmacro{ProvidesPackage}
+
+\noindent
+For example:
+
+\begin{verbatim}
+    \NeedsTeXFormat{LaTeX2e}[2005/12/01]
+    \ProvidesPackage{skeleton}
+       [2002/03/25 v1.0 .dtx skeleton file]
+\end{verbatim}%
+\label{code:ProvidesPackage-example}%
+\indexmacro{NeedsTeXFormat}%
+\indexmacro{ProvidesPackage}
+
+\noindent
+\index{package|(}
+The \usemacro{NeedsTeXFormat} line ensures that the package won't run
+under a version of \latex[\LaTeXe]{} older than what the package was
+tested with.  The date and version strings in the
+\usemacro{ProvidesPackage} line are used by \DOC{} to set the
+\usemacro{filedate} and \usemacro{fileversion} macros.  Note the
+date\index{date format} format; \emph{YYYY/MM/DD} is used throughout
+\latex[\LaTeXe]{} and should be used in your packages as well.
+\index{package|)}
+
+\indexmacroEnd{ProvidesPackage}
+\indexmacroEnd{NeedsTeXFormat}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{EnableCrossrefs} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{CodelineIndex}
+\indexmacroBegin{RecordChanges}
+\indexmacroBegin{DocInput}
+
+\begin{decl}
+  \defmacro{EnableCrossrefs} \\
+  \defmacro{CodelineIndex}   \\
+  \defmacro{RecordChanges}   \\
+  \defmacro{DocInput} \arg{filename}   \label{desc:CodelineIndex}
+\end{decl}
+
+Next comes the only part of the \dtxfile{} file that isn't commented out
+(\ie doesn't begin each line with |%|):
+
+\begin{verbatim}
+    %<<*driver>>
+    \documentclass{ltxdoc}
+    \usepackage{<package>}
+    \EnableCrossrefs
+    \CodelineIndex
+    \RecordChanges
+    \begin{document}
+      \DocInput{<package>.dtx}
+    \end{document}
+    %<</driver>>
+    % \fi
+\end{verbatim}
+
+The preceding code stanza is what |latex| evaluates on its first pass
+through the \dtxfile{} file.  We'll now examine that stanza line-by-line:
+
+\begin{enumerate}
+  \item Putting code between ``|%<<*driver>>|'' and ``|%<</driver>>|''
+  is a \ds{} shorthand for prefixing each line with ``|%<<driver>>|''.
+  This demarcates the \DOC{} driver\index{driver code} code.
+
+  \item The \usemacro{documentclass} should almost always be
+  \usething{ltxdoc}, as that loads \DOC{} and provides a few useful
+  macros for formatting program documentation.
+
+\index{package|(}
+  \item You should always \usemacro{usepackage} your package.  If you
+  don't, \DOC{} won't see the package's \usemacro{ProvidesPackage}
+  line and won't know how to set \usemacro{filedate} and
+  \usemacro{fileversion} (see page~\pageref{code:GetFileInfo}).  This
+  is also where you should \usemacro{usepackage} any other packages
+  needed to typeset the user documentation.
+\index{package|)}
+
+  \item \usemacro{EnableCrossrefs} tells \DOC{} that you want it to
+  construct an index for your code---normally a good idea.  The
+  alternative is \usemacro{DisableCrossrefs}, which speeds up
+  processing by a negligible amount.
+
+  \item \usemacro{CodelineIndex} tells \DOC{} that the index should
+  refer to program line numbers instead of page numbers.  (The
+  alternative is \usemacro{PageIndex}.)  \usemacro{CodelineIndex}
+  makes index entries easier to find at the expense of making the
+  index less self-consistent (because descriptions of macros and
+  environments are always indexed by page number).  The index does,
+  however, begin with a note of explanation.
+
+  \item \label{item:RecordChanges} On page~\pageref{code:changes},
+  we'll see how to log the changes made in each revision of the
+  package\index{package}.  \usemacro{RecordChanges} tells \DOC{} that
+  it should keep and aggregate the log entries.
+
+  \item There should be only one command between the
+  |\begin{document}| and |\end{document}|: a \usemacro{DocInput} call
+  with which the \dtxfile{} file inputs itself.  This enables a master
+  file to \usemacro{DocInput} multiple files in order to produce a
+  single document that covers more than one package\index{package} but
+  contains a unified index\index{indexing}.  Master documentation
+  files are described~\vpageref{sec:master-files}.
+\end{enumerate}
+
+\indexmacroEnd{DocInput}
+\indexmacroEnd{RecordChanges}
+\indexmacroEnd{CodelineIndex}
+\indexmacroEnd{EnableCrossrefs} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{OnlyDescription} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{OnlyDescription} \label{desc:OnlyDescription}
+\end{decl}
+
+Another command that sometimes appears in the preamble (\ie before the
+|\begin{document}|) is \usemacro{OnlyDescription}, which tells \DOC{}
+to typeset only the user documentation, not the package\index{package}
+code/comments\index{comments}.  It's usually best to omit
+\usemacro{OnlyDescription} (or add it commented out).  A user can
+always add it manually or even enable \usemacro{OnlyDescription} for
+\emph{all} \dtxfile{} files by adding the following to his
+\defthing{ltxdoc.cfg} file:
+
+\begin{verbatim}
+     \AtBeginDocument{\OnlyDescription}
+\end{verbatim}%
+\indexmacro{AtBeginDocument}
+
+\indexmacroEnd{OnlyDescription}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\bigskip
+The remainder of this section covers |latex|'s second pass through the
+\dtxfile{} file.  Consequently, all subsequent examples are prefixed
+with percent signs.
+
+\indexmacroBegin{CheckSum} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\index{checksumming|(}
+
+\begin{decl}
+  \defmacro{CheckSum} \arg{number} \label{decl:CheckSum}
+\end{decl}
+
+\DOC{} supports a very simplistic form of document checksumming, to
+help ensure that a package\index{package} didn't get corrupted in
+transport.  \DOC{} merely counts the number of backslashes that occur
+in the code.  If the number matches the checksum, \DOC{} gives a
+success message:
+
+\begin{verbatim}
+    *******************
+    * Checksum passed *
+    *******************
+\end{verbatim}
+
+\noindent
+Otherwise, it says what the correct checksum should be:
+
+\begin{verbatim}
+    ! Package doc Error: Checksum not passed (<incorrect><<>><correct>).
+\end{verbatim}%
+\indexthing{Checksum not passed}
+
+\noindent
+To specify the checksum in a \dtxfile{} file, merely add a \usemacro{CheckSum}
+statement:
+
+\begin{verbatim}
+    % \CheckSum{<number>}
+\end{verbatim}
+
+\noindent
+If \m{number} is~|0|, or if the \dtxfile{} file lacks a
+\usemacro{CheckSum} line entirely, then \DOC{} outputs the following
+warning message:
+
+\begin{verbatim}
+    **********************************
+    * This macro file has no checksum!
+    * The checksum should be <number>!
+    **********************************
+\end{verbatim}
+
+\noindent
+During code development it is convenient to specify |\CheckSum{0}| so
+you don't receive an error message every time you run |latex|.  But
+don't forget to replace ``|0|'' with the correct number before
+releasing your package\index{package}!
+
+\index{checksumming|)}
+\indexmacroEnd{CheckSum}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{CharacterTable} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{CharacterTable} \arg{text}
+\end{decl}
+
+The second mechanism that \DOC{} uses to ensure that a \dtxfile{} file
+is uncorrupted is a character table.  If you put the following command
+verbatim into your \dtxfile{} file, then \DOC{} will ensure that no
+unexpected character translation took place in transport:\footnote{The
+character table is commonly prefixed with double percent signs so that
+it gets written to the \texttt{.sty}\index{style file} file.  This
+seems unnecessary and is therefore shown here with single percent
+signs.}
+
+\begin{verbatim}
+    % \CharacterTable
+    %  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+    %   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+    %   Digits        \0\1\2\3\4\5\6\7\8\9
+    %   Exclamation   \!     Double quote  \"     Hash (number) \#
+    %   Dollar        \$     Percent       \%     Ampersand     \&
+    %   Acute accent  \'     Left paren    \(     Right paren   \)
+    %   Asterisk      \*     Plus          \+     Comma         \,
+    %   Minus         \-     Point         \.     Solidus       \/
+    %   Colon         \:     Semicolon     \;     Less than     \<<
+    %   Equals        \=     Greater than  \>>     Question mark \?
+    %   Commercial at \@     Left bracket  \[     Backslash     \\
+    %   Right bracket \]     Circumflex    \^     Underscore    \_
+    %   Grave accent  \`     Left brace    \{     Vertical bar  \|
+    %   Right brace   \}     Tilde         \~}
+\end{verbatim}
+
+\noindent
+A success message looks like this:
+
+\begin{verbatim}
+    ***************************
+    * Character table correct *
+    ***************************
+\end{verbatim}
+
+\noindent
+and an error message looks like this:
+
+\begin{verbatim}
+    ! Package doc Error: Character table corrupted.
+\end{verbatim}%
+\indexthing{Character table corrupted}
+
+\indexmacroEnd{CharacterTable}     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{changes} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  \defmacro{changes} \arg{version} \arg{date} \arg{description}
+    \label{code:changes}
+\end{decl}
+
+\index{package|(}
+
+On page~\pageref{item:RecordChanges} we learned that \DOC{} has a
+mechanism for recording changes to the package.  The command is
+``|\changes{<version>}{<date>}{<description>}|'', and it's common to
+use \usemacro{changes} for the initial version of the package to log
+the package's creation date:
+
+\index{package|)}
+
+\begin{verbatim}
+    % \changes{v1.0}{2002/03/25}{Initial version}
+\end{verbatim}
+
+One nice feature of the \usemacro{changes} command is that it knows
+whether it was used internally to a macro/environment definition.  As
+Figure~\ref{fig:change-history} shows, top-level changes are prefixed
+with ``General:'', and internal changes are prefixed with the name of
+the enclosing macro or environment.
+
+\begin{figure}[htbp]
+  \centering
+  \index{change history}
+  \fbox{%
+    \begin{minipage}[t]{0.75\textwidth}
+      {\normalfont\Large\bfseries Change History\vskip 2.3ex plus 0.2ex}
+      v1.0 \\
+      \hspace*{2em} General: Top-level comment \dotfill 1 \\
+      v1.2j \\
+      \hspace*{2em} \texttt{myMacro}: Internal macro comment \dotfill 5
+    \end{minipage}%
+  }%
+  \caption{Sample change history}
+  \label{fig:change-history}
+\end{figure}
+
+\indexmacroEnd{changes}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{GetFileInfo} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{filedate}
+\indexmacroBegin{fileversion}
+\indexmacroBegin{fileinfo}
+
+\begin{decl}
+  \defmacro{GetFileInfo} \arg{style-file}   \label{code:GetFileInfo} \\[1ex]
+  \defmacro{filedate}    \\
+  \defmacro{fileversion} \\
+  \defmacro{fileinfo}
+\end{decl}
+
+Next, we tell \DOC{} to parse the \usemacro{ProvidesPackage} command
+(page~\pageref{code:ProvidesPackage}), calling the three components of
+\usemacro{ProvidesPackage}'s argument, respectively,
+``\usemacro{filedate}'', ``\usemacro{fileversion}'', and
+``\usemacro{fileinfo}'':
+
+\begin{verbatim}
+    % \GetFileInfo{<package>.sty}
+\end{verbatim}%
+\index{style file}%
+\indexmacro{GetFileInfo}
+
+\noindent
+For instance, the \usemacro{ProvidesPackage} example
+shown~\vpageref{code:ProvidesPackage-example} would be parsed as
+follows:
+
+|    |%
+\begin{tabular}{@{}l@{\qquad$\equiv$\qquad}l@{}}
+  \usemacro{filedate}    & 2002/03/25         \\
+  \usemacro{fileversion} & v1.0               \\
+  \usemacro{fileinfo}    & .dtx skeleton file
+\end{tabular}
+
+\indexmacroEnd{fileinfo}
+\indexmacroEnd{fileversion}
+\indexmacroEnd{filedate}
+\indexmacroEnd{GetFileInfo} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{DoNotIndex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\index{indexing|(}
+
+\begin{decl}
+  \defmacro{DoNotIndex} \arg{macro-name \textnormal{, \dots}}
+\end{decl}
+
+When producing an index, \DOC{} normally indexes \emph{every} control
+sequence (\ie backslashed word or symbol) in the code.  The problem
+with this level of automation is that many control sequences are
+uninteresting from the perspective of understanding the code.  For
+example, a reader probably doesn't want to see every location where
+|\if| is used---or |\the| or |\let| or |\begin| or any of numerous
+other control sequences.
+
+As its name implies, the \usemacro{DoNotIndex} command gives \DOC{} a
+list of control\index{control sequences} sequences that should not be
+indexed.  \usemacro{DoNotIndex} can be used any number of times, and
+it accepts any number of control\index{control sequences} sequence
+names per invocation:
+
+\begin{verbatim}
+    % \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
+    % \DoNotIndex{\@ne}
+    % \DoNotIndex{\advance,\begingroup,\catcode,\closein}
+    % \DoNotIndex{\closeout,\day,\def,\edef,\else,\empty,\endgroup}
+\end{verbatim}
+\centerline{$\vdots$}
+
+\index{indexing|)}
+\indexmacroEnd{DoNotIndex}     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{User documentation}
+
+We can finally start writing the user documentation.  A typical
+beginning looks like this:
+
+\begin{verbatim}
+    % \title{The \textsf{<package>} package\thanks{This document
+    %   corresponds to \textsf{<package>}~\fileversion,
+    %   dated~\filedate.}}
+    % \author{<your name> \\ \texttt{<your e-mail address>}}
+    %
+    % \maketitle
+\end{verbatim}%
+\indexmacro{title}
+\indexmacro{author}
+\indexmacro{maketitle}
+
+\noindent
+\index{package|(}
+The title can certainly be more creative, but note that it's common
+for package names to be typeset with \usemacro{textsf} and for
+\usemacro{thanks} to be used to specify the package version and date.
+This yields one of the advantages of literate\index{literate
+programming} programming: Whenever you change the package version (the
+optional second argument to \usemacro{ProvidesPackage}), the user
+documentation is updated accordingly.  Of course, you still have to
+ensure manually that the user documentation accurately describes the
+updated package.
+\index{package|)}
+
+Write the user documentation as you would any \latex{} document,
+except that you have to precede each line with a ``|%|''.  Note that
+the \usething{ltxdoc} document class is derived from |article|, so the
+top-level sectioning command is \usemacro{section}, not
+\usemacro{chapter}.
+
+
+\indexmacroBegin{DescribeMacro} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{DescribeEnv}
+
+\begin{decl}
+  \defmacro{DescribeMacro} \arg{macro} \\
+  \defmacro{DescribeEnv} \arg{environment}
+\end{decl}
+
+\DOC{} provides a couple of commands to help format user
+documentation.  If you include
+``|\DescribeMacro{<macro>}|''\footnote{``\m{macro}'' should include
+the backslash.} within a paragraph, \DOC{} will stick ``\m{macro}'' in
+the margin to make it easy for a reader to see.  \DOC{} will also add
+\m{macro} to the index and format the corresponding page number to
+indicate that this is where the macro is described (as opposed to the
+place in the source code where the macro is defined).
+
+\usemacro{DescribeEnv} is the analogous command for describing an
+environment.  Both \usemacro{DescribeMacro} and \usemacro{DescribeEnv}
+can be used multiple times within a paragraph.
+
+\indexmacroEnd{DescribeEnv}
+\indexmacroEnd{DescribeMacro}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexmacroBegin{marg} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{oarg}
+\indexmacroBegin{parg}
+\indexmacroBegin{meta}
+
+\begin{decl}
+  \defmacro{marg} \arg{argument} \\
+  \defmacro{oarg} \arg{argument} \\
+  \defmacro{parg} \arg{argument} \\
+  \defmacro{meta} \arg{text}
+\end{decl}
+
+The \usething{ltxdoc} document class provides three commands to help
+typeset macro and environment syntax
+(Table~\ref{tbl:argument-formatting}).  \usemacro{marg} formats
+mandatory arguments, \usemacro{oarg} formats optional arguments, and
+\usemacro{parg} formats picture arguments.  All three of these utilize
+\usemacro{meta} to typeset the argument proper.  \usemacro{meta} is
+also useful on its own.  For example, ``\texttt{This needs a}
+|\meta{dimen}|.'' is typeset as ``This needs a \m{dimen}.''
+
+\begin{table}[htbp]
+  \centering
+  \caption{Argument-formatting commands}
+  \label{tbl:argument-formatting}
+  \begin{tabular}{@{}ll@{}}
+    \hline
+    \multicolumn{1}{@{}c}{Command} &
+    \multicolumn{1}{c@{}}{Result} \\
+    \hline
+    \usemacro{marg}|{text}| & |{<text>}| \\
+    \usemacro{oarg}|{text}| & |[<text>]| \\
+    \usemacro{parg}|{text}| & |(<text>)| \\
+    \hline
+  \end{tabular}
+\end{table}
+
+In addition to those commands, \DOC{} facilitates the typesetting of
+macro descriptions by automatically loading the \svrb{}
+package\index{package}.  \svrb{} lets you use \verb+|+\dots\verb+|+
+as a convenient shorthand for |\verb|\verb+|+\dots\verb+|+.  For
+instance, ``\verb+|\mymacro|+ |\oarg{pos}| |\marg{width}|
+|\marg{text}|'' is typeset as follows:
+
+\begin{verbatim}
+    \mymacro [<pos>] {<width>} {<text>}
+\end{verbatim}
+
+\noindent
+Like \usemacro{verb}, the \verb+|+\dots\verb+|+ shorthand does not
+work within \usemacro{footnote} or other fragile macros.
+
+\indexmacroEnd{meta}
+\indexmacroEnd{parg}
+\indexmacroEnd{oarg}
+\indexmacroEnd{marg}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Code and commentary}
+
+\indexmacroBegin{StopEventually} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexmacroBegin{Finale}
+
+\begin{decl}
+  \defmacro{StopEventually} |{<text>}| \\
+  \defmacro{Finale}
+\end{decl}
+
+The package's\index{package} source code is delineated by putting it
+between \usemacro{StopEventually} and \usemacro{Finale}.  Note that
+\usemacro{CheckSum} (page~\pageref{decl:CheckSum}) applies only to the
+package's\index{package} source code.  \usemacro{StopEventually} takes
+an argument, which is a block of text to typeset after the code.  If
+\usemacro{OnlyDescription} (page~\pageref{desc:OnlyDescription}) is
+specified, then nothing after the \usemacro{StopEventually} will be
+output---including text that follows \usemacro{Finale}.
+\usemacro{StopEventually}'s \m{text} parameter is therefore the
+mechanism for providing a piece of text that should be output
+regardless of whether or not a code listing is typeset.  It commonly
+includes a bibliography section and/or one or more of the following
+commands.
+
+\indexmacroEnd{Finale}
+\indexmacroEnd{StopEventually}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\begin{decl}
+  \defmacro{PrintChanges} \\
+  \defmacro{PrintIndex}
+\end{decl}
+
+\indexmacroBegin{PrintChanges} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\index{change history|(}
+
+\usemacro{PrintChanges} produces an unnumbered section called ``Change
+History''.  (See Figure~\vref{fig:change-history}).  The Change
+History section aggregates all of the \usemacro{changes} commands in
+the \dtxfile{} file into a single list of per-version modifications.
+This makes it easy to keep track of what changed from version to
+version.
+
+\usemacro{PrintChanges} uses \latex's glossary mechanism.  Running
+|latex| on |<package>.dtx| produces change-history data in
+|<package>.glo|.  To produce the actual change history
+(|<package>.gls|), the user should run the \usething{makeindex}
+program as follows:
+
+\begin{verbatim}
+    makeindex -s gglo.ist -o <package>.gls <package>.glo
+\end{verbatim}
+
+\index{change history|)}
+\indexmacroEnd{PrintChanges}    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\indexmacroBegin{PrintIndex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\index{indexing|(}
+
+\usemacro{PrintIndex} produces an unnumbered section called ``Index''.
+The index automatically includes entries for all macros and
+environments that are used, defined, or described in the document.
+All environments are additionally listed under ``environments''.
+Table~\ref{tbl:index-formatting} illustrates the way that various
+entries are formatted.  In that table, ``27'' refers to a page number,
+and ``123'' refers to a line number.\footnote{If
+\texttt{\string\CodelineIndex} (page~\pageref{desc:CodelineIndex})
+were not used then ``123'' would refer to a page number.}  Note that
+macro/environment definitions and uses are included in the index only
+if the document includes a code listing (\ie
+\usemacro{OnlyDescription} was not specified).
+
+\begin{table}[htbp]
+  \centering
+  \caption{Formatting of entries in the index}
+  \label{tbl:index-formatting}
+  \begin{tabular}{@{}llp{6cm}@{}}
+  \hline
+  Item        & Function  & Formatting in index                            \\
+  \hline
+  Macro       & Used      & |\myMacro| \dotfill~123                        \\
+  Macro       & Defined   & |\myMacro| \dotfill~\underline{123}            \\
+  Macro       & Described & |\myMacro| \dotfill~\textit{27}                \\
+  Environment & Defined   & |myEnv| (environment) \dotfill~\underline{123} \\
+  Environment & Described & |myEnv| (environment) \dotfill~\textit{27}     \\
+  \multicolumn{2}{@{}l}{Other (\ie an explicit \texttt{\string\index})}
+                          & myItem \dotfill~27                             \\
+  \hline
+  \end{tabular}
+\end{table}
+
+The default formatting for an explicit \usemacro{index} command uses a
+roman page number.  This leads to confusion, as roman page numbers
+otherwise indicate line numbers in the package source code.  The
+solution is to specify ``|usage|'' formatting to the \usemacro{index}
+command:
+
+\begin{verbatim}
+    \index{explicit indexing|usage}
+\end{verbatim}
+
+Running |latex| on |<package>.dtx| produces index data in
+|<package>.idx|.  To produce the actual index (|<package>.ind|), the
+user should run the \usething{makeindex} program as follows:
+
+\begin{verbatim}
+    makeindex -s gind.ist -o <package>.ind <package>.idx
+\end{verbatim}
+
+A code index is a nice ``value added'' made possible by
+literate\index{literate programming} programming.  It requires
+virtually no extra effort and greatly helps code maintainers to find
+macro definitions and see what other macros a package\index{package}
+depends upon.
+
+\index{indexing|)}
+\indexmacroEnd{PrintIndex}   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexthingBegin{macrocode} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{decl}
+  |\begin{macrocode}| \\
+  \m{code}            \\
+  |\end{macrocode}|
+\end{decl}
+
+Code fragments listed between |\begin{macrocode}| and
+|\end{macrocode}| are extracted verbatim into the \styfile{} file.
+When typeset, the code fragments are shown with a running line counter
+to make it easy to refer to a specific line.  Here are some key points
+to remember about the \usething{macrocode} environment:
+
+\begin{enumerate}
+  \item There must be \emph{exactly} four spaces between the ``|%|''
+  and the ``|\begin{macrocode}|'' or ``|\end{macrocode}|''.
+  Otherwise, \DOC{} won't detect the end of the code
+  fragment.\footnote{Trivia: Only the
+  \texttt{\string\end\string{macrocode\string}} needs this precise
+  spacing and then, only for typesetting the documentation.
+  Nevertheless, it's good practice to use
+  ``\texttt{\%\textvisiblespace\textvisiblespace\textvisiblespace\textvisiblespace}''
+  for the \texttt{\string\begin\string{macrocode\string}}, as well.}
+
+  \item The lines of code within
+  |\begin{macrocode}|\dotsbrk|\end{macrocode}| should not begin with
+  ``|%|''.  The code gets written exactly as it is to the \insfile{}
+  file, with no |%|-stripping.
+\end{enumerate}
+
+The following is a sample code fragment.  It happens to be a complete
+macro definition, but this is not necessary; any fragment of \latex{}
+code can appear within a \usething{macrocode} environment.
+
+\label{code:mymacro}
+\begin{verbatim}
+    %    \begin{macrocode}
+    \newcommand{\mymacro}{This is
+      a \LaTeX{} macro.}
+    %    \end{macrocode}
+\end{verbatim}
+
+\noindent
+\DOC{} formats the preceding code fragment as follows:
+
+\begin{tabbing}
+|    |\={\tiny 9} \=\kill
+       \> {\tiny 1} \> |\newcommand{\mymacro}{This is| \\
+       \> {\tiny 2} \> |  a \LaTeX{} macro.}|
+\end{tabbing}
+
+\noindent
+Note that line numbers are unique across the entire program (as
+opposed to being reset at the top of each page).  If
+\usemacro{PrintIndex} is used in the \dtxfile{} file containing the
+preceding definition of |\mymacro|, the index will automatically
+include entries for |\newcommand|, |\mymacro|, and |\LaTeX|, unless
+any of these are \usemacro{DoNotIndex}'ed.
+
+\indexthingEnd{macrocode}   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\indexthingBegin{macro} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\indexthingBegin{environment}
+
+\begin{decl}
+  |\begin{macro}{<macro>}| \\
+  \qquad $\vdots$ \\
+  |\end{macro}| \\
+  \\
+  |\begin{environment}{<environment>}| \\
+  \qquad $\vdots$ \\
+  |\end{environment}| \\
+\end{decl}
+
+The \usething{macro} and \usething{environment} environments are used
+to delineate a complete macro or environment definition.
+\usething{macro}/\usething{environment} environments generally contain
+one or more \usething{macrocode} environments interspersed with code
+documentation.  The following is a more complete version of the
+\usething{macrocode} example shown~\vpageref{code:mymacro}.
+
+\begin{verbatim}
+    % \begin{macro}{\mymacro}
+    % We define a trivial macro, |\mymacro|, to illustrate
+    % the use of the |macro| environment.
+    %    \begin{macrocode}
+    \newcommand{\mymacro}{This is
+      a \LaTeX{} macro.}
+    %    \end{macrocode}
+    % \end{macro}
+\end{verbatim}
+
+\noindent
+The typeset version is shown below:
+
+\begin{tabbing}
+|    \mymacro|\qquad\={\tiny 9} \= \kill
+|    \mymacro| \> We define a trivial macro, |\mymacro|, to illustrate the \\
+               \> use of the \usething{macro} environment. \\
+               \> {\tiny 1} \> |\newcommand{\mymacro}{This is| \\
+               \> {\tiny 2} \> |  a \LaTeX{} macro.}|
+\end{tabbing}
+
+\DOC{} typesets the macro/environment name in the margin for increased
+visibility.  \DOC{} also adds the appropriate entries to the index.
+(See Table~\vref{tbl:index-formatting} for examples of how these
+entries are formatted.)  Note that
+|\begin{macro}|\dotsbrk|\end{macro}| is not required to indicate a
+macro definition.  It can also be used to indicate definitions of
+\latex{} datatypes, such as counters, lengths, and boxes:
+
+\begin{verbatim}
+    % \begin{macro}{myCounter}
+    % This is an example of using the |macro| environment to format
+    % something other than a macro.
+    %    \begin{macrocode}
+    \newcounter{myCounter}
+    %    \end{macrocode}
+    % \end{macro}
+\end{verbatim}%
+\indexthing{macrocode}
+
+\usething{macro} and \usething{environment} environments can be
+nested.  This capability is useful not only for macros that define
+other macros, but also when defining a group of related datatypes that
+share a description:
+
+\begin{verbatim}
+    % \begin{macro}{\thingheight}
+    % \begin{macro}{\thingwidth}
+    % \begin{macro}{\thingdepth}
+    % These lengths keep track of the dimensions of our |\thing|
+    % box.  (Actually, we're just trying to show how to nest
+    % |macro| environments.)
+    %    \begin{macrocode}
+    \newlength{\thingheight}
+    \newlength{\thingwidth}
+    \newlength{\thingdepth}
+    %    \end{macrocode}
+    % \end{macro}
+    % \end{macro}
+    % \end{macro}
+\end{verbatim}%
+\indexthing{macro}%
+\indexthing{macrocode}
+
+\noindent
+Descriptionless \usething{macro} environments should generally be
+avoided, as the formatting is a little ugly; the macro name appears on
+its own line, to the left of an ``empty'' description, but the code
+doesn't start until the next line.
+
+There can be multiple \usething{macrocode} environments within a
+|\begin{macro}|\dotsbrk|\end{macro}| or
+|\begin{environment}|\dotsbrk|\end{environment}| block.
+\index{comments|(} This is the mechanism by which code can be
+commented internally to a macro/environment.  (It's considered bad
+style to use ``|%|'' for comments within a \usething{macrocode}
+block.)  Here's an example of the way that a nontrivial macro might be
+commented:
+
+\begin{verbatim}
+    % \begin{macro}{\complexMacro}
+    % Pretend that this is a very complex macro that needs
+    % to have its various pieces documented.
+    %    \begin{macrocode}
+    \newcommand{\complexMacro}{%
+    %    \end{macrocode}
+    % Initialize all of our counters to zero.
+    %    \begin{macrocode}
+      \setcounter{count@i}{0}%
+      \setcounter{count@ii}{0}%
+      \setcounter{count@iii}{0}%
+      \setcounter{count@iv}{0}%
+    %    \end{macrocode}
+    % Do some really complicated processing.
+    %    \begin{macrocode}
+\end{verbatim}%
+\indexthing{macrocode}
+|                  |$\vdots$
+\begin{verbatim}
+    %    \end{macrocode}
+    % We're all finished now.
+    %    \begin{macrocode}
+    }
+    %    \end{macrocode}
+    % \end{macro}
+\end{verbatim}%
+\indexthing{macrocode}
+
+\indexthingEnd{environment}
+\indexthingEnd{macro}   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\index{comments|)}
+
+Appendix~\ref{sec:skeleton-dtx-file-style} lists a complete, skeleton
+\dtxfile{} file that encapsulates a \styfile{} file and its
+documentation.
+
+\index{class file|(}
+
+\paragraph{Class files}
+The procedure to produce a class file from a \dtxfile{} file is far
+less straightforward than the procedure to produce a style file.  The
+problem is that \usemacro{DocInput} relies on the
+|\usepackage{|\m{package}|}| line (more precisely, the
+\usemacro{ProvidesPackage} line within \m{package}|.sty|) to set the
+\usemacro{fileversion} and \usemacro{filedate} macros.  However, a
+class file can't be loaded with |\usepackage|.  Nor can we simply load
+it with |\documentclass{|\m{package}|}| because only one class can be
+loaded per document and we need that class to be \usething{ltxdoc}.
+
+The solution is to use \usemacro{ProvidesFile} to make the file
+version and date available to the \dtxfile{} file.
+Appendix~\ref{sec:skeleton-dtx-file-class} lists a complete, skeleton
+\dtxfile{} file that encapsulates a \clsfile{} file and its
+documentation.  It resembles the skeleton file shown in
+Appendix~\ref{sec:skeleton-dtx-file-style} but has a differently
+structured header section.
+
+\index{class file|)}
+
+
+\index{documented LaTeX file@documented \LaTeX{} file|)}
+
+
+\section{Tips, tricks, and recommendations}
+
+\begin{itemize}
+  \item Write lots of good documentation!  It really helps others
+  understand your code and the package\index{package} as a whole.
+
+  \item If you believe the \latex{} community at large would be
+  interested in your package then you should upload it to \CTAN{} at
+  \URL{http://www.ctan.org/upload}.  As a central repository of all
+  things \TeX-related, \CTAN{} makes it easier for others to find your
+  \latex{} package than if it were located on your personal home page.
+
+\index{documentation, prebuilt PDF|(}
+  \item When distributing your package, be sure to include a
+  |README|\index{README file@\texttt{README} file} file describing
+  what your package does as well as \emph{prebuilt} documentation,
+  preferably as a PDF file.  Prebuilt documentation saves users the
+  bother of having to download your package, install it, and build the
+  documentation before even knowing what the package is supposed to do
+  or if it meets their needs.
+\index{documentation, prebuilt PDF|)}
+
+  \item Use \latex's sectioning commands to organize the code and
+  clarify its structure (\eg |\subsection{|\texttt{Initialization
+  macros}|}|, |\subsection{|\texttt{Helper functions}|}|,
+  |\subsection{|\texttt{Exported macros and environments}|}|,~\dots).
+
+\index{comments|(}
+
+  \item Although commentary really belongs only in the typeset
+  documentation, it is also possible to write comments that are
+  visible only in the \styfile{} file, in both the typeset
+  documentation and the \styfile{} file, or only in the \dtxfile{}
+  source.  Table~\ref{tbl:comment-visibility} shows how to control
+  comment visibility.
+
+\index{comments|)}
+
+    \begin{table}[hbp]
+      \centering
+      \caption{Comment visibility}
+      \label{tbl:comment-visibility}
+      \newcommand{\yes}{Y}%
+      \newcommand{\no}{N}%
+      \index{style file}%
+      \index{comments}%
+      \begin{tabular}{@{}ccl@{}}
+        \hline
+        Appears  & Appears   \\
+        in docs  & in \styfile{} & \raisebox{1.5ex}[0pt]{Mechanism} \\
+        \hline
+
+        \no  & \no  & |% ^^A <comment>| \\[2ex]
+
+        \no  & \yes & |% \iffalse|      \\
+             &      & |%% <comment>|    \\
+             &      & |% \fi|           \\[2ex]
+
+        \yes & \no  & |% <comment>|     \\[2ex]
+
+        \yes & \yes & |%% <comment>|    \\
+        \hline
+      \end{tabular}
+    \end{table}
+
+  \item All lines between |<<*package>>| and |<</package>>|, except
+  those within a \usething{macrocode} environment, should begin with
+  ``|%|''.  Don't use any blank lines; these would get written to the
+  \styfile{} file (and oughtn't).
+
+
+\index{package|(}
+\index{"@@\texttt{"@}!in macro names|(}
+  \item It is good practice for \latex{} programs to use ``|@|''
+  within the names of macros, lengths, counters, etc.\ that are
+  declared globally, but intended to be used only internally to the
+  package.  This prevents a user from corrupting package state by
+  inadvertently redefining package internals.\footnote{Within a
+  \LaTeX{} document, ``|@|'' is set to category code~12 (``other''),
+  not category code~11 (``letter''), so the user can't easily define
+  or use a macro with ``|@|'' in its name.}  Another good practice is
+  to prefix all global names that are internal to the package with the
+  name of the package (\eg ``|\<package>@thing|'' instead of
+  ``|\@thing|'' or---even worse---just ``|\thing|'').  This helps
+  avoid inter-package naming conflicts.  Finally, because decimal
+  digits are not normally allowed in macro names, it is common to use
+  roman\index{roman numerals} numerals instead, for example: |\arg@i|,
+  |\arg@ii|, |\arg@iii|, |\arg@iv|, etc.
+\index{"@@\texttt{"@}!in macro names|)}
+\index{package|)}
+
+  \item You can use \usemacro{index} in the normal way to index things
+  other than macros and environments.
+
+  \item Because macro names can be long, consider using the
+  \defthing{idxlayout} package to reduce the number of columns in
+  the index.  (It provides control over other aspects of index
+  formatting, as well.)
+  
+  \item If you use \Emacs{} as your text editor, try out \swiftexel's
+  |doctex-mode|\index{doctex-mode@\texttt{doctex-mode}}, an \Emacs{}
+  mode designed specifically for writing \dtxfile{} files.
+  \swiftexel{} is available from \CTAN{}.
+
+  As a more primitive alternative, look up \Emacs's |string-rectangle|
+  and |kill-rectangle| commands.  These help a great deal with adding
+  and removing a ``|%|'' at the beginning of every line in a region.
+
+  \item Be sure to read ``The \ds{} Program'' and ``The \DOC{} and
+  \svrb{} Packages'', the documentation for \ds{} and \DOC{},
+  respectively (provided in \dtxfile{} format, of course).  These
+  explain how to do more advanced things with \insfile{} and
+  \dtxfile{} files than this tutorial covered.  Some advanced topics
+  include the following:
+
+    \begin{itemize} \item Extracting multiple \styfile{}
+    files from a single \dtxfile{} file.
+
+      \item Putting different preambles in different
+      \styfile{} files.
+
+      \item Extracting something other than a \styfile{} file (\eg a
+      configuration file or a Perl script) from a \dtxfile{} file.
+
+      \item Changing the formatting of the typeset documentation.
+    \end{itemize}
+\end{itemize}
+
+
+\section{Advanced packaging techniques}
+
+This section describes various bits of wizardry that can be
+accomplished with \DOC{} and \ds.  Few packages require these
+techniques but they are included here for convenient reference.
+
+\subsection{Master documentation files}
+\label{sec:master-files}
+
+\DOC{} supports ``master'' documentation files that typeset multiple
+\dtxfile{} files.  The advantage is that a set of related \dtxfile{}
+files can be typeset with continuous section numbering and a single,
+unified index.  In fact, the \latex[\LaTeXe]{} source code itself is
+typeset using a master document (|source2e.tex|) that includes all of
+the myriad \dtxfile{} files that comprise \latex[\LaTeXe].
+
+To help produce master documents, the \usething{ltxdoc} class
+provides a command called ``\usemacro{DocInclude}''.
+\usething{ltxdoc}'s \usemacro{DocInclude} is much like \DOC's
+\usemacro{DocInput}---it even uses it internally---but has the
+following additional features.
+
+  \begin{itemize}
+    \item \usemacro{PrintIndex} is automatically handled properly.
+
+    \item Every \usemacro{DocInclude}'d file is given a title page.
+
+    \item \usemacro{tableofcontents} works as expected.  \dtxfile{}
+    filenames are used as ``chapter'' names.
+  \end{itemize}
+
+\noindent
+Note that \usemacro{DocInclude}, unlike \usemacro{DocInput}, assumes
+a \dtxfile{} extension.
+
+Appendix~\ref{sec:skeleton-master-file} presents a master-document
+skeleton that uses \usemacro{DocInclude} to typeset |<file1>.dtx|,
+|<file2>.dtx|, and |<file3>.dtx| as a single document.  If you prefer
+a more manual approach (\eg if you dislike \usemacro{DocInclude}'s
+per-file title pages), you can still use \usemacro{DocInput}.
+\index{indexing|(}
+Just make sure to redefine \usemacro{PrintIndex} to do nothing;
+otherwise, each file will get its own index.  After all of the
+\dtxfile{} files have been typeset, call the original
+\usemacro{PrintIndex} command to print a unified index:
+
+\begin{verbatim}
+    \begin{document}
+      \let\origPrintIndex=\PrintIndex \let\PrintIndex=\relax
+      \DocInput{<file1>.dtx}
+      \DocInput{<file2>.dtx}
+      \DocInput{<file3>.dtx}
+      \origPrintIndex
+    \end{document}
+\end{verbatim}%
+\indexmacro{PrintIndex}%
+\indexmacro{DocInput}
+
+\index{indexing|)}
+
+\subsection{Single-file package distributions}
+\label{sec:single-file}
+
+Although \latex{} packages are typically distributed as both
+a~\insfile{} and a \dtxfile{} file, it is possible to distribute a
+package as a single file.  The trick is to include the entire
+\insfile{} at the top of the \dtxfile{} file, right after the
+|%<package>| lines:
+
+\begin{alltt}
+    %\string<*batchfile\string>
+    \string\begingroup
+          \(\vdots\)
+    <Entire contents of the {\normalfont\texttt{.ins}} file>
+          \(\vdots\)
+    \string\endgroup
+    %\string</batchfile\string>
+\end{alltt}
+
+\noindent
+Omit the \usemacro{endbatchfile} to allow \latex{} to continue on with
+the rest of the \dtxfile{} file.  Also, to avoid the ``\texttt{File}
+\m{sty-file} \texttt{already exists on the system.  Overwrite it?
+[y/n]}'' message you can put ``\usemacro{askforoverwritefalse}''
+before the first \usemacro{generate} command.  (This will
+automatically overwrite the existing \styfile{} file.  Wrapping the
+\usemacro{generate} command(s) within
+``\usemacro{IfFileExists}|{|\m{sty-file}|}{}{|\dots|}|'' will suppress
+the overwriting.)  You should also move the \styfile{} installation
+instructions to the end of the \dtxfile{} file so they don't scroll
+off the user's screen.  You'll need to use \usemacro{typeout} as
+\usemacro{Msg} won't be defined:
+
+\begin{verbatim}
+    % \Finale
+    %
+    % \typeout{**************************************************}
+    % \typeout{*}
+    % \typeout{* To finish the installation you have to move the}
+    % \typeout{* following file into a directory searched by TeX:}
+    % \typeout{*}
+    % \typeout{* \space\space skeleton.sty}
+    % \typeout{*}
+    % \typeout{* Documentation is in skeleton.dvi.}
+    % \typeout{*}
+    % \typeout{* Happy TeXing!}
+    % \typeout{**************************************************}
+    \endinput
+\end{verbatim}
+
+
+\subsection{Class and style files with shared versioning information}
+
+Some packages contain both a \clsfile{} and \styfile{} file.  It may
+be desirable to have these extracted from the same \insfile{} file and
+share the same versioning string.  The \ds{} documentation explains
+how to extract multiple files from a single \usemacro{generate} call:
+
+\begin{verbatim}
+    \generate{\file{<package>.cls}{\from{<package>.dtx}{class}}
+              \file{<package>.sty}{\from{<package>.dtx}{package}}}
+\end{verbatim}
+
+Using a single versioning string for both the \clsfile{} and
+\styfile{} files can be accomplished by changing the following lines
+in the \dtxfile{} file shown in
+Appendix~\ref{sec:skeleton-dtx-file-class}:
+
+\begin{verbatim}
+    %<<class>>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+    %<<class>>\ProvidesClass{<package>}
+    %<<*class>>
+        [<YYYY>/<MM>/<DD> v<version> <brief description>]
+    %<</class>>
+\end{verbatim}
+
+The replacement code specifies which lines belong to the class file
+and which belong to the style file:
+
+\begin{verbatim}
+    %<<class|package>>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+    %<<class>>\ProvidesClass{<package>}
+    %<<package>>\ProvidesPackage{<package>}
+    %<<*class|package>>
+        [<YYYY>/<MM>/<DD> v<version> <brief description>]
+    %<</class|package>>
+\end{verbatim}
+
+\subsection{Gallery of advanced packaging techniques}
+
+See the \dtxfile\ gallery on
+\CTAN\ \URL{https://www.ctan.org/tex-archive/info/dtxgallery} for
+examples of various packaging possibilities, including the following:
+
+\begin{itemize}
+  \item single-file package distributions (cf.~Section~\ref{sec:single-file})
+
+  \item conditional code inclusion (cf.~Table~\ref{tbl:comment-visibility})
+
+  \item rearranging code for presentation in the documentation
+\end{itemize}
+
+
+\appendix
+
+\section{Skeleton files}
+
+This section contains complete skeletons of the types of files
+discussed in the rest of the document.  These skeletons can be used as
+templates for creating your own packages.\index{package}
+
+\index{installer file|(}
+
+\subsection{A skeleton \texttt{.ins} file to generate a \texttt{.sty} file}
+\label{sec:skeleton-ins-file-style}
+
+\begin{verbatim}
+%%
+%% Copyright (C) <year> by <your name>
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version.  The latest version of this license is in:
+%%
+%%    http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/<package>}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) <year> by <your name>
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 of this license or (at your option) any later
+version.  The latest version of this license is in:
+
+   http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+\endpreamble
+
+\generate{\file{<package>.sty}{\from{<package>.dtx}{package}}}
+
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space <package>.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file <package>.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+
+\endbatchfile
+\end{verbatim}
+
+
+\subsection{A skeleton \texttt{.ins} file to generate a \texttt{.cls} file}
+\label{sec:skeleton-ins-file-class}
+
+\begin{verbatim}
+%%
+%% Copyright (C) <year> by <your name>
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version.  The latest version of this license is in:
+%%
+%%    http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/<package>}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) <year> by <your name>
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 of this license or (at your option) any later
+version.  The latest version of this license is in:
+
+   http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+\endpreamble
+
+\generate{\file{<package>.cls}{\from{<package>.dtx}{class}}}
+
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space <package>.cls}
+\Msg{*}
+\Msg{* To produce the documentation run the file <class>.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+
+\endbatchfile
+\end{verbatim}
+
+\index{installer file|)}
+\index{documented LaTeX file@documented \LaTeX{} file|(}
+
+
+\subsection{A skeleton \texttt{.dtx} file to generate a \texttt{.sty} file}
+\label{sec:skeleton-dtx-file-style}
+
+\begin{verbatim}
+% \iffalse meta-comment
+%
+% Copyright (C) <year> by <your name>
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%<<package>>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<<package>>\ProvidesPackage{<package>}
+%<<package>>   [<YYYY>/<MM>/<DD> v<version> <brief description>]
+%
+%<<*driver>>
+\documentclass{ltxdoc}
+\usepackage{<package>}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+  \DocInput{<package>.dtx}
+\end{document}
+%<</driver>>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%   Digits        \0\1\2\3\4\5\6\7\8\9
+%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%   Dollar        \$     Percent       \%     Ampersand     \&
+%   Acute accent  \'     Left paren    \(     Right paren   \)
+%   Asterisk      \*     Plus          \+     Comma         \,
+%   Minus         \-     Point         \.     Solidus       \/
+%   Colon         \:     Semicolon     \;     Less than     \<<
+%   Equals        \=     Greater than  \>>     Question mark \?
+%   Commercial at \@     Left bracket  \[     Backslash     \\
+%   Right bracket \]     Circumflex    \^     Underscore    \_
+%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%   Right brace   \}     Tilde         \~}
+%
+%
+% \changes{v1.0}{<YYYY>/<MM>/<DD>}{Initial version}
+%
+% \GetFileInfo{<package>.sty}
+%
+% \DoNotIndex{<list of control sequences>}
+%
+% \title{The \textsf{<package>} package\thanks{This document
+%   corresponds to \textsf{<package>}~\fileversion,
+%   dated \filedate.}}
+% \author{<your name> \\ \texttt{<your e-mail address>}}
+%
+% \maketitle
+%
+% \begin{abstract}
+%   Put text here.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Put text here.
+%
+% \section{Usage}
+%
+% \DescribeMacro{\YOURMACRO}
+% Put description of |\YOURMACRO| here.
+%
+% \DescribeEnv{YOURENV}
+% Put description of |YOURENV| here.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{Implementation}
+%
+% \begin{macro}{\YOURMACRO}
+% Put explanation of |\YOURMACRO|'s implementation here.
+%    \begin{macrocode}
+\newcommand{\YOURMACRO}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{YOURENV}
+% Put explanation of |YOURENV|'s implementation here.
+%    \begin{macrocode}
+\newenvironment{YOURENV}{}{}
+%    \end{macrocode}
+% \end{environment}
+%
+% \Finale
+\endinput
+\end{verbatim}
+
+
+\subsection{A skeleton \texttt{.dtx} file to generate a \texttt{.cls} file}
+\label{sec:skeleton-dtx-file-class}
+
+\begin{verbatim}
+% \iffalse meta-comment
+%
+% Copyright (C) <year> by <your name>
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%<<*driver>>
+\ProvidesFile{<package>.dtx}
+%<</driver>>
+%<<class>>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<<class>>\ProvidesClass{<package>}
+%<<*class>>
+    [<YYYY>/<MM>/<DD> v<version> <brief description>]
+%<</class>>
+%
+%<<*driver>>
+\documentclass{ltxdoc}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+  \DocInput{<package>.dtx}
+\end{document}
+%<</driver>>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%   Digits        \0\1\2\3\4\5\6\7\8\9
+%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%   Dollar        \$     Percent       \%     Ampersand     \&
+%   Acute accent  \'     Left paren    \(     Right paren   \)
+%   Asterisk      \*     Plus          \+     Comma         \,
+%   Minus         \-     Point         \.     Solidus       \/
+%   Colon         \:     Semicolon     \;     Less than     \<<
+%   Equals        \=     Greater than  \>>     Question mark \?
+%   Commercial at \@     Left bracket  \[     Backslash     \\
+%   Right bracket \]     Circumflex    \^     Underscore    \_
+%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%   Right brace   \}     Tilde         \~}
+%
+%
+% \changes{v1.0}{<YYYY>/<MM>/<DD>}{Initial version}
+%
+% \GetFileInfo{<package>.dtx}
+%
+% \DoNotIndex{<list of control sequences>}
+%
+% \title{The \textsf{<package>} class\thanks{This document
+%   corresponds to \textsf{<package>}~\fileversion,
+%   dated \filedate.}}
+% \author{<your name> \\ \texttt{<your e-mail address>}}
+%
+% \maketitle
+%
+% \begin{abstract}
+%   Put text here.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Put text here.
+%
+% \section{Usage}
+%
+% \DescribeMacro{\YOURMACRO}
+% Put description of |\YOURMACRO| here.
+%
+% \DescribeEnv{YOURENV}
+% Put description of |YOURENV| here.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{Implementation}
+%
+% \begin{macro}{\YOURMACRO}
+% Put explanation of |\YOURMACRO|'s implementation here.
+%    \begin{macrocode}
+\newcommand{\YOURMACRO}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{YOURENV}
+% Put explanation of |YOURENV|'s implementation here.
+%    \begin{macrocode}
+\newenvironment{YOURENV}{}{}
+%    \end{macrocode}
+% \end{environment}
+%
+% \Finale
+\endinput
+\end{verbatim}
+
+\index{documented LaTeX file@documented \LaTeX{} file|)}
+
+\subsection{A skeleton master-document file (\texttt{.tex})}
+\label{sec:skeleton-master-file}
+
+\begin{verbatim}
+\documentclass{ltxdoc}
+\usepackage{<file1>}
+\usepackage{<file2>}
+\usepackage{<file3>}
+
+\title{<title>}
+\author{<you>}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+\begin{document}
+  \maketitle
+
+  \begin{abstract}
+    <abstract>
+  \end{abstract}
+
+  \tableofcontents
+
+  \DocInclude{<file1>}
+  \DocInclude{<file2>}
+  \DocInclude{<file3>}
+\end{document}
+\end{verbatim}
+
+
+% The following was generated by BibTeX and slightly touched up by hand.
+\vfill
+\begin{thebibliography}{1}
+  \bibitem{Goossens1994:companion}
+  Michel Goossens, Frank Mittelbach, and Alexander Samarin.
+  \newblock \emph{The {\LaTeX} Companion}.
+  \newblock Addison~Wesley, Reading, Massachusetts, October~1, 1994.
+  \newblock ISBN~\mbox{0-201-54199-8}.
+
+  \bibitem{Knuth1984:literate}
+  Donald~E. Knuth.
+  \newblock Literate programming.
+  \newblock \emph{The Computer Journal}, 27(2):97--111, May 1984.
+  \newblock British Computer Society. Available from
+    \URL{http://www.literateprogramming.com/knuthweb.pdf}.
+\end{thebibliography}
+
+% Print an index.
+\index{sty@\texttt{.sty}|see{style file}}
+\index{cls@\texttt{.cls}|see{class file}}
+\index{ins@\texttt{.ins}|see{installer file}}
+\index{dtx@\texttt{.dtx}|see{documented \LaTeX{} file}}
+\index{CTAN|see{Comprehensive \TeX{} Archive Network}}
+\printindex
+
+\end{document}
-- 
cgit v1.2.3

