summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/memoir/memoir.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/memoir/memoir.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/memoir/memoir.dtx')
-rw-r--r--macros/latex/contrib/memoir/memoir.dtx36718
1 files changed, 36718 insertions, 0 deletions
diff --git a/macros/latex/contrib/memoir/memoir.dtx b/macros/latex/contrib/memoir/memoir.dtx
new file mode 100644
index 0000000000..2fd0bb32a5
--- /dev/null
+++ b/macros/latex/contrib/memoir/memoir.dtx
@@ -0,0 +1,36718 @@
+% \iffalse meta-comment
+%
+% memoir.dtx
+% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net
+% Maintainer: Lars Madsen (daleif at math dot au dot dk)
+% Copyright 2001--2010 Peter R. Wilson
+% Copyright 2011-- Lars Madsen
+%
+% This work 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 the license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of
+% LaTeX version 2003/06/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This work consists of the files listed in the README file.
+%
+% \fi
+% \CheckSum{31004}
+%
+% \changes{v0.1}{2001/05/20}{First public alpha release}
+% \changes{v0.2}{2001/06/03}{First beta release}
+% \changes{v0.3}{2001/07/09}{Bug fixing}
+% \changes{v0.31}{2001/07/09}{Bug fixing}
+% \changes{v0.32}{2001/08/03}{Fix for old versions of amsmath package}
+% \changes{v0.33}{2001/08/03}{Added controllable chapter/LoF spacing}
+% \changes{v0.33}{2001/08/03}{Fixed bug in \cs{appendixpage}}
+% \changes{v1.0}{2001/10/30}{First production release}
+% \changes{v1.0a}{2001/12/07}{Feature fixes} ^^A never released
+% \changes{v1.1}{2002/03/10}{More fixups}
+% \changes{v1.1}{2002/03/10}{Replaced all the subfigure code}
+% \changes{v1.1}{2002/03/28}{Added sidebars}
+% \changes{v1.1}{2002/03/28}{Upgraded verse typesetting}
+% \changes{v1.2}{2002/07/07}{Added 17pt option}
+% \changes{v1.2}{2002/07/07}{Added extra \cs{provide} commands}
+% \changes{v1.2}{2002/07/27}{Major verbatim, box and file additions}
+% \changes{v1.2}{2002/07/27}{Removed extraneous space from change marks}
+% \changes{v1.2}{2002/07/27}{Extra optarg in \cs{chapter} and \cs{chapter*}}
+% \changes{v1.2}{2002/07/27}{Twiddled font sizes a little}
+% \changes{v1.2}{2002/08/27}{Fixed 12pt bug}
+% \changes{v1.3}{2002/09/27}{Minor tweaks wrt v1.2}
+% \changes{v1.3}{2002/10/10}{Extra trimming styles}
+% \changes{v1.3}{2002/10/10}{Major extensions for indexing}
+% \changes{v1.3}{2002/11/14}{Automatically call a patch file}
+% \changes{v1.3a}{2002/11/22}{Fixed nasty figure/table bug}
+% \changes{v1.4}{2003/02/27}{Added patches v1.1}
+% \changes{v1.4}{2003/02/27}{Added patches v1.3}
+% \changes{v1.4}{2003/11/16}{Including current patches}
+% \changes{v1.4}{2003/11/16}{Added patches v1.2}
+% \changes{v1.4}{2003/11/22}{Added patches v1.4}
+% \changes{v1.4}{2003/11/22}{Added patches v1.5}
+% \changes{v1.4}{2003/11/22}{Added patches v1.6}
+% \changes{v1.4}{2003/11/22}{Added patches v1.7}
+% \changes{v1.4}{2003/11/30}{Added patches v1.8}
+% \changes{v1.4}{2003/11/30}{Added patches v1.9}
+% \changes{v1.6}{2004/01/31}{Decided to issue v1.4 as v1.6 on the way to
+% the golden section 1.6180339887...}
+% \changes{v1.61}{2004/03/14}{Changes to clo files, and footnotes}
+% \changes{v1.61}{2004/03/21}{Removed a potential problem with the
+% hangul package}
+% \changes{v1.618}{2005/09/02}{Folded in all v1.61 patches}
+% \changes{v1.618}{2005/09/15}{Some minor extensions}
+% \changes{v1.618}{2005/09/25}{Support for glossaries}
+% \changes{v1.6180}{2006/06/12}{Footnote font fix}
+% \changes{v1.61803}{2008/05/26}{Folded in all mempatch v4.9a patches}
+% \changes{v1.618033}{2008/06/02}{Fixed(?) page layout algorithms}
+% \changes{v1.6180339}{2008/07/23}{Unemulated if... packages}
+% \changes{v1.6180339}{2008/07/23}{Folded in all mempatch v5.1 patches}
+% \changes{v1.6180339a}{2008/08/07}{Removed extra space in footnotes}
+% \changes{v1.6180339c}{2009/01/21}{Minor bug fixes and extensions}
+% \changes{v1.6180339c}{2009/01/25}{A few more}
+% \changes{v1.6180339d}{2009/02/04}{Fixed a bug in the running
+% head/foot widths}
+% \changes{v1.6180339f}{2009/03/16}{Start of `f' version.}
+% \changes{v1.6180339f}{2009/03/16}{Fixed problem with companion pagestyle
+% and added 2 col Toc}
+% \changes{v1.6180339f}{2009/04/25}{Extended description lists}
+% \changes{v1.6180339f}{2009/07/12}{Added three \cs{memlet...} macros}
+% \changes{v1.6180339g}{2009/07/13}{Fixed a bug regading extre enties
+% in the page note list}
+% \changes{v1.61803398}{2009/07/17}{Added bidi (RTL) support}
+% \changes{v1.61803398}{2009/07/27}{Fixed bug in \cs{@setclcnt}, added simple pagestyle}
+% \changes{v1.61803398}{2009/08/08}{changed the code that defined the
+% main function out of \cs{newlistof}}
+% \changes{v1.61803398}{2009/09/10}{fixed bug with upquote}
+% \changes{v1.61803398b}{2009/09/21}{fixed typo}
+% \changes{v1.61803398c}{2009/11/13}{fixed typo}
+% \changes{v1.61803398d}{2009/11/13}{fixed infelicity with \cs{@starttoc}}
+% \changes{v1.61803398d}{2009/12/01}{fixed bug in ifxetex, ifpdf,...}
+% \changes{v1.61803398d}{2009/12/18}{made \cs{subcaptionref} robust}
+% \changes{v1.61803398d}{2010/xx/xx}{several changes}
+% \changes{v1.618033988}{2010/02/16}{bumped version to v1.618033988}
+% \changes{v1.618033988b}{2010/02/17}{fixed typo that broke \cs{feetbelowfloat}}
+% \changes{v1.618033988c}{2010/02/20}{fixed sporadic space in \cs{@footnotetext}}
+% \changes{v1.618033988d}{2010/02/26}{fixed bug in
+% \cs{marginparmargin}\{left\} in twoside mode}
+%
+% \changes{v3.6}{2010/04/19}{Reversioned memoir to a more suitable scheme}
+% \changes{v3.6d}{2010/07/01}{Various bug fixes}
+% \changes{v3.6e}{2010/08/20}{Maintenance}
+% \changes{v3.6f}{2010/08/22}{Bad typo}
+% \changes{v3.6g}{2010/09/19}{Maintenance}
+% \changes{v3.6h}{2011/02/13}{Various things}
+% \changes{v3.6i}{2011/02/18}{Two bug fixes}
+% \changes{v3.6j}{2011/03/06}{Bug fixes}
+% \changes{v3.6k}{2013/05/17}{Various fixes and long overdue maintenance}
+% \changes{v3.7}{2013/05/22}{Bumped version}
+% \changes{v3.7b}{2013/05/30}{Bugfix, sidecaption}
+% \changes{v3.7c}{2015/03/05}{Bugfix}
+% \changes{v3.7d}{2015/04/23}{Misc. bugfixes}
+% \changes{v3.7e}{2015/07/08}{Per request from LaTeX Team, etex is not
+% autoloaded on newer kernels}
+% \changes{v3.7f}{2016/05/16}{Maintenance, luatex85 and booktabs update}
+%
+% \changes{v3.7h}{2018/12/12}{Maintenance, removing some emulated packages}
+%
+% \def\dtxfile{memoir.dtx}
+%
+% \def\fileversion{v0.1} \def\filedate{2001/05/20}
+% \def\fileversion{v0.2} \def\filedate{2001/06/03}
+% \def\fileversion{v0.3} \def\filedate{2001/07/14}
+% \def\fileversion{v0.31} \def\filedate{2001/07/24}
+% \def\fileversion{v0.32} \def\filedate{2001/08/03}
+% \def\fileversion{v0.33} \def\filedate{2001/08/31}
+% \def\fileversion{v1.0} \def\filedate{2001/11/17}
+% \def\fileversion{v1.0a} \def\filedate{2001/12/07}
+% \def\fileversion{v1.1} \def\filedate{2002/03/28}
+% \def\fileversion{v1.1a} \def\filedate{2002/04/28}
+% \def\fileversion{v1.2} \def\filedate{2002/08/10}
+% \def\fileversion{v1.2} \def\filedate{2002/08/27}
+% \def\fileversion{v1.3} \def\filedate{2002/11/14}
+% \def\fileversion{v1.3a} \def\filedate{2002/11/22}
+% \def\fileversion{v1.4} \def\filedate{2003/12/18}
+% \def\fileversion{v1.6} \def\filedate{2004/01/31}
+% \def\fileversion{v1.61} \def\filedate{2004/04/04}
+% \def\fileversion{v1.618} \def\filedate{2005/09/27}
+% \def\fileversion{v1.6180} \def\filedate{2006/06/12}
+% \def\fileversion{v1.61803} \def\filedate{2008/05/26}
+% \def\fileversion{v1.618033} \def\filedate{2008/06/02}
+% \def\fileversion{v1.6180339} \def\filedate{2008/07/23}
+% \def\fileversion{v1.6180339a} \def\filedate{2008/08/07}
+% \def\fileversion{v1.6180339c} \def\filedate{2009/01/21}
+% \def\fileversion{v1.6180339c} \def\filedate{2009/01/25}
+% \def\fileversion{v1.6180339d} \def\filedate{2009/02/04}
+% \def\fileversion{v1.6180339e} \def\filedate{2009/02/06}
+% \def\fileversion{v1.6180339f} \def\filedate{2009/07/12}
+% \def\fileversion{v1.6180339g} \def\filedate{2009/07/13}
+% \def\fileversion{v1.61803398} \def\filedate{2009/09/10}
+% \def\fileversion{v1.61803398b} \def\filedate{2009/09/21}
+% \def\fileversion{v1.61803398c} \def\filedate{2009/11/17}
+% \def\fileversion{v1.61803398d} \def\filedate{2009/11/23}
+% \def\fileversion{v1.618033988} \def\filedate{2010/02/16}
+% \def\fileversion{v1.618033988b} \def\filedate{2010/02/17}
+% \def\fileversion{v1.618033988c} \def\filedate{2010/02/20}
+% \def\fileversion{v3.6} \def\filedate{2010/04/19}
+% \def\fileversion{v3.6d} \def\filedate{2010/07/01}
+% \def\fileversion{v3.6e} \def\filedate{2010/08/20}
+% \def\fileversion{v3.6f} \def\filedate{2010/08/22}
+% \def\fileversion{v3.6g} \def\filedate{2010/09/19}
+% \def\fileversion{v3.6h} \def\filedate{2011/02/13}
+% \def\fileversion{v3.6i} \def\filedate{2011/02/18}
+% \def\fileversion{v3.6j} \def\filedate{2011/03/06}
+% \def\fileversion{v3.6k} \def\filedate{2013/05/17}
+% \def\fileversion{v3.7} \def\filedate{2013/05/22}
+% \def\fileversion{v3.7b} \def\filedate{2013/05/30}
+% \def\fileversion{v3.7c} \def\filedate{2015/03/05}
+% \def\fileversion{v3.7d} \def\filedate{2015/04/23}
+% \def\fileversion{v3.7e} \def\filedate{2015/07/08}
+% \def\fileversion{v3.7f} \def\filedate{2016/05/16}
+% \def\fileversion{v3.7g} \def\filedate{2018/04/04}
+% \def\fileversion{v3.7h} \def\filedate{2018/12/12} ^^A remember to fix
+% \title{The LaTeX \Lpack{memoir} class for configurable book
+% typesetting: Source code\thanks{This
+% file (\texttt{\dtxfile}) has version number \fileversion, last revised
+% \filedate.}}
+%
+% \author{%
+% Peter Wilson\\ ^^A\thanks{\texttt{herries dot press at earthlink dot net}}\\
+% Herries Press \\
+% (maintained by Lars Madsen\thanks{\texttt{daleif at math dot au dot dk}}\ )}
+% \date{\filedate}
+% \maketitle
+%
+% \begin{abstract}
+% The \Lpack{memoir} class is designed for typesetting
+% general books such as novels, biographies, histories,
+% and so on, although as it supports all the functionality of the
+% standard \Lpack{book} class it can also be used for technical writing.
+% It provides more functions than the standard class as well as
+% presenting a more friendly interface for the book designer.
+% It can also simulate the typesetting style of the standard \Lpack{article}
+% class.
+%
+% The class was first released in mid 2001 and has been well used ever
+% since.
+% \end{abstract}
+%
+% \tableofcontents
+% \listoftables
+%
+% \StopEventually{}
+%
+%
+%
+% \section{Introduction}
+%
+% This document provides the commented source
+% for the LaTeX \Lpack{memoir} class, which is designed for typesetting
+% general books such as novels, biographies, histories,
+% and so on. It has all the functionality of the standard \Lpack{book}
+% class and, as well as providing some extra functions, also provides
+% a more friendly interface for the document designer. As it can encompass
+% everything that the \Lpack{book} class provides it may also be used
+% for technical writing.
+%
+% The default appearance of a document typeset with this class is
+% the same as if it had been typeset with the \Lpack{book} class and
+% it can be made to simulate the \Lpack{article} class..
+% The class, though, includes extra facilities that make it easy to
+% change the appearance of such things as the page headers and footers,
+% the style of chapter and other sectional headings, and the style of
+% captions. It also makes it easy to both change the style of the
+% Table of Contents, List of Figures, etc., as well as creating new
+% kinds of `List of\ldots'. New types of floats, if needed, can be
+% created very simply. Epigraphs can be put into the document in a
+% variety of styles.
+%
+% The class provides a variety of page, chapter and captioning
+% styles that you can choose from if you don't want to create your own.
+%
+% Documents can be typeset in 9pt, 10pt, 11pt, 12pt, 14pt or 17pt font
+% sizes, and if you have scaleable fonts available they can be set at any size.
+% There is a reasonably intuitive means of setting the margins
+% and placement of the text on a page. There is an option to put
+% trim marks on the printed pages if the stock sheets need to be trimmed
+% down to the final page size. For those whose publishers like a
+% manuscript to look as though it was typewritten, there is an option
+% to do this (double spacing, ragged right, no hyphenation,
+% fixed width font). There is also an unsophisticated means of flagging any
+% revisions to the text.
+%
+% As this is a new class, by default it does not support the old
+% LaTeX v2.09
+% font commands, namely the \cs{bf}, \cs{sl}, \cs{it} and \cs{sc} commands;
+% it warns about using the \cs{em} command but does support it.
+%
+%
+% I hope that apart from the font commands the class
+% is compatible with
+% `standard' LaTeX.
+%
+% Development of this class would never have been started without
+% the wonderful work done by Leslie Lamport and others~\cite{CLASSES}
+% from whom I have learned a great deal and borrowed much code.
+%
+% Sections~\ref{sec:docstrip} through~\ref{sec:ic} describe some
+% administrative elements and code for general use later in the
+% specification.
+% The macros forming the class file are defined in sections~\ref{sec:opt}
+% through~\ref{sec:init}.
+%
+% This manual is typeset according to the conventions of the
+% \LaTeX{} \textsc{docstrip} utility which enables the automatic
+% extraction of the \LaTeX{} macro source files~\cite{GOOSSENS94}.
+%
+%
+% \section{A driver for this document} \label{sec:docstrip}
+%
+% The next series of code contains the documentation driver file for
+% \LaTeX, i.e., the file that will produce the documentation you are
+% currently reading. This will be extracted from this file by the
+% \textsc{docstrip} program.
+%
+% \begin{macrocode}
+%<*driver>
+\documentclass[twoside]{ltxdoc}
+\usepackage[T1]{fontenc}
+\usepackage{url,array}
+%%\usepackage[draft=false,
+%% plainpages=false,
+%% pdfpagelabels,
+%% bookmarksnumbered,
+%% hyperindex=true
+%% ]{hyperref} % Doesn't work with indexing of \DescribeMacro
+\providecommand{\phantomsection}{} % just in case hyperref not used
+% \end{macrocode}
+%
+% We do want an index, using linenumbers, but not update information.
+% \begin{macrocode}
+\EnableCrossrefs
+\CodelineIndex
+%% \RecordChanges
+% \end{macrocode}
+% We had better have page headings to aid navigation, but I don't
+% like Uppercased titles.
+% \begin{macrocode}
+\makeatletter
+ \@mparswitchfalse
+\makeatother
+\renewcommand{\MakeUppercase}[1]{#1}
+\pagestyle{headings}
+% \end{macrocode}
+% We may use so many \file{docstrip} modules that we set the
+% \texttt{StandardModuleDepth} counter to 1.
+% \begin{macrocode}
+\setcounter{StandardModuleDepth}{1}
+% \end{macrocode}
+% Some commonly used abbreviations
+% \begin{macrocode}
+\newcommand*{\Lopt}[1]{\textsf {#1}} % typeset an option
+\newcommand*{\file}[1]{\texttt {#1}} % typeset a file
+\newcommand*{\Lcount}[1]{\textsl {\small#1}} % typeset a counter
+\newcommand*{\pstyle}[1]{\textsl {#1}} % typeset a pagestyle
+\newcommand*{\Lenv}[1]{\texttt {#1}} % typeset an environment
+\newcommand*{\Lpack}[1]{\textsf {#1}} % typeset a package
+\newcommand*{\ctt}{\textsc{ctt}} % comp.text.tex
+\newenvironment{PW}{\em}{}
+\newenvironment{dlf}{\em}{}
+\newcommand*{\theTeXbook}{\textit{The \TeX book}}
+\let\oldllap\llap
+\def\llap#1{\oldllap{#1\quad}} % might be evil
+% \end{macrocode}
+% We want the full details printed.
+% \begin{macrocode}
+\begin{document}
+\DeleteShortVerb{\|}
+\raggedbottom
+%\raggedright
+\DocInput{\jobname.dtx}
+\PrintIndex
+%% \PrintChanges
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+%
+% ^^A There are some elements we do not want to appear in the index.
+% \DoNotIndex{\',\.,\@M,\@@input,\@addtoreset,\@arabic,\@badmath}
+% \DoNotIndex{\@centercr,\@cite}
+% \DoNotIndex{\@dotsep,\@empty,\@gobble,\@gobbletwo,\@ignoretrue}
+% \DoNotIndex{\@input,\@ixpt,\@m}
+% \DoNotIndex{\@minus,\@ne,\@nil,\@nomath,\@plus,\@set@topoint}
+% \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb}
+% \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt}
+% \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt}
+% \DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace}
+% \DoNotIndex{\advance,\Alph,\alph}
+% \DoNotIndex{\arabic,\ast,\begin,\begingroup,\bfseries,\bgroup,\box}
+% \DoNotIndex{\bullet}
+% \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption}
+% \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass}
+% \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist}
+% \DoNotIndex{\EnableCrossrefs,\end,\endgroup}
+% \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter}
+% \DoNotIndex{\fbox}
+% \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef}
+% \DoNotIndex{\global,\halign,\hbox,\hfil,\hfill,\hrule}
+% \DoNotIndex{\hsize,\hskip,\hspace,\hss}
+% ^^A \DoNotIndex{\if@tempswa,\fi}
+% \DoNotIndex{\ifcase,\or,\fi}
+% \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi}
+% \DoNotIndex{\input}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\let}
+% \DoNotIndex{\list,\llap,\long,\m@ne,\m@th}
+% \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment}
+% \DoNotIndex{\NeedsTeXFormat,\newdimen}
+% \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number}
+% \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@}
+% \DoNotIndex{\par,\paragraph,\paragraphmark,\parfillskip}
+% \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions}
+% \DoNotIndex{\protect,\ProvidesClass}
+% \DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font}
+% \DoNotIndex{\rightskip,\rlap,\rmfamily,\roman}
+% \DoNotIndex{\roman,\secdef,\selectfont,\setbox,\setcounter,\setlength}
+% \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space}
+% \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase}
+% \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt}
+% \DoNotIndex{\viipt,\vipt,\vskip,\vspace}
+% \DoNotIndex{\wd,\xiipt,\year,\z@}
+% \DoNotIndex{\@namedef,\@nameuse,\csname,\endcsname}
+%
+%
+%
+% \section{Identification} \label{sec:id}
+%
+% The \Lpack{memoir} document class can only be used with LaTeX2e,
+% so we make
+% sure that an appropriate message is displayed when another \TeX{}
+% format is used.
+% \begin{macrocode}
+%<class>\NeedsTeXFormat{LaTeX2e}
+% \end{macrocode}
+%
+% ^^A Use the Golden Section as the version number (1.6180339887 4989484820 4586834365)
+% \changes{v3.6}{2010/04/19}{Not any more, apparently people does not
+% know the numeric value of the golden ration very well}
+%
+%
+% Announce the name, option files and version for LaTeX2e files:
+% \begin{macrocode}
+%<class>\ProvidesClass{memoir}%
+%<class> [2018/12/12 v3.7h configurable book, report, article document class]
+% \end{macrocode}
+% In the manual it is useful to know the current version.
+% \begin{macrocode}
+%<class>\newcommand\memversion{v3.7h, 2018/12/12}
+%<9pt>\ProvidesFile{mem9.clo}%
+%<9pt> [2008/01/30 v0.4 memoir class 9pt size option]
+%<10pt>\ProvidesFile{mem10.clo}%
+%<10pt> [2008/01/30 v0.3 memoir class 10pt size option]
+%<11pt>\ProvidesFile{mem11.clo}%
+%<11pt> [2008/01/30 v0.3 memoir class 11pt size option]
+%<12pt>\ProvidesFile{mem12.clo}%
+%<12pt> [2010/10/19 v0.4b memoir class 12pt size option]
+%<14pt>\ProvidesFile{mem14.clo}%
+%<14pt> [2008/01/30 v0.4 memoir class 14pt size option]
+%<17pt>\ProvidesFile{mem17.clo}%
+%<17pt> [2008/01/30 v0.3 memoir class 17pt size option]
+%<20pt>\ProvidesFile{mem20.clo}%
+%<20pt> [2008/01/31 v0.1 memoir class 20pt size option]
+%<25pt>\ProvidesFile{mem25.clo}%
+%<25pt> [2008/01/31 v0.1 memoir class 25pt size option]
+%<30pt>\ProvidesFile{mem30.clo}%
+%<30pt> [2008/01/31 v0.1 memoir class 30pt size option]
+%<36pt>\ProvidesFile{mem36.clo}%
+%<36pt> [2008/01/31 v0.1 memoir class 36pt size option]
+%<48pt>\ProvidesFile{mem48.clo}%
+%<48pt> [2008/01/31 v0.1 memoir class 48pt size option]
+%<60pt>\ProvidesFile{mem60.clo}%
+%<60pt> [2008/01/31 v0.1 memoir class 60pt size option]
+% \end{macrocode}
+%
+%
+% \section{Initial Code} \label{sec:ic}
+%
+% \begin{macrocode}
+%<*class>
+% \end{macrocode}
+%
+% Note (2001/08/03): Old versions of the \Lpack{amsmath} package did odd
+% things with \cs{@tempa}, \cs{@tempb} and \cs{@tempc}. I have now replaced
+% any use of these with \cs{@memtempa}, etc.
+%
+%
+% In this part we define a few commands that are used later on.
+%
+% \begin{macro}{\@ptsize}
+% \begin{macro}{\@memptsize}
+% The \cs{@ptsize} control sequence is normally used to store the
+% second digit of the
+% pointsize we are typesetting in. So, normally, it's value is one
+% of 0, 1 or 2.
+%
+% \cs{@memptsize} stores the full pointsize.
+% \changes{v1.61803}{2008/01/30}{Added \cs{@memptsize}}
+% \begin{macrocode}
+\newcommand*{\@ptsize}{}
+\newcommand*{\@memptsize}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Any new lengths that depend on the point size option must be declared
+% before the options are executed.
+% \begin{macro}{\onelineskip}
+% \begin{macro}{\lxvchars}
+% \begin{macro}{\xlvchars}
+% The length \cs{onelineskip} is the vertical space taken
+% by a normal line of text. The lengths \cs{lxvchars} and \cs{xlvchars} are
+% the approximate lengths required for typesetting lines with either 65 or 45
+% characters.
+% \begin{macrocode}
+\newlength{\onelineskip}
+\newlength{\lxvchars}
+\newlength{\xlvchars}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@memcnta}
+% \begin{macro}{\c@memmarkcntra}
+% We need a scratch count register and a scratch counter.
+% \changes{v1.61803}{2008/10/30}{Added @memmarkcntra scratch counter}
+% \begin{macrocode}
+\newcount\@memcnta
+\newcounter{@memmarkcntra}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.0a}{2001/11/28}{Deleted count register \cs{@memtempa}}
+%
+% \begin{macro}{\if@restonecol}
+% When the document has to be printed in two columns, we sometimes
+% have to temporarily switch to one column. This switch is used to
+% remember to switch back.
+% \begin{macrocode}
+\newif\if@restonecol
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@openright}
+% This is TRUE if chapters are to start on righthand (recto) pages;
+% this is the default. FALSE means chapters can start on any page.
+% \begin{macrocode}
+\newif\if@openright
+ \@openrighttrue
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@openleft}
+% This is TRUE if chapters are to start on lefthand (verso) pages.
+% \begin{macrocode}
+\newif\if@openleft
+ \@openleftfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@mainmatter}
+% This is TRUE if the main part of the document is being currently procesed;
+% this is the default.
+% \begin{macrocode}
+\newif\if@mainmatter
+ \@mainmattertrue
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@memoldfont}
+% This is TRUE if the \Lopt{oldfontcommands} option is used.
+% \changes{v1.0a}{2002/01/29}{Added \cs{if@memoldfont}}
+% \begin{macrocode}
+\newif\if@memoldfont
+ \@memoldfontfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifextrafontsizes}
+% This is TRUE if the \Lopt{extrafontsizes} option is used.
+% \changes{v1.61803}{2008/01/30}{Added \cs{ifextrafontsizes}}
+% \begin{macrocode}
+\newif\ifextrafontsizes
+ \extrafontsizesfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memerror}
+% \begin{macro}{\@memwarn}
+% Two macros to save some space when reporting errors or warnings.
+% The macros take the same arguments, ignoring the first in each case,
+% as \cs{ClassError} and \cs{ClassWarning}, e.g., \\
+% \verb?\@memwarn{Message}? \\
+% instead of \\
+% \verb?\ClassWarning{memoir}{Message}?.
+% \changes{v1.4}{2003/02/27}{Added \cs{@memerror} and \cs{@memwarn}}
+% \begin{macrocode}
+\newcommand*{\@memerror}{\ClassError{memoir}}
+\newcommand*{\@memwarn}{\ClassWarning{memoir}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifsamename}
+% \begin{macro}{\nametest}
+% The macro \cs{nametest}\marg{name1}\marg{name2} tests whether the
+% characters forming the two arguments are the same or not. If they are the
+% same then \cs{ifsamename} is set TRUE, otherwise it is set FALSE. \meta{name1}
+% and \meta{name2} must both be either macro names (including the backslash)
+% or must both not be macro names. That is, you cannot do
+% \verb?\nametest{\cs}{cs}?.
+% \changes{v1.61803398d}{2010/02/13}{added some \% because the macro
+% was leaking spaces}
+% \begin{macrocode}
+\newif\ifsamename
+\newcommand{\nametest}[2]{%
+ \samenamefalse%
+ \begingroup%
+ \def\@memtempa{#1}\def\@memtempb{#2}%
+ \ifx \@memtempa\@memtempb%
+ \endgroup%
+ \samenametrue%
+ \else%
+ \endgroup%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifm@m@And}
+% \begin{macro}{\m@m@Andtrue}
+% \begin{macro}{\m@m@Andfalse}
+% \begin{macro}{\ifm@m@Or}
+% \begin{macro}{\m@m@Ortrue}
+% \begin{macro}{\m@m@Orfalse}
+% \begin{macro}{\ifm@m@Xor}
+% \begin{macro}{\m@m@Xortrue}
+% \begin{macro}{\m@m@Xorfalse}
+% These are for `if A and B', `if A or B' and `if A xor B'.
+%
+% For A and B:
+% \begin{verbatim}
+% \m@m@Andfalse
+% \ifA
+% \ifB
+% \m@mAndtrue
+% \fi
+% \fi
+% \end{verbatim}
+% For A or B:
+% \begin{verbatim}
+% \m@m@Ortrue
+% \ifA
+% \else
+% \ifB
+% \else
+% \m@m@Orfalse
+% \fi
+% \fi
+% \end{verbatim}
+% For A xor B:
+% \begin{verbatim}
+% \m@m@Xortrue
+% \ifA
+% \ifB
+% \m@m@Xfalse
+% \fi
+% \else
+% \ifB
+% \else
+% \m@m@Xorfalse
+% \fi
+% \fi
+% \end{verbatim}
+% \changes{v1.618}{2005/09/09}{Added \cs{ifm@m@And}, \cs{ifm@m@Or} and \cs{ifm@m@Xor}}
+% \begin{macrocode}
+\newif\ifm@m@And
+\newif\ifm@m@Or
+\newif\ifm@m@Xor
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v0.3}{2001/07/09}{Deleted \cs{fillline} and \cs{makecommand} as
+% they were not used}
+%
+%
+% \begin{macro}{\kill@lastcounter}
+% \cs{kill@lastcounter}\marg{cntr}\footnote{With thanks to Stefan Ulrich
+% (\texttt{ulrich@cis.uni-muenchen.de}) who answered a question on this
+% on \ctt, 2001/07/09. (Also answered by Heiko Oberdiek,
+% \texttt{oberdiek@ruf.uni-freiburg.de}).}
+% kills the counter \meta{cntr}. This macro is an extension to the
+% suggestions as it also makes the last count register reusable.
+% \emph{The macro must only be used when the last allocated counter is to
+% be killed.}
+% For example with:\\
+% \verb?\newcounter{fred} \kill@lastcounter{fred} \newcounter{fred}? \\
+% there is no error with the second \cs{newcounter}.
+% \changes{v0.3}{2001/07/09}{Added \cs{kill@counter}}
+% \changes{v1.618}{2005/09/02}{Ensured \cs{kill@counter} zeroed the counter}
+% \begin{macrocode}
+\newcommand{\kill@lastcounter}[1]{%
+% \end{macrocode}
+% Deallocate the last counter register. From \theTeXbook, \verb?\count10? is
+% the number of the last register. The counter should be zeroed before being
+% deallocated otherwise an immediatally following \cs{newcount} may not
+% be zero when allocated\footnote{Discovered and fix provided by Robert
+% Schlicht on 2005/08/31.}.
+% \begin{macrocode}
+ \count\count10 \z@
+ \advance\count10 \m@ne
+% \end{macrocode}
+% Set the internal counter definition to \cs{relax}.
+% \begin{macrocode}
+ \expandafter\let\csname c@#1\endcsname\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@name@p@xdf}
+% \begin{macro}{\@name@unresp@xdef}
+% \begin{macro}{\@namelet}
+% \begin{macro}{\@namelongdef}
+% Utility definition macros, along the lines of the kernel's \cs{@namedef}.
+% \changes{v1.4}{2003/11/22}{Added \cs{@namelet} and friends (from patch v1.8)}
+% \begin{macrocode}
+\newcommand{\@name@p@xdef}[1]{%
+ \expandafter\protected@xdef\csname #1\endcsname}
+\newcommand{\@name@unresp@xdef}[1]{%
+ \expandafter\unrestored@protected@xdef\csname #1\endcsname}
+\newcommand{\@namelet}[1]{%
+ \expandafter\let\csname #1\endcsname}
+\newcommand{\@namelongdef}[1]{%
+ \long\expandafter\def\csname #1\endcsname}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memletcmdtxt}
+% \begin{macro}{\memlettxttxt}
+% \begin{macro}{\memlettxtcmd}
+% More utility macros (for the user but perhaps better not to tell them about
+% it in the manual) \\
+% \verb?\memletcmdtxt{\cmd}{txt} -> \let\cmd\txt? \\
+% \verb?\memlettxttxt{txta}{txtb} -> \let\txta\txtb? \\
+% \verb?\memlettxtcmd{txt}{\cmd} -> \let\txt\cmd? \\
+% \changes{v1.6180339f}{2009/06/25}{Added \cs{memletcmdtxt}, \cs{memlettxttxt}
+% and \cs{memlettxtcmd}}
+% \begin{macrocode}
+\newcommand*{\memletcmdtxt}[2]{\expandafter\let\expandafter#1\csname#2\endcsname}
+\newcommand*{\memlettxttxt}[1]{\expandafter\memletcmdtxt\csname#1\endcsname}
+\newcommand*{\memlettxtcmd}[2]{\expandafter\let\csname#1\endcsname#2}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@nameedef}
+% A shorthand for using \cs{protected@edef}.
+% \begin{macrocode}
+\newcommand{\@nameedef}[1]{%
+ \expandafter\protected@edef\csname #1\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\memjustarg}
+% \begin{macro}{\memgobble}
+% Utility macros \emph{that are not to be changed by any user!}
+% \changes{v1.618}{2005/09/25}{Added \cs{memjustarg} and \cs{memgobble}}
+% \begin{macrocode}
+\newcommand{\memjustarg}[1]{#1}
+\newcommand{\memgobble}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \changes{v3.6k}{2013/05/14}{Added macro used macros}
+% \begin{macro}{\memsetmacroused}
+% \begin{macro}{\memsetmacrounused}
+% \begin{macro}{\memifmacroused}
+% We may want to make auto adjustment to the layout unless the user
+% has used certain macros (in which case the user is responsible for
+% their own actions). To make this macro test easier, we provide a
+% few utility macros. Their use should be self explanatory. Though
+% note that the macro being marked as used, is given in full, i.e.,
+% \begin{verbatim}
+% \memsetmacroused\setlrmargins
+% \end{verbatim}
+% \begin{macrocode}
+\newcommand\memsetmacroused[1]{%
+ \@namedef{mem@macro@used@\expandafter\@gobble\string#1}{00}}
+\newcommand\memsetmacrounused[1]{%
+ \@namedef{mem@macro@used@\expandafter\@gobble\string#1}{01}}
+\newcommand\memifmacroused[1]{%
+ \if\@nameuse{mem@macro@used@\expandafter\@gobble\string#1}%
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memsetlengthmin}
+% \begin{macro}{\memsetlengthmax}
+% Returns the min or max of two lengths. Note we may alter this in
+% the future to use \cs{dimexpr}.
+% \begin{macrocode}
+\newcommand\memsetlengthmin[3]{\ifdim#2<#3\setlength{#1}{#2}\else\setlength{#1}{#3}\fi}
+\newcommand\memsetlengthmax[3]{\ifdim#2>#3\setlength{#1}{#2}\else\setlength{#1}{#3}\fi}
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Classes, Packages and Files}
+%
+% \begin{macro}{\@memfakeusepackage}
+% \cs{@memfakeusepackage}\marg{pack} fools \LaTeX{} into thinking
+% that the \meta{pack.sty} package has been loaded.
+% \changes{v1.4}{2003/11/22}{Added \cs{@memfakeusepackage} (from patch v1.9)}
+% \begin{macrocode}
+\newcommand*{\@memfakeusepackage}[1]{%
+ \@namelet{ver@#1.sty}\@empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EmulatedPackage}
+% \begin{macro}{\EmulatedPackageWithOptions}
+% There was some discussion on CTT\footnote{\textit{Re: breakurl + pdfetex
+% for generating .dvi}, March 2005.} about how to prevent loading of
+% a package. My response was to use \cs{@memfakusepackage}. Donald Arseneau
+% came up with this comprehensive solution (there was a little discussion
+% about naming with my final suggestion as here). \\
+% \cs{EmulatedPackage}\marg{package}\oarg{date} \\
+% \cs{EmulatedPackageWithOptions}\marg{option-list}\marg{package}\oarg{date} \\
+%
+% \changes{v1.618}{2005/09/04}{Added \cs{EmulatedPackage} and
+% \cs{EmulatedPackageWithOptions}}
+% \changes{v1.6180339}{2008/07/23}{Extended \cs{EmulatedPackage}}
+% \begin{macrocode}
+\providecommand*{\EmulatedPackage}{}
+\renewcommand*{\EmulatedPackage}[1]{%
+ \@ifnextchar[{\@emulated@package{#1}}%
+ {\@emulated@package{#1}[\@empty]}%]
+}
+\providecommand*{\EmulatedPackageWithOptions}{}
+\renewcommand*{\EmulatedPackageWithOptions}[2]{%
+ \PassOptionsToPackage{#1}{#2}%
+ \EmulatedPackage{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@emulated@package}
+% The workhorse for the user commands.
+% \begin{macrocode}
+\def\@emulated@package#1[#2]{%
+ \expandafter\xdef\csname ver@#1.\@pkgextension\endcsname{#2}%
+ \@ifundefined{opt@#1.\@pkgextension}%
+ {\@namedef{opt@#1.\@pkgextension}{}}{}%
+ \wlog{Package #1 \ifx\@empty#2\else[#2] \fi
+ \if,\csname opt@#1.\@pkgextension\endcsname,\else
+ (with options \csname opt@#1.\@pkgextension\endcsname) \fi
+ emulated by \@currname.}%
+}
+\@onlypreamble\EmulatedPackage
+\@onlypreamble\EmulatedPackageWithOptions
+\@onlypreamble\@emulated@package
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DisemulatePackage}
+% \cs{DisemulatePackage}\marg{package} undoes a previous
+% \cs{EmulatedPackage...}
+% \changes{v1.61803}{2008/01/30}{Added \cs{DisemulatePackage} from memptach v4.5}
+% \changes{v1.6180339}{2008/07/23}{Fixed \cs{DisemulatePackage} from mempatch v5.1}
+% \begin{macrocode}
+\newcommand*{\DisemulatePackage}[1]{%
+ \@namelet{ver@#1.\@pkgextension}\relax}
+\@onlypreamble\DisemulatePackage
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% Code, based on a hint from Morten H{\o}gholm\footnote{CTT posting
+% 2005/11/08, \textit{Re: Checking for packages froma class...
+% revisited}} that the \Lpack{scrlfile} package from
+% \Lpack{koma-script} includes commands such as \\
+% \cs{AfterFile}\marg{file}\marg{code} \\
+% plus before and after classes and packages.
+% \changes{v1.16803}{2008/01/30}{Added various \cs{AtBegin...} and
+% \cs{AtEnd...} macros (mempatch v4.2)}
+%
+% Extend the \cs{InputIfFileExists} macro to call hooks before and
+% the actual inputting. The kernel version (as of 2005/11/21) is:
+% \begin{verbatim}
+% \newcommand{\InputIfFileExists}[2]{%
+% \IfFileExists{#1}%
+% {\#2\@addtofilelist{#1}\@@input \@filef@und}}
+% \end{verbatim}
+%
+% \begin{macro}{\InputIfFileExists}
+% Effectively all file input is handled by this macro. Extend it
+% by adding pre- and post- input hooks.
+% \begin{macrocode}
+\renewcommand{\InputIfFileExists}[2]{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}\m@matbeginf{#1}%
+ \@@input \@filef@und
+ \m@matendf{#1}%
+ \killm@matf{#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@matbeginf}
+% \begin{macro}{\m@matendf}
+% \cs{m@matbeginf}\marg{file} calls macro \cs{file-m@mfb} if it
+% is defined. Similarly \cs{m@matendf}\marg{file} calls
+% \cs{file-m@mfe} if it is defined.
+% \begin{macrocode}
+\newcommand{\m@matbeginf}[1]{\@ifundefined{#1-m@mfb}{}%
+ {\@nameuse{#1-m@mfb}}}
+\newcommand{\m@matendf}[1]{\@ifundefined{#1-m@mfe}{}%
+ {\@nameuse{#1-m@mfe}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\killm@matf}
+% \cs{killm@matf}\marg{file} undefines the \cs{file-m@mfb} and
+% \cs{file-m@mfe} macros.
+% \begin{macrocode}
+\newcommand*{\killm@matf}[1]{%
+ \@namelet{#1-m@mfb}\relax
+ \@namelet{#1-m@mfe}\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginFile}
+% \begin{macro}{\AtEndFile}
+% \cs{AtBeginFile}\marg{file}\marg{code} inserts \meta{code}
+% just before \meta{file} is input. Similarly \cs{AtEndFile} inserts
+% just after input.
+% \begin{macrocode}
+\newcommand{\AtBeginFile}[2]{\@ifundefined{#1-m@mfb}%
+ {\@namedef{#1-m@mfb}{#2}}%
+ {\expandafter\addtodef\csname #1-m@mfb\endcsname{}{#2}}}
+\newcommand{\AtEndFile}[2]{\@ifundefined{#1-m@mfe}%
+ {\@namedef{#1-m@mfe}{#2}}%
+ {\expandafter\addtodef\csname #1-m@mfe\endcsname{}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginPackage}
+% \begin{macro}{\AtEndPackage}
+% \begin{macro}{\RequireAtEndPackage}
+% \cs{AtBeginPackage}\marg{pack}\marg{code} inserts \meta{code}
+% just before the \meta{pack} package is input, and \cs{AtEndPackage}
+% is the equivalent for after input. \cs{RequireAtEndPackage} inserts
+% \meta{code} either at the end of \meta{pack}, or immediately if
+% \meta{pack} has already been input.
+% \begin{macrocode}
+\newcommand{\AtBeginPackage}[2]{%
+ \AtBeginFile{#1.\@pkgextension}{#2}}
+\newcommand{\AtEndPackage}[2]{%
+ \AtEndFile{#1.\@pkgextension}{#2}}
+\newcommand{\RequireAtEndPackage}[2]{%
+ \@ifpackageloaded{#1}{#2}%
+ {\AtEndFile{#1.\@pkgextension}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginClass}
+% \begin{macro}{\AtEndClass}
+% \begin{macro}{\RequireAtEndClass}
+% \cs{AtBeginClass}\marg{class}\marg{code} and friends are the class
+% equivalents of \cs{AtBeginPackage} and friends.
+% \begin{macrocode}
+\newcommand{\AtBeginClass}[2]{%
+ \AtBeginFile{#1.\@clsextension}{#2}}
+\newcommand{\AtEndClass}[2]{%
+ \AtEndFile{#1.\@clsextension}{#2}}
+\newcommand{\RequireAtEndClass}[2]{%
+ \@ifclassloaded{#1}{#2}%
+ {\AtEndFile{#1.\@clsextension}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\phantomsection}
+% A command needed if the \Lpack{hyperref} package is used, for putting
+% before certain \cs{addcontentsline} commands.
+% \begin{macrocode}
+\newcommand{\phantomsection}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nofiles}
+% The kernel's \cs{nofiles}, which surprisingly may be called \emph{before}
+% the class is loaded, lets \cs{makeindex} to \cs{relax}. This could
+% cause problems\footnote{As reported by Heiko Oberdiek on 2005/07/09.}
+% with my initial version of \cs{makeindex}.
+% Here's the kernel \cs{nofiles} definition:
+% \begin{verbatim}
+% \def\nofiles{%
+% \@fileswfalse% flag for suppressing \immediate \writes
+% \typeout{No auxiliary output files.^^J}%
+% \long\def\protected@write##1##2##3%
+% {\write\m@ne{}\if@nobreak\ifvmode\nobreak\fi\fi}%
+% \let\makeindex\relax
+% \let\makeglossary\relax}
+% \end{verbatim}
+% To get it to work for when \cs{makeindex}es optional argument is
+% used I let \cs{makeindex} itself deal with \cs{nofiles} (and
+% also \cs{makeglossary}).
+% \changes{v1.618}{2005/09/25}{Modified the kernel's \cs{nofiles}}
+% \begin{macrocode}
+ \renewcommand*{\nofiles}{%
+ \@fileswfalse% flag for suppressing \immediate \writes
+ \typeout{No auxiliary output files.^^J}%
+ \long\def\protected@write##1##2##3%
+ {\write\m@ne{}\if@nobreak\ifvmode\nobreak\fi\fi}%
+ }
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memsetcounter}
+% A wrapper round \cs{setcounter}. I want to use this in the \texttt{aux} file.
+% \changes{v1.61803}{2008/01/30}{Added \cs{memsetcounter}}
+% \begin{macrocode}
+\newcommand*{\memsetcounter}[2]{\setcounter{#1}{#2}}
+\AtBeginDocument{\immediate\write\@mainaux{%
+ \string\providecommand*{\string\memsetcounter}[2]{}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{For package documentation}
+%
+% Some macros that may be useful for documenting LaTeX code. These
+% have principally come from \texttt{doc.dtx}.
+%
+% \begin{macro}{\bs}
+% Prints \verb?\?
+% \begin{macrocode}
+\def\bs{\texttt{\char`\\}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@nohyphenation}
+% \begin{macro}{\meta}
+% \begin{macro}{\meta@font@select}
+% From \texttt{doc.dtx} \\
+% \cs{meta}\marg{arg} prints \meta{arg}.
+% \begin{macrocode}
+\ifx\l@nohyphenation\undefined
+ \newlanguage\l@nohyphenation
+\fi
+\DeclareRobustCommand{\meta}[1]{%
+ \ensuremath\langle
+ \ifmmode \expandafter \nfss@text \fi
+ {%
+ \meta@font@select
+ \edef\meta@hyphen@restore
+ {\hyphenchar\the\font\the\hyphenchar\font}%
+ \hyphenchar\font\m@ne
+ \language\l@nohyphenation
+ #1\/%
+ \meta@hyphen@restore
+ }\ensuremath\rangle
+}
+\def\meta@font@select{\itshape}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marg}
+% \begin{macro}{\oarg}
+% \begin{macro}{\parg}
+% Robust versions of the \texttt{doc.dtx} macros. \\
+% \cs{marg}\marg{arg} prints \marg{arg} \\
+% \cs{oarg}\marg{arg} prints \oarg{arg} \\
+% \cs{parg}\marg{arg} prints \parg{arg} \\
+% \begin{macrocode}
+\DeclareRobustCommand{\marg}[1]{%
+ {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
+\DeclareRobustCommand{\oarg}[1]{%
+ {\ttfamily\char`\[}\meta{#1}{\ttfamily\char`\]}}
+\DeclareRobustCommand{\parg}[1]{%
+ {\ttfamily\char`\(}\meta{#1}{\ttfamily\char`\)}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cs}
+% \verb?\cs{arg}? prints \cs{arg}.
+% \begin{macrocode}
+\DeclareRobustCommand{\cs}[1]{\texttt{\char`\\#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\cmdprint}
+% \begin{macro}{\cmd}
+% From Heiko Oberdiek CTT 2001/05/26 (print and index a command) \\
+% \verb?\cmdprint{\fred}? prints \verb?\fred? \\
+% \verb?\cmd{\fred}? prints and indexes \verb?\fred?. NOTE It assumes that
+% \verb!?! is the `actual' character for MakeIndex (it is normally \verb!@!
+% but that is not much use if a command includes \verb!@! as part of its name).
+% \begin{macrocode}
+\newcommand{\cmdprint}[1]{\texttt{\string#1}}
+\newcommand{\cmd}[1]{\cmdprint{#1}%
+ \index{\expandafter\@gobble\string#1?\string\cmdprint{\string#1}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Checking the processor}
+%
+% Prior to 2008/07/22 the \Lpack{hyperref} package was modified in such a
+% way as to produce warnings about versions of the \Lpack{ifpdf} and
+% \Lpack{ifxetex} packages when \Lpack{hyperref} was used with versions
+% v1.618033,
+% v1.61803, or v1.618 mempatch v4.9 of the class.
+% \Lpack{hyperref}'s author refused to
+% make any changes to his package, insisting that emulating a package was
+% `ugly hacking'. He did, though, provide an example code that could be
+% added to memoir
+% to use a package if it was available. I have used it for the emulations
+% in this section. There will be no further changes to the class to accomodate
+% any further changes to \Lpack{hyperref} --- it's easy for a package to
+% determine what class is being used and make arrangements accordingly,
+% especially as there are not all that many classes. There are hundreds
+% of packages that might be used with a particular class and it would be
+% senseless for a class to attempt to take account of everything that might
+% be used with it.
+%
+% ^^A % Note (2016/05/16): Due to recent changes in Luatex, most notably the
+% ^^A % removal of several \cs{pdf...} macro, several PDF tests fail with
+% ^^A % LuaLaTeX. As a temporary measure the following is used to restore
+% ^^A % the old functionality when a newer LuaLaTeX is used. Code courtesy
+% ^^A % of David Carlisle. At some point we will include some of this into
+% ^^A % the class.
+% \changes{v3.7f}{2016/05/16}{Temp measure to make the class work with
+% updated luatex}
+% \changes{v3.7g}{2018/03/09}{\Lpack{luatex85} removed again, now
+% relying on external \cs{if<engine>} packages and have rewritten the
+% macros that use \cs{pdf...}}
+% ^^A % \begin{macrocode}
+% ^^A \ifx\pdfextension\@undefined\else
+% ^^A \RequirePackage{luatex85}
+% ^^A \fi
+% ^^A
+% ^^A % \end{macrocode}
+%
+%
+% \begin{macro}{\ifpdf}
+% This can be used to check whether or not a document is being processed
+% by \LaTeX{} or pdf\LaTeX. We will simply require the \Lpack{ifpdf} package.
+% \changes{v1.0}{2001/09/21}{Made checking of \cs{pdfouput} more robust}
+% \changes{v1.618}{2005/09/03}{Prohibit loading the ifpdf package (mempatch v3.9)}
+% \changes{v1.618033}{2008/06/02}{Further improved pdf checking}
+% \changes{v1.6180339}{2008/07/23}{Use ifpdf package if available}
+% \changes{v1.61803398d}{2009/12/01}{if \cs{ifpdf} is already
+% defined, e.g. using \cs{RequirePackage} before \cs{documentclass},
+% then using \cs{newif}\cs{ifpdf} will cause TeX to eat up a lot of
+% code. We fix this using a hint by Will Robertson.}
+% \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be
+% emulating \cs{if}\meta{engine} packages, you'll get an error if you
+% do not have them}
+% \begin{macrocode}
+\RequirePackage{ifpdf}[2017/03/15]
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifetex}
+% Check if \texttt{etex} is being used. We will simply require the \Lpack{ifetex} package.
+% \changes{v1.61803}{2008/01/30}{Added check for etex (mempatch v4.9)}
+% \changes{v1.618033}{2008/06/02}{Improved check for etex}
+% \changes{v1.6180339}{2008/07/23}{Use an ifetex package if available}
+% \changes{v1.6180339c}{2008/12/27}{Changed ifetex message from Warning to Info}
+% \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be
+% emulating \cs{if}\meta{engine} packages, you'll get an error if you
+% do not have them}
+% \begin{macrocode}
+\RequirePackage{ifetex}
+% \end{macrocode}
+% \end{macro}
+% Having supplied an \cs{ifpdf} to check if pdfLaTeX is being used,
+% here's one for XeTeX.
+%
+% \begin{macro}{\ifxetex}
+% Checks if XeTeX is being used. We will simply require the \Lpack{ifxetex} package.
+% \changes{v1.61803}{2008/01/30}{Added checks for XeTeX (mempatch v4.9)}
+% \changes{v1.6180339}{2008/07/23}{Use ifxetex package if available}
+% \changes{v1.61803398d}{2009/12/01}{if \cs{ifxetex} is already
+% defined, e.g. using \cs{RequirePackage} before \cs{documentclass},
+% then using \cs{newif}\cs{ifxetex} will cause TeX to eat up a lot of
+% code. We fix this using a hint by Will Robertson.}
+% \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be
+% emulating \cs{if}\meta{engine} packages, you'll get an error if you
+% do not have them}
+% \begin{macrocode}
+\RequirePackage{ifxetex}[2010/09/12]
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifluatex}
+% Check if \texttt{luatex} is being used. We will simply require the \Lpack{ifluatex} package.
+% \changes{v1.61803}{2008/01/30}{Added check for luatex}
+% \changes{v1.6180339}{2008/07/23}{Use an ifluatex package if available}
+% \changes{v1.6180339c}{2008/12/31}{It seems that Heiko Oberdiek has created an
+% ifluatex package.}
+% \changes{v1.61803398d}{2009/12/01}{if \cs{ifluatex} is already
+% defined, e.g. using \cs{RequirePackage} before \cs{documentclass},
+% then using \cs{newif}\cs{ifluatex} will cause TeX to eat up a lot of
+% code. We fix this using a hint by Will Robertson.}
+% \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be
+% emulating \cs{if}\meta{engine} packages, you'll get an error if you
+% do not have them}
+% \begin{macrocode}
+\RequirePackage{ifluatex}[2016/05/16]
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Extending an existing macro}
+%
+%
+% My usual technique for modifying the code of an existing
+% macro was to use \cs{renewcommand}. However it slowly became apparent that
+% many of such modifications merely consisted of adding some code at
+% either the start or end of the existing definition. In June 2000 I
+% posed a question
+% on the \texttt{comp.text.tex} newsgroup about this, and
+% Michael Downes\footnote{\texttt{epsmjd@ams.org}} and
+% Heiko Oberdiek\footnote{\texttt{oberdiek@ruf.uni-freiburg.de}}
+% were kind enough to respond.
+% The responses arrived almost simultaneously, both
+% supplying methods for adding code at the end of a macro defined to take
+% one argument. Michael Downes' response included a remark about it probably
+% being too much effort to formulate a general way of doing this.
+% Heiko Oberdiek almost immediately replied with such a generalisation.
+%
+% The following code, which I have extracted from a package that I
+% wrote but which I did not submit to CTAN, incorporates the work of both
+% Michael and Heiko. I have added a bit. All errors are my responsibility.
+% Michael went on the write the \Lpack{patchcmd} package which is
+% a generalisation of the facilities below and so there was no need for
+% my more restricted package.
+% \changes{v0.33}{2001/08/31}{Replaced \cs{appendiarg} with \cs{addtodef}
+% and friends}
+%
+% \begin{macro}{\wo@dmacro}
+% Heiko Oberdiek suggested\footnote{Via email on 2000/07/12.} that
+% \meta{macro} should be tested for being the name of a macro, rather than
+% using the normal \LaTeX{} test against it being undefined. He supplied
+% the code for performing the macro name test.
+%
+% \cs{wo@dmacro} is a helper for handling the string `macro:'.
+% \begin{macrocode}
+\edef\wo@dmacro{%
+ \string m\string a\string c\string r\string o\string :%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\wo@difmacro@begingroup}
+% This seems to take two arguments:
+% \cs{wo@difmacro@begingroup}\marg{macro}\marg{code}, where
+% \meta{macro} should be the name of a defined macro and \meta{code}
+% is code to be executed if and only if \meta{macro} \emph{is} a
+% defined macro.
+% \begin{macrocode}
+\def\wo@difmacro@begingroup#1{%
+% \end{macrocode}
+% Start a group.
+% \begin{macrocode}
+ \begingroup
+% \end{macrocode}
+% Test if \verb?#1? is a defined macro; \cs{wo@dparsemacro} does most of the work.
+% \begin{macrocode}
+ \edef\x{%
+ \noexpand\wo@dparsemacro\meaning#1\wo@dmacro\string -%
+ }%
+ \x\@nil{#1}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\wo@dparsemacro}
+% This is called by \cs{wo@difmacro@begingroup}. If \meta{macro} is not
+% a defined macro it prints a warning and closes the group begun by
+% \cs{wo@difmacro@begingroup}. Otherwise it process the \meta{code} which
+% \emph{must} close the group.
+% \begin{macrocode}
+\begingroup
+ \edef\x{\endgroup
+ \def\noexpand\wo@dparsemacro##1\wo@dmacro##2\string -}%
+\x#3\@nil#4{%
+ \ifx\\#3\\%
+ \endgroup
+ \@memwarn{\string `\string #4\string ' is not a macro}%
+ \expandafter\@gobble
+ \else
+ \expandafter\@firstofone
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addtodef}
+% \begin{macro}{\addtodef*}
+% \begin{macro}{\wo@daddtodef}
+% The command \cs{addtodef}\marg{macro}\marg{start-stuff}\marg{end-stuff}
+% adds stuff at the start and/or end of an argumentless macro.
+% Initially the code for appending was a reimplementation of the
+% kernel \cs{g@addto@macro} command (from \file{ltclass.dtx}).
+% Later, at Michael Downes' suggestion, I combined
+% appending and prepending stuff into a single command.
+% Actually, there is no real need to have both
+% \cs{addtodef} and \cs{addtodef*} as the body of the command
+% being amended has no argument,
+% but both versions are provided for consistency.
+%
+% The kernel \cs{@star@or@long} and \cs{l@ngrel@x} commands
+% (in \file{ltdefns.dtx}) are used to handle
+% the potential \verb?*? after the command name.
+% \begin{macrocode}
+\def\addtodef{\@star@or@long\wo@daddtodef}
+% \end{macrocode}
+% The \cs{@star@or@long} command dealt with a possible \verb?*? and now
+% \cs{wo@daddtodef} does the work. It picks up the three arguments
+% that the user thinks belong to \cs{addtodef}, namely \meta{macro},
+% \meta{start-stuff} and \meta{end-stuff}.
+% \begin{macrocode}
+\long\def\wo@daddtodef#1#2#3{%
+% \end{macrocode}
+% Check if \meta{macro} has been defined.
+% \begin{macrocode}
+ \wo@difmacro@begingroup{#1}{%
+% \end{macrocode}
+% If \meta{macro} is defined then store the tokens corresponding to the
+% body of \meta{macro} and the extra \meta{-stuff} in token registers.
+% \begin{macrocode}
+ \@temptokena{#2}%
+ \toks@\expandafter{#1#3}%
+% \end{macrocode}
+% Do an expanded definition for \cs{x}, so that calling \cs{x}
+% will \cs{def} a new version of \meta{macro}, whose body consists of the
+% saved tokens (i.e., the orginal body plus the extra stuff).
+% As Michael Downes noted, single letter control sequences do not take any of
+% \TeX's hash table space.
+% \cs{l@ngrel@x}
+% has been previously set to either \cs{long} or \cs{relax} by \cs{@star@or@long},
+% and so may make the new definition of \meta{macro} to be \cs{long}.
+% \begin{macrocode}
+ \edef\x{\endgroup
+ \l@ngrel@x\def\noexpand#1{\the\@temptokena \the\toks@}}%
+% \end{macrocode}
+% Finally, call \cs{x} to perform the new definition.
+% \begin{macrocode}
+ \x
+ }%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\addtoiargdef}
+% \begin{macro}{\addtoiargdef*}
+% \begin{macro}{\wo@daddtoiargdef}
+% This adds stuff at the start and/or end of a macro that takes one argument.
+% It is a modification of Michael Downes' appending
+% code\footnote{Posted to \ctt{} on 15~June 2000,\\
+% URL: \url{http://www.dejanews.com/getdoc.xp?AN=635057844}.}
+% which was:
+% \begin{small}\begin{verbatim}
+% \def\appendef#1#2{%
+% \begingroup
+% \toks@\expandafter{#1{##1}#2}%
+% \edef\x{\endgroup \def\noexpand#1####1{\the\toks@}}%
+% \x}
+% \end{verbatim}
+% \par\end{small}
+%
+% \begin{macrocode}
+\def\addtoiargdef{\@star@or@long\wo@daddtoiargdef}
+\long\def\wo@daddtoiargdef#1#2#3{%
+ \wo@difmacro@begingroup{#1}{%
+ \@temptokena{#2}%
+ \toks@\expandafter{#1{##1}#3}%
+ \edef\x{\endgroup
+ \l@ngrel@x\def\noexpand#1####1{\the\@temptokena \the\toks@}}%
+ \x
+ }%
+}
+
+% \end{macrocode}
+% For the record, Heiko Oberdiek produced the following
+% version\footnote{Posted to \ctt{} on 16~June 2000,\\
+% URL: \url{http://www.dejanews.com/getdoc.xp?AN=635095381}.}
+% which avoids the use of a token register.
+% \begin{small}\begin{verbatim}
+% \newcommand{\appendiargdef}[2]{%
+% \long\expandafter\def\expandafter#1\expandafter
+% ##\expandafter1\expandafter{#1{##1}#2}}
+% \end{verbatim}
+% \par\end{small}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Continuing the saga, Michael came up with a pretty general solution for
+% modifying a macro with any number (up to 9) of arguments which he
+% sent to me on 2000/07/13; this became
+% the \Lpack{patchcmd} package which is on CTAN. I'm sure that Michael
+% would have given me permission to include it here if he had not tragically
+% passed away in 2003. I miss his encouragement, advice, and skills.
+%
+% \begin{macro}{\patchcmd}
+% \cs{patchcmd}\marg{macro}\marg{start-stuff}\marg{end-stuff} inserts
+% \meta{start-stuff} at the beginning of the definition of \meta{macro}
+% and \meta{end-stuff} at the end of the definition. \meta{macro}
+% can have 0--9 arguments and be defined by \cs{newcommand} (and associates)
+% or with \cs{DeclareRobustCommand}. For macros that use \cs{futurelet}
+% (e.g., those with starred forms or optional arguments) only prepending
+% works --- any non-empty \meta{end-stuff} will mess things up. \cs{patchcmd}
+% does not work with macros that have delimited arguments.
+% \changes{v1.618}{2005/09/05}{Added \cs{patchcmd}}
+%
+% \begin{macrocode}
+%%%%%%%%%%%%%%%% Michael Downes' patchcmd 2000/07/31 v1.03 %%%%%%%%
+\newcommand{\patchcommand}[1]{%
+ \expandafter\patchcmd@a\meaning#1??->@\@nil#1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmd@a}
+% \begin{macrocode}
+\long\def\patchcmd@a#1#2#3->#4#5\@nil#6{%
+ \ifx @#4\relax \patchcmdError#6#1%
+ \expandafter\@gobbletwo % discard the other two arguments
+ \else
+ \if l#2\toks@{\patchcmd@e{}#6}% l in this position means \long
+ \else \toks@{\patchcmd@e*#6}% not \long
+ \fi
+ \patchcmd@b #3@#4#5 ? ? ? \@nil#6%
+ \expandafter\the\expandafter\toks@
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmd@b}
+% \begin{macrocode}
+\def\patchcmd@b#1:#2@#3#4 #5#6 #7 #8\@nil#9{%
+ \if \ifx @#7@\expandafter
+ \ifx\csname #6\endcsname#9T\else F\fi\else F\fi T%
+ \toks@\expandafter{\expandafter\patchcommand\csname #6 \endcsname}%
+ \else
+ \ifx @#2@% No arguments
+ \toks@\expandafter{\the\toks@ 0}%
+ \else
+ \patchcmd@c 0#2{\string##}0%
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmd@c}
+% \begin{macrocode}
+\def\patchcmd@c#1#2#3{%
+ \if\string###2% % yes it's a # token
+ \ifodd 0#31 % and it's followed by a number
+ \if 0#3\patchcmd@d#1\fi % number=0? then we're done
+ \else \patchcmd@d D% # not a number: must be a delimited arg
+ \fi
+ \else \patchcmd@d D% not a # token: must be a delmited arg
+ \fi
+ \patchcmd@c#3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmd@d}
+% \begin{macrocode}
+\def\patchcmd@d#1{%
+ \if D#1%
+%%% \PackageError{patchcmd}{Cannot change a macro that has
+%%% delimited arguments}\@ehd
+ \@memerror{%
+ Cannot change a macro that has delimited arguments}{\@ehd}
+ \else
+ \toks@\expandafter{\the\toks@ #1}%
+ \fi
+ \begingroup
+ \aftergroup\@gobble
+ \let\patchcmd@c\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmd@e}
+% \begin{macrocode}
+\def\patchcmd@e#1#2#3#4#5{%
+ \begingroup
+ \edef\@##1{%
+ \@temptokena\noexpand\expandafter{%
+ \noexpand#2%
+ \ifnum#3>0 {####1}\ifnum#3>1 {####2}\ifnum#3>2 {####3}%
+ \ifnum#3>3 {####4}\ifnum#3>4 {####5}\ifnum#3>5 {####6}%
+ \ifnum#3>6 {####7}\ifnum#3>7 {####8}\ifnum#3>8 {####9}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi
+ ##1%
+ }%
+ }
+ \@{#5}%
+ \edef\@##1{\endgroup
+ \noexpand\renewcommand#1\noexpand#2\ifcase#3 \else [#3]\fi
+ {##1\the\@temptokena}}%
+ \@{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\patchcmdError}
+% \begin{macrocode}
+\long\def\patchcmdError#1#2{%
+ \begingroup
+ \toks@{Not redefinable}%
+ \ifcat\relax\noexpand#1% Is it a control sequence?
+ \begingroup
+ \let#1=?\ifx ?\relax % Is it "\relax"?
+ \endgroup % accept current value of \toks@
+ \else \endgroup
+ \if\ifx\relax#1u\else #2\fi u%
+ \toks@{Not defined}%
+ \fi
+ \fi
+ \fi
+ \edef\@{\endgroup
+%%% \noexpand\PackageError{patchcmd}{%
+%%% \the\toks@: \string#1}\noexpand\@ehd}%
+ \noexpand\@memerror{%
+ \the\toks@: \string#1}\noexpand\@ehd}%
+ \@}
+
+%%%%%%%%%%%%%%%%%%%%% end of patchcmd code %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \end{macrocode}
+% \end{macro}
+%
+% Prevent later loading of the original \Lpack{patchcmd} package.
+% \begin{macrocode}
+%%\@memfakeusepackage{patchcmd}
+
+% \end{macrocode}
+%
+% \changes{v1.61803398}{2009/07/18}{Added support for bidi}
+% \subsection{Support for the bidi package (RTL typesetting)}
+%
+% The \Lpack{bidi} package (system) enables bidirectional typesetting.
+% As part of
+% being able to accomplish this it often needs to exchange, for example,
+% \cs{leftskip} and \cs{rightskip} depending on whether it is setting
+% left-to-right (LTR) or right-to-left (RTL). In the case of \Lpack{memoir}
+% the initial \Lpack{bidi} system implementation used a \Lpack{bidimemoir}
+% class developed by Vafa Khalighi. Now, with Vafa's help, the necessary
+% changes have been incorporated in \Lpack{memoir}; the \Lpack{bidimemoir}
+% class is no longer needed.
+%
+% \begin{macro}{\memRTLleftskip}
+% \begin{macro}{\memRTLrightskip}
+% \begin{macro}{\memRTLvleftskip}
+% \begin{macro}{\memRTLvrightskip}
+% \begin{macro}{\memRTLraggedright}
+% \begin{macro}{\memRTLraggedleft}
+% \begin{macro}{\memRTLmainraggedright}
+% \begin{macro}{\memRTLmainraggedleft}
+% These are the hooks required to support the \Lpack{bidi} package,
+% plus some we added that \Lpack{bidi} can use. The idea behind the
+% \cs{XmainraggedX} macros are documents fully in RTL mode, then it
+% makes sense to have the raggedness of the header and footer
+% reversed. By default they do what the normally do, but in main RTL
+% mode, \Lpack{bidi} can redefine them to reverse the order of the
+% headers, i.e. the `left' part of the header is typeset as the
+% `right' part.
+% \changes{v3.6h}{2010/10/22}{Added \cs{mem@RTLmainraggedX} macros}
+% \changes{v3.6k}{2011/06/24}{the \cs{mem@RTLvX} macros should point
+% at \cs{vX} not \cs{X}}
+% \begin{macrocode}
+\newcommand*{\memRTLleftskip}{\leftskip}
+\newcommand*{\memRTLrightskip}{\rightskip}
+\newcommand*{\memRTLvleftskip}{\vleftskip}
+\newcommand*{\memRTLvrightskip}{\vrightskip}
+\newcommand*{\memRTLraggedright}{\raggedright}
+\newcommand*{\memRTLraggedleft}{\raggedleft}
+\newcommand*{\memRTLmainraggedright}{\raggedright}
+\newcommand*{\memRTLmainraggedleft}{\raggedleft}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% It is expected that the \Lpack{bidi} package will redefine these as:
+% \begin{verbatim}
+% \renewcommand*{\memRTLleftskip}{\if@RTL\rightskip\else\leftskip\fi}
+% \renewcommand*{\memRTLrightskip}{\if@RTL\leftskip\else\rightskip\fi}
+% \renewcommand*{\memRTLvleftskip}{\if@RTL\vrightskip\else\vleftskip\fi}
+% \renewcommand*{\memRTLvrightskip}{\if@RTL\vleftskip\else\vrightskip\fi}
+% \renewcommand*{\memRTLraggedright}{\if@RTL\raggedleft\else\raggedright\fi}
+% \renewcommand*{\memRTLraggedleft}{\if@RTL\raggedright\else\raggedleft\fi}
+% \renewcommand*{\memRTLmainraggedright}{\if@RTLmain\raggedleft\else\raggedright\fi}
+% \renewcommand*{\memRTLmainraggedleft}{\if@RTLmain\raggedright\else\raggedleft\fi}
+% \end{verbatim}
+%
+% \section{Declaration of Options} \label{sec:opt}
+%
+%
+% \subsection{Setting Paper Sizes}
+%
+% The variables \cs{paperheight} and \cs{paperwidth} should reflect the
+% physical paper size after trimming.
+%
+% Option \Lopt{letterpaper} will be the default.
+%
+% \begin{macro}{\stockheight}
+% \begin{macro}{\stockwidth}
+% \begin{macro}{\trimtop}
+% \begin{macro}{\trimedge}
+% The lengths \cs{stockheight} and \cs{stockwidth} should be the height and
+% width of the stock sheet before trimming. For example, this is the
+% physical size
+% of a single sheet that might be laser-printed. The lengths \cs{trimtop}
+% and \cs{trimedge} are the amount that will be trimmed off the top and fore
+% edge of the physical sheet.
+% For desk printer output the size of the trimmed sheet is often the
+% same as the physical sheet. In other words the \cs{paper...} and \cs{stock...}
+% sizes are the same and the trims are zero. This class assumes that this
+% is the normal case.
+% \begin{macrocode}
+\newlength{\stockheight}
+\newlength{\stockwidth}
+\newlength{\trimtop}
+\newlength{\trimedge}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% The class provides an extended range of stock sizes. It may be useful at some
+% point to have macros for these.
+%
+% \begin{macro}{\stockdbill}
+% \begin{macro}{\stockstatement}
+% \begin{macro}{\stockexecutive}
+% \begin{macro}{\stockletter}
+% \begin{macro}{\stockold}
+% \begin{macro}{\stocklegal}
+% \begin{macro}{\stockledger}
+% \begin{macro}{\stockbroadsheet}
+% US stock sizes.
+% \changes{v1.61803}{2008/01/30}{Major expansion of stock size options}
+% \begin{macrocode}
+\newcommand*{\stockdbill} {\stockheight=7in \stockwidth=3in}
+\newcommand*{\stockstatement} {\stockheight=8.5in \stockwidth=5.5in}
+\newcommand*{\stockexecutive} {\stockheight=10.5in \stockwidth=7.25in}
+\newcommand*{\stockletter} {\stockheight=11in \stockwidth=8.5in}
+\newcommand*{\stockold} {\stockheight=12in \stockwidth=9in}
+\newcommand*{\stocklegal} {\stockheight=14in \stockwidth=8.5in}
+\newcommand*{\stockledger} {\stockheight=17in \stockwidth=11in}
+\newcommand*{\stockbroadsheet}{\stockheight=22in \stockwidth=17in}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stockpottvo}
+% \begin{macro}{\stockfoolscapvo}
+% \begin{macro}{\stockcrownvo}
+% \begin{macro}{\stockpostvo}
+% \begin{macro}{\stocklargecrownvo}
+% \begin{macro}{\stocklargepostvo}
+% \begin{macro}{\stocksmalldemyvo}
+% Traditional British octavo sizes.
+% \begin{macrocode}
+\newcommand*{\stockpottvo} {\stockheight=6.25in \stockwidth=4in}
+\newcommand*{\stockfoolscapvo} {\stockheight=6.75in \stockwidth=4.25in}
+\newcommand*{\stockcrownvo} {\stockheight=7.5in \stockwidth=5in}
+\newcommand*{\stockpostvo} {\stockheight=8in \stockwidth=5in}
+\newcommand*{\stocklargecrownvo}{\stockheight=8in \stockwidth=5.25in}
+\newcommand*{\stocklargepostvo} {\stockheight=8.25in \stockwidth=5.25in}
+\newcommand*{\stocksmalldemyvo} {\stockheight=8.5in \stockwidth=5.675in}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stockdemyvo}
+% \begin{macro}{\stockmediumvo}
+% \begin{macro}{\stocksmallroyalvo}
+% \begin{macro}{\stockroyalvo}
+% \begin{macro}{\stocksuperroyalvo}
+% \begin{macro}{\stockimperialvo}
+% \begin{macrocode}
+\newcommand*{\stockdemyvo} {\stockheight=8.75in \stockwidth=5.675in}
+\newcommand*{\stockmediumvo} {\stockheight=9in \stockwidth=5.75in}
+\newcommand*{\stocksmallroyalvo}{\stockheight=9.25in \stockwidth=6.175in}
+\newcommand*{\stockroyalvo} {\stockheight=10in \stockwidth=6.25in}
+\newcommand*{\stocksuperroyalvo}{\stockheight=10.25in \stockwidth=6.75in}
+\newcommand*{\stockimperialvo} {\stockheight=11in \stockwidth=7.5in}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stockmcrownvo}
+% \begin{macro}{\stockmlargecrownvo}
+% \begin{macro}{\stockmdemyvo}
+% \begin{macro}{\stockmsmallroyalvo}
+% Metric stock sizes.
+% \begin{macrocode}
+\newcommand*{\stockmcrownvo} {\stockheight=186mm \stockwidth=123mm}
+\newcommand*{\stockmlargecrownvo} {\stockheight=198mm \stockwidth=129mm}
+\newcommand*{\stockmdemyvo} {\stockheight=216mm \stockwidth=138mm}
+\newcommand*{\stockmsmallroyalvo} {\stockheight=234mm \stockwidth=156mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stockao}
+% \begin{macro}{\stockai}
+% \begin{macro}{\stockaii}
+% \begin{macro}{\stockaiii}
+% \begin{macro}{\stockaiv}
+% \begin{macro}{\stockav}
+% \begin{macro}{\stockavi}
+% The A series, A0 --- A6.
+% \changes{v1.6180339c}{2008/12/26}{Extended the A and B stock/paper size
+% seies with A/B0 through A/B2}
+% \begin{macrocode}
+\newcommand*{\stockao} {\stockheight=1189mm \stockwidth=841mm}
+\newcommand*{\stockai} {\stockheight=841mm \stockwidth=594mm}
+\newcommand*{\stockaii} {\stockheight=594mm \stockwidth=420mm}
+\newcommand*{\stockaiii}{\stockheight=420mm \stockwidth=297mm}
+\newcommand*{\stockaiv} {\stockheight=297mm \stockwidth=210mm}
+\newcommand*{\stockav} {\stockheight=210mm \stockwidth=148mm}
+\newcommand*{\stockavi} {\stockheight=148mm \stockwidth=105mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stockbo}
+% \begin{macro}{\stockbi}
+% \begin{macro}{\stockbii}
+% \begin{macro}{\stockbiii}
+% \begin{macro}{\stockbiv}
+% \begin{macro}{\stockbv}
+% \begin{macro}{\stockbvi}
+% The B series, B0 --- B6.
+% \begin{macrocode}
+\newcommand*{\stockbo} {\stockheight=1414mm \stockwidth=1000mm}
+\newcommand*{\stockbi} {\stockheight=1000mm \stockwidth=707mm}
+\newcommand*{\stockbii} {\stockheight=707mm \stockwidth=500mm}
+\newcommand*{\stockbiii}{\stockheight=500mm \stockwidth=353mm}
+\newcommand*{\stockbiv} {\stockheight=353mm \stockwidth=250mm}
+\newcommand*{\stockbv} {\stockheight=250mm \stockwidth=176mm}
+\newcommand*{\stockbvi} {\stockheight=176mm \stockwidth=125mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% It will be useful also to provide macros that set the page sizes.
+%
+% \begin{macro}{\pagedbill}
+% \begin{macro}{\pagestatement}
+% \begin{macro}{\pageexecutive}
+% \begin{macro}{\pageletter}
+% \begin{macro}{\pageold}
+% \begin{macro}{\pagelegal}
+% \begin{macro}{\pageledger}
+% \begin{macro}{\pagebroadsheet}
+% \changes{v1.6180339c}{\cs{pageheight} and \cs{pagewidth} should be
+% \cs{paperheight} and \cs{paperwidth}
+% (courtesy Wilhelm Muller)}
+% US page sizes.
+% \begin{macrocode}
+\newcommand*{\pagedbill} {\paperheight=7in \paperwidth=3in}
+\newcommand*{\pagestatement} {\paperheight=8.5in \paperwidth=5.5in}
+\newcommand*{\pageexecutive} {\paperheight=10.5in \paperwidth=7.25in}
+\newcommand*{\pageletter} {\paperheight=11in \paperwidth=8.5in}
+\newcommand*{\pageold} {\paperheight=12in \paperwidth=9in}
+\newcommand*{\pagelegal} {\paperheight=14in \paperwidth=8.5in}
+\newcommand*{\pageledger} {\paperheight=17in \paperwidth=11in}
+\newcommand*{\pagebroadsheet}{\paperheight=22in \paperwidth=17in}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pagepottvo}
+% \begin{macro}{\pagefoolscapvo}
+% \begin{macro}{\pagecrownvo}
+% \begin{macro}{\pagepostvo}
+% \begin{macro}{\pagelargecrownvo}
+% \begin{macro}{\pagelargepostvo}
+% \begin{macro}{\pagesmalldemyvo}
+% British traditional page sizes, octavo.
+% \begin{macrocode}
+\newcommand*{\pagepottvo} {\paperheight=6.25in \paperwidth=4in}
+\newcommand*{\pagefoolscapvo} {\paperheight=6.75in \paperwidth=4.25in}
+\newcommand*{\pagecrownvo} {\paperheight=7.5in \paperwidth=5in}
+\newcommand*{\pagepostvo} {\paperheight=8in \paperwidth=5in}
+\newcommand*{\pagelargecrownvo}{\paperheight=8in \paperwidth=5.25in}
+\newcommand*{\pagelargepostvo} {\paperheight=8.25in \paperwidth=5.25in}
+\newcommand*{\pagesmalldemyvo} {\paperheight=8.5in \paperwidth=5.675in}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pagedemyvo}
+% \begin{macro}{\pagemediumvo}
+% \begin{macro}{\pagesmallroyalvo}
+% \begin{macro}{\pageroyalvo}
+% \begin{macro}{\pagesuperroyalvo}
+% \begin{macro}{\pageimperialvo}
+% \begin{macrocode}
+\newcommand*{\pagedemyvo} {\paperheight=8.75in \paperwidth=5.675in}
+\newcommand*{\pagemediumvo} {\paperheight=9in \paperwidth=5.75in}
+\newcommand*{\pagesmallroyalvo}{\paperheight=9.25in \paperwidth=6.175in}
+\newcommand*{\pageroyalvo} {\paperheight=10in \paperwidth=6.25in}
+\newcommand*{\pagesuperroyalvo}{\paperheight=10.25in \paperwidth=6.75in}
+\newcommand*{\pageimperialvo} {\paperheight=11in \paperwidth=7.5in}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\pagemcrownvo}
+% \begin{macro}{\pagemlargecrownvo}
+% \begin{macro}{\pagemdemyvo}
+% \begin{macro}{\pagemsmallroyalvo}
+% Metric sizes.
+% \begin{macrocode}
+\newcommand*{\pagemcrownvo} {\paperheight=186mm \paperwidth=123mm}
+\newcommand*{\pagemlargecrownvo} {\paperheight=198mm \paperwidth=129mm}
+\newcommand*{\pagemdemyvo} {\paperheight=216mm \paperwidth=138mm}
+\newcommand*{\pagemsmallroyalvo} {\paperheight=234mm \paperwidth=156mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pageao}
+% \begin{macro}{\pageai}
+% \begin{macro}{\pageaii}
+% \begin{macro}{\pageaiii}
+% \begin{macro}{\pageaiv}
+% \begin{macro}{\pageav}
+% \begin{macro}{\pageavi}
+% The A series, A0 --- A6.
+% \begin{macrocode}
+\newcommand*{\pageao} {\paperheight=1189mm \paperwidth=841mm}
+\newcommand*{\pageai} {\paperheight=841mm \paperwidth=594mm}
+\newcommand*{\pageaii} {\paperheight=594mm \paperwidth=420mm}
+\newcommand*{\pageaiii}{\paperheight=420mm \paperwidth=297mm}
+\newcommand*{\pageaiv} {\paperheight=297mm \paperwidth=210mm}
+\newcommand*{\pageav} {\paperheight=210mm \paperwidth=148mm}
+\newcommand*{\pageavi} {\paperheight=148mm \paperwidth=105mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pagebo}
+% \begin{macro}{\pagebi}
+% \begin{macro}{\pagebii}
+% \begin{macro}{\pagebiii}
+% \begin{macro}{\pagebiv}
+% \begin{macro}{\pagebv}
+% \begin{macro}{\pagebvi}
+% The B series, B0 --- B6.
+% \begin{macrocode}
+\newcommand*{\pagebo} {\paperheight=1414mm \paperwidth=1000mm}
+\newcommand*{\pagebi} {\paperheight=1000mm \paperwidth=707mm}
+\newcommand*{\pagebii} {\paperheight=707mm \paperwidth=500mm}
+\newcommand*{\pagebiii}{\paperheight=500mm \paperwidth=353mm}
+\newcommand*{\pagebiv} {\paperheight=353mm \paperwidth=250mm}
+\newcommand*{\pagebv} {\paperheight=250mm \paperwidth=176mm}
+\newcommand*{\pagebvi} {\paperheight=176mm \paperwidth=125mm}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Declare the stock size options.
+%
+% Metric paper stock sizes.
+% \changes{v1.6180339c}{2008/12/26}{Extended class options to include stock
+% sizes A0, A1, A2, B0, B1 and B2}
+% \begin{macrocode}
+\DeclareOption{a0paper}{\stockao}
+\DeclareOption{a1paper}{\stockai}
+\DeclareOption{a2paper}{\stockaii}
+\DeclareOption{a3paper}{\stockaiii}
+\DeclareOption{a4paper}{\stockaiv}
+\DeclareOption{a5paper}{\stockav}
+\DeclareOption{a6paper}{\stockavi}
+\DeclareOption{b0paper}{\stockbo}
+\DeclareOption{b1paper}{\stockbi}
+\DeclareOption{b2paper}{\stockbii}
+\DeclareOption{b3paper}{\stockbiii}
+\DeclareOption{b4paper}{\stockbiv}
+\DeclareOption{b5paper}{\stockbv}
+\DeclareOption{b6paper}{\stockbvi}
+\DeclareOption{mcrownvopaper}{\stockmcrownvo}
+\DeclareOption{mlargecrownvopaper}{\stockmlargecrownvo}
+\DeclareOption{mdemyvopaper}{\stockmdemyvo}
+\DeclareOption{msmallroyalvopaper}{\stockmsmallroyalvo}
+
+% \end{macrocode}
+% US paper stock sizes.
+% \begin{macrocode}
+\DeclareOption{dbillpaper}{\stockdbill}
+\DeclareOption{statementpaper}{\stockstatement}
+\DeclareOption{executivepaper}{\stockexecutive}
+\DeclareOption{letterpaper}{\stockletter}
+\DeclareOption{oldpaper}{\stockold}
+\DeclareOption{legalpaper}{\stocklegal}
+\DeclareOption{ledgerpaper}{\stockledger}
+\DeclareOption{broadsheetpaper}{\stockbroadsheet}
+
+% \end{macrocode}
+% British octavo stock paper sizes.
+% \begin{macrocode}
+\DeclareOption{pottvopaper}{\stockpottvo}
+\DeclareOption{foolscapvopaper}{\stockfoolscapvo}
+\DeclareOption{crownvopaper}{\stockcrownvo}
+\DeclareOption{postvopaper}{\stockpostvo}
+\DeclareOption{largecrownvopaper}{\stocklargecrownvo}
+\DeclareOption{largepostvopaper}{\stocklargepostvo}
+\DeclareOption{smalldemyvopaper}{\stocksmalldemyvo}
+\DeclareOption{demyvopaper}{\stockdemyvo}
+\DeclareOption{mediumvopaper}{\stockmediumvo}
+\DeclareOption{smallroyalvopaper}{\stocksmallroyalvo}
+\DeclareOption{royalvopaper}{\stockroyalvo}
+\DeclareOption{superroyalvopaper}{\stocksuperroyalvo}
+\DeclareOption{imperialvopaper}{\stockimperialvo}
+
+% \end{macrocode}
+% Ebook.
+% \begin{macrocode}
+\DeclareOption{ebook}
+ {\setlength\stockheight {9in}%
+ \setlength\stockwidth {6in}}
+
+% \end{macrocode}
+%
+% The \Lopt{landscape} option switches the values of the height and width,
+% assuming that the dimensions were originally given for portrait
+% orientation. (At the suggestion of Wilhelm M\"{u}ller made this independent
+% of the option sequence).
+% \changes{v1.6180339c}{2008/12/26}{`Stabilised' the landscape option and
+% added a portrait option}.
+% \begin{macro}{\ifmemlandscape}
+% \begin{macro}{\memlandscapetrue}
+% \begin{macro}{\memlandscapefalse}
+% \begin{macrocode}
+\newif\ifmemlandscape
+ \memlandscapefalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\DeclareOption{landscape}{\memlandscapetrue}
+\DeclareOption{portrait}{\memlandscapefalse}
+
+% \end{macrocode}
+%
+%
+% \subsection{Choosing the type size}
+%
+% The type size options are handled by defining \cs{@ptsize} to contain
+% the last digit of the size in question and branching on \cs{ifcase}
+% statements. This is done for historical reasons to stay compatible
+% with other packages that use the \cs{@ptsize} variable to select
+% special actions. It makes the declarations of size options less
+% than 10pt or more than 20pt difficult. In this class \texttt{9} is used
+% for the \Lopt{9pt} option, assuming that the class will never define a
+% \Lopt{19pt} option. For larger options the full complement of digits
+% are used.
+%
+% In any event, \cs{@memptsize} holds the complete size.
+%
+% Option \Lopt{10pt} will be the default.
+% \changes{v1.2}{2002/07/07}{Added 17pt option}
+% \changes{v1.61803}{2008/01/30}{Added pt options 20 to 60.}
+% \changes{v1.61803}{2008/01/30}{Used \cs{@memptsize}}
+% \begin{macrocode}
+\renewcommand*{\@ptsize}{0}
+\renewcommand*{\@memptsize}{10}
+\DeclareOption{9pt}{\renewcommand*{\@ptsize}{9}\renewcommand*{\@memptsize}{9}}
+\DeclareOption{10pt}{\renewcommand*{\@ptsize}{0}\renewcommand*{\@memptsize}{10}}
+\DeclareOption{11pt}{\renewcommand*{\@ptsize}{1}\renewcommand*{\@memptsize}{11}}
+\DeclareOption{12pt}{\renewcommand*{\@ptsize}{2}\renewcommand*{\@memptsize}{12}}
+\DeclareOption{14pt}{\renewcommand*{\@ptsize}{4}\renewcommand*{\@memptsize}{14}}
+\DeclareOption{17pt}{\renewcommand*{\@ptsize}{7}\renewcommand*{\@memptsize}{17}}
+\DeclareOption{20pt}{\renewcommand*{\@ptsize}{20}\renewcommand*{\@memptsize}{20}}
+\DeclareOption{25pt}{\renewcommand*{\@ptsize}{25}\renewcommand*{\@memptsize}{25}}
+\DeclareOption{30pt}{\renewcommand*{\@ptsize}{30}\renewcommand*{\@memptsize}{30}}
+\DeclareOption{36pt}{\renewcommand*{\@ptsize}{36}\renewcommand*{\@memptsize}{36}}
+\DeclareOption{48pt}{\renewcommand*{\@ptsize}{48}\renewcommand*{\@memptsize}{48}}
+\DeclareOption{60pt}{\renewcommand*{\@ptsize}{60}\renewcommand*{\@memptsize}{60}}
+
+% \end{macrocode}
+%
+% \begin{macro}{\if@nyptsizeopt}
+% \begin{macro}{\@nyptsizeopttrue}
+% \begin{macro}{\@nyptsizeoptfalse}
+% \begin{macro}{\anyptfilebase}
+% \begin{macro}{\anyptsize}
+% For any point size:
+% \changes{v1.61803}{2008/02/29}{Added *pt option}
+% \begin{macrocode}
+\newif\if@nyptsizeopt
+ \@nyptsizeoptfalse
+\providecommand*{\anyptfilebase}{mem}
+\providecommand*{\anyptsize}{10}
+\DeclareOption{*pt}{\@nyptsizeopttrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Two-side or one-side printing}
+%
+% For two-sided printing we use the switch \cs{if@twoside}. In
+% addition we have to set the \cs{if@mparswitch} to get any margin
+% paragraphs into the outside margin. The default is \Lopt{twoside}.
+% \begin{macro}{\if@twoside}
+% \begin{macro}{\if@mparswitch}
+% \begin{macrocode}
+\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
+\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Two column printing}
+%
+% Two-column and one-column printing is again realized via a switch
+% which is defined in the kernel. The default is single column printing.
+%
+% \begin{macro}{\if@twocolumn}
+% \begin{macrocode}
+\DeclareOption{onecolumn}{\@twocolumnfalse}
+\DeclareOption{twocolumn}{\@twocolumntrue}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The \Lopt{draft} option}
+%
+% If the user requests \Lopt{draft} we show any overfull boxes,
+% marginal notes are allowed, and any copyright notices are not
+% printed. For symmetry, we also define a \Lopt{final} option
+% which is the default.
+%
+% The user can use the \cs{ifdraftdoc} flag to add additional effects: \\
+% \verb?\ifdraftdoc <additional code> \fi?
+% \begin{macro}{\ifdraftdoc}
+% \begin{macrocode}
+\newif\ifdraftdoc\draftdocfalse
+\setlength{\overfullrule}{\z@}
+\DeclareOption{final}{\setlength{\overfullrule}{\z@}
+ \draftdocfalse
+ \msdocfalse}
+\DeclareOption{draft}{\setlength\overfullrule{5pt}%
+ \draftdoctrue
+ \msdocfalse}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \Lopt{ms} option}
+%
+% \begin{macro}{\ifmsdoc}
+% The \Lopt{ms} option makes the document look as though it was produced
+% on a typewriter. We use a flag for remembering this. The user may also
+% use the flag for specifying \Lopt{ms} effects.
+% \begin{macrocode}
+\newif\ifmsdoc
+ \msdocfalse
+\DeclareOption{ms}{%
+ \msdoctrue
+ \draftdocfalse
+ \setlength\overfullrule{\z@}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \Lopt{showtrims} option}
+%
+% The \Lopt{showtrims} option will display crosses at the corners
+% of the logical pages showing where the stock should be trimmed.
+%
+% \begin{macro}{\ifshowtrims}
+% \begin{macrocode}
+\newif\ifshowtrims
+ \showtrimsfalse
+\DeclareOption{showtrims}{\showtrimstrue}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \Lopt{article} option}
+%
+% The \Lopt{article} option typesets as a simulation of the
+% \Lpack{article} class.
+% \changes{v0.3}{2001/07/09}{Added article option}
+% \begin{macro}{\ifartopt}
+% \cs{ifartopt} is a flag (TRUE) if the \Lopt{article} option is called.
+% \begin{macrocode}
+\newif\ifartopt
+ \artoptfalse
+\DeclareOption{article}{\artopttrue}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \Lopt{subfigure} option}
+%
+% The \Lopt{subfigure} option has been made a no-op since version 1.1
+% and finally removed in version 1.61803. It was:
+% \changes{v0.3}{2001/07/09}{Added subfigure option}
+% \changes{v1.1}{2002/03/10}{Effectively removed subfigure option}
+% \changes{v1.61803}{2008/01/30}{Removed subfigure option}
+% \begin{verbatim}
+% \DeclareOption{subfigure}{%
+% \ClassWarningNoLine{memoir}{The subfigure option is not required}}
+% \end{verbatim}
+%
+% \subsection{The openright, openleft and openany options}
+%
+% The \Lopt{openright} option specifies that Chapters must begin on
+% recto pages. The \Lopt{openleft} option specifies that Chapters
+% must begin on verso pages and the \Lopt{openany} option lets Chapters
+% start on any page.
+% \changes{v1.0}{2001/10/24}{Added the openleft option}
+% \begin{macrocode}
+\DeclareOption{openright}{\@openrighttrue}
+\DeclareOption{openany}{\@openrightfalse}
+\DeclareOption{openleft}{\@openlefttrue}
+% \end{macrocode}
+%
+% \begin{macro}{\openright}
+% \begin{macro}{\openany}
+% \begin{macro}{\openleft}
+% Commands that can be used to change the option in the middle of the
+% document\footnote{Openleft provided to meet a request by
+% Vladimir G.~Ivanovic (\texttt{vladimir@acm.org}) in September 2001.}.
+% \begin{macrocode}
+\newcommand{\openright}{\@openrighttrue\@openleftfalse%
+ \gdef\clearforchapter{\cleartorecto}}
+\newcommand{\openany}{\@openrightfalse\@openleftfalse%
+ \gdef\clearforchapter{\clearpage}}
+\newcommand{\openleft}{\@openlefttrue
+ \gdef\clearforchapter{\cleartoverso}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Equation numbering on the left}
+%
+% The \Lopt{leqno} option prints equation numbers on the left. This
+% is implemented via an external class option file.
+% \begin{macrocode}
+\DeclareOption{leqno}{\input{leqno.clo}}
+% \end{macrocode}
+%
+% \subsection{Flush left math displays}
+%
+% The \Lopt{fleqn} option redefines the displayed math environments
+% so that they are left adjusted with an indent of \cs{mathindent}
+% from the current left margin. This
+% is implemented via an external class option file.
+% \begin{macrocode}
+\DeclareOption{fleqn}{\input{fleqn.clo}}
+% \end{macrocode}
+%
+% \subsection{Open bibliography}
+%
+% The \Lopt{openbib} option redefines the \verb?thebibliography? so that each
+% block starts on a new line, and succeeding lines in a block are
+% indented by \cs{bibindent}.
+% \changes{v1.0a}{2001/11/28}{Replaced \cs{AtEndOfPackage} with \cs{AtEndOfClass}}
+% \begin{macrocode}
+\DeclareOption{openbib}{%
+ \AtEndOfClass{%
+ \renewcommand\@openbib@code{%
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ }%
+ \renewcommand\newblock{\par}}}
+
+% \end{macrocode}
+%
+% \subsection{Old font commands}
+%
+% The \Lopt{oldfontcommands} option enables commands like \cs{bf} and friends.
+% \changes{v1.0a}{2002/01/29}{Added the oldfontcommands option}
+% \begin{macrocode}
+\DeclareOption{oldfontcommands}{\@memoldfonttrue}
+% \end{macrocode}
+%
+% \subsection{Extra font sizes}
+%
+% The \Lopt{extrafontsizes} options indicates that extended font sizes (above 25pt)
+% are available.
+% \changes{v1.61803}{2008/01/30}{Added extrafontsizes option.}
+% \begin{macrocode}
+\DeclareOption{extrafontsizes}{\extrafontsizestrue}
+
+% \end{macrocode}
+%
+% \subsection{The \Lopt{fullptlayout} option}
+% \changes{v3.7g}{2018/03/09}{Added the \Lopt{fullptlayout} option}
+% \begin{macro}{\mem@settopoint}
+% By default the class will truncate some layout lengths to a whole
+% number of points.\footnote{Presumably because it looks better when
+% the layout is written to the log.} This might not be desirable, so the
+% \Lopt{fullptlayout} class option disables this truncation.
+% \begin{macrocode}
+\newcommand\mem@settopoint[1]{\@settopoint{#1}}
+\DeclareOption{fullptlayout}{\renewcommand\mem@settopoint{\@gobble}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \changes{v1.6180339f}{2009/07/12}{Added dead man switch for etex}
+% \subsection{ETeX}
+%
+% If found we automatically load the eTeX package right after
+% executing the class options. Though, some odd \LaTeX\ installations
+% may have the eTeX pacakge, but is not based on eTeX (eventhough that
+% is what the LaTeX-project have recommended for several years now),
+% so we add a dead mans switch to disable the loading.
+%
+% \medskip\noindent
+% Update 2015: Since the 2015 LaTeX kernel automatically takes care of
+% allocating extra registers, the \Lpack{etex} package is no longer
+% needed with newer kernels. Therefore automatic loading \Lpack{etex}
+% now only happen if the kernel is pre 2015.
+% \begin{macro}{\ifmem@noetex}
+% \begin{macro}{\mem@noetextrue}
+% \begin{macro}{\mem@noetexfalse}
+% \begin{macrocode}
+\newif\ifmem@noetex
+ \mem@noetexfalse
+\DeclareOption{noetex}{\mem@noetextrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \section{Executing Options} \label{sec:xopt}
+%
+% Here we execute the default options to initialize certain
+% variables.
+% \begin{macrocode}
+\ExecuteOptions{final,letterpaper,10pt,onecolumn,openright,twoside,
+ portrait}
+% \end{macrocode}
+%
+% The \cs{ProcessOptions} command causes the execution of the code
+% for every option \Lopt{foo}
+% which is declared and for which the user typed
+% the \Lopt{foo} option in his
+% \cs{documentclass} command. For every option \Lopt{bar} he typed,
+% which is not declared, the option is assumed to be a global option.
+% All options will be passed as document options to any
+% \cs{usepackage} command in the document preamble.
+%
+% \cs{ProcessOptions*} processes the options in the order they are given
+% in the \cs{documentclass} command, instead of the definition order.
+% \changes{v1.6180339c}{2008/12/26}{Change \cs{ProcessOptions} to
+% \cs{ProcessOptions*} and handle landscape/portrait
+% option after \cs{ProcessOptions*}}
+% \begin{macrocode}
+\ProcessOptions*
+ \ifmemlandscape
+ \setlength\@tempdima {\stockheight}
+ \setlength\stockheight{\stockwidth}
+ \setlength\stockwidth {\@tempdima}
+ \fi
+
+% \end{macrocode}
+% Load the eTeX package if found, and if the user has not explicitly
+% asked us not to.
+%
+% \medskip\noindent
+% Update 2015: Since 2015 the LaTeX kernel automatically
+% allocate extra registers, thus that part of the \Lpack{etex}
+% package is no longer needed for newer \LaTeX\ kernels. At the
+% request of the LaTeX Team, we now only load \Lpack{etex} on older
+% kernels.
+% \changes{v3.7e}{2015/07/08}{Only load \Lpack{etex} on older kernels}
+% \begin{macrocode}
+\ifmem@noetex\relax\else
+ \ifx\e@alloc\@undefined
+ \IfFileExists{etex.sty}{\RequirePackage{etex}}{}
+ \fi
+\fi
+% \end{macrocode}
+% \begin{macro}{\memoirpostopthook}
+% A user could define this \emph{before} the \cs{documentclass} command
+% to do something at this point. For example, to set up a new stock size: \\
+% \verb?\def\memoirpostopthook{\stockheight=44in \stockwidth=34in}?
+% \changes{v1.618033}{2008/06/02}{Added \cs{memoirpostopthook}}
+% \begin{macrocode}
+\providecommand*{\memoirpostopthook}{}
+ \memoirpostopthook
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cleartorecto}
+% A repeat of \cs{cleardoublepage}; clears to a recto (odd-numbered) page.
+% \begin{macrocode}
+\def\cleartorecto{\clearpage\if@twoside \ifodd\c@page\else
+ \hbox{}\thispagestyle{cleared}%
+ \newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cleartoverso}
+% Clears to a verso (even-numbered) page.
+% \begin{macrocode}
+\def\cleartoverso{\clearpage\if@twoside
+ \ifodd\c@page\hbox{}\thispagestyle{cleared}%
+ \newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+
+% Set \cs{clearforchapter} according to the options.
+% \begin{macrocode}
+\if@openleft
+ \openleft
+\else
+ \if@openright
+ \openright
+ \else
+ \openany
+ \fi
+\fi
+
+% \end{macrocode}
+%
+% \begin{macro}{\@ivpt}
+% \begin{macro}{\@xxxpt}
+% \begin{macro}{\@xxxvipt}
+% \begin{macro}{\@xlviiipt}
+% \begin{macro}{\@lxpt}
+% \begin{macro}{\@lxxiipt}
+% \begin{macro}{\@lxxxivpt}
+% \begin{macro}{\@xcvipt}
+% \begin{macro}{\@cviiipt}
+% \begin{macro}{\@cxxpt}
+% \begin{macro}{\@cxxxiipt}
+% \changes{v1.61803}{2008/01/30}{Added a bunch of \cs{@...pt} macros}
+% \begin{macrocode}
+\newcommand*{\@ivpt}{4}
+\newcommand*{\@xxxpt}{30}
+\newcommand*{\@xxxvipt}{36}
+\newcommand*{\@xlviiipt}{48}
+\newcommand*{\@lxpt}{60}
+\newcommand*{\@lxxiipt}{72}
+\newcommand*{\@lxxxivpt}{84}
+\newcommand*{\@xcvipt}{96}
+\newcommand*{\@cviiipt}{108}
+\newcommand*{\@cxxpt}{120}
+\newcommand*{\@cxxxiipt}{132}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Now that all the options have been executed we can load the
+% chosen class option file that contains all size dependent code. The
+% larger sizes are only made available for the \Lopt{extrafontsizes} option.
+%
+% \begin{macro}{\memfontfamily}
+% \begin{macro}{\memfontenc}
+% \begin{macro}{\memfontpack}
+% The default font and coding as set by the kernel is \texttt{cmr} and
+% \texttt{OT1} respectively, giving Knuth's original Computer Modern Roman
+% font at a set of fixed sizes (maximum of 24.88pt). If we are to have
+% any size font we have to go to a scaleable font. As the Latin Modern font
+% is a scaleable version of Computer Modern, and all modern LaTeX distributions
+% include it, I am using this by default.
+%
+% By defining these three macros \emph{before}
+% the \cs{documentclass} any other font and package can be used.
+% \begin{macrocode}
+\providecommand*{\memfontfamily}{lmr}
+\providecommand*{\memfontenc}{T1}
+\providecommand*{\memfontpack}{lmodern}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Deal with the `anyptsize' (\Lopt{*pt}) option first. In this case the macros
+% \cs{anyptfilebase} and \cs{anyptsize} should have been defined by the
+% author \emph{before} the \cs{documentclass} command, and a file \\
+% \verb?\anyptfilebase\anyptsize.clo? should exist (if not the file will
+% default to \verb?mem10.clo?).
+% \changes{v1.61803}{2008/01/30}{Extended the loading of \texttt{.clo} files.}
+% \begin{macrocode}
+\if@nyptsizeopt
+ \newcommand*{\@nyptclofile}{\anyptfilebase\anyptsize.clo}
+ \IfFileExists{\@nyptclofile}{\def\@memptsize{\anyptsize}}{%
+ \@memerror{You have used the `*pt' option but \MessageBreak
+ file \@nyptclofile\space can't be found}%
+ {I'll use mem10.clo instead}
+ \renewcommand*{\@nyptclofile}{mem10.clo}%
+ \def\@memptsize{10}%
+ }
+ \renewcommand*{\@ptsize}{\@memptsize}
+ \usefont{\memfontenc}{\memfontfamily}{m}{n}
+ \input{\@nyptclofile}
+ \usepackage{\memfontpack}\usepackage[\memfontenc]{fontenc}
+\else
+% \end{macrocode}
+% Now for the fixed pt size options.
+% \begin{macrocode}
+ \ifextrafontsizes
+ \usefont{\memfontenc}{\memfontfamily}{m}{n}
+ \input{mem\@memptsize.clo}
+ \usepackage{\memfontpack}\usepackage[\memfontenc]{fontenc}
+ \else
+ \ifnum\@memptsize > 17\relax
+ \@memerror{The `extrafontsizes' option is required to use \MessageBreak
+ the `\@memptsize pt' option}%
+ {The 17pt option will be used instead}
+ \input{mem17.clo}
+ \else
+ \ifnum\@ptsize = 9\relax
+ \input{mem\@ptsize.clo}
+ \else
+ \input{mem1\@ptsize.clo}
+ \fi
+ \fi
+ \fi
+\fi
+
+%</class>
+% \end{macrocode}
+%
+%
+% \section{Fonts and spaces} \label{sec:docl}
+% \label{sec:maincode}
+%
+% In this section we deal with most of the aspects that are related
+% to font sizes, and spacing that is related to the size of the body font.
+%
+% \subsection{Fonts}
+%
+% \LaTeX\ offers the user commands to change the size of the font,
+% relative to the `main' size. Each relative size changing command
+% \cs{size} executes the command
+% \verb?\@setfontsize\size? \meta{font-size} \meta{baselineskip} where:
+%
+% \begin{description}
+% \item[\meta{font-size}] The absolute size of the font to use from
+% now on.
+%
+% \item[\meta{baselineskip}] The normal value of \cs{baselineskip}
+% for the size of the font selected. (The actual value will be
+% \cs{baselinestretch} * \meta{baselineskip}.)
+% \end{description}
+%
+% A number of commands, defined in the \LaTeX\ kernel, shorten the
+% following definitions and are used throughout. They are listed in
+% the first part of Table~\ref{tab:sh}. Those in the second part are introduced
+% by the class.
+%
+% \begin{table}
+% \centering
+% \caption{Shorthand font point size commands}\label{tab:sh}
+% \begin{tabular}{ll@{\qquad}ll@{\qquad}ll} \hline
+% & & & & \cs{@ivpt} & 4 \\
+% \cs{@vpt} & 5 & \cs{@vipt} & 6 & \cs{@viipt} & 7 \\
+% \cs{@viiipt} & 8 & \cs{@ixpt} & 9 & \cs{@xpt} & 10 \\
+% \cs{@xipt} & 10.95 & \cs{@xiipt} & 12 & \cs{@xivpt} & 14.4\\
+% \cs{@xviipt} & 17.28 & \cs{@xxpt} & 20.74 & \cs{@xxvpt} & 24.88\\ \hline
+% \cs{@xxxpt} & 30 & \cs{@xxxvipt} & 36 & \cs{@xlviiipt} & 48 \\
+% \cs{@lxpt} & 60 & \cs{@lxxiipt} & 72 & \cs{@lxxxivpt} & 84 \\
+% \cs{@xcvipt} & 96 & \cs{@cviiipt} & 108 & \cs{@cxxpt} & 120 \\
+% \cs{@cxxxiipt} & 132 \\ \hline
+% \end{tabular}
+% \end{table}
+%
+% \begin{macro}{\normalsize}
+% \begin{macro}{\@normalsize}
+%
+% The user level command for the main size is \cs{normalsize}.
+% Internally \LaTeX\ uses \cs{@normalsize} when it refers to the
+% main size. \cs{@normalsize} will be defined to work like
+% \cs{normalsize} if the latter is redefined from its default
+% definition (that just issues an error message). Otherwise, in the standard
+% classes \cs{@normalsize} simply selects a 10pt/12pt size, but here
+% it selects among the wider range.
+%
+% The \cs{normalsize} macro also sets new values for\\
+% \cs{abovedisplayskip}, \cs{abovedisplayshortskip} and
+% \cs{belowdisplayshortskip}.
+%
+% For the larger sizes I have set \cs{abovedisplayskip} to the font size
+% and \cs{belowdisplayshortskip} to 0.5\cs{onelineskip}.
+%
+% \begin{macrocode}
+%<*9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+% \end{macrocode}
+% \changes{v0.11 (mem14.clo)}{2001/10/30}{Changed baseline skip from 17.28pt to 17.5pt}
+% \changes{v1.61803}{2008/01/30}{Added files mem20.clo through mem60.clo}
+% \changes{v1.61803}{2008/01/30}{Changed .clo files to accomodate \cs{extrafontsizes}}
+% \begin{macrocode}
+\renewcommand{\normalsize}{%
+%<*9pt>
+ \@setfontsize\normalsize\@ixpt\@xpt
+ \abovedisplayskip 9\p@ \@plus 2\p@ \@minus 4.5\p@
+ \abovedisplayshortskip \z@ \@plus 3\p@
+ \belowdisplayshortskip 5.5\p@ \@plus 2.5\p@ \@minus 3\p@
+%</9pt>
+%<*10pt>
+ \@setfontsize\normalsize\@xpt\@xiipt
+ \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
+%</10pt>
+%<*11pt>
+ \@setfontsize\normalsize\@xipt{13.6}%
+ \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+%</11pt>
+%<*12pt>
+ \@setfontsize\normalsize\@xiipt{14.5}%
+ \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+%</12pt>
+%<*14pt>
+ \@setfontsize\normalsize\@xivpt{17.5}%
+ \abovedisplayskip 14\p@ \@plus3\p@ \@minus8\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 7\p@ \@plus3.5\p@ \@minus3\p@
+%</14pt>
+%<*17pt>
+ \@setfontsize\normalsize\@xviipt{22}%
+ \abovedisplayskip 15\p@ \@plus4\p@ \@minus8\p@
+ \abovedisplayshortskip \z@ \@plus4\p@
+ \belowdisplayshortskip 8\p@ \@plus4\p@ \@minus3\p@
+%</17pt>
+%<*20pt>
+ \@setfontsize\normalsize\@xxpt{25}%
+ \abovedisplayskip 20\p@ \@plus5\p@ \@minus9\p@
+ \abovedisplayshortskip \z@ \@plus5\p@
+ \belowdisplayshortskip 12.5\p@ \@plus6\p@ \@minus3\p@
+%</20pt>
+%<*25pt>
+ \@setfontsize\normalsize\@xxvpt{30}%
+ \abovedisplayskip 25\p@ \@plus6\p@ \@minus10\p@
+ \abovedisplayshortskip \z@ \@plus6\p@
+ \belowdisplayshortskip 15\p@ \@plus7.5\p@ \@minus4\p@
+%</25pt>
+%<*30pt>
+ \@setfontsize\normalsize\@xxxpt{37}%
+ \abovedisplayskip 30\p@ \@plus7\p@ \@minus11\p@
+ \abovedisplayshortskip \z@ \@plus7\p@
+ \belowdisplayshortskip 18\p@ \@plus9\p@ \@minus4\p@
+%</30pt>
+%<*36pt>
+ \@setfontsize\normalsize\@xxxvipt{45}%
+ \abovedisplayskip 36\p@ \@plus8\p@ \@minus12\p@
+ \abovedisplayshortskip \z@ \@plus8\p@
+ \belowdisplayshortskip 22\p@ \@plus11\p@ \@minus5\p@
+%</36pt>
+%<*48pt>
+ \@setfontsize\normalsize\@xlviiipt{60}%
+ \abovedisplayskip 48\p@ \@plus9\p@ \@minus13\p@
+ \abovedisplayshortskip \z@ \@plus9\p@
+ \belowdisplayshortskip 30\p@ \@plus15\p@ \@minus7\p@
+%</48pt>
+%<*60pt>
+ \@setfontsize\normalsize\@lxpt{72}%
+ \abovedisplayskip 60\p@ \@plus10\p@ \@minus14\p@
+ \abovedisplayshortskip \z@ \@plus10\p@
+ \belowdisplayshortskip 36\p@ \@plus18\p@ \@minus9\p@
+%</60pt>
+% \end{macrocode}
+% The \cs{belowdisplayskip} is always equal to the
+% \cs{abovedisplayskip}. The parameters of the first level list are
+% always given by \cs{@listI}.
+% \begin{macrocode}
+ \belowdisplayskip \abovedisplayskip
+ \let\@listi\@listI}
+% \end{macrocode}
+%
+% We initially choose the normalsize font.
+% \begin{macrocode}
+\normalsize
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\small}
+% This code is similar to that for \cs{normalsize}.
+% (Robert Schlicht\footnote{\texttt{w.m.l@gmx.net}, via email on 2004/03/11.}
+% noted that in some cases \% signs were missing after \verb?\@setfontsize?).
+%
+% For the larger sizes I have set \cs{topsep} to 2/3\cs{onelineskip}
+% and \cs{parsep} to 1/2\cs{topsep}.
+% \changes{v1.61}{2004/03/12}{Added missing percent signs to some uses of
+% \cs{@setfontsize}}
+% \begin{macrocode}
+\newcommand{\small}{%
+%<*9pt>
+ \@setfontsize\small\@viiipt{9.5}%
+ \abovedisplayskip 6\p@ \@plus 2\p@ \@minus 4\p@
+ \abovedisplayshortskip \z@ \@plus 2\p@
+ \belowdisplayshortskip 4\p@ \@plus 2\p@ \@minus 2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 2\p@ \@plus 2\p@ \@minus 2\p@
+ \parsep 1\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</9pt>
+%<*10pt>
+ \@setfontsize\small\@ixpt{11}%
+ \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
+ \abovedisplayshortskip \z@ \@plus2\p@
+ \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 4\p@ \@plus2\p@ \@minus2\p@
+ \parsep 2\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</10pt>
+%<*11pt>
+ \@setfontsize\small\@xpt\@xiipt
+ \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 6\p@ \@plus2\p@ \@minus2\p@
+ \parsep 3\p@ \@plus2\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</11pt>
+%<*12pt>
+ \@setfontsize\small\@xipt{13.6}%
+ \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 9\p@ \@plus3\p@ \@minus5\p@
+ \parsep 4.5\p@ \@plus2\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</12pt>
+%<*14pt>
+ \@setfontsize\small\@xiipt{14.5}%
+ \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 11\p@ \@plus4\p@ \@minus6\p@
+ \parsep 6\p@ \@plus3\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</14pt>
+%<*17pt>
+ \@setfontsize\small\@xivpt{17}%
+ \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 7\p@ \@plus4\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 11\p@ \@plus4\p@ \@minus6\p@
+ \parsep 6\p@ \@plus3\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</17pt>
+%<*20pt>
+ \@setfontsize\small\@xviipt{22}%
+ \abovedisplayskip 17\p@ \@plus4\p@ \@minus8\p@
+ \abovedisplayshortskip \z@ \@plus4\p@
+ \belowdisplayshortskip 11\p@ \@plus4\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 14\p@ \@plus5\p@ \@minus7\p@
+ \parsep 7\p@ \@plus2\p@ \@minus3\p@
+ \itemsep \parsep}%
+%</20pt>
+%<*25pt>
+ \@setfontsize\small\@xxpt{25}%
+ \abovedisplayskip 20\p@ \@plus5\p@ \@minus9\p@
+ \abovedisplayshortskip \z@ \@plus5\p@
+ \belowdisplayshortskip 12.5\p@ \@plus6\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 16\p@ \@plus5\p@ \@minus8\p@
+ \parsep 8\p@ \@plus3\p@ \@minus4\p@
+ \itemsep \parsep}%
+%</25pt>
+%<*30pt>
+ \@setfontsize\small\@xxvpt{30}%
+ \abovedisplayskip 25\p@ \@plus6\p@ \@minus10\p@
+ \abovedisplayshortskip \z@ \@plus6\p@
+ \belowdisplayshortskip 15\p@ \@plus7.5\p@ \@minus4\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 20\p@ \@plus7\p@ \@minus10\p@
+ \parsep 10\p@ \@plus4\p@ \@minus5\p@
+ \itemsep \parsep}%
+%</30pt>
+%<*36pt>
+ \@setfontsize\small\@xxxpt{37}%
+ \abovedisplayskip 30\p@ \@plus7\p@ \@minus11\p@
+ \abovedisplayshortskip \z@ \@plus7\p@
+ \belowdisplayshortskip 18\p@ \@plus9\p@ \@minus4\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 24\p@ \@plus8\p@ \@minus12\p@
+ \parsep 12\p@ \@plus4\p@ \@minus6\p@
+ \itemsep \parsep}%
+%</36pt>
+%<*48pt>
+ \@setfontsize\small\@xxxvipt{45}%
+ \abovedisplayskip 36\p@ \@plus8\p@ \@minus12\p@
+ \abovedisplayshortskip \z@ \@plus8\p@
+ \belowdisplayshortskip 22\p@ \@plus11\p@ \@minus5\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 30\p@ \@plus10\p@ \@minus15\p@
+ \parsep 15\p@ \@plus5\p@ \@minus7\p@
+ \itemsep \parsep}%
+%</48pt>
+%<*60pt>
+ \@setfontsize\small\@xlviiipt{60}%
+ \abovedisplayskip 48\p@ \@plus9\p@ \@minus13\p@
+ \abovedisplayshortskip \z@ \@plus9\p@
+ \belowdisplayshortskip 30\p@ \@plus15\p@ \@minus7\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 40\p@ \@plus13\p@ \@minus20\p@
+ \parsep 20\p@ \@plus6\p@ \@minus10\p@
+ \itemsep \parsep}%
+%</60pt>
+ \belowdisplayskip \abovedisplayskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footnotesize}
+% This code is similar to that for \cs{small}.
+% \begin{macrocode}
+\newcommand{\footnotesize}{%
+%<*9pt>
+ \@setfontsize\footnotesize\@viipt{8}%
+ \abovedisplayskip 6\p@ \@plus 2\p@ \@minus 4\p@
+ \abovedisplayshortskip \z@ \@plus 2\p@
+ \belowdisplayshortskip 4\p@ \@plus 2\p@ \@minus 2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 2\p@ \@plus 2\p@ \@minus 2\p@
+ \parsep 1\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</9pt>
+%<*10pt>
+ \@setfontsize\footnotesize\@viiipt{9.5}%
+ \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@
+ \abovedisplayshortskip \z@ \@plus\p@
+ \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 3\p@ \@plus\p@ \@minus\p@
+ \parsep 2\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</10pt>
+%<*11pt>
+ \@setfontsize\footnotesize\@ixpt{11}%
+ \abovedisplayskip 8\p@ \@plus2\p@ \@minus4\p@
+ \abovedisplayshortskip \z@ \@plus\p@
+ \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 4\p@ \@plus2\p@ \@minus2\p@
+ \parsep 2\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</11pt>
+%<*12pt>
+ \@setfontsize\footnotesize\@xpt\@xiipt
+ \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 6\p@ \@plus2\p@ \@minus2\p@
+ \parsep 3\p@ \@plus2\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</12pt>
+%<*14pt>
+ \@setfontsize\footnotesize\@xipt{13.6}%
+ \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \parsep 4\p@ \@plus3\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</14pt>
+%<*17pt>
+ \@setfontsize\footnotesize\@xiipt{14}%
+ \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \parsep 4\p@ \@plus3\p@ \@minus\p@
+ \itemsep \parsep
+%% \itemindent\z@
+ }%
+%</17pt>
+%<*20pt>
+ \@setfontsize\footnotesize\@xivpt{17.5}%
+ \abovedisplayskip 14\p@ \@plus3\p@ \@minus8\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 7\p@ \@plus3.5\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 12\p@ \@plus4\p@ \@minus6\p@
+ \parsep 6\p@ \@plus2\p@ \@minus3\p@
+ \itemsep \parsep}%
+%</20pt>
+%<*25pt>
+ \@setfontsize\footnotesize\@xviipt{22}%
+ \abovedisplayskip 17\p@ \@plus4\p@ \@minus8\p@
+ \abovedisplayshortskip \z@ \@plus4\p@
+ \belowdisplayshortskip 11\p@ \@plus4\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 14\p@ \@plus5\p@ \@minus7\p@
+ \parsep 7\p@ \@plus2\p@ \@minus3\p@
+ \itemsep \parsep}%
+%</25pt>
+%<*30pt>
+ \@setfontsize\footnotesize\@xxpt{25}%
+ \abovedisplayskip 20\p@ \@plus5\p@ \@minus9\p@
+ \abovedisplayshortskip \z@ \@plus5\p@
+ \belowdisplayshortskip 12.5\p@ \@plus6\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 16\p@ \@plus5\p@ \@minus8\p@
+ \parsep 8\p@ \@plus3\p@ \@minus4\p@
+ \itemsep \parsep}%
+%</30pt>
+%<*36pt>
+ \@setfontsize\footnotesize\@xxvpt{30}%
+ \abovedisplayskip 25\p@ \@plus6\p@ \@minus10\p@
+ \abovedisplayshortskip \z@ \@plus6\p@
+ \belowdisplayshortskip 15\p@ \@plus7.5\p@ \@minus4\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 20\p@ \@plus7\p@ \@minus10\p@
+ \parsep 10\p@ \@plus4\p@ \@minus5\p@
+ \itemsep \parsep}%
+%</36pt>
+%<*48pt>
+ \@setfontsize\footnotesize\@xxxpt{37}%
+ \abovedisplayskip 30\p@ \@plus7\p@ \@minus11\p@
+ \abovedisplayshortskip \z@ \@plus7\p@
+ \belowdisplayshortskip 18\p@ \@plus9\p@ \@minus4\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 24\p@ \@plus8\p@ \@minus12\p@
+ \parsep 12\p@ \@plus4\p@ \@minus6\p@
+ \itemsep \parsep}%
+%</48pt>
+%<*60pt>
+ \@setfontsize\footnotesize\@xxxvipt{45}%
+ \abovedisplayskip 36\p@ \@plus8\p@ \@minus12\p@
+ \abovedisplayshortskip \z@ \@plus8\p@
+ \belowdisplayshortskip 22\p@ \@plus11\p@ \@minus5\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 30\p@ \@plus10\p@ \@minus15\p@
+ \parsep 15\p@ \@plus5\p@ \@minus7\p@
+ \itemsep \parsep}%
+%</60pt>
+ \belowdisplayskip \abovedisplayskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\miniscule}
+% \begin{macro}{\scriptsize}
+% \begin{macro}{\tiny}
+% \begin{macro}{\large}
+% \begin{macro}{\Large}
+% \begin{macro}{\LARGE}
+% \begin{macro}{\huge}
+% \begin{macro}{\Huge}
+% \begin{macro}{\HUGE}
+% These are all much simpler than the previous macros, they just
+% select a new fontsize, but leave the parameters for displays and
+% lists alone. The class provides two additional sizes, \cs{miniscule}
+% and \cs{HUGE}, with respect to the usual set. For the larger sizes (e.g.,
+% 72pt and above) I have
+% made the \cs{baselineskip} approximately 20 precent larger than the pt size.
+% \changes{v1.2}{2002/07/27}{Added \cs{miniscule} and \cs{HUGE} font sizes}
+% \changes{v1.2}{2002/07/27}{Twiddled some font sizes to get regular steps}
+% \changes{v1.2a}{2002/08/27}{Fixed 12pt scriptsize bug}
+% \begin{macrocode}
+%<*9pt>
+\ifextrafontsizes
+ \newcommand*{\miniscule}{\@setfontsize\miniscule\@ivpt{5}}
+\else
+ \newcommand*{\miniscule}{\@setfontsize\miniscule\@vpt{6}}
+\fi
+\newcommand*{\tiny}{\@setfontsize\tiny\@vpt{6}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@vipt{7}}
+\newcommand*{\large}{\@setfontsize\large\@xpt{12}}
+\newcommand*{\Large}{\@setfontsize\Large\@xipt{13.6}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xiipt{14.5}}
+\newcommand*{\huge}{\@setfontsize\huge\@xivpt{18}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@xviipt{22}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@xxpt{25}}
+%</9pt>
+%<*10pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@vpt{6}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@vipt{7}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@viipt{8}}
+\newcommand*{\large}{\@setfontsize\large\@xipt{13.6}}
+\newcommand*{\Large}{\@setfontsize\Large\@xiipt{14.5}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xivpt{18}}
+\newcommand*{\huge}{\@setfontsize\huge\@xviipt{22}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@xxpt{25}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@xxvpt{30}}
+%</10pt>
+%<*11pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@vipt{7}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@viipt{8}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@viiipt{9.5}}
+\newcommand*{\large}{\@setfontsize\large\@xiipt{14.5}}
+\newcommand*{\Large}{\@setfontsize\Large\@xivpt{18}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xviipt{22}}
+\newcommand*{\huge}{\@setfontsize\huge\@xxpt{25}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@xxvpt{30}}
+\ifextrafontsizes
+ \newcommand*{\HUGE}{\@setfontsize\HUGE\@xxxpt{37}}
+\else
+ \let\HUGE=\Huge
+\fi
+%</11pt>
+%<*12pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@viipt{8}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@viiipt{9.5}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@ixpt\@xpt}
+\newcommand*{\large}{\@setfontsize\large\@xivpt{18}}
+\newcommand*{\Large}{\@setfontsize\Large\@xviipt{22}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xxpt{25}}
+\newcommand*{\huge}{\@setfontsize\huge\@xxvpt{30}}
+\ifextrafontsizes
+ \newcommand*{\Huge}{\@setfontsize\Huge\@xxxpt{37}}
+ \newcommand*{\HUGE}{\@setfontsize\HUGE\@xxxvipt{45}}
+\else
+ \let\Huge=\huge
+ \let\HUGE=\huge
+\fi
+%</12pt>
+%<*14pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@viiipt{9.5}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@ixpt{10}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xpt{12}}
+\newcommand*{\large}{\@setfontsize\large\@xviipt{22}}
+\newcommand*{\Large}{\@setfontsize\Large\@xxpt{25}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xxvpt{30}}
+\ifextrafontsizes
+ \newcommand*{\huge}{\@setfontsize\Huge\@xxxpt{37}}
+ \newcommand*{\Huge}{\@setfontsize\Huge\@xxxvipt{45}}
+ \newcommand*{\HUGE}{\@setfontsize\HUGE\@xlviiipt{60}}
+\else
+ \let\huge=\LARGE
+ \let\Huge=\LARGE
+ \let\HUGE=\LARGE
+\fi
+%</14pt>
+%<*17pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@ixpt{10}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xpt{12}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xipt{13.6}}
+\newcommand*{\large}{\@setfontsize\large\@xxpt{25}}
+\newcommand*{\Large}{\@setfontsize\Large\@xxvpt{30}}
+\ifextrafontsizes
+ \newcommand*{\LARGE}{\@setfontsize\LARGE\@xxxpt{37}}
+ \newcommand*{\huge}{\@setfontsize\huge\@xxxvipt{45}}
+ \newcommand*{\Huge}{\@setfontsize\Huge\@xlviiipt{60}}
+ \newcommand*{\HUGE}{\@setfontsize\HUGE\@lxpt{72}}
+\else
+ \let\LARGE=\Large
+ \let\huge=\Large
+ \let\Huge=\Large
+ \let\HUGE=\Large
+\fi
+%</17pt>
+%<*20pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xpt{12}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xipt{13.6}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xiipt{14.5}}
+\newcommand*{\large}{\@setfontsize\large\@xxvpt{30}}
+\newcommand*{\Large}{\@setfontsize\Large\@xxxpt{37}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xxxvipt{45}}
+\newcommand*{\huge}{\@setfontsize\huge\@xlviiipt{60}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@lxpt{72}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@lxxiipt{86}}
+%</20pt>
+%<*25pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xipt{13.6}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xiipt{14.5}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xivpt{17.5}}
+\newcommand*{\large}{\@setfontsize\large\@xxxpt{37}}
+\newcommand*{\Large}{\@setfontsize\Large\@xxxvipt{45}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xlviiipt{60}}
+\newcommand*{\huge}{\@setfontsize\huge\@lxpt{72}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@lxxiipt{86}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@lxxxivpt{100}}
+%</25pt>
+%<*30pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xiipt{14.5}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xivpt{17.5}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xviipt{22}}
+\newcommand*{\large}{\@setfontsize\large\@xxxvipt{45}}
+\newcommand*{\Large}{\@setfontsize\Large\@xlviiipt{60}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@lxpt{72}}
+\newcommand*{\huge}{\@setfontsize\huge\@lxxiipt{86}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@lxxxivpt{100}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@xcvipt{116}}
+%</30pt>
+%<*36pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xivpt{17.5}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xviipt{22}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xxpt{25}}
+\newcommand*{\large}{\@setfontsize\large\@xlviiipt{60}}
+\newcommand*{\Large}{\@setfontsize\Large\@lxpt{72}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@lxxiipt{86}}
+\newcommand*{\huge}{\@setfontsize\huge\@lxxxivpt{100}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@xcvipt{116}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@cviiipt{132}}
+%</36pt>
+%<*48pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xviipt{22}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xxpt{25}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xxvpt{30}}
+\newcommand*{\large}{\@setfontsize\large\@lxpt{72}}
+\newcommand*{\Large}{\@setfontsize\Large\@lxxiipt{86}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@lxxxivpt{100}}
+\newcommand*{\huge}{\@setfontsize\huge\@xcvipt{116}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@cviiipt{132}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@cxxpt{144}}
+%</48pt>
+%<*60pt>
+\newcommand*{\miniscule}{\@setfontsize\miniscule\@xxpt{25}}
+\newcommand*{\tiny}{\@setfontsize\tiny\@xxvpt{30}}
+\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@xxxpt{37}}
+\newcommand*{\large}{\@setfontsize\large\@lxxiipt{86}}
+\newcommand*{\Large}{\@setfontsize\Large\@lxxxivpt{100}}
+\newcommand*{\LARGE}{\@setfontsize\LARGE\@xcvipt{116}}
+\newcommand*{\huge}{\@setfontsize\huge\@cviiipt{132}}
+\newcommand*{\Huge}{\@setfontsize\Huge\@cxxpt{144}}
+\newcommand*{\HUGE}{\@setfontsize\HUGE\@cxxxiipt{162}}
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+%<*class>
+% \end{macrocode}
+%
+% \begin{macro}{\captionsize}
+% This internal command holds the font size for captions.
+% \begin{macrocode}
+\newcommand{\captionsize}{\normalsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Paragraphing}
+%
+% \begin{macro}{\lineskip}
+% \begin{macro}{\normallineskip}
+% These parameters control \TeX's behaviour when two lines tend to
+% come too close together.
+% \begin{macrocode}
+\setlength\lineskip{1\p@}
+\setlength\normallineskip{1\p@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\baselinestretch}
+% This is used as a multiplier for \cs{baselineskip}. The default is
+% to \emph{not} stretch the baselines.
+% \begin{macrocode}
+\renewcommand{\baselinestretch}{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\parskip}
+% \begin{macro}{\onelineskip}
+%
+% \cs{parskip} is additional vertical space between paragraphs; default
+% is zero.
+%
+%
+% \cs{onelineskip} is the default space between baselines.
+% \changes{v0.11 (mem14.clo)}{2001/10/30}{Changed \cs{onelineskip} from 17.28pt to 17.5pt}
+% \begin{macrocode}
+\setlength\parskip{0\p@ \@plus \p@}
+%</class>
+%<*9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+%<9pt>\setlength{\onelineskip}{\@xpt\p@}
+%<10pt>\setlength{\onelineskip}{\@xiipt\p@}
+%<11pt>\setlength{\onelineskip}{13.6\p@}
+%<12pt>\setlength{\onelineskip}{14.5\p@}
+%<14pt>\setlength{\onelineskip}{17.5\p@}
+%<17pt>\setlength{\onelineskip}{22\p@}
+%<20pt>\setlength{\onelineskip}{25\p@}
+%<25pt>\setlength{\onelineskip}{30\p@}
+%<30pt>\setlength{\onelineskip}{37\p@}
+%<36pt>\setlength{\onelineskip}{45\p@}
+%<48pt>\setlength{\onelineskip}{60\p@}
+%<60pt>\setlength{\onelineskip}{72\p@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\parindent}
+% \cs{parskip} gives extra vertical space between paragraphs and
+% \cs{parindent} is the width of the paragraph indentation.
+% \begin{macrocode}
+\if@twocolumn
+ \setlength\parindent{1em}
+\else
+%<9pt> \setlength\parindent{12\p@}
+%<10pt> \setlength\parindent{15\p@}
+%<11pt> \setlength\parindent{17\p@}
+%<12pt> \setlength\parindent{1.5em}
+%<14pt> \setlength\parindent{1.5em}
+%<17pt> \setlength\parindent{1.5em}
+%<20pt> \setlength\parindent{1.5em}
+%<25pt> \setlength\parindent{1.5em}
+%<30pt> \setlength\parindent{1.5em}
+%<36pt> \setlength\parindent{1.5em}
+%<48pt> \setlength\parindent{1.5em}
+%<60pt> \setlength\parindent{1.5em}
+\fi
+%</9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smallskipamount}
+% \begin{macro}{\medskipamount}
+% \begin{macro}{\bigskipamount}
+% The values for these three parameters are set in the LaTeX kernel.
+% Historically they have been size invariant, but I have changed them for
+% the larger sizes (\cs{smallskipamount} is 1/4 the fontsize, and the others
+% each double up on the next lower).
+% \changes{v1.61803}{2008/01/30}{(small/med/big)skips not invraiant for larger font sizes.}
+% \changes{v1.61803}{2008/01/30}{Changed (small/med/big)skips for 17pt}
+% \begin{macrocode}
+%<*9pt|10pt|11pt|12pt|14pt>
+\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@}
+\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@}
+%</9pt|10pt|11pt|12pt|14pt>
+%<*17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+%<*17pt>
+\setlength\smallskipamount{4\p@ \@plus1\p@ \@minus1\p@}
+\setlength\medskipamount{8\p@ \@plus2\p@ \@minus2\p@}
+\setlength\bigskipamount{17\p@ \@plus4\p@ \@minus4\p@}
+%</17pt>
+%<*20pt>
+\setlength\smallskipamount{5\p@ \@plus1\p@ \@minus1\p@}
+\setlength\medskipamount{10\p@ \@plus2\p@ \@minus2\p@}
+\setlength\bigskipamount{20\p@ \@plus4\p@ \@minus4\p@}
+%</20pt>
+%<*25pt>
+\setlength\smallskipamount{6\p@ \@plus1\p@ \@minus1\p@}
+\setlength\medskipamount{12\p@ \@plus2\p@ \@minus2\p@}
+\setlength\bigskipamount{24\p@ \@plus4\p@ \@minus4\p@}
+%</25pt>
+%<*30pt>
+\setlength\smallskipamount{5\p@ \@plus1\p@ \@minus1\p@}
+\setlength\medskipamount{10\p@ \@plus2\p@ \@minus2\p@}
+\setlength\bigskipamount{20\p@ \@plus4\p@ \@minus4\p@}
+%</30pt>
+%<*36pt>
+\setlength\smallskipamount{9\p@ \@plus2\p@ \@minus2\p@}
+\setlength\medskipamount{18\p@ \@plus4\p@ \@minus4\p@}
+\setlength\bigskipamount{36\p@ \@plus8\p@ \@minus8\p@}
+%</36pt>
+%<*48pt>
+\setlength\smallskipamount{12\p@ \@plus3\p@ \@minus3\p@}
+\setlength\medskipamount{24\p@ \@plus6\p@ \@minus6\p@}
+\setlength\bigskipamount{48\p@ \@plus12\p@ \@minus12\p@}
+%</48pt>
+%<*60pt>
+\setlength\smallskipamount{15\p@ \@plus4\p@ \@minus4\p@}
+\setlength\medskipamount{30\p@ \@plus8\p@ \@minus8\p@}
+\setlength\bigskipamount{60\p@ \@plus16\p@ \@minus16\p@}
+%</60pt>
+%</17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@lowpenalty}
+% \begin{macro}{\@medpenalty}
+% \begin{macro}{\@highpenalty}%
+% The commands \cs{nopagebreak} and \cs{nolinebreak} put in penalties
+% to discourage these breaks at the point they are put in.
+% They use \cs{@lowpenalty}, \cs{@medpenalty} or \cs{@highpenalty},
+% dependent on their argument.
+% \begin{macrocode}
+%<*class>
+\@lowpenalty 51
+\@medpenalty 151
+\@highpenalty 301
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\clubpenalty}
+% \begin{macro}{\widowpenalty}
+% These penalties are used to discourage club and widow lines.
+% The default values are 150 each, but we want stronger discouragement.
+% \begin{macrocode}
+\clubpenalty 1000
+\widowpenalty 1000
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\displaywidowpenalty}
+% \begin{macro}{\predisplaypenalty}
+% \begin{macro}{\postdisplaypenalty}
+% Discourage, but do not prevent, widows in front of a math display
+% and forbid breaking directly in front of a display. Allow break
+% after a display without a penalty. The default values are
+% used, therefore we only show them here.
+% \begin{macrocode}
+% \displaywidowpenalty 50
+% \predisplaypenalty 10000
+% \postdisplaypenalty 0
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\interlinepenalty}
+% Allow the breaking of a page in the middle of a paragraph.
+% \begin{macrocode}
+% \interlinepenalty 0
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\brokenpenalty}
+% We allow the breaking of a page after a hyphenated line.
+% \begin{macrocode}
+% \brokenpenalty 100
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Vertical spacing}
+%
+% \begin{macro}{\headheight}
+% \begin{macro}{\headsep}
+% \begin{macro}{\topskip}
+% \begin{macro}{\footskip}
+% The \cs{headheight} is the height of the box that will contain the
+% running head. In this class it is point size dependent ---
+% \cs{onelineskip} (normally it is a constant 12pt).
+%
+% The \cs{headsep} is the distance between the bottom
+% of the running head and the top of the text. For the larger sizes
+% this is 1.8 times the fontsize.
+%
+% The \cs{topskip} is the \cs{baselineskip} for the first line on a page;
+% \LaTeX's output routine will not work properly if it has the
+% value 0pt, so do not do that! For the lareger sizes this is the font size.
+%
+% The distance from the baseline of the box which contains the
+% running footer to the baseline of last line of text is controlled
+% by the \cs{footskip}. For the larger sizes this is 2.5 times the
+% font size.
+% \changes{v0.11 (mem14.clo)}{2001/10/30}{Changed \cs{headheight} from 16pt to 17.5pt}
+% \changes{v0.11 (mem11.clo)}{2002/03/10}{Changed \cs{headheight} from 13pt to 13.6pt}
+% \changes{v0.4b (mem12.clo)}{2010/10/19}{Changed \cs{headheight} from 14pt to 14.5pt}
+% \begin{macrocode}
+%</class>
+%<*9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+%<*9pt>
+\setlength\headheight{11\p@}
+\setlength\headsep{.225in}
+\setlength\topskip{9\p@}
+\setlength\footskip{.33in}
+%</9pt>
+%<*10pt>
+\setlength\headheight{12\p@}
+\setlength\headsep{.25in}
+\setlength\topskip{10\p@}
+\setlength\footskip{.35in}
+%</10pt>
+%<*11pt>
+\setlength\headheight{13.6\p@}
+\setlength\headsep{.275in}
+\setlength\topskip{11\p@}
+\setlength\footskip{.38in}
+%</11pt>
+%<*12pt>
+\setlength\headheight{14.5\p@}
+\setlength\headsep{.275in}
+\setlength\topskip{12\p@}
+\setlength\footskip{30\p@}
+%</12pt>
+%<*14pt>
+\setlength\headheight{17.5\p@}
+\setlength\headsep{.30in}
+\setlength\topskip{14.4\p@}
+\setlength\footskip{.4in}
+%</14pt>
+%<*17pt>
+\setlength\headheight{22\p@}
+\setlength\headsep{.30in}
+\setlength\topskip{14.4\p@}
+\setlength\footskip{.4in}
+%</17pt>
+%<*20pt>
+\setlength\headheight{25\p@}
+\setlength\headsep{36\p@}
+\setlength\topskip{20\p@}
+\setlength\footskip{50\p@}
+%</20pt>
+%<*25pt>
+\setlength\headheight{30\p@}
+\setlength\headsep{45\p@}
+\setlength\topskip{25\p@}
+\setlength\footskip{62\p@}
+%</25pt>
+%<*30pt>
+\setlength\headheight{37\p@}
+\setlength\headsep{54\p@}
+\setlength\topskip{30\p@}
+\setlength\footskip{75\p@}
+%</30pt>
+%<*36pt>
+\setlength\headheight{45\p@}
+\setlength\headsep{65\p@}
+\setlength\topskip{36\p@}
+\setlength\footskip{90\p@}
+%</36pt>
+%<*48pt>
+\setlength\headheight{60\p@}
+\setlength\headsep{86\p@}
+\setlength\topskip{48\p@}
+\setlength\footskip{120\p@}
+%</48pt>
+%<*60pt>
+\setlength\headheight{72\p@}
+\setlength\headsep{108\p@}
+\setlength\topskip{60\p@}
+\setlength\footskip{150\p@}
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\maxdepth}
+% \begin{macro}{\@maxdepth}
+% The \TeX\ primitive register \cs{maxdepth} has a function that is
+% similar to that of \cs{topskip}. The register \cs{@maxdepth} should
+% always contain a copy of \cs{maxdepth}. In both plain \TeX\ and
+% \LaTeX~2.09 \cs{maxdepth} had a fixed value of \texttt{4pt}; in
+% native \LaTeX 2e mode we let the value depend on the typesize. We
+% set it so that \cs{maxdepth} $+$ \cs{topskip} $=$ typesize $\times
+% 1.5$. As it happens, in these classes \cs{topskip} is equal to the
+% typesize, therefor we set \cs{maxdepth} to half the value of
+% \cs{topskip}.
+% \begin{macrocode}
+\setlength\maxdepth{.5\topskip}
+\setlength\@maxdepth\maxdepth
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Footnotes}
+%
+% \begin{macro}{\footnotesep}
+% \cs{footnotesep} is the height of the strut placed at the beginning
+% of every footnote. It equals the height of a normal \cs{footnotesize}
+% strut, so no extra space appears between footnotes.
+% \changes{v1.61803}{2007/01/30}{Changed nearly all \cs{footnotesep}}
+% \begin{macrocode}
+%<9pt>\setlength\footnotesep{5.6\p@}
+%<10pt>\setlength\footnotesep{6.65\p@}
+%<11pt>\setlength\footnotesep{7.7\p@}
+%<12pt>\setlength\footnotesep{8.4\p@}
+%<14pt>\setlength\footnotesep{9.5\p@}
+%<17pt>\setlength\footnotesep{10.15\p@}
+%<20pt>\setlength\footnotesep{12.6\p@}
+%<25pt>\setlength\footnotesep{15.4\p@}
+%<30pt>\setlength\footnotesep{17.5\p@}
+%<36pt>\setlength\footnotesep{21\p@}
+%<48pt>\setlength\footnotesep{25.9\p@}
+%<60pt>\setlength\footnotesep{31.5\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footins}
+% \verb?\skip\footins? is the space between the last line of the main
+% text and the top of the first footnote.
+% \begin{macrocode}
+%<9pt>\setlength{\skip\footins}{8\p@ \@plus 2\p@ \@minus 2\p@}
+%<10pt>\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@}
+%<11pt>\setlength{\skip\footins}{10\p@ \@plus 4\p@ \@minus 2\p@}
+%<12pt>\setlength{\skip\footins}{10.8\p@ \@plus 4\p@ \@minus 2\p@}
+%<14pt>\setlength{\skip\footins}{13\p@ \@plus 4\p@ \@minus 2\p@}
+%<17pt>\setlength{\skip\footins}{16\p@ \@plus 5\p@ \@minus 3\p@}
+%<20pt>\setlength{\skip\footins}{19\p@ \@plus 7\p@ \@minus 3\p@}
+%<25pt>\setlength{\skip\footins}{24\p@ \@plus 8\p@ \@minus 4\p@}
+%<30pt>\setlength{\skip\footins}{29\p@ \@plus 10\p@ \@minus 5\p@}
+%<36pt>\setlength{\skip\footins}{35\p@ \@plus 12\p@ \@minus 6\p@}
+%<48pt>\setlength{\skip\footins}{47\p@ \@plus 16\p@ \@minus 8\p@}
+%<60pt>\setlength{\skip\footins}{59\p@ \@plus 20\p@ \@minus 10\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Floats}
+%
+% \paragraph{Floats on a text page}
+%
+% \begin{macro}{\floatsep}
+% \begin{macro}{\textfloatsep}
+% \begin{macro}{\intextsep}
+% When a floating object is placed on a page with text, these
+% parameters control the separation between the float and the other
+% objects on the page. These parameters are used for both
+% one-column mode and single-column floats in two-column mode.
+%
+% \cs{floatsep} is the space between adjacent floats that are moved
+% to the top or bottom of the text page. For the larger sizes this is
+% \cs{bigskip}.
+%
+% \cs{textfloatsep} is the space between the main text and floats
+% at the top or bottom of the page. For the larger sizes this is
+% 1.45\cs{onelineskip}.
+%
+% \cs{intextsep} is the space between in-text floats and the text.
+% \begin{macrocode}
+%<*9pt>
+\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+%</9pt>
+%<*10pt>
+\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+%</10pt>
+%<*11pt>
+\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+%</11pt>
+%<*12pt>
+\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\intextsep {14\p@ \@plus 4\p@ \@minus 4\p@}
+%</12pt>
+%<*14pt>
+\setlength\floatsep {14\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\textfloatsep{20\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\intextsep {14\p@ \@plus 4\p@ \@minus 4\p@}
+%</14pt>
+%<*17pt>
+\setlength\floatsep {15\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\textfloatsep{25\p@ \@plus 4\p@ \@minus 5\p@}
+\intextsep \floatsep
+%</17pt>
+%<*20pt>
+\setlength\floatsep {20\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\textfloatsep{36\p@ \@plus 4\p@ \@minus 8\p@}
+\intextsep \floatsep
+%</20pt>
+%<*25pt>
+\setlength\floatsep {24\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\textfloatsep{43\p@ \@plus 4\p@ \@minus 8\p@}
+\intextsep \floatsep
+%</25pt>
+%<*30pt>
+\setlength\floatsep {30\p@ \@plus 6\p@ \@minus 6\p@}
+\setlength\textfloatsep{54\p@ \@plus 6\p@ \@minus 12\p@}
+\intextsep \floatsep
+%</30pt>
+%<*36pt>
+\setlength\floatsep {36\p@ \@plus 8\p@ \@minus 8\p@}
+\setlength\textfloatsep{65\p@ \@plus 8\p@ \@minus 16\p@}
+\intextsep \floatsep
+%</36pt>
+%<*48pt>
+\setlength\floatsep {48\p@ \@plus 12\p@ \@minus 12\p@}
+\setlength\textfloatsep{87\p@ \@plus 12\p@ \@minus 24\p@}
+\intextsep \floatsep
+%</48pt>
+%<*60pt>
+\setlength\floatsep {60\p@ \@plus 16\p@ \@minus 16\p@}
+\setlength\textfloatsep{104\p@ \@plus 16\p@ \@minus 32\p@}
+\intextsep \floatsep
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dblfloatsep}
+% \begin{macro}{\dbltextfloatsep}
+% When floating objects that span the whole \cs{textwidth} are placed
+% on a text page and \LaTeX{} is in twocolumn mode the separation
+% between the float and the text is controlled by \cs{dblfloatsep}
+% and \cs{dbltextfloatsep}.
+%
+% \cs{dblfloatsep} is the space between adjacent floats that are moved
+% to the top or bottom of the text page.
+%
+% \cs{dbltextfloatsep} is the space between the main text and floats
+% at the top or bottom of the page.
+%
+% \begin{macrocode}
+%<*9pt>
+\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+%</9pt>
+%<*10pt>
+\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+%</10pt>
+%<*11pt>
+\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+%</11pt>
+%<*12pt>
+\setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+%</12pt>
+%<*14pt>
+\setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@}
+\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
+%</14pt>
+%<*17pt>
+\setlength\dblfloatsep {15\p@ \@plus 4\p@ \@minus 4\p@}
+\setlength\dbltextfloatsep{25\p@ \@plus 5\p@ \@minus 5\p@}
+%</17pt>
+%<*20pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</20pt>
+%<*25pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</25pt>
+%<*30pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</30pt>
+%<*36pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</36pt>
+%<*48pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</48pt>
+%<*60pt>
+\dblfloatsep \floatsep
+\dbltextfloatsep \textfloatsep
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \paragraph{Floats on their own page or column}
+%
+% \begin{macro}{\@fptop}
+% \begin{macro}{\@fpsep}
+% \begin{macro}{\@fpbot}
+% When floating objects are placed on separate pages the layout of
+% such pages is controlled by these parameters. At the top of the
+% page \cs{@fptop} amount of stretchable whitespace is inserted, at
+% the bottom of the page we get an \cs{@fpbot} amount of stretchable
+% whitespace. Between adjacent floats the \cs{@fpsep} is inserted.
+% For the larger sizes \cs{@fpsep} is .7\cs{onelineskip}.
+%
+% These parameters are used for the placement of floating objects
+% in one column mode, or in single column floats in two column
+% mode.
+%
+% Note that at least one of the two parameters \cs{@fptop} and
+% \cs{@fpbot} should contain a \verb?plus ...fil? to allow filling the
+% remaining empty space.
+% \begin{macrocode}
+%<*9pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{9\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</9pt>
+%<*10pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{8\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</10pt>
+%<*11pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{8\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</11pt>
+%<*12pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{10\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</12pt>
+%<*14pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{10\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</14pt>
+%<*17pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{12\p@ \@plus 2fil}
+\setlength\@fpbot{0\p@ \@plus 1fil}
+%</17pt>
+%<*20pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{17\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</20pt>
+%<*25pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{21\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</25pt>
+%<*30pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{26\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</30pt>
+%<*36pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{31\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</36pt>
+%<*48pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{42\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</48pt>
+%<*60pt>
+\setlength\@fptop{0\p@ \@plus 1fil}
+\setlength\@fpsep{50\p@ \@plus 2fil}
+\@fpbot \@fptop
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@dblfptop}
+% \begin{macro}{\@dblfpsep}
+% \begin{macro}{\@dblfpbot}
+% Double column floats in two column mode are handled with similar
+% parameters.
+% \begin{macrocode}
+%<*9pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{7\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</9pt>
+%<*10pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{8\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</10pt>
+%<*11pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{8\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</11pt>
+%<*12pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{10\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</12pt>
+%<*14pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{12\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</14pt>
+%<*17pt>
+\setlength\@dblfptop{0\p@ \@plus 1fil}
+\setlength\@dblfpsep{12\p@ \@plus 2fil}
+\setlength\@dblfpbot{0\p@ \@plus 1fil}
+%</17pt>
+%<*20pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</20pt>
+%<*25pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</25pt>
+%<*30pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</30pt>
+%<*36pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</36pt>
+%<*48pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</48pt>
+%<*60pt>
+\@dblfptop \@fptop
+\@dblfpsep \@fpsep
+\@dblfpbot \@dblfptop
+%</60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The measure}
+%
+% The width of a line of text (and therefore the text block) is termed
+% the \emph{measure}.
+%
+% \begin{macro}{\lxvchars}
+% The length \cs{lxvchars} is the approximate length of a normal
+% text line containing 65 characters (a typesetters rule of thumb is
+% that there should be about 60--70 characters per line).
+% \begin{macrocode}
+%<9pt>\setlength\lxvchars{276\p@} %
+%<10pt>\setlength\lxvchars{300\p@} % standard 345pt
+%<11pt>\setlength\lxvchars{324\p@} % standard 360pt
+%<12pt>\setlength\lxvchars{336\p@} % standard 390pt
+%<14pt>\setlength\lxvchars{408\p@} %
+%<17pt>\setlength\lxvchars{444\p@} %
+%<20pt>\setlength\lxvchars{528\p@} %
+%<25pt>\setlength\lxvchars{626\p@} %
+%<30pt>\setlength\lxvchars{748\p@} %
+%<36pt>\setlength\lxvchars{891\p@} %
+%<48pt>\setlength\lxvchars{1177\p@} %
+%<60pt>\setlength\lxvchars{1463\p@} %
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xlvchars}
+% The length \cs{xlvchars} is the approximate length of a normal
+% double column text line containing 45 characters
+% (a typesetters rule of thumb is
+% that there should be about 40--50 characters per column line).
+% \begin{macrocode}
+%<9pt>\setlength\xlvchars{192\p@} %
+%<10pt>\setlength\xlvchars{204\p@} %
+%<11pt>\setlength\xlvchars{216\p@} %
+%<12pt>\setlength\xlvchars{240\p@} %
+%<14pt>\setlength\xlvchars{288\p@} %
+%<17pt>\setlength\xlvchars{312\p@} %
+%<20pt>\setlength\xlvchars{365\p@} %
+%<25pt>\setlength\xlvchars{438\p@} %
+%<30pt>\setlength\xlvchars{518\p@} %
+%<36pt>\setlength\xlvchars{617\p@} %
+%<48pt>\setlength\xlvchars{815\p@} %
+%<60pt>\setlength\xlvchars{1014\p@} %
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\marginparsep}
+% \begin{macro}{\marginparpush}
+% \cs{marginparsep} is the horizontal space between the text block and
+% marginal notes, while \cs{marginparpush} is the minimum vertical
+% separation between the notes.
+% \begin{macrocode}
+\if@twocolumn
+%<*9pt|10pt|11pt|12pt|14pt>
+ \setlength\marginparsep{10\p@}
+%</9pt|10pt|11pt|12pt|14pt>
+%<*17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+ \setlength\marginparsep{1em}
+%</17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+\else
+%<*9pt|10pt|11pt|12pt|14pt>
+ \setlength\marginparsep{7\p@}
+%</9pt|10pt|11pt|12pt|14pt>
+%<*17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+ \setlength\marginparsep{0.7em}
+%</17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+\fi
+%<9pt|10pt|11pt>\setlength{\marginparpush}{5\p@}
+%<12pt|14pt>\setlength{\marginparpush}{7\p@}
+%<*17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+ \setlength\marginparpush{0.5em}
+%</17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</9pt|10pt|11pt|12pt|14pt|17pt|20pt|25pt|30pt|36pt|48pt|60pt>
+%<*class>
+% \end{macrocode}
+%
+% \section{Page Layout}
+%
+%
+% \subsection{The typeblock and margins}
+%
+% All margin dimensions are measured from a point one inch from the
+% top and lefthand side of the page.
+%
+% \begin{macro}{\setlxvchars}
+% \begin{macro}{\setxlvchars}
+% These were suggested and supplied by Morten H{\o}gholm (18 May 2003).
+%
+% \cs{setlxvchars}\oarg{fontspec} sets \cs{lxvchars} to the length of a line
+% containing 65 characters in the \meta{fontspec}.
+%
+% Similarly
+% \cs{setxlvchars}\oarg{fontspec} sets \cs{xlvchars} for 45 characters.
+% \changes{v1.4}{2003/11/22}{Added \cs{setlxvchars} and \cs{setxlvchars}
+% (from patch v1.6)}
+% \begin{macrocode}
+\newcommand*{\setlxvchars}[1][\normalfont]{\begingroup
+ #1
+ \settowidth{\lxvchars}{abcdefghijklmnopqrstuvwxyz}%
+ \setlength{\lxvchars}{2.042\lxvchars}%
+ \addtolength{\lxvchars}{33.41pt}%
+ \global\lxvchars=\lxvchars
+ \endgroup}
+\newcommand*{\setxlvchars}[1][\normalfont]{\begingroup
+ #1
+ \settowidth{\xlvchars}{abcdefghijklmnopqrstuvwxyz}%
+ \setlength{\xlvchars}{1.415\xlvchars}%
+ \addtolength{\xlvchars}{23.03pt}%
+ \global\xlvchars=\xlvchars
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setrectanglesize}
+% The macro \cs{setrectanglesize}\marg{H}\marg{W}\marg{r}
+% calculates the height and width of a rectangle given any two out of
+% the three arguments. An unvalued argument is denoted by \verb?*?.
+%
+% Table~\ref{tab:setrect} shows the argument combinations and the result
+% for each combination.
+% \begin{table}
+% \centering
+% \caption{Arguments and results for \cs{setrectanglesize}}\label{tab:setrect}
+% \begin{tabular}{ccc|l} \hline
+% H & W & r & Result \\ \hline
+% * & W & r & $H = rW$ \\{}
+% * & W & * & $H = W$ \\{}
+% * & * & r & ambiguous \\{}
+% * & * & * & ambiguous \\{}
+% H & W & r & $H, W$ \\
+% H & W & * & $H, W$ \\
+% H & * & r & $W = rH$ \\
+% H & * & * & $W = H$ \\
+% \hline
+% \end{tabular}
+% \end{table}
+%
+% The
+% calculated height and width are stored in \cs{@tempdima} and \cs{@tempdimb}
+% respectively. Both lengths are set to zero if there is an error.
+% \changes{v1.61803}{2008/01/30}{Used \cs{setlength} instead of TeX syntax so that the calc package
+% can be used with page layout (Morten H{\o}gholm mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\setrectanglesize}[3]{%
+ \nametest{#1}{*}%
+ \ifsamename % H = *
+ \nametest{#2}{*}%
+ \ifsamename % W = *
+ \@memerror{%
+ The combination of argument values is ambiguous.\MessageBreak
+ The lengths will be set to zero}{\@ehd}%
+ \setlength{\@tempdima}{0pt}%
+ \setlength{\@tempdimb}{0pt}%
+ \else % W
+ \nametest{#3}{*}%
+ \ifsamename % r = *
+ \setlength{\@tempdimb}{#2}%
+ \setlength{\@tempdima}{\@tempdimb}%
+ \else % r
+ \setlength{\@tempdimb}{#2}%
+ \setlength{\@tempdima}{#3\@tempdimb}%
+ \fi
+ \fi
+ \else % H
+ \nametest{#2}{*}%
+ \ifsamename % W = *
+ \nametest{#3}{*}%
+ \ifsamename % r = *
+ \setlength{\@tempdima}{#1}%
+ \setlength{\@tempdimb}{\@tempdima}%
+ \else % r
+ \setlength{\@tempdima}{#1}%
+ \setlength{\@tempdimb}{#3\@tempdima}%
+ \fi
+ \else % W
+ \setlength{\@tempdima}{#1}%
+ \setlength{\@tempdimb}{#2}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setfillsize}
+% Consider a set of 4 lengths, $T$, $L$, $C$, and $R$, such that
+% $T = L + C + R$, where $T$ is a fixed size and normally $C$ is also fixed.
+% Also $L$ and $R$ may be specified independently of each other or as a
+% ratio (i.e., $L = rR$ or $R = rL$).
+% The macro
+% \cs{setfillsize}\marg{T}\marg{C}\marg{L}\marg{R}\marg{r}
+% maintains these constraints among the variables, where an unvalued
+% argument is denoted by \verb?*?.
+%
+% Table~\ref{tab:setfill} shows the argument combinations and the result
+% for each combination.
+% \begin{table}
+% \centering
+% \caption{Arguments and results for \cs{setfillsize}}\label{tab:setfill}
+% \begin{tabular}{cccc|ll} \hline
+% C & L & R & r & Result & \\ \hline
+% * & * & R & r & $L = rR$, & $C = T - L - R$ \\{}
+% * & * & R & * & $L = R$, & $C = T - L - R$ \\{}
+% * & * & * & r & ambigous & \\{}
+% * & * & * & * & ambiguous & \\{}
+% * & L & R & r & $L$, $R$, & $C = T - L - R$ \\{}
+% * & L & R & * & $L$, $R$, & $C = T - L - R$ \\{}
+% * & L & * & r & $R = rL$, & $C = T - L - R$ \\{}
+% * & L & * & * & $R = L$, & $C = T - L - R$ \\{}
+% C & * & R & r & $L = T - C - R$ & $C$ \\
+% C & * & R & * & $L = T - C - R$, & $C$ \\
+% C & * & * & r & $L + R = T - C$, $R = rL$, & $C$ \\
+% C & * & * & * & $L + R = T - C$, $R = L$, & $C$ \\
+% C & L & R & r & ambiguous & $C$ \\
+% C & L & R & * & ambiguous & $C$ \\
+% C & L & * & r & $R = T - C - L$, & $C$ \\
+% C & L & * & * & $R = T - C - L$, & $C$ \\
+% \hline
+% \end{tabular}
+% ^^A \MakeShortVerb{\|}
+% \end{table}
+%
+%
+% The
+% calculated values of \texttt{C}, \texttt{L} and \texttt{R} are stored
+% \cs{@tempdimc},
+% \cs{@tempdima} and \cs{@tempdimb} respectively. If there is an error
+% the lengths are set to zero.
+% \begin{macrocode}
+\newcommand*{\setfillsize}[5]{%
+ \nametest{#2}{*}%
+ \ifsamename % C = *
+ \nametest{#3}{*}%
+ \ifsamename % L = *
+ \nametest{#4}{*}%
+ \ifsamename % R = *
+ \@memerror{%
+ The combination of argument values is ambiguous.\MessageBreak
+ The lengths will be set to zero}{\@ehd}
+ \setlength{\@tempdima}{0pt}%
+ \setlength{\@tempdimb}{0pt}%
+ \setlength{\@tempdimc}{0pt}%
+ \else % R
+ \nametest{#5}{*}%
+ \ifsamename % r = *
+ \setlength{\@tempdimb}{#4}%
+ \setlength{\@tempdima}{\@tempdimb}%
+ \setlength{\@tempdimc}{#1}%
+ \advance\@tempdimc -\@tempdima
+ \advance\@tempdimc -\@tempdimb
+ \else % r
+ \setlength{\@tempdimb}{#4}%
+ \setlength{\@tempdima}{#5\@tempdimb}%
+ \setlength{\@tempdimc}{#1}%
+ \advance\@tempdimc -\@tempdima
+ \advance\@tempdimc -\@tempdimb
+ \fi
+ \fi
+ \else % L
+ \nametest{#4}{*}%
+ \ifsamename % R = *
+ \nametest{#5}{*}%
+ \ifsamename % r = *
+ \setlength{\@tempdima}{#3}%
+ \setlength{\@tempdimb}{\@tempdima}
+ \setlength{\@tempdimc}{#1}%
+ \advance\@tempdimc -\@tempdima
+ \advance\@tempdimc -\@tempdimb
+ \else % r
+ \setlength{\@tempdima}{#3}%
+ \setlength{\@tempdimb}{#5\@tempdima}
+ \setlength{\@tempdimc}{#1}%
+ \advance\@tempdimc -\@tempdima
+ \advance\@tempdimc -\@tempdimb
+ \fi
+ \else % R
+ \setlength{\@tempdima}{#3}%
+ \setlength{\@tempdimb}{#4}%
+ \setlength{\@tempdimc}{#1}%
+ \advance\@tempdimc -\@tempdima
+ \advance\@tempdimc -\@tempdimb
+ \fi
+ \fi
+ \else % C is valued
+ \nametest{#3}{*}%
+ \ifsamename % L = *
+ \nametest{#4}{*}%
+ \ifsamename % R = *
+ \nametest{#5}{*}%
+ \ifsamename % r = *
+ \setlength{\@tempdimc}{#2}%
+ \setlength{\@tempdima}{#1}%
+ \advance\@tempdima -\@tempdimc
+ \@tempdima = 0.5\@tempdima
+ \@tempdimb = \@tempdima
+ \else % r (CODE PERHAPS FIXED)
+ \setlength{\@tempdimc}{#2} % C
+ \setlength{\@tempdimb}{#1} % T
+ \advance\@tempdimb -\@tempdimc % T - C
+ \@tempdima = 1000sp
+ \setlength{\@tempdima}{#5\@tempdima} % 1000r sp
+ \advance\@tempdima by 1000sp % 1000(1+r)sp
+ \@tempcnta = \@tempdima % 1000(1+r)
+ \@tempdima = \@tempdimb % T - C
+ \divide\@tempdima by \@tempcnta % (T-C)/1000(1+r) pts
+ \@tempdima = 1000\@tempdima % (T-C)/(1+r) pts = L
+ \advance\@tempdimb by -\@tempdima % = R
+ \fi
+ \else % R
+ \setlength{\@tempdimc}{#2}%
+ \setlength{\@tempdimb}{#4}%
+ \setlength{\@tempdima}{#1}%
+ \advance\@tempdima -\@tempdimc
+ \advance\@tempdima -\@tempdimb
+ \fi
+ \else % L
+ \nametest{#4}{*}%
+ \ifsamename % R = *
+ \setlength{\@tempdimc}{#2}%
+ \setlength{\@tempdima}{#3}%
+ \setlength{\@tempdimb}{#1}%
+ \advance\@tempdimb -\@tempdimc
+ \advance\@tempdimb -\@tempdima
+ \else % R
+ \@memerror{%
+ The combination of argument values is ambiguous.\MessageBreak
+ The lengths will be set to zero}{\@ehd}%
+ \setlength{\@tempdima}{0pt}%
+ \setlength{\@tempdimb}{0pt}%
+ \setlength{\@tempdimc}{#2}%
+ \fi
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setstocksize}
+% \begin{macro}{\settrims}
+% \begin{macro}{\settrimmedsize}
+% \cs{setstocksize}\marg{height}\marg{width} sets the height
+% and width of the stock material and
+% \cs{settrims}\marg{top}\marg{edge} sets the trim lengths
+% for the top and side (fore edge) of the stock.
+% The macro \cs{settrimmedsize}\marg{height}\marg{width}\marg{ratio}
+% sets the size for the trimmed page, based on \cs{setrectanglesize}.
+% \begin{macrocode}
+\newcommand{\setstocksize}[2]{%
+ \setlength{\stockheight}{#1}%
+ \setlength{\stockwidth}{#2}}
+\newcommand{\settrims}[2]{%
+ \setlength{\trimtop}{#1}%
+ \setlength{\trimedge}{#2}}
+\newcommand{\settrimmedsize}[3]{%
+ \setrectanglesize{#1}{#2}{#3}%
+ \setlength{\paperheight}{\@tempdima}%
+ \setlength{\paperwidth}{\@tempdimb}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\settypeblocksize}
+% \cs{settypeblocksize}\marg{height}\marg{width}\marg{ratio}
+% calulates the \cs{textheight} and \cs{textwidth} from two out of the
+% three arguments.
+% \changes{v3.6k}{2013/05/14}{Marked \cs{settypeblocksize} as being used}
+% \begin{macrocode}
+\newcommand{\settypeblocksize}[3]{%
+ \memsetmacroused\settypeblocksize%
+ \setrectanglesize{#1}{#2}{#3}%
+ \setlength{\textheight}{\@tempdima}%
+ \setlength{\textwidth}{\@tempdimb}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\binding}
+% \begin{macro}{\setbinding}
+% The length \cs{binding} is an allowance on the spine margin for
+% binding. \cs{setbinding}\marg{length} sets the \cs{binding}.
+% \changes{v1.6180339c}{2008/12/29}{Added binding offset code to the
+% layout functions}
+% \begin{macrocode}
+\newlength{\binding}
+\newcommand*{\setbinding}[1]{\setlength{\binding}{#1}}
+ \setbinding{0pt}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\spinemargin}
+% \begin{macro}{\foremargin}
+% \begin{macro}{\setlrmargins}
+% \cs{setlrmargins}\marg{L}\marg{R}\marg{r} sets the Left (spine)
+% and Right (fore edge) margins with constant typeblock.
+% \changes{v1.6180339c}{2008/12/29}{Added binding to \cs{setlrmargins}}
+% \changes{v3.6k}{2013/05/14}{Marked \cs{setlrmargins} as being used}
+% \begin{macrocode}
+\newlength{\spinemargin}
+\newlength{\foremargin}
+\newcommand{\setlrmargins}[3]{%
+ \memsetmacroused\setlrmargins%
+ \advance\paperwidth -\binding
+ \setfillsize{\paperwidth}{\textwidth}{#1}{#2}{#3}%
+ \setlength{\textwidth}{\@tempdimc}%
+ \setlength{\spinemargin}{\@tempdima}%
+ \setlength{\foremargin}{\@tempdimb}%
+ \advance\paperwidth \binding
+ \advance\spinemargin \binding}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setlrmarginsandblock}
+% \cs{setlrmarginsandblock}\marg{L}\marg{R}\marg{r} sets the Left (spine)
+% and Right (fore edge) margins with variable typeblock.
+% \changes{v1.6180339c}{2008/12/29}{Added binding to \cs{setlrmarginsandblock}}
+% \begin{macrocode}
+\newcommand{\setlrmarginsandblock}[3]{%
+ \advance\paperwidth -\binding
+ \setfillsize{\paperwidth}{*}{#1}{#2}{#3}%
+ \setlength{\textwidth}{\@tempdimc}%
+ \setlength{\spinemargin}{\@tempdima}%
+ \setlength{\foremargin}{\@tempdimb}%
+ \advance\paperwidth \binding
+ \advance\spinemargin \binding}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\uppermargin}
+% \begin{macro}{\lowermargin}
+% \begin{macro}{\setulmargins}
+% \cs{setulmargins}\marg{L}\marg{R}\marg{r} sets the Left (upper)
+% and Right (lower) margins with constant typeblock.
+% \changes{v3.6k}{2013/05/14}{Marked \cs{setulmargins} as being used}
+% \begin{macrocode}
+\newlength{\uppermargin}
+\newlength{\lowermargin}
+\newcommand{\setulmargins}[3]{%
+ \memsetmacroused\setulmargins%
+ \setfillsize{\paperheight}{\textheight}{#1}{#2}{#3}%
+ \setlength{\textheight}{\@tempdimc}%
+ \setlength{\uppermargin}{\@tempdima}%
+ \setlength{\lowermargin}{\@tempdimb}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setulmarginsandblock}
+% \cs{setulmarginsandblock}\marg{L}\marg{R}\marg{r} sets the Left (upper)
+% and Right (lower) margins with variable typeblock.
+% \begin{macrocode}
+\newcommand{\setulmarginsandblock}[3]{%
+ \setfillsize{\paperheight}{*}{#1}{#2}{#3}%
+ \setlength{\textheight}{\@tempdimc}%
+ \setlength{\uppermargin}{\@tempdima}%
+ \setlength{\lowermargin}{\@tempdimb}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\headdrop}
+% \begin{macro}{\setheaderspaces}
+% \cs{setheaderspaces}\marg{L}\marg{R}\marg{r} sets the Left (head margin)
+% and Right (headsep) spacing with constant headheight.
+% \begin{macrocode}
+\newlength{\headdrop}
+\newcommand{\setheaderspaces}[3]{%
+ \setfillsize{\uppermargin}{\headheight}{#1}{#2}{#3}%
+ \setlength{\headheight}{\@tempdimc}%
+ \setlength{\headdrop}{\@tempdima}%
+ \setlength{\headsep}{\@tempdimb}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setheadfoot}
+% \cs{setheadfoot}\marg{headheight}\marg{footskip}
+% sets the headheight and the footskip.
+% \begin{macrocode}
+\newcommand{\setheadfoot}[2]{%
+ \setlength{\headheight}{#1}%
+ \setlength{\footskip}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setcolsepandrule}
+% \cs{setcolsepandrule}\marg{colsep}\marg{thickness}
+% sets the column separation and the rule thickness.
+% \changes{v1.0}{2001/09/20}{Changed \cs{setcolseprule} to
+% \cs{setcolsepandrule} to match the documentation.}
+% \begin{macrocode}
+\newcommand{\setcolsepandrule}[2]{%
+ \setlength{\columnsep}{#1}%
+ \setlength{\columnseprule}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setmarginnotes}
+% \cs{setmarginnotes}\marg{sep}\marg{width}\marg{push}
+% sets the marginpar parameters.
+% \changes{v3.6k}{2013/05/14}{Marked \cs{setmarginnotes} as being used}
+% \begin{macrocode}
+\newcommand{\setmarginnotes}[3]{%
+ \memsetmacroused\setmarginnotes%
+ \setlength{\marginparsep}{#1}%
+ \setlength{\marginparwidth}{#2}%
+ \setlength{\marginparpush}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setfootins}
+% \cs{setfootins}\marg{length}\marg{length} sets
+% \cs{skip}\cs{footins} and its minipage counterpart. It will also
+% set \cs{skip}\cs{footinsv@r} and similar for minipages to the same
+% values. These are used by for example \cs{twocolumnfootnotes}.
+% \begin{macrocode}
+\newcommand\setfootins[2]{
+ \setlength{\skip\footins}{#1}
+ \setlength{\skip\footinsv@r}{#1}
+ \setlength{\skip\@mpfootins}{#2}
+ % not explicitly used
+ \setlength{\skip\@mpfootinsv@r}{#2}
+}
+
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% Initialise the paper size and trimming to their default values.
+% \begin{macrocode}
+\settrimmedsize{\stockheight}{\stockwidth}{*}
+\settrims{\z@}{\z@}
+
+% \end{macrocode}
+%
+% What now follows is the standard class's method for setting up
+% the dimensions.
+%
+% Set \cs{@tempdimb} to size-dependent initial line length and
+% set \cs{@tempdima} to the maximum textwidth for the paper width,
+% an inch margin on either side. In the standard classes the initial
+% line length is about 14\% greater than \cs{lxvchars}.
+% \begin{macrocode}
+\setlength{\@tempdimb}{1.14\lxvchars}
+\setlength\@tempdima{\paperwidth}
+ \addtolength\@tempdima{-2in}
+% \end{macrocode}
+%
+% \begin{macro}{\textwidth}
+% Now set the \cs{textwidth} depending on the number of columns. In twocolumn
+% mode each column should be no wider than \cs{@tempdimb}.
+% \begin{macrocode}
+\if@twocolumn
+ \ifdim\@tempdima>2\@tempdimb\relax
+ \setlength\textwidth{2\@tempdimb}
+ \else
+ \setlength\textwidth{\@tempdima}
+ \fi
+% \end{macrocode}
+% In onecolumn
+% the text should not be wider than the minumum of the paperwidth (less
+% 2in for the margins) and the maximum length of the character line.
+% \begin{macrocode}
+\else
+ \ifdim\@tempdima>\@tempdimb\relax
+ \setlength\textwidth{\@tempdimb}
+ \else
+ \setlength\textwidth{\@tempdima}
+ \fi
+\fi
+% \end{macrocode}
+% Adjust the width to be a whole number of points.
+% \changes{v3.7g}{2018/03/09}{Switch to private truncating macro so we
+% can disable truncation via class option}
+% \begin{macrocode}
+\mem@settopoint\textwidth
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\textheight}
+% The \cs{textheight} is the height of the text block, excluding
+% headers and footers. This is set according to the \cs{paperheight},
+% to an integral number of lines, and allowing a 1in margin at the
+% top and bottom and a further 1.5in for headers and footers.
+% \begin{macrocode}
+\setlength\@tempdima{\paperheight}
+ \addtolength\@tempdima{-3.5in}
+% \end{macrocode}
+% Divide this height by the \cs{baselineskip} to get the number of lines.
+% Then (re)calculate the \cs{textheight} and finally add the \cs{topskip}.
+% \begin{macrocode}
+ \divide\@tempdima\baselineskip
+\@tempcnta=\@tempdima
+\setlength\textheight{\@tempcnta\baselineskip}
+ \addtolength\textheight{\topskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The margins are calculated.
+%
+% \begin{macro}{\oddsidemargin}
+% \begin{macro}{\marginparwidth}
+% \begin{macro}{\evensidemargin}
+% The margins depend on the paper size, also for two sided
+% printing the inner margin is made smaller than the outer.
+% \begin{macrocode}
+\if@twoside
+ \setlength\@tempdima {\paperwidth}
+ \addtolength\@tempdima {-\textwidth}
+ \setlength\oddsidemargin {.4\@tempdima}
+ \addtolength\oddsidemargin {-1in}
+ \setlength\marginparwidth {.6\@tempdima}
+ \addtolength\marginparwidth{-\marginparsep}
+ \addtolength\marginparwidth{-0.4in}
+\else
+ \setlength\@tempdima {\paperwidth}
+ \addtolength\@tempdima {-\textwidth}
+ \setlength\oddsidemargin {.5\@tempdima}
+ \addtolength\oddsidemargin {-1in}
+ \setlength\marginparwidth {.5\@tempdima}
+ \addtolength\marginparwidth{-\marginparsep}
+ \addtolength\marginparwidth{-0.8in} % don't know why this isn't .4
+\fi
+\ifdim\marginparwidth>2in
+ \setlength\marginparwidth{2in}%
+\fi
+% \end{macrocode}
+% Set these values to integer numbers of points, and afterwards calculate the
+% \cs{evensidemargin}.
+% Jonathon Stickel (\url{jjstickel@vcn.com}) on 2008/05/30 noted that
+% \cs{marginparwidth} had to be positive for the initial setting of the sidebar
+% geometry through \cs{setsidebars}.
+% \changes{v1.618033}{2008/06/02}{Ensured initial value of \cs{marginparwidth}
+% was positive}
+% \changes{v3.7g}{2018/03/09}{Switch to private truncating macro so we
+% can disable truncation via class option}
+% \begin{macrocode}
+\mem@settopoint\oddsidemargin
+\mem@settopoint\marginparwidth
+\ifdim\marginparwidth<1pt \setlength\marginparwidth{1pt}\fi
+
+\setlength\evensidemargin {\paperwidth}
+\addtolength\evensidemargin{-2in}
+\addtolength\evensidemargin{-\textwidth}
+\addtolength\evensidemargin{-\oddsidemargin}
+\mem@settopoint\evensidemargin
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\topmargin}
+% The \cs{topmargin} is the distance below the top of the printable
+% area (1in below the top of the paper) and the top of the box
+% containing the running head.
+% \changes{v3.7g}{2018/03/09}{Switch to private truncating macro so we
+% can disable truncation via class option}
+% \begin{macrocode}
+\setlength\topmargin {\paperheight}
+\addtolength\topmargin{-2in}
+\addtolength\topmargin{-\headheight}
+\addtolength\topmargin{-\headsep}
+\addtolength\topmargin{-\textheight}
+\addtolength\topmargin{-\footskip}
+\addtolength\topmargin{-.5\topmargin}
+\mem@settopoint\topmargin
+
+% \end{macrocode}
+% \end{macro}
+%
+% That is the end of the classical algorithm. Now calculate the
+% user-friendly dimensions. The calculations are simpler than in
+% the general case as the \cs{paperwidth} and \cs{paperheight} is the
+% same as the \cs{stockwidth} and \cs{stockheight}.
+%
+% We can get the spine
+% and edge margins from the \cs{oddsidemargin}.
+% \begin{macrocode}
+\setlength{\spinemargin}{\oddsidemargin}
+\addtolength{\spinemargin}{1in}
+\setlrmargins{\spinemargin}{*}{*}
+
+% \end{macrocode}
+%
+% Similarly we can get the upper and lower margins from the
+% \cs{topmargin}, \cs{headheight} and \cs{headskip}.
+% \begin{macrocode}
+\setlength{\uppermargin}{\topmargin}
+\addtolength{\uppermargin}{1in}
+\addtolength{\uppermargin}{\headheight}
+\addtolength{\uppermargin}{\headsep}
+\setulmargins{\uppermargin}{*}{*}
+
+% \end{macrocode}
+%
+% \begin{macro}{\@memznegtest}
+% DA suggested this in a private email (2003/002/13) to make error
+% checking and reporting a bit more (space) efficient. Use like \\
+% \verb?\@memznegtest{\marginparsep}? instead of \\
+% \begin{verbatim}
+% \ifdim\marginparsep>\z@\else
+% \@memerror{\protect\marginparsep\space is zero or negative}{\@ehd}%
+% \fi
+% \end{verbatim}
+% If its length variable argument is zero or less it reports an error.
+%
+% \changes{v1.4}{2003/02/27}{Added \cs{@memznegtest}}
+% \changes{v1.618033}{2008/06/02}{Changed \cs{@memznegtest} and
+% \cs{@memnegtest} to issue warnings instead of errors}
+%
+% \begin{macrocode}
+\newcommand*{\@memznegtest}[1]{%
+ \ifdim#1>\z@\else
+ %%%% \@memerror{\protect#1\space is zero or negative}{\@ehd}%
+ \@memwarn{\protect#1\space is zero or negative}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memnegtest}
+% Reports an error if its length variable argument is negative.
+% \changes{v1.4}{2003/02/27}{Added \cs{@memnegtest}}
+% \begin{macrocode}
+\newcommand*{\@memnegtest}[1]{%
+ \ifdim#1<\z@
+%%%% \@memerror{\protect#1\space is negative}{\@ehd}%
+ \@memwarn{\protect#1\space is negative}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mclassicht}
+% The classic adjustment of the \cs{textheight} to get an integral number
+% of lines (given an integral number of baselineskips returns a height
+% giving one more line in the block).
+% \changes{v1.61803}{2008/01/30}{Added \cs{m@mclassicht}, \cs{m@mlinesht}
+% and \cs{m@mnearestht} (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\m@mclassicht}{%
+ \setlength{\@tempdima}{\textheight}%
+ \divide\@tempdima \baselineskip
+ \@tempcnta=\@tempdima
+ \setlength{\textheight}{\@tempcnta\baselineskip}%
+ \addtolength{\textheight}{\topskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mlinesht}
+% The adjustment of the \cs{textheight} to get an integral number
+% of lines (given an inegral number of baselineskips returns a height
+% giving that number of lines).
+% \begin{macrocode}
+\newcommand*{\m@mlinesht}{%
+ \setlength{\@tempdima}{\textheight}%
+ \advance\@tempdima -\baselineskip
+ \divide\@tempdima \baselineskip
+ \@tempcnta=\@tempdima
+ \setlength{\textheight}{\@tempcnta\baselineskip}%
+ \addtolength{\textheight}{\topskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mnearestht}
+% The adjustment of the \cs{textheight} to get an integral number
+% of lines with the calculated height being as the closest to the given
+% height. Algorithm supplied by Lars Madsen and Morten H{\o}gholm on
+% 2006/07/27.
+% \begin{macrocode}
+\newcommand*{\m@mnearestht}{%
+ \setlength{\@tempdima}{\textheight}%
+ \advance\@tempdima -\topskip
+ \advance\@tempdima 0.5\baselineskip
+ \divide\@tempdima \baselineskip
+ \@tempcnta=\@tempdima
+ \setlength{\textheight}{\@tempcnta\baselineskip}%
+ \addtolength{\textheight}{\topskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@autoadjust@marginparwidth}
+% This macro implements an algorithm, to automatically adjust
+% \cs{marginparwidth} to the current values of \cs{spinemargin} and
+% \cs{foremargin} (i.e., the inner and outer margins). It may be used
+% within \cs{fixthelayout} in case the user has not changed
+% \cs{marginparwidth} using \cs{setmarginnotes}.
+% \begin{macrocode}
+\newcommand\mem@autoadjust@marginparwidth{%
+ \if@twocolumn
+ \memsetlengthmin\marginparwidth\spinemargin\foremargin
+ \else
+ \if@twoside
+ \ifcase\m@mmpar@margin\relax% 0 - left
+ \memsetlengthmin\marginparwidth\spinemargin\foremargin
+ \or% 1 - right
+ \memsetlengthmin\marginparwidth\spinemargin\foremargin
+ \or% 2 - outer
+ \setlength\marginparwidth{\foremargin}
+ \or% 3 - inner
+ \setlength\marginparwidth{\spinemargin}
+ \fi
+ \else % oneside
+ \ifnum\m@mmpar@margin=0% left
+ \setlength\marginparwidth{\spinemargin}
+ \else% right
+ \setlength\marginparwidth{\foremargin}
+ \fi
+ \fi
+ \fi
+ \addtolength\marginparwidth{-2\marginparsep}
+ \ifdim\marginparwidth<1pt\setlength\marginparwidth{1pt}\fi%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@reset@used@macros}
+% This macro is used to unset used macros. It is a manually
+% maintained macro. A better version would have been to let
+% \cs{memsetmacroused} record its use in a list, and then loop over
+% this list. Maybe some other time.
+% \begin{macrocode}
+\newcommand\mem@reset@used@macros{%
+ \memsetmacrounused\setmarginnotes
+ \memsetmacrounused\settypeblocksize
+ \memsetmacrounused\setulmargins
+ \memsetmacrounused\setlrmargins
+}
+
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\checkthelayout}
+% \cs{checkthelayout}\oarg{text} is the user level macro for
+% checking the layout. The \meta{text} argument controls which
+% algorithm should be used to calculate the \cs{textheight}.
+% \changes{v1.61803}{2008/01/30}{Extended \cs{checkthelayout} to include a choice
+% of algorithms (mempatch v4.5)}
+% \changes{v1.61803}{2008/01/30}{Changed some page layout tests to negative from zero or negative
+% (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\checkthelayout}[1][classic]{%
+% \end{macrocode}
+% First check the dimensions are not (zero or) negative.
+% \begin{macrocode}
+ \@memnegtest{\trimedge}
+ \@memnegtest{\trimtop}
+ \@memznegtest{\stockwidth}
+ \@memznegtest{\paperwidth}
+ \@memznegtest{\textwidth}
+%%% \@memznegtest{\spinemargin}
+ \@memnegtest{\spinemargin}
+%%% \@memznegtest{\foremargin}
+ \@memnegtest{\foremargin}
+ \@memznegtest{\marginparsep}
+ \@memznegtest{\marginparwidth}
+ \@memznegtest{\stockheight}
+ \@memznegtest{\paperheight}
+ \@memznegtest{\textheight}
+%%% \@memznegtest{\uppermargin}
+ \@memnegtest{\uppermargin}
+%%% \@memznegtest{\lowermargin}
+ \@memnegtest{\lowermargin}
+%%% \@memznegtest{\headheight}
+ \@memnegtest{\headheight}
+%%% \@memznegtest{\headsep}
+ \@memnegtest{\headsep}
+%%% \@memznegtest{\footskip}
+ \@memnegtest{\footskip}
+% \end{macrocode}
+%
+% Carry on regardless. We may need to adjust the \cs{textheight}
+% to get an integral number of lines.
+% \begin{macrocode}
+ \nametest{#1}{classic}%
+ \ifsamename
+ \m@mclassicht
+ \else
+ \nametest{#1}{lines}%
+ \ifsamename
+ \m@mlinesht
+ \else
+ \nametest{#1}{nearest}%
+ \ifsamename
+ \m@mnearestht
+ \else
+ \nametest{#1}{fixed}
+ \ifsamename
+ \else% not classic, lines, nearest, or fixed
+ \@memerror{Optional argument is not one of:\MessageBreak
+ classic, fixed, lines, or nearest. \MessageBreak
+ I will assume the default}%
+ {\@ehc}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \setulmargins{\uppermargin}{*}{*}
+% \end{macrocode}
+%
+% Check that all the sums add up correctly, or
+% at least to within a small (\cs{@tempdimb}) error.
+% \changes{v1.618033}{2008/06/02}{Added more information about problematic
+% layout values}
+% \begin{macrocode}
+ \@tempdimb = -1pt
+ \@tempdima=\stockwidth
+ \advance\@tempdima -\trimedge
+ \advance\@tempdima -\paperwidth
+ \ifdim\@tempdima<\@tempdimb
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\paperwidth\space (\the\paperwidth) and/or
+ \protect\trimedge\space (\the\trimedge)
+ are too large for \protect\stockwidth\space (\the\stockwidth)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi
+ \@tempdima = \paperwidth
+ \advance\@tempdima -\foremargin
+ \advance\@tempdima -\textwidth
+ \advance\@tempdima -\spinemargin
+ \ifdim\@tempdima<\@tempdimb
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\spinemargin\space (\the\spinemargin) and/or
+ \protect\textwidth\space (\the\textwidth) and/or
+ \protect\foremargin\space (\the\foremargin)
+ are too large for \protect\paperwidth\space (\the\paperwidth)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi
+ \@tempdima = \stockheight
+ \advance\@tempdima -\trimtop
+ \advance\@tempdima -\paperheight
+ \ifdim\@tempdima<\@tempdimb
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\paperheight\space (\the\paperheight) and/or
+ \protect\trimtop\space (\the\trimtop)
+ are too large for \protect\stockheight\space (\the\stockheight)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi
+ \@tempdima = \paperheight
+ \advance\@tempdima -\uppermargin
+ \advance\@tempdima -\textheight
+ \advance\@tempdima -\lowermargin
+ \ifdim\@tempdima<\@tempdimb
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\uppermargin\space (\the\uppermargin) and/or
+ \protect\textheight\space (\the\textheight) and/or
+ \protect\lowermargin\space (\the\lowermargin)
+ are too large for \protect\paperheight\space (\the\paperheight)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi
+ \@tempdima = \uppermargin
+ \advance\@tempdima -\headheight
+ \advance\@tempdima -\headsep
+ \ifdim\@tempdima<\@tempdimb
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\headheight\space (\the\headheight) and/or
+ \protect\headsep\space (\the\headsep)
+ are too large for \protect\uppermargin\space (\the\uppermargin)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi
+ \@tempdima = \lowermargin
+ \advance\@tempdima -\footskip
+ \ifdim\@tempdima<\z@
+ \@tempdima = -\@tempdima
+ \@memerror{\protect\footskip\space (\the\footskip)
+ is too large for \protect\lowermargin\space (\the\lowermargin)
+ by \the\@tempdima}%
+ {\@ehd}
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fixthelayout}
+% Calculate the normal
+% \LaTeX{} page layout parameter values. We'll do the heights first
+% as they are independent of the number of columns and the side printing.
+% \changes{v1.0a}{2002/01/18}{Added \cs{fixthelayout}}
+% \begin{macrocode}
+\newcommand*{\fixthelayout}{%
+ \topmargin = \trimtop
+ \advance\topmargin \uppermargin
+ \advance\topmargin -\headsep
+ \advance\topmargin -\headheight
+ \advance\topmargin -1in\relax
+% \end{macrocode}
+%
+% Now the \cs{oddsidemargin}.
+% \begin{macrocode}
+ \oddsidemargin = \stockwidth
+ \advance\oddsidemargin -\trimedge
+ \advance\oddsidemargin -\paperwidth
+ \advance\oddsidemargin \spinemargin
+ \advance\oddsidemargin -1in\relax
+% \end{macrocode}
+%
+% And the \cs{evensidemargin}.
+% \begin{macrocode}
+ \evensidemargin = \trimedge
+ \advance\evensidemargin \foremargin
+ \advance\evensidemargin -1in\relax
+% \end{macrocode}
+%
+%
+% Set the values to the nearest whole point.
+% \changes{v3.7g}{2018/03/09}{Switch to private truncating macro so we
+% can disable truncation via class option}
+% \begin{macrocode}
+ \mem@settopoint\textwidth
+ \mem@settopoint\oddsidemargin
+ \mem@settopoint\evensidemargin
+% \end{macrocode}
+% Fix standard page layouts after possible change of \cs{textwidth}.
+% \changes{v1.6180339f}{2009/03/16}{Added \cs{fixheaderwidths} to \cs{fixthelayout}}
+% \begin{macrocode}
+ \fixheaderwidths
+% \end{macrocode}
+% Autoadjust \cs{marginparwidth} unless the user have used
+% \cs{setmarginnotes}. Plus add a reset of the recordedmacros, just in
+% case \cs{fixthelayout} is being used several times.
+% \changes{v3.6k}{2013/05/15}{Added autoadjust}
+% \begin{macrocode}
+ \memifmacroused\setmarginnotes{}{\mem@autoadjust@marginparwidth}
+ \mem@reset@used@macros
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typeoutlayout}
+% \begin{macro}{\settypeoutlayoutunit}
+% \begin{macro}{\mem@typeouttwolengths}
+% \begin{macro}{\mem@typeoutonelength}
+% Why not type out the calculated versions of the designed values?
+% \changes{v1.0a}{2002/01/18}{Added \cs{typeoutlayout}}
+% \changes{v1.0a}{2002/01/25}{Added column info to \cs{typeoutlayout}}
+% \changes{v1.61803}{2008/01/30}{Added sidecap and sidebar data to \cs{typeoutlayout}
+% (mempatch v4.6)}
+% \changes{v1.61803398d}{2010/02/04}{Added information about side feet}
+% \changes{v3.6g}{2010/09/17}{Added feature such that user can change
+% the unit used by \cs{typeoutlayout}, requested by Rasmus Villemoes}
+% Using the macro \cs{settypeoutlayoutunit}\marg{unit} before
+% \cs{typeoutlayout} (or more often \cs{checkandfixthelayout}), the
+% user can choose the unit in which the list is typeset. The code is
+% inspired by the \texttt{printlen} package.
+% \begin{macrocode}
+\newcommand\settypeoutlayoutunit[1]{
+ \nametest{#1}{pt}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{1.0}
+ \else
+ \nametest{#1}{pc}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.083333}
+ \else
+ \nametest{#1}{in}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.013837}
+ \else
+ \nametest{#1}{mm}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.351459}
+ \else
+ \nametest{#1}{cm}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.0351459}
+ \else
+ \nametest{#1}{bp}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.996264}
+ \else
+ \nametest{#1}{dd}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.9345718}
+ \else
+ \nametest{#1}{cc}
+ \ifsamename
+ \def\mem@tl@unit{#1}
+ \def\mem@tl@unitperpt{0.0778809}
+ \else
+ \@memerror{Unknown unit '#1' not suitable for layout listing}{}
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% Default value is \texttt{pt}, other supported are \texttt{mm},
+% \texttt{cm}, \texttt{in}, \texttt{bp}, \texttt{dd} and \texttt{cc}.
+% \begin{macrocode}
+\settypeoutlayoutunit{pt}
+% \end{macrocode}
+% To help with the typesetting, we need to helper macros:
+% \begin{macrocode}
+\newcommand\mem@typeouttwolengths[4]{
+ % #1 = text before
+ % #2 = first length
+ % #3 = text between
+ % #4 = second length
+ \setlength\@tempdimc{\mem@tl@unitperpt #2}
+ \edef\l@first{\strip@pt\@tempdimc}%
+ \setlength\@tempdimc{\mem@tl@unitperpt #4}
+ \edef\l@second{\strip@pt\@tempdimc}%
+ \typeout{#1: \l@first\mem@tl@unit\space#3\space\l@second\mem@tl@unit}
+}
+\newcommand\mem@typeoutonelength[2]{
+ % #1 = text before
+ % #2 = first length
+ \setlength\@tempdimc{\mem@tl@unitperpt #2}
+ \edef\l@first{\strip@pt\@tempdimc}%
+ \typeout{#1: \l@first\mem@tl@unit}
+}
+% \end{macrocode}
+% Thirdly \cs{typeoutlayout} need to be rewritten to take care of the
+% extra convertions
+% \begin{macrocode}
+\newcommand*{\typeoutlayout}{%
+ \typeout{}
+ \typeout{******************************************************}
+ % \typeout{Stock height and width:
+ % \the\stockheight\space by \the\stockwidth}
+ % \typeout{Top and edge trims:
+ % \the\trimtop\space and \the\trimedge}
+ % \typeout{Page height and width:
+ % \the\paperheight\space by \the\paperwidth}
+ % \typeout{Text height and width:
+ % \the\textheight\space by \the\textwidth}
+ % \typeout{Spine and edge margins:
+ % \the\spinemargin\space and \the\foremargin}
+ % \typeout{Upper and lower margins:
+ % \the\uppermargin\space and \the\lowermargin}
+ % \typeout{Headheight and headsep:
+ % \the\headheight\space and \the\headsep}
+ % \typeout{Footskip:
+ % \the\footskip}
+ % \typeout{Columnsep and columnseprule:
+ % \the\columnsep\space and \the\columnseprule}
+ % \typeout{Marginparsep and marginparwidth:
+ % \the\marginparsep\space and \the\marginparwidth}
+ % \typeout{Sidecapsep and sidecapwidth:
+ % \the\sidecapsep\space and \the\sidecapwidth}
+ % \typeout{Sidebarhsep and sidebarwidth:
+ % \the\sidebarhsep\space and \the\sidebarwidth}
+ % \typeout{Sidebarvsep and sidebartopsep:
+ % \the\sidebarvsep\space and \the\sidebartopsep}
+ % \typeout{Sidebarheight:
+ % \the\dimen\sideins}
+ % \typeout{Sidefoothsep and sidefootwidth:
+ % \the\sidefoothsep\space and \the\sidefootwidth}
+ % \typeout{Sidefootvsep and sidefootheight:
+ % \the\sidefootvsep\space and \the\sidefootheight}
+ \mem@typeouttwolengths{Stock height and width}{\stockheight}{by}{\stockwidth}
+ \mem@typeouttwolengths{Top and edge trims}{\trimtop}{and}{\trimedge}
+ \mem@typeouttwolengths{Page height and width}{\paperheight}{by}{\paperwidth}
+ \mem@typeouttwolengths{Text height and width}{\textheight}{by}{\textwidth}
+ \mem@typeouttwolengths{Spine and edge margins}{\spinemargin}{and}{\foremargin}
+ \mem@typeouttwolengths{Upper and lower margins}{\uppermargin}{and}{\lowermargin}
+ \mem@typeouttwolengths{Headheight and headsep}{\headheight}{and}{\headsep}
+ \mem@typeoutonelength{Footskip}{\footskip}
+ \mem@typeouttwolengths{Columnsep and columnseprule}{\columnsep}{and}{\columnseprule}
+ \mem@typeouttwolengths{Marginparsep and marginparwidth}{\marginparsep}{and}{\marginparwidth}
+ \mem@typeouttwolengths{Sidecapsep and sidecapwidth}{\sidecapsep}{and}{\sidecapwidth}
+ \mem@typeouttwolengths{Sidebarhsep and sidebarwidth}{\sidebarhsep}{and}{\sidebarwidth}
+ \mem@typeouttwolengths{Sidebarvsep and sidebartopsep}{\sidebarvsep}{and}{\sidebartopsep}
+ \mem@typeoutonelength{Sidebarheight}{\dimen\sideins}
+ \mem@typeouttwolengths{Sidefoothsep and sidefootwidth}{\sidefoothsep}{and}{\sidefootwidth}
+ \mem@typeouttwolengths{Sidefootvsep and sidefootheight}{\sidefootvsep}{and}{\sidefootheight}
+ \typeout{******************************************************}
+ \typeout{}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\checkandfixthelayout}
+% This macro checks and fixes the layout, and reports the result. It takes the
+% same optional argument as \cs{checkthelayout}.
+% \changes{v0.2}{2001/06/03}{Replaced \cs{fixpagelayout} by \cs{checkandfixthelayout}}
+% \changes{v1.0a}{2002/01/18}{Partitioned \cs{checkandfixthelayout}}
+% \changes{v1.61803}{2008/01/30}{Changed \cs{checkandfixthelayout}
+% for the extended \cs{checkthelayout} (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\checkandfixthelayout}[1][classic]{%
+ \checkthelayout[#1]%
+ \fixthelayout
+ \typeoutlayout}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\mem@fixpagelayout}
+% \changes{v3.7g}{2018/03/09}{Changed to use this instead of
+% \cs{fixpdflayout} and \cs{fixdvipslayout}, then we no longer need \Lpack{luatex85}}
+% Outputting the size of the output document. This is a little tricky as
+% the various engines do not quite agree on which variables to use. As
+% of 2018 we will be using this: First of \cs{pdfpageheight/width} is
+% used by pdf(e)tex based enginges. We set them if they are
+% defined. Just incase someone need to be able to patch this, we make
+% it into a macro and just run it at the start of the cocument
+% \begin{macrocode}
+\newcommand\mem@fixpagelayout{%
+ \@ifundefined{pdfpageheight}{}{\pdfpageheight=\the\stockheight}
+ \@ifundefined{pdfpagewidth}{}{\pdfpagewidth=\the\stockwidth}
+% \end{macrocode}
+% Next comes the two macros that recent luaTeX versions use instead of
+% the \cs{pdf...} equivalents.
+% \begin{macrocode}
+ \@ifundefined{pageheight}{}{\pageheight=\the\stockheight}
+ \@ifundefined{pagewidth}{}{\pagewidth=\the\stockwidth}
+% \end{macrocode}
+% If is unclear why these were added to the class sources in the first
+% place, we'll just leave them.
+% \begin{macrocode}
+ \@ifundefined{pdfvorigin}{}{\ifdim\pdfvorigin=0pt\pdfvorigin=1in\fi}
+ \@ifundefined{pdfhorigin}{}{\ifdim\pdfhorigin=0pt\pdfhorigin=1in\fi}
+% \end{macrocode}
+% Lastly we need to output a special to the DVI, but other engines can
+% also understand specials, so to not end up getting those pesky
+% non-PDF special warnings, we need some engine tests before emiting
+% the data to the DVI.
+% \begin{macrocode}
+ \ifluatex\else
+ \ifxetex\else
+ \ifpdf\else
+ \AtBeginDvi{\special{papersize=\the\stockwidth,\the\stockheight}}
+ \fi
+ \fi
+ \fi
+}
+
+\AtBeginDocument{\mem@fixpagelayout}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fixpdflayout}
+% \begin{macro}{\fixdvipslayout}
+% As of 2018 these are disabled
+% ^^A % Page layout with pdf\LaTeX{} seems a bit iffy.
+% ^^A % At the suggestion of Lars Madsen, help with
+% ^^A % setting viewer (e.g., ghostview)
+% ^^A % window sizes for dvi/ps. \cs{fixdvipslayout} does for \file{dvi} output
+% ^^A % as \cs{fixpdflayout} does for \file{pdf} output.
+% \changes{v1.4}{2003/11/22}{Added \cs{fixpdflayout} (from patch v1.6)}
+% \changes{v1.4}{2003/12/01}{Added \cs{fixdvipslayout} }
+% \changes{v1.61803398}{2009/08/17}{on ctt dynamotwain suggested a
+% change to \cs{fixpdflayout} and the following \cs{AtBeginDocument}
+% such that the \cs{special} is not outputtet when running xelatex}
+% \begin{macrocode}
+\newcommand*{\fixpdflayout}{%
+ \ClassWarning{memoir}{As of 2018, \string\fixpdflayout\ is no longer used}
+ % \pdfpageheight=\the\stockheight
+ % \pdfpagewidth=\the\stockwidth
+ % \ifxetex\else
+ % \ifdim\pdfvorigin=0pt\pdfvorigin=1in\fi
+ % \ifdim\pdfhorigin=0pt\pdfhorigin=1in\fi
+ % \fi
+}
+\newcommand*{\fixdvipslayout}{%
+ \ClassWarning{memoir}{As of 2018, \string\fixdvipslayout\ is no longer used}
+ %\AtBeginDvi{\special{papersize=\the\stockwidth,\the\stockheight}}
+}
+% \end{macrocode}
+
+% ^^A % \AtBeginDocument{%
+% ^^A % \ifxetex
+% ^^A % \fixpdflayout
+% ^^A % \else
+% ^^A % \ifpdf
+% ^^A % \ifnum\pdfoutput<\@ne
+% ^^A % \fixdvipslayout
+% ^^A % \else
+% ^^A % \fixpdflayout
+% ^^A % \fi
+% ^^A % \else
+% ^^A % \fixdvipslayout
+% ^^A % \fi
+% ^^A % \fi}
+
+%
+% ^^A % With a landscape document when going \texttt{latex -> dvips} the
+% ^^A % resulting \file{.ps} file
+% ^^A % may apear upside down in \texttt{ghostview}. If this happens, try putting
+% ^^A % the following in the document preamble:
+% ^^A % \begin{verbatim}
+% ^^A % \addtodef{\fixdvipslayout}{}{%
+% ^^A % \special{!TeXDict begin /landplus90{true}store end }}
+% ^^A % \end{verbatim}
+% ^^A % See \texttt{http://www.radicaleye.com.dvips.html} (DVIPS Home Page) for
+% ^^A % an explanation.
+% ^^A %
+% ^^A % Some other potential specials for PostScript printing may be
+% ^^A % (at least for an HP 5SiMx LaserJet duplex printer):
+% ^^A % \begin{verbatim}
+% ^^A % \special{!TeXDict begin <</Duplex true>>
+% ^^A % setpagedevice end} % duplex
+% ^^A % \special{!TeXDict begin <</Tumble true>>
+% ^^A % setpagedevice end} % short side binding
+% ^^A % \end{verbatim}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\typeoutstandardlayout}
+% Types out the current values of the standard page layout parameters.
+% \changes{v1.0a}{2002/01/25}{Added \cs{typeoutstandardlayout}}
+% \changes{v3.6g}{2010/09/17}{changed such that the user can change
+% the unit being used}
+% \begin{macrocode}
+\newcommand{\typeoutstandardlayout}{%
+ \typeout{}
+ \typeout{******************************************************}
+ % \typeout{Page height and width:
+ % \the\paperheight\space by \the\paperwidth}
+ \mem@typeouttwolengths{Page height and width}{\paperheight}{by}{\paperwidth}
+ % \typeout{Text height and width:
+ % \the\textheight\space by \the\textwidth}
+ \mem@typeouttwolengths{Text height and width}{\textheight}{by}{\textwidth}
+ % \typeout{Oddside and evenside margins:
+ % \the\oddsidemargin\space and \the\evensidemargin}
+ \mem@typeouttwolengths{Oddside and evenside margins}{\oddsidemargin}{and}{\evensidemargin}
+ % \typeout{Topmargin and footskip:
+ % \the\topmargin\space and \the\footskip}
+ \mem@typeouttwolengths{Topmargin and footskip}{\topmargin}{and}{\footskip}
+ % \typeout{Headheight and headsep:
+ % \the\headheight\space and \the\headsep}
+ \mem@typeouttwolengths{Headheight and headsep}{\headheight}{and}{\headsep}
+ % \typeout{Columnsep and columnseprule:
+ % \the\columnsep\space and \the\columnseprule}
+ \mem@typeouttwolengths{Columnsep and columnseprule}{\columnsep}{and}{\columnseprule}
+ % \typeout{Marginparsep and marginparwidth:
+ % \the\marginparsep\space and \the\marginparwidth}
+ \mem@typeouttwolengths{Marginparsep and marginparwidth}{\marginparsep}{and}{\marginparwidth}
+ \typeout{******************************************************}
+ \typeout{}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Some predefined layouts}
+%
+% A few predefined layouts for the textblock are presented. The \cs{checkandfixthelayout}
+% macro \emph{must} be called afterwards.
+%
+% \begin{macro}{\medievalpage}
+% This implements Jan Tschichold's reconstruction of the page and textblock
+% layout used by medieval scribes and the early printers~\cite{}.
+% The spine, top, edge and bottom margins are in the ratios 2:3:4:6.
+%
+% \cs{medievalpage}\oarg{num} positions the typeblock on the page with the
+% margins in the above ratios. The spine margin is (page width)/\meta{num}
+% (default 9). This must be an integer.
+% \changes{v1.61803}{2008/01/30}{Added \cs{medievalpage}}
+% \begin{macrocode}
+%%%% s = w/#1, t = 1.5s, e = 2s, f = 3s
+\newcommand*{\medievalpage}[1][9]{%
+ \spinemargin=\paperwidth
+ \divide\spinemargin #1\relax
+ \uppermargin = 1.5\spinemargin
+ \setlrmarginsandblock{\spinemargin}{*}{2}
+ \setulmarginsandblock{\uppermargin}{*}{2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\isopage}
+% An implementation of Bringhurst's layout for ISO proportioned pages.
+% It works for any page though. The edge margin is twice the spine,
+% and the bottom margin is twice the top.
+%
+% \cs{isopage}\oarg{num} positions and sizes the typeblock on the page
+% according to the above ratios. The spine is (page width)/\meta{num}
+% and the top margin id (page height)/\meta{num}. \meta{num} must be
+% an integer.
+% \changes{v1.61803}{2008/01/30}{Added \cs{isopage}}
+% \begin{macrocode}
+% s = w/#1, e = 2s, t = h/#1, f = 2h
+\newcommand*{\isopage}[1][9]{%
+ \spinemargin=\paperwidth
+ \divide\spinemargin #1\relax
+ \uppermargin=\paperheight
+ \divide\uppermargin #1\relax
+ \setlrmarginsandblock{\spinemargin}{*}{2}
+ \setulmarginsandblock{\uppermargin}{*}{2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\semiisopage}
+% An variation on Bringhurst's layout for ISO proportioned pages.
+% It works for any page though. The top margin is the same as the spine,
+% and the edge and bottom margins are twice the spine.
+%
+% \cs{semiisopage}\oarg{num} positions and sizes the typeblock on the page
+% according to the above ratios. The spine is (page width)/\meta{num}.
+% \meta{num} must be an integer.
+% \changes{v1.61803}{2008/01/30}{Added \cs{isopage}}
+% \begin{macrocode}
+%%% s = w/#1, t = s, e = 2s, f = e
+\newcommand*{\semiisopage}[1][9]{%
+ \spinemargin=\paperwidth
+ \divide\spinemargin #1\relax
+ \uppermargin=\spinemargin
+ \setlrmarginsandblock{\spinemargin}{*}{2}
+ \setulmarginsandblock{\uppermargin}{*}{2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setpagebl}
+% \begin{macro}{\setpageml}
+% \begin{macro}{\setpagetl}
+% \begin{macro}{\setpagetm}
+% \cs{setpagebl}\marg{height}\marg{width}\marg{ratio} sets a page smaller than
+% the stock size at the bottom left of the stock. The arguments are the
+% the same as for \cs{settrimmedsize};
+% \meta{height}, \meta{width} and \meta{ratio} of height and width
+% (choose any two) of the desired page size. The trims are adjusted to suit.
+% \cs{setpagetl} puts the page at the top left, \cs{setpageml} at the
+% middle left, and \cs{setpagetm} at the top middle.
+% \changes{v1.61803}{2008/01/30}{Added \cs{setpagebl}, \cs{setpageml}, and
+% \cs{setpagetl}}
+% \changes{v1.6180339c}{2008/12/26}{Added \cs{setpagetm}}
+% \begin{macrocode}
+\newcommand*{\setpagebl}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth}
+\newcommand*{\setpageml}[3]{%
+ \settrimmedsize{#1}{#2}{#3}
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \advance\trimtop -0.5\trimtop
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth}
+\newcommand*{\setpagetl}[3]{%
+ \settrimmedsize{#1}{#2}{#3}
+ \trimtop=0pt
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth}
+\newcommand*{\setpagetm}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=0pt
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth
+ \advance\trimedge -0.5\trimedge}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setpagetr}
+% \begin{macro}{\setpagemr}
+% \begin{macro}{\setpagebr}
+% \begin{macro}{\setpagebm}
+% \begin{macro}{\setpagecc}
+% Similar to those above, these macros set the page on the stock
+% at the top right, middle right, bottom right, bottom middle, and centered.
+% \changes{v1.6180339c}{2008/12/26}{Added \cs{setpagetr}, \cs{setpagemr}, \cs{setpagebr},
+% \cs{setpagebm} and \cs{setpagecc}}
+% \begin{macrocode}
+\newcommand*{\setpagetr}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=0pt
+ \trimedge=0pt}
+\newcommand*{\setpagemr}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \advance\trimtop -0.5\trimtop
+ \trimedge=0pt}
+\newcommand*{\setpagebr}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \trimedge=0pt}
+\newcommand*{\setpagebm}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth
+ \advance\trimedge -0.5\trimedge}
+\newcommand*{\setpagecc}[3]{%
+ \settrimmedsize{#1}{#2}{#3}%
+ \trimtop=\stockheight \advance\trimtop -\paperheight
+ \advance\trimtop -0.5\trimtop
+ \trimedge=\stockwidth \advance\trimedge -\paperwidth
+ \advance\trimedge -0.5\trimedge}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Float placement parameters}
+%
+%
+% All float parameters are given default values in the \LaTeX{}
+% kernel. For this reason counters only need to be set with
+% \cs{setcounter} and other parameters are set using \cs{renewcommand}.
+%
+% \paragraph{Limits for the placement of floating objects}
+%
+% The settings here make it easier to place floats than with the
+% standard classes.
+%
+% \begin{macro}{\c@topnumber}
+% The \Lcount{topnumber} counter holds the maximum number of
+% floats that can appear on the top of a text page (classically 2)
+% \begin{macrocode}
+\setcounter{topnumber}{3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\topfraction}
+% This indicates the maximum part of a text page that can be
+% occupied by floats at the top (classically 0.7).
+% \begin{macrocode}
+\renewcommand{\topfraction}{.85}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@bottomnumber}
+% The \Lcount{bottomnumber} counter holds the maximum number of
+% floats that can appear on the bottom of a text page (classically 1).
+% \begin{macrocode}
+\setcounter{bottomnumber}{2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bottomfraction}
+% This indicates the maximum part of a text page that can be
+% occupied by floats at the bottom (classically 0.3).
+% \begin{macrocode}
+\renewcommand{\bottomfraction}{.5}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@totalnumber}
+% This indicates the maximum number of floats that can appear on
+% any text page (classically 3).
+% \begin{macrocode}
+\setcounter{totalnumber}{4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\textfraction}
+% This indicates the minimum part of a text page that has to be
+% occupied by text (classically 0.2).
+% \begin{macrocode}
+\renewcommand{\textfraction}{.1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\floatpagefraction}
+% This indicates the minimum part of a page that has to be
+% occupied by floating objects before a `float page' is
+% produced (classically 0.5).
+% \begin{macrocode}
+\renewcommand{\floatpagefraction}{.7}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@dbltopnumber}
+% The \Lcount{dbltopnumber} counter holds the maximum number of
+% two column floats that can appear on the top of a two column text
+% page (classically 2).
+% \begin{macrocode}
+\setcounter{dbltopnumber}{3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dbltopfraction}
+% This indicates the maximum part of a two column text page that
+% can be occupied by two column floats at the top (classically 0.7).
+% \begin{macrocode}
+\renewcommand{\dbltopfraction}{.85}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dblfloatpagefraction}
+% This indicates the minimum part of a page that has to be
+% occupied by two column wide floating objects before a `float
+% page' is produced (classically 0.5).
+% \begin{macrocode}
+\renewcommand{\dblfloatpagefraction}{.7}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Page Styles}
+%
+% The page style \pstyle{foo} is defined by defining the command
+% \cs{ps@foo}. This command should make only local definitions.
+% There should be no stray spaces in the definition, since they
+% could lead to mysterious extra spaces in the output.
+%
+% \begin{macro}{\@evenhead}
+% \begin{macro}{\@oddhead}
+% \begin{macro}{\@evenfoot}
+% \begin{macro}{\@oddfoot}
+% The \cs{ps@...} command defines the macros \cs{@oddhead},
+% \cs{@oddfoot}, \cs{@evenhead}, and \cs{@evenfoot} to define the running
+% heads and feet---e.g., \cs{@oddhead} is the macro to produce the
+% contents of the heading box for odd-numbered pages. It is called
+% inside an \cs{hbox} of width \cs{textwidth}.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Marking conventions}
+%
+% To make headings determined by the sectioning commands, the page
+% style defines the commands \cs{chaptermark}, \cs{sectionmark},
+% \ldots,\\
+% where \cs{chaptermark}\marg{TEXT} is called by
+% \cs{chapter} to set a mark, and so on.
+%
+% The \cs{...mark} commands and the \cs{...head} macros are defined
+% with the help of the following macros. (All the \cs{...mark}
+% commands should be initialized to no-ops.)
+%
+% \LaTeX{} extends \TeX's \cs{mark} facility by producing two kinds
+% of marks, a `left' and a `right' mark, using the following
+% commands:
+% \begin{flushleft}
+% \cs{markboth}\marg{LEFT}\marg{RIGHT}: Adds both marks.
+%
+% \cs{markright}\marg{RIGHT}: Adds a `right' mark.
+%
+% \cs{leftmark}: Used in the \cs{@oddhead}, \cs{@oddfoot}, \cs{@evenhead}
+% or \cs{@evenfoot} macros, it gets the current `left'
+% mark. \cs{leftmark} works like \TeX's \cs{botmark}
+% command.
+%
+% \cs{rightmark}: Used in the \cs{@oddhead}, \cs{@oddfoot}, \cs{@evenhead}
+% or \cs{@evenfoot} macros, it gets the current
+% `right' mark. \cs{rightmark} works like \TeX's
+% \cs{firstmark} command.
+% \end{flushleft}
+%
+% The marking commands work reasonably well for right marks
+% `numbered within' left marks--e.g., the left mark is changed by a
+% \cs{chapter} command and the right mark is changed by a \cs{section}
+% command. However, it does produce somewhat anomalous results if
+% two \cs{markboth}'s occur on the same page.
+%
+%
+% Commands like \cs{tableofcontents} that should set the marks in some
+% page styles use a \cs{@mkboth} command, which is \cs{let} by the
+% pagestyle command (\cs{ps@...}) to \cs{markboth} for setting the
+% heading or to \cs{@gobbletwo} to do nothing.
+%
+%
+%
+% \subsection{Defining the page styles}
+%
+% This class provides a set of commands for the user to define new
+% pagestyles. Essentially defining a pagestyle consists of defining the
+% macros \cs{@evenhead}, \cs{@oddhead}, \cs{@evenfoot}, and \cs{@oddfoot}.
+% For this class, each header and footer is treated as three parts: a left,
+% center, and right part. In this case, defining a pagestyle consists of
+% specifying these 12 portions of the running headers and footers. The
+% width of the headers/footers may also be specified, rules may be drawn
+% below the headers and/or above the footers, and the complete header and/or
+% footer may be offset with respect to the textblock when the width is not
+% the same as the textwidth.
+%
+% In the following \meta{style} is the name of a pagestyle being defined
+% (e.g., \verb?ruled?).
+%
+% \changes{v1.61803398d}{2010/02/09}{Added the following three macros}
+% \begin{macro}{\mem@set@ps@xtra@info}
+% \begin{macro}{\mem@ps@find@real}
+% \begin{macro}{\mem@ps@safe@change}
+% The class supports an aliasing feature, where a page style name can
+% actually call the code from another. Quite handy. But There might be
+% problems if a use try to modify an alias page style. We care for
+% this by storing some information about each page style, and throwing
+% an error if the user atempts to alter a page style marked as an
+% alias.
+%
+% \verb?\mem@set@ps@xtra@info? store two things: the name of the style
+% we are an alias for (if we are not an alias it will be blank) and an
+% indicator whether we are an alias (00 if we are and 01 if we are not).
+% \begin{macrocode}
+\newcommand\mem@set@ps@xtra@info[3]{%
+ \@namedef{ps@#1@aliasfor}{#2}%
+ \@namedef{ps@#1@isalias}{#3}}
+
+% \end{macrocode}
+% \verb?\mem@ps@find@real? starts at a given page style, if it is
+% marked as an alias, it will recursively go down the chain of aliases
+% and save the name of the first real page style in \verb?\@tempa?.
+% \begin{macrocode}
+\newcommand\mem@ps@find@real[1]{%
+ \if\@nameuse{ps@#1@isalias}\relax
+ \mem@ps@find@real{\@nameuse{ps@#1@aliasfor}}
+ \else\def\@tempa{#1}\fi}
+
+% \end{macrocode}
+% \verb?\mem@ps@safe@change? takes a page style name, checks to see if
+% it is defined, if it is, it checks to see if it is safe to change
+% it.
+% \changes{v3.7c}{2014/05/20}{Typo reported by Werner Grundlingh}
+% \begin{macrocode}
+\newcommand\mem@ps@safe@change[1]{%
+ \@ifundefined{ps@#1}{%
+ \@memerror{Undefined pagestyle '#1', so I cannot change it}{}}{}
+ \if\@nameuse{ps@#1@isalias}\relax \mem@ps@find@real{#1}
+ \@memerror{The pagestyle '#1' is marked as an alias page style.^^J
+ Modifying an alias page style may give unexpected results.^^J The
+ alias chain resolves to the real page style '\@tempa', so try
+ issuing^^J \string\copypagestyle{#1}{\@tempa}^^J
+ before modifying '#1'}{} \fi }
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makeevenhead}
+% The command
+% \cs{makeevenhead}\marg{style}\marg{left}\marg{center}\marg{right}
+% specifies that the left, center and right portions of the even header for
+% pagestyle \meta{style} are defined as the other three arguments, respectiveley.
+% Internally it defines the commands \cs{styleeheadl}, \cs{styleeheadc} and
+% \cs{styleeheadr} to be \meta{left}, \meta{center} and \meta{right} respectively.
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand{\makeevenhead}[4]{%
+ \mem@ps@safe@change{#1}
+ \@namedef{#1eheadl}{#2}
+ \@namedef{#1eheadc}{#3}
+ \@namedef{#1eheadr}{#4}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makeoddhead}
+% \begin{macro}{\makeevenfoot}
+% \begin{macro}{\makeoddfoot}
+% These three macros are similar to \cs{makeevenhead} except that they are
+% for the oddhead, evenfoot and oddfoot.
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand{\makeoddhead}[4]{%
+ \mem@ps@safe@change{#1}
+ \@namedef{#1oheadl}{#2}
+ \@namedef{#1oheadc}{#3}
+ \@namedef{#1oheadr}{#4}
+}
+\newcommand{\makeevenfoot}[4]{%
+ \mem@ps@safe@change{#1}
+ \@namedef{#1efootl}{#2}
+ \@namedef{#1efootc}{#3}
+ \@namedef{#1efootr}{#4}
+}
+\newcommand{\makeoddfoot}[4]{%
+ \mem@ps@safe@change{#1}
+ \@namedef{#1ofootl}{#2}
+ \@namedef{#1ofootc}{#3}
+ \@namedef{#1ofootr}{#4}
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makerunningwidth}
+% \begin{macro}{\makerunningheadwidth}
+% \begin{macro}{\makerunningfootwidth}
+% \begin{macro}{\m@mhfstyle}
+% \begin{macro}{\m@mopthfwidth}
+% The macro \cs{makerunningwidth}\marg{style}\oarg{ftlength}\marg{length}
+% sets the
+% width of the headers and footers of pagestyle \meta{style} to
+% be \meta{length}, but if \meta{ftlength} is present the footer
+% width is set to \meta{ftlength}. The lengths are stored as the
+% macros \cs{styleheadrunwidth} and \cs{stylefootrunwidth}. The two
+% widths can be set individually using
+% \cs{makerunningheadwidth}\marg{style}\marg{length} and
+% \cs{makerunningfootwidth}\marg{style}\marg{length}.
+% \changes{v1.6180339c}{2008/12/26}{Enabled the width of headers and footers
+% to be different
+% (requested by Wilhelm M\"{u}ller).}
+% \changes{v1.6180339c}{2009/01/13}{Added \cs{makerunningheadwidth}
+% and \cs{makerunningfootwidth}}.
+% \changes{v1.6180339d}{2009/02/04}{Fixed a mental bug, /daleif}
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand*{\makerunningwidth}[1]{%
+ \mem@ps@safe@change{#1}%
+ \def\m@mhfstyle{#1}%
+ \m@mopthfwidth}
+\newcommand*{\m@mopthfwidth}[2][\@mpty]{%
+% \setlength\@tempdima{#2}
+ \@namedef{\m@mhfstyle headrunwidth}{#2}%
+% \expandafter\edef\csname \m@mhfstyle headrunwidth\endcsname{\the\@tempdima}
+ \ifx\@mpty #1
+ \@namedef{\m@mhfstyle footrunwidth}{#2}%
+% \expandafter\edef\csname \m@mhfstyle footrunwidth\endcsname{\the\@tempdima}
+ \else
+ \@namedef{\m@mhfstyle footrunwidth}{#1}%
+% \setlength\@tempdima{#1}
+% \expandafter\edef\csname \m@mhfstyle footrunwidth\endcsname{\the\@tempdima}
+ \fi}
+\newcommand*{\makerunningheadwidth}[2]{%
+% \setlength\@tempdima{#2}%
+% \expandafter\edef\csname \m@mhfstyle headrunwidth\endcsname{\the\@tempdima}%
+ \mem@ps@safe@change{#1}%
+ \@namedef{#1headrunwidth}{#2}%
+}
+\newcommand*{\makerunningfootwidth}[2]{%
+% \setlength\@tempdima{#2}%
+ \mem@ps@safe@change{#1}%
+ \@namedef{#1footrunwidth}{#2}%
+% \expandafter\edef\csname \m@mhfstyle footrunwidth\endcsname{\the\@tempdima}%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\normalrulethickness}
+% \begin{macro}{\footruleheight}
+% \begin{macro}{\footruleskip}
+% \begin{macro}{\makeheadrule}
+% \begin{macro}{\makefootrule}
+% \cs{normalrulethickness} is the thickness of a normal horizontal
+% or vertical rule.
+% \cs{footruleheight} is the height of a normal rule above a footer (actually zero).
+% \cs{footruleskip} is a distance sufficient to ensure that a foot rule
+% will appear between the bottom of the textblock and above any actual footer.
+%
+% (There was a \ctt{} thread \textit{ngerman, fancyhdr and \cs{footrulewidth} --- bug?}
+% in December 2002 that bears on the definitions below).
+% \changes{v1.4}{2003/02/27}{Make \cs{normalrulethickness} a length,
+% not a macro (patch 1.1)}
+% \changes{v1.4}{2003/02/27}{Initialise \cs{footruleheight} to 0pt, not
+% \cs{z@skip} (patch 1.1)}
+% \begin{macrocode}
+\newlength{\normalrulethickness}
+ \setlength{\normalrulethickness}{0.4pt}
+\newcommand{\footruleheight}{0pt}
+\newcommand{\footruleskip}{0.3\normalbaselineskip}
+% \end{macrocode}
+% The macro \cs{makeheadrule}\marg{style}\marg{width}\marg{height}
+% specifies the width and height of the header rule for \meta{style}.
+%
+% Similarly
+% \cs{makefootrule}\marg{style}\marg{width}\marg{height}\marg{skip}
+% specifies the width, height and skip for the footrule.
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \changes{v3.7d}{2015/04/22}{Moved \cs{...(head|foot)ruleprefix} out and
+% added them else where}
+% \begin{macrocode}
+\newcommand{\makeheadrule}[3]{%
+ \mem@ps@safe@change{#1}%
+ \@namedef{#1headrule}{%
+ \hrule\@width #2\@height #3 \vskip-#3}}
+\newcommand{\makefootrule}[4]{%
+ \mem@ps@safe@change{#1}%
+ \@namedef{#1footrule}{%
+ \vskip-#4\vskip-#3%
+ \hrule\@width #2\@height #3 \vskip #4}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.6h}{2011/01/25}{Added this macro}
+% \begin{macro}{\makeheadfootruleprefix}
+% We insert a maro at the start of the head and foot rule. By default
+% it does nothing, but it can be ised to specify a different color to
+% the head or foot rules.
+% \begin{macrocode}
+\newcommand\makeheadfootruleprefix[3]{%
+ \@namedef{#1headruleprefix}{#2}%
+ \@namedef{#1footruleprefix}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makeheadposition}
+% \cs{makeheadposition}\marg{style}\marg{eheadpos}\marg{oheadpos}\marg{efootpos}\marg{ofootpos}
+% specifies the horizontal positioning of the even and odd headers and footers,
+% respectively,
+% for the pagestyle \meta{style}. Each of the \meta{...pos} arguments may be
+% either \verb?flushleft?, \verb?center? or \verb?flushright?, with the obvious meanings.
+% An empty argument (or an unrecognised one) is equivalent to \verb?center?.
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand{\makeheadposition}[5]{%
+ \mem@ps@safe@change{#1}%
+% \end{macrocode}
+% Do the even head position first.
+% \begin{macrocode}
+ \nametest{flushleft}{#2}
+ \ifsamename
+ \@namedef{#1evenheadpl}{\relax} \@namedef{#1evenheadpr}{\hss}
+ \else
+ \nametest{flushright}{#2}
+ \ifsamename
+ \@namedef{#1evenheadpl}{\hss} \@namedef{#1evenheadpr}{\relax}
+ \else
+ \@namedef{#1evenheadpl}{\hss} \@namedef{#1evenheadpr}{\hss}
+ \fi
+ \fi
+% \end{macrocode}
+% And similarly for the odd head and even \& odd footers.
+% \begin{macrocode}
+ \nametest{flushleft}{#3}
+ \ifsamename
+ \@namedef{#1oddheadpl}{\relax} \@namedef{#1oddheadpr}{\hss}
+ \else
+ \nametest{flushright}{#3}
+ \ifsamename
+ \@namedef{#1oddheadpl}{\hss} \@namedef{#1oddheadpr}{\relax}
+ \else
+ \@namedef{#1oddheadpl}{\hss} \@namedef{#1oddheadpr}{\hss}
+ \fi
+ \fi
+ \nametest{flushleft}{#4}
+ \ifsamename
+ \@namedef{#1evenfootpl}{\relax} \@namedef{#1evenfootpr}{\hss}
+ \else
+ \nametest{flushright}{#4}
+ \ifsamename
+ \@namedef{#1evenfootpl}{\hss} \@namedef{#1evenfootpr}{\relax}
+ \else
+ \@namedef{#1evenfootpl}{\hss} \@namedef{#1evenfootpr}{\hss}
+ \fi
+ \fi
+ \nametest{flushleft}{#5}
+ \ifsamename
+ \@namedef{#1oddfootpl}{\relax} \@namedef{#1oddfootpr}{\hss}
+ \else
+ \nametest{flushright}{#5}
+ \ifsamename
+ \@namedef{#1oddfootpl}{\hss} \@namedef{#1oddfootpr}{\relax}
+ \else
+ \@namedef{#1oddfootpl}{\hss} \@namedef{#1oddfootpr}{\hss}
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makepsmarks}
+% \begin{macro}{\makepshook}
+% The macro \cs{makepsmarks}\marg{style}\marg{code} specifies that
+% \meta{code} is the definition of the hook for pagestyle \meta{style}.
+% \cs{makepshook} was a deprecated version of \cs{makepsmarks} and is
+% now deleted.
+% \changes{v1.0}{2001/11/15}{Added \cs{makepsmarks} and deprecated
+% \cs{makepshook}}
+% \changes{v1.4}{2003/12/14}{Deleted \cs{makepshook}}
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand{\makepsmarks}[2]{\mem@ps@safe@change{#1}\@namedef{#1pshook}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mhe@dreset}
+% To cater for potential baselineskip changes, such as \verb?\linespread{2}?,
+% we have to ensure they don't percolate into the header/footer.
+% (See CTT thread \textit{memoir + linespread}, 2004/02/11)
+% \changes{v1.61}{2004/03/14}{Added \cs{m@mhe@dreset}}
+% \begin{macrocode}
+\newcommand*{\m@mhe@dreset}{\def\baselinestretch{1}\normalsize}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makeheadfootvposition}
+% The headers and footers are typeset inside \cs{parbox}'es, using
+% \cs{makeheadfootvposition}\marg{style}\marg{headvpos}\marg{footvpost}
+% users can specify whether the alignment should be b,t or~c.The
+% default is~b.
+% \changes{v1.6180339c}{2009/01/13}{Added support for
+% controlling the alignment of the headers and footers}
+% \changes{v1.61803398d}{2010/02/09}{Added safe change test}
+% \begin{macrocode}
+\newcommand*\makeheadfootvposition[3]{%
+ \mem@ps@safe@change{#1}%
+ \@namedef{#1headvplacement}{#2}\@namedef{#1footvplacement}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mem@maxheadheight}
+% \begin{macro}{\mem@maxfootheight}
+% \begin{macro}{\mem@sayonce@head}
+% \begin{macro}{\mem@sayonce@foot}
+% \begin{macro}{\mem@hf@measure@vbox}
+% \begin{macro}{\mem@toolarge@header@message}
+% \begin{macro}{\mem@toolarge@footer@message}
+% \changes{v3.6h}{2010/10/21}{Added the above seven macros to be able
+% to measure the headers and warn users if their design takes them outside.}
+% \verb?\mem@maxheadheight? and \verb?\mem@maxfootheight? globally
+% stores the max measured head and foot heights. Actually the footer
+% ought to be measuring the total height and depth. We may add this
+% later. The two XsayonceX macros are toggles used such that we can
+% add a warning at only the first bad head/foot. We repeat the message
+% at the end of the document.
+% \begin{macrocode}
+\newlength\mem@maxheadheight
+\newlength\mem@maxfootheight
+\newcommand\mem@sayonce@head{00}
+\newcommand\mem@sayonce@foot{00}
+% \end{macrocode}
+% This is the work horse of this construction. First argument is the
+% height to compare against, second should be \texttt{head} or
+% \texttt{foot}, third is the warning message, and the fourth is the
+% material to be measured. The idea to taken from \Lpack{fancyhdr}.
+% \begin{macrocode}
+\newcommand\mem@hf@measure@vbox[4]{%
+ \setbox0\vbox{#4}%
+ \ifdim\ht0>#1\relax%
+ \setlength\@tempdima{\@nameuse{mem@max#2height}}%
+ \ifdim\ht0>\@tempdima\relax%
+ \expandafter\global\@nameuse{mem@max#2height}=\ht0%
+ \expandafter\if\@nameuse{mem@sayonce@#2}\relax%
+ \@memwarn{#3}%
+ \global\@namedef{mem@sayonece@#2}{01}%
+ \fi%
+ \fi%
+ \fi%
+ \box0%
+}
+% \end{macrocode}
+% Warning messages
+% \begin{macrocode}
+\newcommand\mem@toolarge@header@message{%
+ The material used in the headers is too large^^J%
+ (\the\mem@maxheadheight) for the given head height
+ (\the\headheight), it is recommended to^^J%
+ either increase the head height or redesign the header^^J%
+ (in both cases you will find help in the memoir manual).%
+}
+\newcommand\mem@toolarge@footer@message{%
+ The material used in the footer is too large^^J%
+ (\the\mem@maxfootheight) for the given foot skip
+ (\the\footskip), it is recommended to^^J%
+ either increase the foot skip or redesign the footer^^J%
+ (in both cases you will find help in the memoir manual).%
+}
+% \end{macrocode}
+% To make things easier to read we make two short cut macros
+% \begin{macrocode}
+\newcommand\mem@hvboxm[1]{%
+ \mem@hf@measure@vbox\headheight{head}\mem@toolarge@header@message{#1}}
+\newcommand\mem@fvboxm[1]{%
+ \mem@hf@measure@vbox\footskip{foot}\mem@toolarge@footer@message{#1}}
+% \end{macrocode}
+% Make sure to repeat the message at the end of the document. This
+% will show the max value up until the point where the end of document
+% stuff is executed.
+% \begin{macrocode}
+\AtEndDocument{
+ \ifdim\mem@maxheadheight>\headheight
+ \@memwarn{\mem@toolarge@header@message}
+ \fi
+ \ifdim\mem@maxfootheight>\footskip
+ \@memwarn{\mem@toolarge@footer@message}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mem@ps@entry@wrap}
+% \changes{v3.6h}{2010/10/06}{Added this to help bidi control the
+% typesetting direction of the header and footer}
+% This macro is wrapped around eash entry in the headers and
+% footers. By default it does nothing, but can be redefined by
+% packages such as \Lpack{bidi} to control the typesetting direction
+% in the header. Bidi for example has two modes such that headers
+% can be RTL locally while the header stay at LTR. If this macro is
+% changed, it will be a good idea to coordinate it with the bidi
+% maintainer.
+% \begin{macrocode}
+\newcommand\mem@ps@entry@wrap{}
+% \end{macrocode}
+%
+% \end{macro}
+% \begin{macro}{\mem@ps@HLH}
+% \changes{v3.6d}{2010/10/06/24}{Factored \cs{makepagestyle}}
+% The entries in the header used in \cs{makepagestyle} (below) are
+% more or less the same. It depends on \emph{head/foot},
+% \emph{odd/even} and a shorter \emph{o/e}. So to make the code more
+% maintainable we factor this out into a generator macro. The
+% explanation for the code being used is kept below (see
+% \cs{makepagestyle}).
+% \changes{v3.6k}{2012/05/31}{Forgot to separate head/foot position into the
+% factorization, propblem reported by Wybo Dekker on
+% http://tex.stackexchange.com/q/56141/3929}
+% \begin{macrocode}
+\newcommand\mem@ps@HLH[4]{%
+ % #1 ps name
+ % #2 type: head, foot
+ % #3 odd/even
+ % #4 odd/even short (o,e)
+ \@namedef{#1@#3#2}{%
+ \@nameuse{#1#3#2pl}\hb@xt@\@nameuse{#1#2runwidth}{\m@mhe@dreset%
+% \end{macrocode}
+% In footers the line goes before the text, so we test and add the
+% footline if \texttt{\#2} equals \texttt{foot}.
+% \changes{v3.6h}{2010/10/06}{added the entry wrapper}
+% \changes{v3.6h}{201010/10/21}{Added the header/footer measuring feature.}
+% For the header/footer measuring stuff we look at \#2 and make the
+% suiting macro from that value.
+% \changes{v3.6h}{2010/10/22}{Added \cs{memRTLmainraggedX} macros such
+% that \Lpack{bidi} can also change the order of the header if RTL is
+% the main direction of the document.}
+% \begin{macrocode}
+ \nametest{#2}{head}\ifsamename\let\mem@hfboxer\mem@hvboxm\else\let\mem@hfboxer\mem@fvboxm\fi%
+% \end{macrocode}
+% \changes{v3.7d}{2015/04/22}{Moved \cs{...footruleprefix} outside
+% \cs{...footrule}. Otherwise copy does not work correctly. Reported
+% at http://tex.stackexchange.com/q/231454/3929}
+% \begin{macrocode}
+ \mem@hfboxer{\nametest{#2}{foot}\ifsamename%
+ \begingroup% to prevent colors from bleeding into the footer
+ \@nameuse{#1#2ruleprefix}%
+ \@nameuse{#1#2rule}%
+ \endgroup%
+ \fi%
+ \hbox{%
+ \rlap{%
+ \parbox[\@nameuse{#1#2vplacement}]{\@nameuse{#1#2runwidth}}{%
+ \memRTLmainraggedright\@nameuse{#1ps#2strut}%
+ \mem@ps@entry@wrap{\@nameuse{#1#4#2l}}%
+ \@nameuse{#1ps#2strut}}}\hfill
+ \parbox[\@nameuse{#1#2vplacement}]{\@nameuse{#1#2runwidth}}{%
+ \centering\@nameuse{#1ps#2strut}%
+ \mem@ps@entry@wrap{\@nameuse{#1#4#2c}}%
+ \@nameuse{#1ps#2strut}}\hfill
+ \llap{%
+ \parbox[\@nameuse{#1#2vplacement}]{\@nameuse{#1#2runwidth}}{%
+ \memRTLmainraggedleft\@nameuse{#1ps#2strut}%
+ \mem@ps@entry@wrap{\@nameuse{#1#4#2r}}%
+ \@nameuse{#1ps#2strut}}}%
+ }%
+% \end{macrocode}
+% In the header the line goes under the text, so we test and add the
+% headline if \texttt{\#2} equals \texttt{head}.
+% \changes{v3.6k}{2012/05/31}{Forgot to separate head/foot position into the
+% factorization}
+% \changes{v3.7d}{2015/04/22}{Moved \cs{...headruleprefix} outside
+% \cs{...headrule}. Otherwise copy does not work correctly.}
+% \begin{macrocode}
+ \nametest{#2}{head}\ifsamename%
+ \@nameuse{#1#2ruleprefix}%
+ \@nameuse{#1#2rule}%
+ \fi%
+ }}\@nameuse{#1#3#2pr}}%
+% \end{macrocode}
+% And end by letting the LaTeX head/foot use our version
+% \begin{macrocode}
+ \@namedef{@#3#2}{\@nameuse{#1@#3#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makepagestyle}
+% At last we can put everything together for defining a new pagestyle,
+% via the macro \cs{makepagestyle}\marg{style} which initially sets up
+% a new pagestyle \meta{style} corresponding the the \LaTeX{} \verb?empty?
+% pagestyle. The prior macros can then be used to make modifications
+% to the style.
+% \changes{v1.0}{2001/11/15}{Now 2 stage process for defining \cs{@evenhead}
+% and friends}
+% \changes{v1.61}{2004/03/14}{Added \cs{m@mhe@dreset} at several points in
+% \cs{makepagestyle} (from patch 2.1)}
+% \changes{v1.61803}{2008/01/30}{Removed extraneous spaces from pagestyle code
+% (mempatch v4.6)}
+% \changes{v1.61803398d}{2010/02/09}{Added storing extra information
+% about page styles}
+% We also make sure to specify that this is a `real' page style, and
+% thus sets the empty alias name and the alias test to 01.
+% \begin{macrocode}
+\newcommand{\makepagestyle}[1]{%
+ \mem@set@ps@xtra@info{#1}{}{01}%
+% \end{macrocode}
+% First define the macro \cs{ps@style}, which in turn defines the macros
+% \cs{@evenhead}, \cs{@oddhead}, \cs{@evenfoot} and \cs{@oddfoot}.
+% \changes{v3.6d}{20101/06/24}{Factored \cs{makepagestyle}, such
+% that \cs{#1@evenhead} and friends are made using \emph{one} single
+% macro. We keep the original code just in case.}
+% \begin{macrocode}
+ \@namedef{ps@#1}{%
+ \mem@ps@HLH{#1}{head}{even}{e}%
+ \mem@ps@HLH{#1}{head}{odd}{o}%
+ \mem@ps@HLH{#1}{foot}{even}{e}%
+ \mem@ps@HLH{#1}{foot}{odd}{o}%
+ % \@namedef{#1@evenhead}{%
+% \end{macrocode}
+% The code for the definition of \cs{@evenhead} and friends is based on code
+% from Piet van Oostrum's \Lpack{fancyhdr} package~\cite{FANCYHDR}. The three
+% parts of the header are put into parboxes, with fills between them, and
+% the whole lot is put into a box the width of the header. Fillers are put
+% before and after the main box which control the header position.
+%
+% First the left filler which is either \cs{relax} or \cs{hss}, and then
+% start the main box.
+% \changes{v1.6180339c}{2008/12/26}{Replaced \cs{...runwidth} by \cs{...headrunwidth}
+% or \cs{...footrunwidth}, as appropriate for headers and footers.}
+% \changes{v1.6180339c}{2009/01/13}{Replaced \cs{parbox}\texttt[b]
+% with \cs{parbox}\texttt{[\cs{nameuse{#1headvplacement}}]} etc.}
+% \begin{macrocode}
+ % \@nameuse{#1evenhpl}\hb@xt@\@nameuse{#1headrunwidth}{\m@mhe@dreset%
+ % \vbox{\hbox{%
+% \end{macrocode}
+% The left part of the header.
+% \begin{macrocode}
+ % \rlap{\parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \raggedright\@nameuse{#1eheadl}\strut}}\hfill
+% \end{macrocode}
+% The center part of the header.
+% \begin{macrocode}
+ % \parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \centering\@nameuse{#1eheadc}\strut}\hfill
+% \end{macrocode}
+% The right part of the header.
+% \begin{macrocode}
+ % \llap{\parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \raggedleft\@nameuse{#1eheadr}\strut}}}%
+% \end{macrocode}
+% Finally, the header rule and finish with the right filler, which
+% is either \cs{relax} or \cs{hss}.
+% \begin{macrocode}
+ % \@nameuse{#1headrule}}}\@nameuse{#1evenhpr}}%
+% \end{macrocode}
+% The code for the \cs{@oddhead}, \cs{@evenfoot} and \cs{@oddfoot} follows
+% a similar pattern. Here is \cs{@oddhead}.
+% \begin{macrocode}
+ % \@namedef{#1@oddhead}{%
+ % \@nameuse{#1oddhpl}\hb@xt@\@nameuse{#1headrunwidth}{\m@mhe@dreset%
+ % \vbox{\hbox{%
+ % \rlap{\parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \raggedright\@nameuse{#1oheadl}\strut}}\hfill
+ % \parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \centering\@nameuse{#1oheadc}\strut}\hfill
+ % \llap{\parbox[\@nameuse{#1headvplacement}]{\@nameuse{#1headrunwidth}}{%
+ % \raggedleft\@nameuse{#1oheadr}\strut}}}%
+ % \@nameuse{#1headrule}}}\@nameuse{#1oddhpr}}%
+% \end{macrocode}
+% And \cs{@evenfoot}. For the footers the rules come \emph{before} any foot
+% entries.
+% \begin{macrocode}
+ % \@namedef{#1@evenfoot}{%
+ % \@nameuse{#1evenfpl}\hb@xt@\@nameuse{#1footrunwidth}{\m@mhe@dreset%
+ % \vbox{\@nameuse{#1footrule}\hbox{%
+ % \rlap{\parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \raggedright\@nameuse{#1efootl}\strut}}\hfill
+ % \parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \centering\@nameuse{#1efootc}\strut}\hfill
+ % \llap{\parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \raggedleft\@nameuse{#1efootr}\strut}}}%
+ % }}\@nameuse{#1evenfpr}}%
+% \end{macrocode}
+% Lastly the \cs{@oddfoot}.
+% \begin{macrocode}
+ % \@namedef{#1@oddfoot}{%
+ % \@nameuse{#1oddfpl}\hb@xt@\@nameuse{#1footrunwidth}{\m@mhe@dreset%
+ % \vbox{\@nameuse{#1footrule}\hbox{%
+ % \rlap{\parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \raggedright\@nameuse{#1ofootl}\strut}}\hfill
+ % \parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \centering\@nameuse{#1ofootc}\strut}\hfill
+ % \llap{\parbox[\@nameuse{#1footvplacement}]{\@nameuse{#1footrunwidth}}{%
+ % \raggedleft\@nameuse{#1ofootr}\strut}}}%
+ % }}\@nameuse{#1oddfpr}}%
+% \end{macrocode}
+% Now we define \cs{@evenhead} etc., in terms of \verb?#1@evenhead?.
+% \begin{macrocode}
+ % \def\@evenhead{\@nameuse{#1@evenhead}}%
+ % \def\@oddhead{\@nameuse{#1@oddhead}}%
+ % \def\@evenfoot{\@nameuse{#1@evenfoot}}%
+ % \def\@oddfoot{\@nameuse{#1@oddfoot}}%
+% \end{macrocode}
+% To finish off the definition of \cs{ps@style}, add in a hook which can be
+% defined so that it adds additional code, if required.
+% \begin{macrocode}
+ \@nameuse{#1pshook}}%
+% \end{macrocode}
+% \changes{v3.6d}{2010/06/24}{Added strut initialization} Next we
+% initialize the struts being used. Remember the for the
+% \pstyle{empty} style, the strut should be empty.
+% \begin{macrocode}
+ \nametest{#1}{empty}%
+ \ifsamename%
+ \@namedef{#1psheadstrut}{}\@namedef{#1psfootstrut}{}%
+ \else%
+ \@namedef{#1psheadstrut}{\strut}\@namedef{#1psfootstrut}{\strut}%
+ \fi%
+% \end{macrocode}
+%
+% The final part of setting up the new pagestyle
+% is defining all the macros called by \cs{ps@style}, and giving them
+% default values. Make the headers and footers empty.
+% \begin{macrocode}
+ \makeevenhead{#1}{}{}{}%
+ \makeoddhead{#1}{}{}{}%
+ \makeevenfoot{#1}{}{}{}%
+ \makeoddfoot{#1}{}{}{}%
+% \end{macrocode}
+% Make the headers/footers the same width as the \cs{textwidth},
+% center them, and ensure that the rules have zero height so that they
+% will be invisible. Also initialize the head/foot prefixes.
+% \changes{v3.6h}{2011/01/25}{Added the \cs{makeheadfootruleprefix}}
+% \begin{macrocode}
+ \makerunningwidth{#1}{\textwidth}%
+ \makeheadposition{#1}{}{}{}{}%
+ \makeheadrule{#1}{\textwidth}{0pt}%
+ \makefootrule{#1}{\textwidth}{\footruleheight}{\footruleskip}%
+ \makeheadfootruleprefix{#1}{}{}
+% \end{macrocode}
+% Set the initial vertical header and footer positions.
+% \changes{v1.6180339c}{2009/01/13}{Added head/foot position initialisation}
+% \begin{macrocode}
+ \makeheadfootvposition{#1}{b}{b}%
+% \end{macrocode}
+% Finally, there is no addtional code needed, so make the hook empty, and
+% we are done.
+% \begin{macrocode}
+ \makepsmarks{#1}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\aliaspagestyle}
+% The command \cs{aliaspagestyle}\marg{alias}\marg{original}
+% defines the \meta{alias} pagestyle to be an alias for the
+% \meta{original} pagestyle.
+% \changes{v1.61803398d}{2010/02/09}{Added page style storing info}
+% We remember to set the stored alias name, and sets the alias test to
+% true (00).
+% \begin{macrocode}
+\newcommand{\aliaspagestyle}[2]{%
+ \mem@set@ps@xtra@info{#1}{#2}{00}%
+ \@namedef{ps@#1}{\@nameuse{ps@#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\copypagestyle}
+% The command \cs{copypagestyle}\marg{new}\marg{original}
+% defines the \meta{new} pagestyle to be a copy of the
+% \meta{original} pagestyle.
+%
+% It first makes the \meta{new} (empty) pagestyle then defines the internals
+% in terms of the \meta{original} internals.
+% \changes{v1.2}{2002/08/10}{Added \cs{copypagestyle}}
+% \changes{v1.61803}{2008/01/30}{Added missing elements to \cs{copypagestyle}
+% (per Erik Quaeghebeur mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\copypagestyle}[2]{%
+ \makepagestyle{#1}%
+% \end{macrocode}
+% Do the headers and footers.
+% \begin{macrocode}
+ \makeevenhead{#1}{\@nameuse{#2eheadl}}%
+ {\@nameuse{#2eheadc}}{\@nameuse{#2eheadr}}%
+ \makeoddhead{#1}{\@nameuse{#2oheadl}}%
+ {\@nameuse{#2oheadc}}{\@nameuse{#2oheadr}}%
+ \makeevenfoot{#1}{\@nameuse{#2efootl}}%
+ {\@nameuse{#2efootc}}{\@nameuse{#2efootr}}%
+ \makeoddfoot{#1}{\@nameuse{#2ofootl}}%
+ {\@nameuse{#2ofootc}}{\@nameuse{#2ofootr}}%
+% \end{macrocode}
+% Set the width.
+% \begin{macrocode}
+ \makerunningwidth{#1}[\@nameuse{#2footrunwidth}]{\@nameuse{#2headrunwidth}}%
+% \end{macrocode}
+% Specify the \cs{headposition}.
+% \changes{v3.6k}{2012/05/31}{some macro renaming}
+% \begin{macrocode}
+ \@namedef{#1evenheadpl}{\@nameuse{#2evenheadpl}}%
+ \@namedef{#1oddheadpl}{\@nameuse{#2oddheadpl}}%
+ \@namedef{#1evenheadpr}{\@nameuse{#2evenheadpr}}%
+ \@namedef{#1oddheadpr}{\@nameuse{#2oddheadpr}}%
+% \end{macrocode}
+% Also vertically
+% \changes{v1.6180339c}{2008/01/13}{Also copy the vertical positions}
+% \changes{v1.6180339e}{2008/02/06}{Bug fix, reported by Per
+% Starb\"ack on ctt}
+% \begin{macrocode}
+ \makeheadfootvposition{#1}{\@nameuse{#2headvplacement}}{\@nameuse{#2footvplacement}}%
+% \end{macrocode}
+% Specify the feet
+% \changes{v3.6k}{2012/05/31}{some macro renaming}
+% \begin{macrocode}
+ \@namedef{#1evenfootpl}{\@nameuse{#2evenfootpl}}%
+ \@namedef{#1oddfootpl}{\@nameuse{#2oddfootpl}}%
+ \@namedef{#1evenfootpr}{\@nameuse{#2evenfootpr}}%
+ \@namedef{#1oddfootpr}{\@nameuse{#2oddfootpr}}%
+% \end{macrocode}
+% Specify the head and foot rules and the prefixes.
+% \changes{v3.6h}{2011/01/25}{Added the \cs{makeheadfootruleprefix}}
+% \begin{macrocode}
+ \@namedef{#1headrule}{\@nameuse{#2headrule}}%
+ \@namedef{#1footrule}{\@nameuse{#2footrule}}%
+ \@namedef{#1headruleprefix}{\@nameuse{#2headruleprefix}}%
+ \@namedef{#1footruleprefix}{\@nameuse{#2footruleprefix}}%
+% \end{macrocode}
+% \changes{v3.6d}{2010/06/24}{Added strut copying to \cs{copypagestyle}}
+% And remember the struts
+% \begin{macrocode}
+ \@namedef{#1psheadstrut}{\@nameuse{#2psheadstrut}}
+ \@namedef{#1psfootstrut}{\@nameuse{#2psfootstrut}}
+% \end{macrocode}
+% \end{macro}
+% And pick up the hook. We end the macro here.
+% \begin{macrocode}
+ \makepsmarks{#1}{\@nameuse{#2pshook}}}
+
+% \end{macrocode}
+%
+%
+% \begin{macro}{\ifonlyfloats}
+% \cs{ifonlyfloats}\marg{yes}\marg{no} processes \meta{yes} if the macro is
+% called on a page consisting only of floats, otherwise \meta{no} is
+% processed. \cs{if@fcolmade} is specified in \file{ltoutput.dtx}.
+% \changes{v1.0}{2001/11/14}{Added \cs{ifonlyfloats}}
+% \begin{macrocode}
+\newcommand{\ifonlyfloats}[2]{\if@fcolmade #1\else #2\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mergepagefloatstyle}
+% \cs{mergepagefloatstyle}\marg{style}\marg{textstyle}\marg{floatstyle}
+% makes a new page style \meta{style} that is \meta{textstyle} on normal
+% pages but uses \meta{floatstyle} on float-only pages. Both \meta{textstyle}
+% and \meta{floatstyle} must have been previously defined.
+% \changes{v1.0}{2001/11/15}{Added \cs{mergepagefloatstyle}}
+% \begin{macrocode}
+\newcommand{\mergepagefloatstyle}[3]{%
+% \end{macrocode}
+% Make sure that the two styles have been called, otherwise we get some
+% undefined errors.
+% \begin{macrocode}
+ \@nameuse{ps@#3}\@nameuse{ps@#2}%
+% \end{macrocode}
+% Specify the pagestyle's headers and footers.
+% \begin{macrocode}
+ \@namedef{ps@#1}{%
+ \def\@evenhead{\ifonlyfloats{\@nameuse{#3@evenhead}}%
+ {\@nameuse{#2@evenhead}}}%
+ \def\@oddhead{\ifonlyfloats{\@nameuse{#3@oddhead}}%
+ {\@nameuse{#2@oddhead}}}%
+ \def\@evenfoot{\ifonlyfloats{\@nameuse{#3@evenfoot}}%
+ {\@nameuse{#2@evenfoot}}}%
+ \def\@oddfoot{\ifonlyfloats{\@nameuse{#3@oddfoot}}%
+ {\@nameuse{#2@oddfoot}}}%
+% \end{macrocode}
+% Set the hook to the \meta{textstyle} on the assumption that that is
+% more complex that required for a float page.
+% \begin{macrocode}
+ \@namedef{#1pshook}{\@nameuse{#2pshook}}%
+% \end{macrocode}
+% That's it.
+% \begin{macrocode}
+}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makeheadfootstrut}
+% \changes{v3.6d}{2010/06/24}{Added \cs{makeheadfootstrut}}
+% In each `field' of the header a strut is added to keep alignment
+% right. This macro can be used to change a particular strut
+% configuration. Each combination is initialy set by
+% \cs{makepagestyle} to be equal to \cs{strut}, except the
+% \pstyle{empty} style, where the strut is empty by default.
+% \begin{macrocode}
+\newcommand*\makeheadfootstrut[3]{%
+ \@namedef{#1psheadstrut}{#2}\@namedef{#1psfootstrut}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% The pagestyles \pstyle{empty} and \pstyle{plain} are defined
+% in \file{latex.dtx}. However, I will redefine them here, just in
+% case someone takes a fancy to modifying them.
+%
+% \begin{macro}{\ps@empty}
+% The \pstyle{empty} pagestyle is simple, it's just what we get when
+% we call \cs{makepagestyle}.
+% \begin{macrocode}
+\makepagestyle{empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@plain}
+% The \pstyle{plain} pagestyle is also simple, it just puts the
+% page number at the bottom middle of the page.
+% We call \verb?\makepagestyle{plain}? and then adjust as required.
+% \begin{macrocode}
+\makepagestyle{plain}
+ \makeevenfoot{plain}{}{\thepage}{}
+ \makeoddfoot{plain}{}{\thepage}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@simple}
+% The \pstyle{simple} page style simply puts the page number in the header
+% at the outer margin.
+% \changes{v1.61803398}{2009/07/26}{PW: Added the `simple' pagestyle}
+% \begin{macrocode}
+\makepagestyle{simple}
+ \makeevenhead{simple}{\thepage}{}{}
+ \makeoddhead{simple}{}{}{\thepage}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nouppercaseheads}
+% \begin{macro}{\uppercaseheads}
+% \begin{macro}{\memUChead}
+% Spurred by Lars Madsen's \Lpack{memexsupp} v0.5 package here is a
+% way of switching uppercasing in the headings pagestyle.
+% \changes{v1.61803}{2008/01/30}{Added \cs{(no)uppercaseheads} and
+% \cs{memUChead} (mempatch v4.9)}
+% \changes{v3.6k}{2011/05/20}{Making \cs{memUChead} equal to
+% \cs{relax} can cause problems when users want to \cs{provide} it in
+% other applications. It is now redefined into the empty string.}
+% \changes{v3.6k}{2012/09/13}{Default upper case now \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\newcommand*{\nouppercaseheads}{\def\memUChead{}}
+\newcommand*{\uppercaseheads}{\def\memUChead{\MakeTextUppercase}}
+\uppercaseheads
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% The macros \cs{createplainmark}, \cs{createmark} and \cs{addtopsmarks}
+% are modified versions of code supplied by Lars Madsen.
+% \changes{v1.61803}{2008/01/30}{Added, and used, \cs{createplainmark},
+% \cs{createmark} and \cs{addtopsmarks}}
+% \begin{macro}{\createplainmark}
+% \cs{createplainmark}\marg{type}\marg{marks}\marg{text} creates a
+% \cs{typemark} (\meta{type} is \texttt{toc}, \texttt{bib}, etc)
+% with \meta{marks} (left, both, right) whose contents are \meta{text}.
+% For example \verb?\createplainmark{toc}{both}{\contentsname}?. The
+% difference between plain and regular marks, is that plain marks use
+% a fixed text, whereas regular marks recieve dynamic text and thus
+% is given an argument.
+% \begin{macrocode}
+\newcommand*{\createplainmark}[3]{%
+ \nametest{#2}{left}%
+ \ifsamename
+ \@namedef{#1mark}{\markboth{\memUChead{#3}}{}}%
+ \else
+ \nametest{#2}{right}%
+ \ifsamename
+ \@namedef{#1mark}{\markright{\memUChead{#3}}}%
+ \else
+ \nametest{#2}{both}%
+ \ifsamename\else
+ \@memerror{%
+ Unknown mark setting type `#2' for #1mark}{%
+ I expected `left', `both' or `right'. \MessageBreak
+ I will assume you meant `both'}%
+ \fi
+ \@namedef{#1mark}{\markboth{\memUChead{#3}}{\memUChead{#3}}}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\createmark}
+% \cs{createmark}\marg{division}\marg{marks}\marg{show}\marg{prefix}\marg{postfix}
+% creates a \cs{divisionmark} with \meta{marks} (= \texttt{left}, \texttt{both}
+% or \texttt{right}) controlling which marks are set,
+% \meta{show} (= \texttt{shownumber} or \texttt{nonumber}) controls the
+% display of the divison number in \cs{mainmatter}, \meta{prefix} is text
+% before the number and \meta{postfix} is text after the number.
+% \begin{macrocode}
+\newcommand\createmark[5]{%
+% \end{macrocode}
+% Handle \texttt{(show/no)number}, fails to \texttt{shownumber}.
+% \begin{macrocode}
+ \def\@tempa{00}
+ \nametest{#3}{nonumber}%
+ \ifsamename
+ \def\@tempa{01}%
+ \else
+ \nametest{#3}{shownumber}
+ \ifsamename\else
+ \@memerror{Unknown numbering value `#3' for #1mark}%
+ {I expected `shownumber' or `nonumber'.\MessageBreak
+ I will assume you meant `shownumber'}%
+ \fi
+ \fi
+ \expandafter\if\@tempa% compares the two \@tempa digits
+ \@namedef{#1marksn}##1{##1}%
+ \else
+ \@namedef{#1marksn}{\@gobble}%
+ \fi
+% \end{macrocode}
+% The three \meta{marks} cases, \texttt{left}, \texttt{both} and
+% \texttt{right}; fails to \texttt{both}.
+% \changes{v3.7f}{2015/08/25}{Sporious spaces}
+% \begin{macrocode}
+ \nametest{#2}{left}%
+ \ifsamename
+ \@namedef{#1mark}##1{%
+ \@setclcnt{#1}{@memmarkcntra}%
+ \advance\c@@memmarkcntra\m@ne
+ \markboth{%
+ \memUChead{%
+ \ifnum \c@secnumdepth > \c@@memmarkcntra
+ \if@mainmatter
+ \@nameuse{#1marksn}{#4\@nameuse{the#1}#5}%
+ \fi
+ \fi
+ ##1}}{}}%
+ \else
+ \nametest{#2}{right}
+ \ifsamename
+ \@namedef{#1mark}##1{%
+ \@setclcnt{#1}{@memmarkcntra}%
+ \advance\c@@memmarkcntra\m@ne
+ \markright{%
+ \memUChead{%
+ \ifnum \c@secnumdepth > \c@@memmarkcntra
+ \if@mainmatter%
+ \@nameuse{#1marksn}{#4\@nameuse{the#1}#5}%
+ \fi%
+ \fi%
+ ##1}}}%
+ \else
+ \nametest{#2}{both}%
+ \ifsamename\else
+ \@memerror{%
+ Unknown mark setting type `#2' for #1mark}{%
+ I expected `left', `both' or `right'. \MessageBreak
+ I will assume you meant `both'}%
+ \fi
+ \@namedef{#1mark}##1{%
+ \@setclcnt{#1}{@memmarkcntra}%
+ \advance\c@@memmarkcntra\m@ne
+ \markboth{%
+ \memUChead{%
+ \ifnum \c@secnumdepth > \c@@memmarkcntra
+ \if@mainmatter
+ \@nameuse{#1marksn}{#4\@nameuse{the#1}#5}%
+ \fi
+ \fi
+ ##1}}{%
+ \memUChead{%
+ \ifnum \c@secnumdepth > \c@@memmarkcntra
+ \if@mainmatter
+ \@nameuse{#1marksn}{#4\@nameuse{the#1}#5}%
+ \fi
+ \fi
+ ##1}}}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addtopsmarks}
+% \cs{addtopsmarks}\marg{pagestyle}\marg{prepend}\marg{append} inserts
+% \meta{prepend} and \meta{append} at the start and end of the current
+% definition of \cs{pagestylepshook}.
+% \changes{v1.61803398d}{2010/02/09}{Added safe to change test}
+% \begin{macrocode}
+\newcommand\addtopsmarks[3]{%
+ \mem@ps@safe@change{#1}%
+ \expandafter\addtodef\expandafter{\csname #1pshook\endcsname}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clearplainmark}
+% \begin{macro}{\clearmark}
+% For some page styles it is handy to be able to make sure that no
+% section or otherwise add data to the \cs{left-} and
+% \cs{rightmark}. The macros \cs{clearplainmark} and \cs{clearmark}
+% will take one argument specifying which mark to clear, and then
+% redefine this mark to do nothing or to gobble its given argument.
+% \begin{macrocode}
+\newcommand\clearplainmark[1]{%
+ \@namedef{#1mark}{}}
+\newcommand\clearmark[1]{%
+ \@namedef{#1mark}{\@gobble}}
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ps@headings}
+% The \pstyle{headings} pagestyle behaves differently for
+% twosided and onesided printing. This is a rewrite of the
+% standard style.
+% \changes{v1.1}{2002/03/10}{Added \cs{tocmark} etc., to \cs{ps@headings}}
+% \changes{v1.61803}{2008/01/30}{Used \cs{memUChead} in \cs{ps@headings}
+% (mempatch v4.9)}
+% \changes{v1.61803}{2008/01/30}{For twosided docs set both marks for ToC, etc. (mempatch v4.9)}
+% \changes{v1.61803}{2008/01/30}{Eliminated \cs{@mkboth} as never used
+% (mempatch v4.9)}
+% \changes{v1.61803}{2008/01/30}{Added \cs{glossarymark} to \cs{ps@headings}}
+% \begin{macrocode}
+\if@twoside
+% \end{macrocode}
+% The footer is empty and the header contains the page number and
+% one of the marks.
+% \begin{macrocode}
+ \makepagestyle{headings}
+ \makepsmarks{headings}{%
+ \def\chaptermark##1{%
+ \markboth{\memUChead{%
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \@chapapp\ \thechapter. \ %
+ \fi
+ \fi
+ ##1}}{}}%
+ \def\tocmark{\markboth{\memUChead{\contentsname}}{\memUChead{\contentsname}}}%
+ \def\lofmark{\markboth{\memUChead{\listfigurename}}{\memUChead{\listfigurename}}}%
+ \def\lotmark{\markboth{\memUChead{\listtablename}}{\memUChead{\listtablename}}}%
+ \def\bibmark{\markboth{\memUChead{\bibname}}{\memUChead{\bibname}}}%
+ \def\indexmark{\markboth{\memUChead{\indexname}}{\memUChead{\indexname}}}%
+ \def\sectionmark##1{%
+ \markright{\memUChead{%
+ \ifnum \c@secnumdepth > \z@
+ \thesection. \ %
+ \fi
+ ##1}}}}
+% \end{macrocode}
+% And here's a version of the above \cs{makepsmarks} using \cs{createmark} and
+% \cs{createplainmark}.
+% \begin{macrocode}
+ \makepsmarks{headings}{%
+ \createmark{chapter}{left}{shownumber}{\@chapapp\ }{. \ }
+ \createmark{section}{right}{shownumber}{}{. \ }
+ \createplainmark{toc}{both}{\contentsname}
+ \createplainmark{lof}{both}{\listfigurename}
+ \createplainmark{lot}{both}{\listtablename}
+ \createplainmark{bib}{both}{\bibname}
+ \createplainmark{index}{both}{\indexname}
+ \createplainmark{glossary}{both}{\glossaryname}
+ }
+ \makeevenhead{headings}{\thepage}{}{\slshape\leftmark}
+ \makeoddhead{headings}{\slshape\rightmark}{}{\thepage}
+\else
+% \end{macrocode}
+% For one sided printing even and odd pages are treated the same,
+% so no need to bother with the evenhead, and
+% just the \cs{rightmark} is used.
+% \begin{macrocode}
+ \makepagestyle{headings}
+ \makepsmarks{headings}{%
+ \def\chaptermark##1{%
+ \markright{\memUChead{%
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \@chapapp\ \thechapter. \ %
+ \fi
+ \fi
+ ##1}}}%
+ \def\tocmark{\markright{\memUChead{\contentsname}}}%
+ \def\lofmark{\markright{\memUChead{\listfigurename}}}%
+ \def\lotmark{\markright{\memUChead{\listtablename}}}%
+ \def\bibmark{\markright{\memUChead{\bibname}}}%
+ \def\indexmark{\markright{\memUChead{\indexname}}}}
+% \end{macrocode}
+% And here's a version of the above \cs{makepsmarks} using \cs{createmark} and
+% \cs{createplainmark}.
+% \begin{macrocode}
+ \makepsmarks{headings}{%
+ \createmark{chapter}{right}{shownumber}{\@chapapp\ }{. \ }
+ \createplainmark{toc}{right}{\contentsname}
+ \createplainmark{lof}{right}{\listfigurename}
+ \createplainmark{lot}{right}{\listtablename}
+ \createplainmark{bib}{right}{\bibname}
+ \createplainmark{index}{right}{\indexname}
+ \createplainmark{glossary}{right}{\glossaryname}
+ }
+ \makeoddhead{headings}{\slshape\rightmark}{}{\thepage}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@myheadings}
+% The \pstyle{myheadings} page style is simpler because the user
+% has to specify the contents using \cs{markboth} and \cs{markright}
+% commands. This is the definition used in the standard classes.
+% \changes{v1.1}{2002/03/10}{Added \cs{tocmark} etc., to \cs{ps@myheadings}}
+% \begin{verbatim}}
+% \newcommand{\ps@myheadings}{%
+% \let\@oddfoot\@empty\let\@evenfoot\@empty
+% \def\@evenhead{\thepage\hfil{\slshape\leftmark}}%
+% \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
+% \let\@mkboth\@gobbletwo
+% \let\chaptermark\@gobble
+% \let\sectionmark\@gobble
+% }
+% \end{verbatim}
+% Translating that into our terms we get:
+% \changes{v1.0}{2001/11/15}{Changed the code for creating the myheadings pagestyle}
+% \changes{v1.4}{2003/11/22}{Further change to myheadings pagestyle code}
+% \begin{macrocode}
+\makepagestyle{myheadings}
+ \makepsmarks{myheadings}{%
+ \let\chaptermark\@gobble
+ \let\sectionmark\@gobble
+ \def\tocmark{}%
+ \def\lofmark{}%
+ \def\lotmark{}%
+ \def\bibmark{}%
+ \def\indexmark{}%
+ \def\glossarymark{}}
+ \makeevenhead{myheadings}{\thepage}{}{\slshape\leftmark}
+ \makeoddhead{myheadings}{\slshape\rightmark}{}{\thepage}
+
+% \end{macrocode}
+% (Kai von Fintel (\texttt{fintel@mit.edu}) emailed me on 2003/02/24
+% saying that the original \verb?\let\tocmark\@gobble? in the myheadings
+% pagestyle did nasty things
+% to the ToC, etc. Now using \verb?\def\tocmark{}?.)
+% \end{macro}
+%
+% \begin{macro}{\ps@chapter}
+% \begin{macro}{\ps@part}
+% \begin{macro}{\ps@cleared}
+% The standard classes use the \pstyle{plain} pagestyle for the first page
+% of a chapter. This class uses the \pstyle{chapter} instead, which is
+% aliased to \pstyle{plain}. Similarly for parts.
+% Further, \cs{cleardoublepage} uses whatever
+% pagestyle is in effect for the empty verso page. I find that this
+% looks odd if the header contains a chapter name. This class uses
+% the \pstyle{cleared} pagestyle in this case. I have aliased this
+% to \pstyle{empty}; the \pstyle{plain} would be another reasonable choice.
+% \begin{macrocode}
+\aliaspagestyle{chapter}{plain}
+\aliaspagestyle{part}{plain}
+\aliaspagestyle{cleared}{empty}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cleardoublepage}
+% A slight adjustment to the kernel definition to set a pagestyle.
+% \begin{macrocode}
+\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
+ \hbox{}\thispagestyle{cleared}%
+ \newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ps@ruled}
+% Partly to show how it is done, the class provides a \pstyle{ruled} pagestyle.
+% In this style the headers and footers are the same width as the textblock,
+% there is a rule under the header, page numbers are set in the footers
+% at the outside of the page. Even page headers have the chapter number
+% and title at the left, and odd page headers have the section title
+% at the right.
+%
+% Start by making the (empty) \pstyle{ruled} pagestyle.
+% \begin{macrocode}
+\makepagestyle{ruled}
+% \end{macrocode}
+% There is no need to change the default width (which is the \cs{textwidth}),
+% nor the default positions (centered),
+% nor to make the footrule visible. We do, though, have to put the page
+% numbers into the footers.
+% \begin{macrocode}
+\makeevenfoot{ruled}{\thepage}{}{}
+\makeoddfoot{ruled}{}{}{\thepage}
+% \end{macrocode}
+% Make the header rule visible and equal to the \cs{textwidth}.
+% \begin{macrocode}
+\makeheadrule{ruled}{\textwidth}{\normalrulethickness}
+% \end{macrocode}
+%
+% \begin{macro}{\@ruledmarks}
+% We have to make sure that the \cs{chapter} and \cs{section} commands make
+% the appropriate marks for use in the headers. We use the hook for this.
+% Note that contrary to normal \LaTeX{} practice, the titles are not
+% automatically upper-cased. The marks for the tocbibinds also need adjusting.
+% \changes{v1.1}{2002/03/10}{Changed \cs{@ruledmarks} to cater for tocbibind}
+% \begin{macrocode}
+\newcommand{\@ruledmarks}{%
+ \def\chaptermark##1{%
+ \markboth{%
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \thechapter. \ %
+ \fi
+ \fi
+ ##1}{}}
+ \def\sectionmark##1{\markright{##1}}
+ \def\tocmark{\markboth{\contentsname}{}}
+ \def\lofmark{\markboth{\listfigurename}{}}
+ \def\lotmark{\markboth{\listtablename}{}}
+ \def\bibmark{\markboth{\bibname}{}}
+ \def\indexmark{\markboth{\indexname}{}}
+ \def\glossarymark{\markboth{\glossaryname}{}}
+}
+% \end{macrocode}
+% And here's a version using \cs{createmark} and friends.
+% \begin{macrocode}
+\renewcommand*{\@ruledmarks}{%
+ \nouppercaseheads
+ \createmark{chapter}{left}{shownumber}{}{. \space}
+ \createmark{section}{right}{shownumber}{}{. \space}
+ \createplainmark{toc}{both}{\contentsname}
+ \createplainmark{lof}{both}{\listfigurename}
+ \createplainmark{lot}{both}{\listtablename}
+ \createplainmark{bib}{both}{\bibname}
+ \createplainmark{index}{both}{\indexname}
+ \createplainmark{glossary}{both}{\glossaryname}}
+\makepsmarks{ruled}{\@ruledmarks}
+% \end{macrocode}
+% \end{macro}
+%
+% We can now define the even page header which is to have the chapter title
+% at the left. As the chapter mark did no upper-casing we will print it
+% using small caps, but just use the normal font for section title on
+% the odd page header.
+% \begin{macrocode}
+\makeevenhead{ruled}{\scshape\leftmark}{}{}
+\makeoddhead{ruled}{}{}{\rightmark}
+
+% \end{macrocode}
+% \end{macro}
+% This is all that we need to do for the \pstyle{ruled} pagestyle.
+%
+% \begin{macro}{\ps@Ruled}
+% Also define a \pstyle{Ruled} pagestyle similar to \pstyle{ruled} except that the
+% headers and footers are 10\% wider than the textblock, sticking out
+% into the fore edge.
+% \begin{macrocode}
+\makepagestyle{Ruled}
+\makerunningwidth{Ruled}{1.1\textwidth}
+\makeheadposition{Ruled}{flushright}{flushleft}{flushright}{flushleft}
+\makeevenfoot{Ruled}{\thepage}{}{}
+\makeoddfoot{Ruled}{}{}{\thepage}
+\makeheadrule{Ruled}{1.1\textwidth}{\normalrulethickness}
+\makepsmarks{Ruled}{\@ruledmarks}
+\makeevenhead{Ruled}{\scshape\leftmark}{}{}
+\makeoddhead{Ruled}{}{}{\rightmark}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\headwidth}
+% \begin{macro}{\ps@companion}
+% A \pstyle{companion} pagestyle like the one in the
+% \textit{\LaTeX{} Companion} series.
+% We need the \cs{headwidth} length for this.
+% \changes{v1.1}{2002/03/10}{Added \cs{tocmark} etc., to \cs{ps@companion}}
+% \begin{macrocode}
+\newlength{\headwidth}
+
+\makepagestyle{companion}
+\setlength{\headwidth}{\textwidth}
+ \addtolength{\headwidth}{\marginparsep}
+ \addtolength{\headwidth}{\marginparwidth}
+\makerunningwidth{companion}{\headwidth}
+\makeheadrule{companion}{\headwidth}{\normalrulethickness}
+\makeheadposition{companion}{flushright}{flushleft}{}{}
+\makepsmarks{companion}{%
+ \def\chaptermark##1{\markboth{##1}{##1}} % left mark & right marks
+ \def\sectionmark##1{\markright{%
+ \ifnum \c@secnumdepth>\z@
+ \thesection. \ %
+ \fi
+ ##1}}
+ \def\tocmark{\markboth{\contentsname}{\contentsname}}
+ \def\lofmark{\markboth{\listfigurename}{\listfigurename}}
+ \def\lotmark{\markboth{\listtablename}{\listtablename}}
+ \def\bibmark{\markboth{\bibname}{\bibname}}
+ \def\indexmark{\markboth{\indexname}{\indexname}}}
+% \end{macrocode}
+% And here's a version of the above \cs{makepsmarks} using \cs{createmark} and
+% \cs{createplainmark}.
+% \begin{macrocode}
+\makepsmarks{companion}{%
+ \nouppercaseheads
+ \createmark{chapter}{both}{nonumber}{}{}
+ \createmark{section}{right}{shownumber}{}{. \space}
+ \createplainmark{toc}{both}{\contentsname}
+ \createplainmark{lof}{both}{\listfigurename}
+ \createplainmark{lot}{both}{\listtablename}
+ \createplainmark{bib}{both}{\bibname}
+ \createplainmark{index}{both}{\indexname}
+ \createplainmark{glossary}{both}{\glossaryname}}
+\makeevenhead{companion}{\normalfont\bfseries\thepage}{}%
+ {\normalfont\bfseries\leftmark}
+\makeoddhead{companion}{\normalfont\bfseries\rightmark}{}%
+ {\normalfont\bfseries\thepage}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Another pagestyle called \pstyle{showlocs} can be used to show the
+% locations of the header, footer and textblock. I would expect that
+% this would be mainly used as an example for authors to create their
+% own similar styles.
+% \changes{v1.6180339c}{2008/12/28}{Added the showlocs pagestyle and supporting
+% macros}
+% \changes{v1.6180339c}{2009/01/25}{Added more supporting macros for the
+% showlocs pagestyle}
+%
+% \begin{macro}{\ifshowheadfootloc}
+% \begin{macro}{\showheadfootloctrue}
+% \begin{macro}{\showheadfootlocfalse}
+% \begin{macro}{\showheadfootlocon}
+% \begin{macro}{\showheadfootlocoff}
+% \begin{macro}{\ifshowtextblockloc}
+% \begin{macro}{\showtextblockloctrue}
+% \begin{macro}{\showtextblocklocfalse}
+% \begin{macro}{\showtextblocklocon}
+% \begin{macro}{\showtextblocklocoff}
+% Booleans controlling the appearance, or not, of the header/footer lines
+% and text frame in \pstyle{showlocs}.
+% \begin{macrocode}
+\newif\ifshowheadfootloc
+ \showheadfootloctrue
+\newcommand*{\showheadfootlocon}{\showheadfootloctrue}
+\newcommand*{\showheadfootlocoff}{\showheadfootlocfalse}
+\newif\ifshowtextblockloc
+ \showtextblockloctrue
+\newcommand*{\showtextblocklocon}{\showtextblockloctrue}
+\newcommand*{\showtextblocklocoff}{\showtextblocklocfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\framepichook}
+% \changes{v3.6k}{2013/05/08}{Added \cs{framepichook}}
+% The two macros \cs{framepichead} and \cs{framepictextfoot} are used
+% to make up the \texttt{showlocs} page style. They are both zero
+% width \texttt{picture} environments. The very first thing in these
+% \texttt{picture} environments, is a call to \cs{framepichook}
+% (empty by default), which could be used to change the color of the
+% frame.
+% \begin{macrocode}
+\newcommand\framepichook{}
+% \end{macrocode}
+%
+% \end{macro}
+% \begin{macro}{\framepichead}
+% For producing a zero-sized picture of a line at the base of the header.
+% It is meant to be used as the left part of the header for a pagestyle.
+% \changes{v1.6180339c}{2008/12/28}{Added \cs{framepichead}}
+% \changes{v3.6k}{2013/05/08}{Added \cs{framepichook}}
+% \begin{macrocode}
+\newcommand*{\framepichead}{%
+\ifshowheadfootloc
+ \begin{picture}(0,0)
+ \framepichook
+ \unitlength 1pt
+ \put(0,0){\line(1,0){\strip@pt\textwidth}}
+ \end{picture}%
+\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\framepictextfoot}
+% For producing a zero-sized picture of a line at the base of the footer
+% and a frame around the text block. It is meant to be used as the left
+% part of a footer for a pagestyle.
+% \changes{v1.6180339c}{2008/12/28}{Added \cs{framepictextfoot}}
+% \changes{v3.6k}{2013/05/08}{Added \cs{framepichook}}
+% \begin{macrocode}
+\newcommand*{\framepictextfoot}{%
+ \begin{picture}(0,0)
+ \framepichook
+ \unitlength 1pt
+ \ifshowheadfootloc
+ \put(0,0){\line(1,0){\strip@pt\textwidth}}
+ \fi
+ \ifshowtextblockloc
+ \put(0,\strip@pt\footskip)%
+ {\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}
+ \fi
+ \end{picture}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@showlocs}
+% The \pstyle{showlocs} pagestyle. This is more to show what can be done.
+% \changes{v1.6180339c}{2008/12/28}{Added the showlocs pagestyle}
+% \begin{macrocode}
+\makepagestyle{showlocs}
+\makeevenhead{showlocs}{\framepichead\thepage}{\thepage}{\thepage}
+\makeoddhead{showlocs}{\framepichead\thepage}{\thepage}{\thepage}
+\makeevenfoot{showlocs}{\framepictextfoot\thepage}{\thepage}{\thepage}
+\makeoddfoot{showlocs}{\framepictextfoot\thepage}{\thepage}{\thepage}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fixheaderwidths}
+% The companion pagestyle, at least, needs adjusting (at \cs{fixthelayout} time)
+% if the \cs{textwidth} has changed from its initial value.
+% \changes{v1.6180339f}{2009/03/16}{Added \cs{fixheaderwidths}}
+% \begin{macrocode}
+\newcommand*{\fixheaderwidths}{%
+ % companion pagestyle
+ \setlength{\headwidth}{\textwidth}
+ \addtolength{\headwidth}{\marginparsep}
+ \addtolength{\headwidth}{\marginparwidth}
+ \makerunningwidth{companion}{\headwidth}
+ \makeheadrule{companion}{\headwidth}{\normalrulethickness}
+ \makefootrule{companion}{\textwidth}{\footruleheight}{\footruleskip}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Page numbering}
+%
+% The kernel includes the \cs{pagenumbering} command for setting the
+% style (arabic, roman, etc.) of the page numbers, and at the same
+% time it resets the page counter. I want a version that resets the style
+% but not the number\footnote{Added to meet a request by Daniel Richard G.
+% (\texttt{skunk@mit.edu}) September 2001.}.
+%
+% \begin{macro}{\pagenumbering}
+% \begin{macro}{\pagenumbering*}
+% \cs{pagenumbering}\marg{style} is the normal version whereas
+% the starred version does not reset the counter.
+% \changes{v1.0}{2001/09/21}{Added \cs{pagenumbering} and \cs{pagenumbering*} }
+% \begin{macrocode}
+\renewcommand{\pagenumbering}{%
+ \@ifstar{\@smempnum}{\@mempnum}}
+% \end{macrocode}
+% \begin{macro}{\@smempnum}
+% \begin{macrocode}
+\newcommand{\@smempnum}[1]{%
+ \gdef\thepage{\csname @#1\endcsname \c@page}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@mempnum}
+% \begin{macrocode}
+\newcommand{\@mempnum}[1]{%
+ \@smempnum{#1}\global\c@page \@ne}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@storedpagenumber}
+% A counter to store the page number.
+% \begin{macrocode}
+\newcounter{storedpagenumber}
+ \setcounter{storedpagenumber}{1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\savepagenumber}
+% \begin{macro}{\restoregenumber}
+% \cs{savepagenumber} saves the current page number and \cs{restorepagenumber}
+% sets the page number to the stored value.
+% \changes{v1.0}{2001/09/24}{Added \cs{savepagenumber} and \cs{restorepagenumber}}
+% \begin{macrocode}
+\newcommand{\savepagenumber}{\global\c@storedpagenumber \c@page}
+\newcommand{\restorepagenumber}{\global\c@page \c@storedpagenumber}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Non-traditional spacing}
+% \changes{v1.61803}{2008/01/30}{Added non-traditional spacing
+% (mempatch v4.6)}
+%
+% \subsection{Double spacing}
+%
+% This is an embedding and extension of the code from the \Lpack{setspace}
+% package, with
+% names changed.
+%
+% \begin{macro}{\setSpacing}
+% \cs{setSpacing}\marg{num} effectively increases the \cs{baselineskip} to
+% \meta{num}*\cs{baselineskip}.
+% (In package was \cs{setstretch}).
+% \begin{macrocode}
+\newcommand*{\setSpacing}[1]{%
+ \def\baselinestretch{#1}%
+ \@currsize}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setSingleSpace}
+% \begin{macro}{\setFootnoteSpacing}
+% \begin{macro}{\setFloatSpacing}
+% \cs{setSingleSpace}\marg{num} effectively increases the \cs{baselineskip} for
+% single spacing to \meta{num}*\cs{baselineskip} (\meta{num} should be
+% close to 1.0). (In package was \cs{SetSinglespace}). We extend with
+% two extra macros \cs{setFootnoteSpacing} and \cs{setFloatSpacing}
+% which can be used to explicitly set the spacing inside page notes
+% (fotnotes and friends) and inside floats. Changing
+% \cs{setSingleSpace} will also set page note and float spacings to
+% the same value.
+% \changes{v3.6g}{2010/09/19}{Added two extra 'single' spacing macros}
+% \begin{macrocode}
+\newcommand*{\setSingleSpace}[1]{%
+ \def\m@m@singlespace{#1}%
+ \def\m@m@footnote@spacing{#1}%
+ \def\m@m@float@spacing{#1} %
+}
+\setSingleSpace{1}
+\newcommand*\setPagenoteSpacing[1]{\def\m@m@footnote@spacing{#1}}
+\newcommand*\setFloatSpacing[1] {\def\m@m@float@spacing{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SingleSpacing}
+% \begin{macro}{\SingleSpacing*}
+% \cs{SingleSpacing} starts single spacing. (In package was \cs{singlespacing}).
+% \changes{v3.6g}{2010/09/19}{Added reset of the float and page note spacings}
+% \begin{macrocode}
+\newcommand*{\SingleSpacing}{%
+ \setSpacing{\m@m@singlespace}%
+ \edef\m@m@footnote@spacing{\baselinestretch}%
+ \edef\m@m@float@spacing{\baselinestretch}%
+% \end{macrocode}
+% \changes{v3.7h}{2018/09/19}{Added the ifstar and \cs{@noocument}}
+% We can have a strange interaction with \Lpack{tikz} if this
+% \cs{vskip} is emitted in the preamble. We use a trick (via David
+% Carlisle) to check whether we are in the preamble, and only emit the
+% vskip if we are not. \cs{@ifstar} added to let the user disable the
+% vskip if needed.
+% \begin{macrocode}
+ \@ifstar{}{\ifx\@nodocument\relax\vskip\baselineskip\fi}% correction for coming into single spacing
+}
+\SingleSpacing
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@OnehalfSpacing}
+% \begin{macro}{\OnehalfSpacing}
+% \cs{OnehalfSpacing} starts `one and a half' spacing, which to most
+% thesis nitpickers will look like double spacing.
+% (In package was \cs{onehalfspacing}). The starred version
+% \cs{OnehalfSpacing*} will also give page notes and floats the same spacing
+% \changes{v3.6g}{2010/09/19}{Made \cs{OnehalfSpacing} into a starred
+% version such that the starred version makes everything one half
+% spaced including page notes and floats}
+% \begin{macrocode}
+\newcommand*{\@OnehalfSpacing}{
+ \setSpacing{1.25}% default (10pt)
+ \ifcase \@ptsize \relax % 10pt
+ \setSpacing{1.25}%
+ \or% 11pt
+ \setSpacing{1.213}%
+ \or% 12pt
+ \setSpacing{1.241}%
+ \or\or% 14pt
+ \setSpacing{1.20}%
+ \or\or\or% 17pt
+ \setSpacing{1.16}%
+ \or\or% 9pt
+ \setSpacing{1.35}%
+ \else% the extended sizes
+ \setSpacing{1.16}%
+ \fi}
+\newcommand*\OnehalfSpacing{%
+ \@ifstar{%
+ \@OnehalfSpacing%
+ \edef\m@m@footnote@spacing{\baselinestretch}%
+ \edef\m@m@float@spacing{\baselinestretch}%
+ }{\@OnehalfSpacing}%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DoubleSpacing}
+% \begin{macro}{\@DoubleSpacing}
+% \cs{DoubleSpacing} starts double spacing, which to most thesis nitpickers
+% will look far too spaced out. (In package was
+% \cs{doublespacing}). The starred version will also set the page note
+% and float spacing to the same value.
+% \changes{v3.6g}{2010/09/19}{Extended with a starred version.}
+% \begin{macrocode}
+\newcommand*{\@DoubleSpacing}{
+ \setSpacing{1.667}% default (10pt)
+ \ifcase \@ptsize \relax % 10pt
+ \setSpacing{1.667}%
+ \or% 11pt
+ \setSpacing{1.618}%
+ \or% 12pt
+ \setSpacing{1.655}%
+ \or\or% 14pt
+ \setSpacing{1.60}%
+ \or\or\or% 17pt
+ \setSpacing{1.545}%
+ \or\or% 9pt
+ \setSpacing{1.8}%
+ \else% larger sizes
+ \setSpacing{1.5}%
+ \fi}
+\newcommand*\DoubleSpacing{%
+ \@ifstar{%
+ \@DoubleSpacing%
+ \edef\m@m@footnote@spacing{\baselinestretch}%
+ \edef\m@m@float@spacing{\baselinestretch}%
+ }{\@DoubleSpacing}%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@setsize}
+% Modify the kernel command.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check what this does!!!!!!!!
+% \begin{macrocode}
+\renewcommand*{\@setsize}[4]{%
+ \@nomath#1%
+ \let\@currsize#1%
+ \baselineskip #2%
+ \baselineskip \baselinestretch\baselineskip
+ \parskip \baselinestretch\parskip
+ \setbox\strutbox \hbox{%
+ \vrule height.7\baselineskip
+ depth .3\baselineskip
+ width \z@}%
+ \skip\footins \baselinestretch\skip\footins
+ \normalbaselineskip\baselineskip#3#4}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{SingleSpace}
+% Environment form of \cs{SingleSpacing}. (In package was \texttt{singlespace}).
+% \begin{macrocode}
+\newenvironment{SingleSpace}{%
+ \vskip\baselineskip
+ \setSpacing{\m@m@singlespace}%
+ \vskip -\baselineskip
+}{\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{SingleSpace*}
+% Don't use this; it's only here to match the \Lpack{setspace} package.
+% (In package was \texttt{singlespace*}).
+% \begin{macrocode}
+\newenvironment{SingleSpace*}{%
+%% \vskip\baselineskip
+ \setSpacing{\m@m@singlespace}%
+ \vskip 0.5\baselineskip
+}{\vskip -0.5\baselineskip}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\m@mrestore@spacing}
+% \begin{macrocode}
+\newcommand*{\m@mrestore@spacing}{%
+ \par
+ \vskip \parskip
+ \vskip \baselineskip
+ \endgroup
+ \vskip -\parskip
+ \vskip -\baselineskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Spacing}
+% \verb?\begin{Spacing}{num}? increases the \cs{baselineskip}
+% to \verb?num*\baselineskip?. (In package was \texttt{spacing}).
+% \begin{macrocode}
+\newenvironment{Spacing}[1]{%
+ \par
+ \begingroup
+ \setSpacing{#1}}{\m@mrestore@spacing}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{OnehalfSpace}
+% Environment form of \cs{OnehalfSpacing}. (In package was \texttt{onehalfspace}).
+% \changes{v3.6g}{2010/09/19}{Added starred version of environment to
+% complement the starred macro version}
+% \begin{macrocode}
+\newenvironment{OnehalfSpace}{%
+ \begingroup
+ \OnehalfSpacing}{\m@mrestore@spacing}
+\newenvironment{OnehalfSpace*}{%
+ \begingroup
+ \OnehalfSpacing*}{\m@mrestore@spacing}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{DoubleSpace}
+% Environment form of \cs{DoubleSpacing}. (In package was \texttt{doublespace}).
+% \changes{v3.6g}{2010/09/19}{Added starred version of environment to
+% complement the starred macro version}
+% \begin{macrocode}
+\newenvironment{DoubleSpace}{%
+ \begingroup
+ \DoubleSpacing}{\m@mrestore@spacing}
+\newenvironment{DoubleSpace*}{%
+ \begingroup
+ \DoubleSpacing}{\m@mrestore@spacing}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% Deal with spacing around displays.
+%
+% \begin{macro}{\memdskipstretch}
+% \begin{macro}{\setDisplayskipStretch}
+% \begin{macro}{\noDisplayskipStretch}
+% \cs{setDisplayskipStretch}\marg{num} changes space around displays by the
+% factor (1+\meta{num}). \cs{noDisplaydkipStretch} keeps the regular
+% spacing around displays. (In package were \cs{setdisplayskipstretch} and
+% the \texttt{nodisplayskipstretch} option).
+% \begin{macrocode}
+\newcommand*{\memdskipstretch}{0.0}
+\newcommand*{\setDisplayskipStretch}[1]{%
+ \renewcommand*{\memdskipstretch}{#1}}
+\newcommand*{\noDisplayskipStretch}{\setDisplayskipStretch{0.0}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memdskips}
+% Macro added to the kernel hook \cs{everydisplay}, changing the settings
+% of displayskips
+% \begin{macrocode}
+\newcommand*{\memdskips}{%
+ \advance\abovedisplayskip \memdskipstretch\abovedisplayskip
+ \advance\belowdisplayskip \memdskipstretch\belowdisplayskip
+ \advance\abovedisplayshortskip \memdskipstretch\abovedisplayshortskip
+ \advance\belowdisplayshortskip \memdskipstretch\belowdisplayshortskip}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\everydisplay}
+% \begin{macrocode}
+\everydisplay\expandafter{%
+ \the\everydisplay
+ \memdskips}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xfloat}
+% Reset \cs{baselinestretch} in floats. Because of a package like
+% \Lpack{fixltx2e} (recommended package), we have to delay the
+% addition.
+% \changes{v3.7d}{2014/07/28}{Delayed addition to
+% \cs{@xfloat}. Reported by Ulrike Fischer}.
+% \changes{v3.7g}{2017/05/08}{Delayed the addition of the adjustment
+% to the float until after \cs{normalsize}. Reported at \protect\url{https://tex.stackexchange.com/q/368422/3929}}
+% \begin{macrocode}
+\AtBeginDocument{
+ \let\m@m@xfloat\@xfloat
+ \def\@xfloat #1[#2]{%
+ \m@m@xfloat #1[#2]%
+ \def\baselinestretch{\m@m@float@spacing}%
+ \normalsize%
+ \@nameuse{#1adjustment}%
+ }
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The extra spacing does not add space before and after a minipage.
+% The solution, hinted at by Donald Arseneau, is to create a new
+% environment. I came up with a solution which DA then much improved upon
+% (CTT \textit{setspace and minipages}, 2006/11/28).
+% This is like minipage from an author's view, except that it is
+% always top positioned and acts like a paragraph.
+% \begin{macro}{\memPD}
+% \begin{macrocode}
+\newdimen\memPD
+% \end{macrocode}
+% \end{macro}
+% \begin{environment}{vminipage}
+% The user view, just as for \texttt{minipage}, but ensures the \texttt{t}
+% position and as a new paragraph. It is like \texttt{minipage} but with
+% better fore and aft spacing.
+% \begin{macrocode}
+\newenvironment{vminipage}{%
+ \par
+ \@ifnextchar[%]
+ \@ivminipage
+ {\@iiiminipage t\relax[s]}
+}{%
+ \par\global\memPD=\prevdepth
+ \endminipage
+ \par
+ \kern-\memPD% no pagebreak allowed here
+ \hbox{\vrule depth \memPD width \z@}}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\@ivminipage}
+% Deal with first optional argument to \texttt{vminipage}.
+% \begin{macrocode}
+ \def\@ivminipage[#1]{%
+ \@ifnextchar[%]
+ {\@iiminipage{t}}{\@iiiminipage{t}\relax[s]}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Abnormal parskips}
+%
+% Non-zero, positive \cs{parskip}, which is not to be encouraged. Code
+% based on Robin Fairbairns \Lpack{parskip} package and the NTG classes.
+%
+% \begin{macro}{\ifm@mnzpskip}
+% \begin{macro}{\m@mnzpskiptrue}
+% \begin{macro}{\m@mnzpskipfalse}
+% \cs{ifm@mnzpskip} is TRUE if \cs{parskip} set to anything but 0pt.
+% \begin{macrocode}
+\newif\ifm@mnzpskip
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\traditionalparskip}
+% \begin{macro}{\m@mabparskip}
+% \begin{macro}{\abnormalparskip}
+% \begin{macro}{\nonzeroparskip}
+% \cs{traditionalparskip} sets \cs{parskip} to 0pt.
+% \cs{abnormalparskip}\marg{length} sets \cs{parskip} to \meta{length}.
+% \cs{nonzeroparskip} sets \cs{parskip} to a non-zero value that might be
+% not too bad (any non-zero \cs{parskip} is not good).
+% \changes{v1.61803398c}{2009/11/13}{\cs{parskip} was set to \cs{z@},
+% thus the stretch was missing, this broke \cs{flushbottom}}
+% \begin{macrocode}
+\newcommand*{\traditionalparskip}{%
+ \setlength\parskip{0\p@ \@plus \p@}
+ \m@mnzpskipfalse}
+\newskip\m@mabparskip
+\newcommand*{\abnormalparskip}[1]{%
+ \setlength{\parskip}{#1}\m@mabparskip=#1\relax
+ \m@mnzpskiptrue}
+\newcommand*{\nonzeroparskip}{\abnormalparskip{%
+ 0.5\baselineskip
+ \@plus .1\baselineskip \@minus .1\baselineskip% NTG
+%% 0.5/baselineskip \@plus 2pt% RF
+}}
+\traditionalparskip
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@minpagerestore}
+% This needs extending: here's what NTG does, but I've put the
+% appropriate code later.
+% \begin{verbatim}
+% \providecommand*{\@minipagerestore}{%
+% \parskip=.5\baselineskip \@plus .1\baselineskip \@minus .1\baselineskip}
+% \end{verbatim}
+% \end{macro}
+%
+% \section{Titles}
+%
+% For books the title is usually designed specifically for the particular
+% work, so originally the class did not provide a \cs{maketitle} command or
+% any of the \cs{title} and other commands that normally go along with this.
+% After some thought I decided to add in the code from the
+% \Lpack{titling} package~\cite{TITLING}. However, in this case life
+% is a bit simpler as there is no pre-existing class code.
+% \changes{v0.3}{2001/07/09}{Added titling code}
+%
+% \begin{macro}{\pretitle}
+% \begin{macro}{\@bspretitle}
+% \begin{macro}{\posttitle}
+% \begin{macro}{\@bsposttitle}
+% \begin{macro}{\preauthor}
+% \begin{macro}{\@bspreauthor}
+% \begin{macro}{\postauthor}
+% \begin{macro}{\@bspostauthor}
+% \begin{macro}{\predate}
+% \begin{macro}{\@bspredate}
+% \begin{macro}{\postdate}
+% \begin{macro}{\@bspostdate}
+% To provide some flexibilty in the titling style of the document,
+% user level commands are provided that can be changed to reconfigure
+% the appearance resulting from \cs{maketitle}.
+% \begin{macrocode}
+\newcommand{\pretitle}[1]{\def\@bspretitle{#1}}
+\newcommand{\posttitle}[1]{\def\@bsposttitle{#1}}
+\newcommand{\preauthor}[1]{\def\@bspreauthor{#1}}
+\newcommand{\postauthor}[1]{\def\@bspostauthor{#1}}
+\newcommand{\predate}[1]{\def\@bspredate{#1}}
+\newcommand{\postdate}[1]{\def\@bspostdate{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% These are defined initially
+% to mimic the normal \LaTeX{} style.
+% \begin{macrocode}
+ \pretitle{\begin{center}\LARGE}
+ \posttitle{\par\end{center}\vskip 0.5em}
+ \preauthor{\begin{center}
+ \large \lineskip .5em%
+ \begin{tabular}[t]{c}}
+ \postauthor{\end{tabular}\par\end{center}}
+ \predate{\begin{center}\large}
+ \postdate{\par\end{center}}
+
+% \end{macrocode}
+%
+% \begin{macro}{\maketitlehooka}
+% \begin{macro}{\maketitlehookb}
+% \begin{macro}{\maketitlehookc}
+% \begin{macro}{\maketitlehookd}
+% The four hooks which will be called by \cs{maketitle}. These are initially
+% vacuous.
+% \begin{macrocode}
+\newcommand{\maketitlehooka}{}
+\newcommand{\maketitlehookb}{}
+\newcommand{\maketitlehookc}{}
+\newcommand{\maketitlehookd}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\thanksmarkseries}
+% \begin{macro}{\@bsmarkseries}
+% \begin{macro}{\symbolthanksmark}
+% These are for specifying the kind of series for thanks markers.
+% \begin{macrocode}
+\newcommand{\thanksmarkseries}[1]{%
+ \def\@bsmarkseries{\renewcommand{\thefootnote}%
+ {\@nameuse{#1}{footnote}}}}
+\newcommand{\symbolthanksmark}{\thanksmarkseries{\fnsymbol}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\continuousmarks}
+% \begin{macro}{\@bscontmark}
+% These are for (non) zeroing of the footnote counter.
+% \begin{macrocode}
+\newcommand{\@bscontmark}{\setcounter{footnote}{0}}
+\newcommand{\continuousmarks}{\def\@bscontmark{}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\thanksheadextra}
+% \begin{macro}{\@bsthanksheadpre}
+% \begin{macro}{\@bsthanksheadpost}
+% These are for inserting stuff before and after a mark in the titling.
+% \begin{macrocode}
+\newcommand{\thanksheadextra}[2]{%
+ \def\@bsthanksheadpre{#1}%
+ \def\@bsthanksheadpost{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.2}{2002/08/10}{Deprecated \cs{thanksfootextra}}
+% \changes{v1.2}{2002/08/10}{Removed \cs{thanksfootpre} and \cs{thanksfootpost}}
+% \changes{v1.4}{2003/12/14}{Removed \cs{thanksfootextra}}
+%
+% \begin{macro}{\thanksmark}
+% This adds a thanks mark. The \cs{footnotemark} could have been used directly
+% but it is fragile in a moving argument.
+% \begin{macrocode}
+\DeclareRobustCommand{\thanksmark}[1]{\footnotemark[#1]}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thanksgap}
+% This specifies some horizontal space.
+% \begin{macrocode}
+\newcommand{\thanksgap}[1]{\hspace{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tamark}
+% This stores the current definition of \cs{@thefnmark}. For some reason
+% using \cs{@thefnmark} directly only gave the last value.
+% \begin{macrocode}
+\newcommand{\tamark}{\@thefnmark}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thanksmarkwidth}
+% A length determining the size of the box for typesetting
+% a thanks marker.
+% \begin{macrocode}
+\newlength{\thanksmarkwidth}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thanksmarksep}
+% A length determining the inset of thanks footnotes.
+% \changes{v1.2}{2002/08/10}{Replaced \cs{thanksmargin} by \cs{thanksmarksep}}
+% \begin{macrocode}
+\newlength{\thanksmarksep}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thanksmarkstyle}
+% \begin{macro}{\thanksscript}
+% \cs{thanksscript} is a wrapper round the actual mark stuff to be typeset.
+% The user can define this via \cs{thanksmarkstyle}\marg{code}.
+% The default is a superscript mark.
+% \changes{v1.2}{2002/08/10}{Added \cs{thanksmarkstyle}}
+% \begin{macrocode}
+\newcommand{\thanksmarkstyle}[1]{\def\thanksscript##1{#1}}
+\thanksmarkstyle{\textsuperscript{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makethanksmarkhook}
+% A vacuous macro used as a hook into \cs{makethanksmark}.
+% \begin{macrocode}
+\newcommand{\makethanksmarkhook}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thanksfootmark}
+% This typesets the thanks footnote mark.
+% \changes{v1.2}{2002/08/10}{Complete rewrite of \cs{thanksfootmark}}
+% \begin{macrocode}
+\newcommand{\thanksfootmark}{%
+ \ifdim\thanksmarkwidth < \z@
+% \end{macrocode}
+% Negative width, mark is in the margin.
+% \begin{macrocode}
+ \llap{\hb@xt@ -\thanksmarkwidth{%
+ \hss\normalfont\thanksscript{\tamark}}%
+ \hspace*{-\thanksmarkwidth}}%
+ \else
+ \ifdim\thanksmarkwidth = \z@
+% \end{macrocode}
+% Zero width, mark is at (inside) the margin.
+% \begin{macrocode}
+ {\normalfont\thanksscript{\tamark}}%
+ \else
+% \end{macrocode}
+% Positive width.
+% \begin{macrocode}
+ \hb@xt@\thanksmarkwidth{\hss\normalfont\thanksscript{\tamark}}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makethanksmark}
+% This sets the general indentations for the thanks footnote,
+% and typesets the mark. The code is a simplified version of that
+% for typesetting ToC entries.
+% \changes{v1.2}{2002/08/10}{Minor changes to \cs{makethanksmark}}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{makethanksmark}}
+% \changes{v1.61803398b}{2009/09/21}{fixed typo, \cs{thanksmarksep}
+% not \cs{thanksmark}}
+% \begin{macrocode}
+\newcommand{\makethanksmark}{%
+ \leavevmode%
+ \parindent 1em\noindent
+%%% \leftskip\thanksmarksep\relax
+ \memRTLleftskip\thanksmarksep\relax
+%%% \advance\leftskip\thanksmarkwidth
+ \advance\memRTLleftskip\thanksmarkwidth
+%%% \null\nobreak\hskip-\leftskip\relax
+ \null\nobreak\hskip-\memRTLleftskip\relax
+ \makethanksmarkhook\relax
+ \thanksfootmark}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\usethanksrule}
+% \begin{macro}{\cancelhanksrule}
+% Simple macros that let \cs{footnoterule} to another rule definition.
+% \begin{macrocode}
+\newcommand{\usethanksrule}{\let\footnoterule\thanksrule}
+\newcommand{\cancelthanksrule}{\let\footnoterule\@bsfootnoterule}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% Now set up the rest of the thanks defaults, styling having been
+% done earlier.
+% \begin{macrocode}
+\thanksmarkseries{fnsymbol} % symbols
+\thanksheadextra{}{}
+\setlength{\thanksmarkwidth}{1.8em}
+\setlength{\thanksmarksep}{-\thanksmarkwidth}
+
+% \end{macrocode}
+% \begin{macro}{\thanksrule}
+% \begin{macro}{\@bsfootnoterule}
+% These are saved versions of the \cs{footnoterule} definition as it
+% is at the end of the preamble.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \let\thanksrule\footnoterule
+ \let\@bsfootnoterule\footnoterule
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\droptitle}
+% A titling block has \cs{droptitle} amount of additional vertical space
+% above it (normally zero).
+% \begin{macrocode}
+\newlength{\droptitle}
+\setlength{\droptitle}{0pt}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maketitle}
+% The following is a
+% modification of \cs{maketitle} as in the \Lpack{article}, \Lpack{report},
+% and \Lpack{book} classes. It sets the pagestyle to \pstyle{title}.
+% \changes{v1.4}{2004/01/21}{Removed the \cs{rlap} from \cs{@makefnmark}
+% in \cs{maketitle} so multiple \cs{thanks}
+% work per \cs{footnote}}
+% \changes{v1.618}{2005/09/03}{Fix to remove extra blank page when
+% \cs{maketitle} (and \cs{@maketitle}) is used within adjustwidth
+% inside a titlingpage (mempatch v3.2)}
+% \begin{macrocode}
+\newcommand{\maketitle}{\par
+ \begingroup
+ \@bsmarkseries
+ \def\@makefnmark{\@textsuperscript{%
+ \normalfont\@bsthanksheadpre \tamark \@bsthanksheadpost}}%
+ \long\def\@makefntext##1{\makethanksmark ##1}
+ \if@twocolumn
+ \ifnum \col@number=\@ne
+ \@maketitle
+ \else
+ \twocolumn[\@maketitle]%
+ \fi
+ \else
+ \ifdim\pagetotal>\z@
+ \newpage
+ \fi
+ \global\@topnum\z@
+ \@maketitle
+ \fi
+ \thispagestyle{title}\@thanks
+ \endgroup
+ \@bscontmark % \setcounter{footnote}{0}%
+ }
+\aliaspagestyle{title}{plain}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mem@titlefootkill}
+% \cs{@mem@titlefootkill}\marg{note} Warn about footnotes in titles.
+% \begin{macrocode}
+\newcommand*{\@mem@titlefootkill}[1]{%
+ \@memwarn{Do not use \string\footnote\space in
+ \string\maketitle.\MessageBreak
+ Use \protect\thanks\space instead}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@maketitle}
+% Our version of \cs{@maketitle}.
+% Footnotes are killed in the title; see the thread `\cs{title}, \cs{author}
+% and \cs{footnote} feature in memoir class', February 2003.
+% \changes{v1.4}{2003/11/16}{Killed footnote in titles (from patch v1.4)}
+% \begin{macrocode}
+\newcommand{\@maketitle}{%
+ \let\footnote\@mem@titlefootkill
+ \ifdim\pagetotal>\z@
+ \newpage
+ \fi
+ \null
+ \vskip 2em%
+ \vspace*{\droptitle}
+ \maketitlehooka
+ {\@bspretitle \@title \@bsposttitle}
+ \maketitlehookb
+ {\@bspreauthor \@author \@bspostauthor}
+ \maketitlehookc
+ {\@bspredate \@date \@bspostdate}
+ \maketitlehookd
+ \par
+ \vskip 1.5em}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{mem@titlingpage}
+% \begin{environment}{titlingpage}
+% \begin{environment}{titlingpage*}
+% \begin{macro}{\titlingpageend}
+% The \Lenv{titlingpage} environment sets the pagestyle to be \pstyle{titlingpage},
+% disables the footnote rule and ensures that the page is single
+% column. At the end it switches back to twocolumn if neccessary,
+% and then starts a new page as number 1. On the other hand
+% \Lenv{titlingpage*}, does \emph{not} reset the page counter.
+%
+% At the end of the titlingpage we clear the page to let the next data
+% start on a new page. However there is a slight complication
+% here. Should we clear to next page or to next righthand page. One
+% could argue that under \Lopt{twoside} going to next right hand page
+% would be best, but then there is also \Lopt{openany}. In order to
+% make this configurable we will factor this out in a configurable
+% macro, and leave the defaults as they are so not to mess with
+% existing documents.
+% \changes{v3.6k}{2012/12/24}{Added \Lenv{titlingpage*} env}
+% \changes{v3.7g}{2018/03/06}{Added \cs{titlingpageend}}
+% \begin{macrocode}
+\newcommand\titlingpageend[2]{%
+ \def\mem@titlingpage@clear@for@twoside{#1}%
+ \def\mem@titlingpage@clear@for@oneside{#2}%
+}
+ % default
+\titlingpageend{\cleardoublepage}{\clearpage}
+\newenvironment{mem@titlingpage}%
+ {\let\footnoterule\relax
+ \let\footnotesize\small
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \thispagestyle{titlingpage}%
+ \if\mem@titlpg@reset\setcounter{page}{\@ne}\fi%
+ }{%
+ \thispagestyle{titlingpage}%
+ \if@restonecol \twocolumn \fi
+ % \if@twoside \cleardoublepage \else \clearpage \fi
+ \if@twoside \mem@titlingpage@clear@for@twoside \else \mem@titlingpage@clear@for@oneside \fi
+ \if\mem@titlpg@reset\setcounter{page}{\@ne}\fi}
+\newenvironment{titlingpage}{%
+ \def\mem@titlpg@reset{00}%
+ \begin{mem@titlingpage}}{%
+ \end{mem@titlingpage}}
+\newenvironment{titlingpage*}{%
+ \def\mem@titlpg@reset{01}%
+ \begin{mem@titlingpage}}{%
+ \end{mem@titlingpage}}
+\aliaspagestyle{titlingpage}{empty}
+
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\emptythanks}
+% This macro discards all prior \cs{thanks} texts.
+% \begin{macrocode}
+\newcommand{\emptythanks}{\global\let\@thanks\@empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\andnext}
+% The kernel \cs{and} macro puts space between author's names. The
+% \cs{andnext} macro puts a newline between the names.
+% \changes{v1.6}{2004/01/28}{Added \cs{andnext}}
+% \begin{macrocode}
+\newcommand*{\andnext}{%
+ \end{tabular}\\ \begin{tabular}[t]{c}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bsmtitlempty}
+% \cs{@bsmtitlempty} is a helper macro to save some macro space.
+% It empties some elements of \cs{maketitle}.
+% \changes{v3.6k}{2012/07/01}{Removed \cs{thanksfootextra}, seems to
+% have been forgotten back in 2003.}
+% \begin{macrocode}
+\newcommand{\@bsmtitlempty}{%
+ \global\let\maketitle\relax
+ \global\let\@maketitle\relax
+ \global\let\title\relax
+ \global\let\author\relax
+ \global\let\date\relax
+ \global\let\thanksmarkseries\relax
+ \global\let\thanksfootextra\relax
+ \global\let\thanksmark\relax
+ \global\let\thanksgap\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\keepthetitle}
+% This macro undefines all the titling commands except for
+% \cs{thetitle}, \cs{theauthor} and \cs{thedate}.
+% \changes{v1.6}{2004/01/28}{changed \cs{keepthetitle} to cater for \cs{andnext}}
+% \begin{macrocode}
+\newcommand{\keepthetitle}{%
+ \@bsmtitlempty
+ \global\let\thanks\relax
+ \global\let\and\relax
+ \global\let\andnext\relax
+ \global\let\@thanks\@empty
+ \global\let\@title\@empty
+ \global\let\@author\@empty
+ \global\let\@date\@empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\killtitle}
+% \cs{killtitle} undefines the remaining macros of \cs{maketitle}.
+% \begin{macrocode}
+\newcommand{\killtitle}{%
+ \keepthetitle
+ \global\let\thetitle\relax
+ \global\let\theauthor\relax
+ \global\let\thedate\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\thetitle}
+% \begin{macro}{\theauthor}
+% \begin{macro}{\thedate}
+% In order to make the \cs{title}, etc., values available for printing
+% their definitions (in \file{ltsect.dtx}) need extending to save their
+% arguments. We have to make sure that extraneous material,
+% like \cs{thanks}, is excluded from the saved texts.
+% \changes{v1.4}{2003/11/16}{Gobble footnotes in \cs{title}, \cs{author}
+% and \cs{date} (from patch v1.4)}
+% \changes{v1.6}{2004/01/28}{Added \cs{andnext} handling to \cs{author}}
+% \begin{macrocode}
+\addtoiargdef{\title}{%
+ \begingroup\let\footnote\@gobble}{%
+ \begingroup
+ \renewcommand{\thanks}[1]{}
+ \renewcommand{\thanksmark}[1]{}
+ \renewcommand{\thanksgap}[1]{}
+ \protected@xdef\thetitle{#1}
+ \endgroup\endgroup}
+\addtoiargdef{\author}{%
+ \begingroup\let\footnote\@gobble}{%
+ \begingroup
+ \renewcommand{\thanks}[1]{}
+ \renewcommand{\and}{\unskip, }
+ \renewcommand{\andnext}{\unskip, }
+ \renewcommand{\thanksmark}[1]{}
+ \renewcommand{\thanksgap}[1]{}
+ \protected@xdef\theauthor{#1}
+ \endgroup\endgroup}
+\addtoiargdef{\date}{%
+ \begingroup\let\footnote\@gobble}{%
+ \begingroup
+ \renewcommand{\thanks}[1]{}
+ \renewcommand{\thanksmark}[1]{}
+ \renewcommand{\thanksgap}[1]{}
+ \protected@xdef\thedate{#1}
+ \endgroup\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \section{Parts, chapters and other divisions}
+%
+% \subsection{Building blocks} The definitions in this part of a
+% class file usually make use of two internal macros, \cs{@startsection} and
+% \cs{secdef}. To understand
+% what is going on here, we describe their syntax.
+%
+% \DescribeMacro{\@startsection}
+% The macro \cs{@startsection} has 6 required arguments, optionally
+% followed by a $*$, an optional argument and a required argument:
+%
+% \cs{@startsection}\meta{name}\meta{level}\meta{indent}^^A
+% \meta{beforeskip}\meta{afterskip}\meta{style}
+% optional * %\\
+% \null\hphantom{\bslash @startsection}^^A
+% \oarg{altheading}\meta{heading}
+%
+% It is a generic command to start a section, the arguments have
+% the following meaning:
+%
+% \begin{description}
+% \item[\meta{name}] The name of the user level command, e.g.,
+% `section'.
+% \item[\meta{level}] A number, denoting the depth of the section
+% --- e.g., chapter = 0, section = 1, etc. A section number
+% will be printed if and only if \meta{level} $<=$ the value
+% of the \Lcount{secnumdepth} counter.
+% \item[\meta{indent}] The indentation of the heading from the left
+% margin
+% \item[\meta{beforeskip}] The absolute value of this argument
+% gives the skip to leave above the heading. If it is
+% negative, then the paragraph indent of the text following
+% the heading is suppressed.
+% \item[\meta{afterskip}] If positive, this gives the skip to leave
+% below the heading, else it gives the skip to leave to the
+% right of a run-in heading.
+% \item[\meta{style}] Commands to set the style of the heading.
+% \item[$*$] When this is missing the heading is numbered and the
+% corresponding counter is incremented.
+% \item[\meta{altheading}] Gives an alternative heading to use in
+% the table of contents and in the running heads. This should
+% be present when the $*$ form is used.
+% \item[\meta{heading}] The heading of the new section.
+% \end{description}
+% A sectioning command is normally defined to \cs{@startsection} and
+% its first six arguments.
+%
+% \DescribeMacro{\secdef}
+% The macro \cs{secdef} can be used when a sectioning command is
+% defined without using \cs{@startsection}. It has two arguments:
+%
+% \cs{secdef}\meta{unstarcmds}\meta{starcmds}
+%
+% \begin{description}
+% \item[\meta{unstarcmds}] Used for the normal form of a
+% sectioning command.
+% \item[\meta{starcmds}] Used for the $*$-form of a
+% sectioning command.
+% \end{description}
+%
+% You can use \cs{secdef} as follows:
+% \begin{verbatim}
+% \def\chapter { ... \secdef \CMDA \CMDB }
+% \def\CMDA [#1]#2{ ... } % Command to define
+% % \chapter[...]{...}
+% \def\CMDB #1{ ... } % Command to define
+% % \chapter*{...}
+% \end{verbatim}
+%
+% \DescribeMacro{\@hangfrom}
+% Internally the \cs{@startsection} macro uses \verb?\@hangfrom{NUM}?, where
+% \verb?NUM? is the sectional number, to produce a hanging paragraph. That is,
+% the second and later lines of a multiline title are indented from the
+% left margin by the width of the number.
+% The definition of \cs{@hangfrom}, from \file{ltsect.dtx}, is:
+% \begin{verbatim}
+% \def\@hangfrom#1{\setbox\@tempboxa\hbox{{#1}}%
+% \hangindent \wd\@tempboxa\noindent\box\@tempboxa}
+% \end{verbatim}
+%
+% To get a normal paragraphed title you can do: \\
+% \verb?\renewcommand{\@hangfrom}[1]{#1}? \\
+% or as a block paragraph: \\
+% \verb?\renewcommand{\@hangfrom}[1]{\noindent #1}? \\
+%
+% \DescribeMacro{\@seccntformat}
+% The \cs{@startsection} macro also uses \verb?\@seccntformat{NUM}? to format
+% the section number, including the space after it. Its definition,
+% from \file{ltsect.dtx}, is
+% \begin{verbatim}
+% \def\@seccntformat#1{\csname the#1\endcsname\quad}
+% \end{verbatim}
+% This is the command to change if you need different number formatting. For
+% example the combination
+% \begin{verbatim}
+% \renewcommand{\@seccntformat}[1]{\llap{\csname the#1\endcsname\quad}}
+% \renewcommand{\@hangfrom}[1]{\noindent #1}
+% \end{verbatim}
+% will hang the section numbers in the margin.
+%
+% \begin{table}
+% \centering
+% \caption{Document division levels}\label{tab:levels}
+% \begin{tabular}{lr} \hline
+% Division & Level \\ \hline
+% book & -2 \\
+% part & -1 \\
+% chapter & 0 \\
+% section & 1 \\
+% subsection & 2 \\
+% subsubsection & 3 \\
+% paragraph & 4 \\
+% subparagraph & 5 \\
+% \hline
+% \end{tabular}
+% \end{table}
+%
+% The values used for the document division levels are the same
+% as defined by the standard \LaTeX{} classes, with the exception
+% of the book division which is a memoir addition, and are given in
+% Table~\ref{tab:levels}.
+% \changes{v1.61803}{2008/01/30}{Added book division (from mempatch v4.4)}
+% \subsection{Mark commands}
+%
+% \begin{macro}{\bookpagemark}
+% \begin{macro}{\partmark}
+% \begin{macro}{\chaptermark}
+% \begin{macro}{\sectionmark}
+% \begin{macro}{\subsectionmark}
+% \begin{macro}{\subsubsectionmark}
+% \begin{macro}{\paragraphmark}
+% \begin{macro}{\subparagraphmark}
+% The default initialisations of the \cs{...mark} commands for use in
+% the pagestyles. Most are already defined in the kernel but they are
+% all noted here.
+% \begin{macrocode}
+\newcommand*{\bookpagemark}[1]{}
+\newcommand*{\partmark}[1]{}
+\newcommand*{\chaptermark}[1]{}
+% \newcommand*{\sectionmark}[1]{}
+% \newcommand*{\subsectionmark}[1]{}
+% \newcommand*{\subsubsectionmark}[1]{}
+% \newcommand*{\paragraphmark}[1]{}
+% \newcommand*{\subparagraphmark}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibmark}
+% Marks for the bibliography, which may be filled with \cs{bibname}.
+% \changes{v1.1}{2002/03/10}{Added \cs{bibmark}}
+% \begin{macrocode}
+\newcommand*{\bibmark}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\indexmark}
+% Marks for the index, which may be filled with \cs{indexname}.
+% \changes{v1.1}{2002/03/10}{Added \cs{indexmark}}
+% \begin{macrocode}
+\newcommand*{\indexmark}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glossarymark}
+% Marks for the glossary, which may be filled with \cs{glossaryname}.
+% \changes{v1.618}{2005/09/25}{Added \cs{glossarymark}}
+% \begin{macrocode}
+\newcommand*{\glossarymark}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Define Counters}
+%
+% \begin{macro}{\c@secnumdepth}
+% The value of the counter \Lcount{secnumdepth} gives the depth of
+% the highest-level sectioning command that is to produce section
+% numbers.
+% \begin{macrocode}
+\setcounter{secnumdepth}{2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@book}
+% \begin{macro}{\c@part}
+% \begin{macro}{\c@chapter}
+% \begin{macro}{\c@section}
+% \begin{macro}{\c@subsection}
+% \begin{macro}{\c@subsubsection}
+% \begin{macro}{\c@paragraph}
+% \begin{macro}{\c@subparagraph}
+% These counters are used for the sectioning numbers. The macro\\
+% \cs{newcounter}\marg{newctr}\oarg{oldctr}\\
+% defines\meta{newctr} to be a counter, which is reset to zero when
+% counter \meta{oldctr} is stepped. Counter \meta{oldctr} must
+% already be defined.
+%
+% Book, part and chapter are the top level document divisions.
+% \begin{macrocode}
+\newcounter{book} \setcounter{book}{0}
+\newcounter{part} \setcounter{part}{0}
+\newcounter{chapter} \setcounter{chapter}{0}
+% \end{macrocode}
+% The lower level divisions get reset by higher level divisions.
+% \begin{macrocode}
+\newcounter{section}[chapter]
+\newcounter{subsection}[section]
+\newcounter{subsubsection}[subsection]
+\newcounter{paragraph}[subsubsection]
+\newcounter{subparagraph}[paragraph]
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\thebook}
+% \begin{macro}{\thepart}
+% \begin{macro}{\thechapter}
+% \begin{macro}{\thesection}
+% \begin{macro}{\thesubsection}
+% \begin{macro}{\thesubsubsection}
+% \begin{macro}{\theparagraph}
+% \begin{macro}{\thesubparagraph}
+% For any counter \Lcount{CTR}, \cs{theCTR} is a macro that defines
+% the printed version of counter \Lcount{CTR}. It is defined in
+% terms of the following macros:
+%
+% \cs{arabic}\marg{COUNTER} prints the value of
+% \meta{COUNTER} as an arabic numeral.
+%
+% \cs{roman}\marg{COUNTER} prints the value of
+% \meta{COUNTER} as a lowercase roman numeral.
+%
+% \cs{Roman}\marg{COUNTER} prints the value of
+% \meta{COUNTER} as an uppercase roman numeral.
+%
+% \cs{alph}\marg{COUNTER} prints the value of \meta{COUNTER}
+% as a lowercase letter: $1 =$~a, $2 =$~ b, etc.
+%
+% \cs{Alph}\marg{COUNTER} prints the value of \meta{COUNTER}
+% as an uppercase letter: $1 =$~A, $2 =$~B, etc.
+%
+% \begin{macrocode}
+\renewcommand*{\thebook}{\@Roman\c@book}
+\renewcommand*{\thepart}{\@Roman\c@part}
+\renewcommand*{\thechapter}{\@arabic\c@chapter}
+\renewcommand*{\thesection}{\thechapter.\@arabic\c@section}
+\renewcommand*{\thesubsection}{%
+ \thesection.\@arabic\c@subsection}
+\renewcommand*{\thesubsubsection}{%
+ \thesubsection.\@arabic\c@subsubsection}
+\renewcommand*{\theparagraph}{%
+ \thesubsubsection.\@arabic\c@paragraph}
+\renewcommand*{\thesubparagraph}{%
+ \theparagraph.\@arabic\c@subparagraph}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@chapapp}
+% \cs{@chapapp} is initially defined as \cs{chaptername}. The \cs{appendix}
+% command redfines it as \cs{appendixname}.
+% \begin{macrocode}
+\newcommand{\@chapapp}{\chaptername}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Front, main and back matter}
+%
+% These are the three main logical divisions in a book. As noted earlier,
+% the boolean \cs{if@mainmatter} is TRUE iff the main matter is being
+% processed. Chapters will be unnumbered when \cs{if@mainmatter} is FALSE.
+%
+% \begin{macro}{\frontmatter}
+% \begin{macro}{\frontmatter*}
+% The \cs{frontmatter} command starts roman numbering and turns off
+% chapter numbering.
+% It ensures that lower level divisions will not have chapter numbers,
+% nor will figures or tables. It
+% also ensures that the next page will be recto.
+% The starred version makes no changes to the page numbering\footnote{The
+% starred versions were added to meet a request by Daniel Richard G.
+% (\texttt{skunk@mit.edu}) in September 2001.}.
+% \changes{v0.3}{2001/07/09}{\cs{frontmatter} switches off numbering via
+% the secnumdepth counter}
+% \changes{v1.0}{2001/09/21}{Added \cs{frontmatter*} command}
+% \begin{macrocode}
+\newcommand{\frontmatter}{%
+ \@ifstar{\@smemfront}{\@memfront}}
+% \end{macrocode}
+% \begin{macro}{\@memfront@floats}
+% \changes{v1.6180339f}{Added \cs{@memfront@floats}}
+% Factoring out the float counter domination, in case someone wants
+% something added or changed
+% \begin{macrocode}
+\newcommand\@memfront@floats{%
+ \counterwithout{figure}{chapter}
+ \counterwithout{table}{chapter}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@smemfront}
+% \begin{macrocode}
+\newcommand{\@smemfront}{%
+ \cleardoublepage
+ \@mainmatterfalse
+ \setcounter{secnumdepth}{-10}
+ \@memfront@floats
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@memfront}
+% \begin{macrocode}
+\newcommand{\@memfront}{%
+ \@smemfront\pagenumbering{roman}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mainmatter}
+% \begin{macro}{\mainmatter*}
+% The \cs{mainmatter} command starts arabic numbering and turns on chapter numbering.
+% It sets numbering to the normal state. It
+% also ensures that the next page will be recto. The starred version does
+% not change the page numbering.
+%
+% Romano Giannetti suggested that \cs{mainmatter} (and \cs{backmatter}) should
+% be almost no-ops with the article option.
+% \changes{v0.3}{2001/07/09}{\cs{mainmatter} switches on section numbering
+% via the secnumdepth counter}
+% \changes{v1.0}{2001/09/21}{Added \cs{mainmatter*} command}
+% \begin{macrocode}
+\newcommand{\mainmatter}{%
+ \@ifstar{\@smemmain}{\@memmain}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@memmain@floats}
+% \changes{v1.6180339f}{}{Added \cs{@memmain@floats}}
+% Factoring out the float counter domination, in case someone wants
+% something added or changed
+% \begin{macrocode}
+\newcommand\@memmain@floats{%
+ \counterwithin{figure}{chapter}
+ \counterwithin{table}{chapter}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@smemmain}
+% If \cs{frontmatter} and \cs{mainmatter} are used with the article option,
+% then a page numbering / margin problem can occur if the frontmatter ends
+% on an odd page --- the first mainmatter next page is odd as well which throws
+% puts two odd-margined pages together.
+%
+% One fix from Morten is to always \cs{cleardoublepage} for twosided articles.
+%
+% One fix from me is for the ...matter macros to just switch on/off section
+% numbering.
+%
+% Morten's is simpler to implement.
+%
+% \changes{v1.1}{2002/03/10}{Modified \cs{@smemmain} to reset the secnumdepth
+% counter to maxsecnumdepth}
+% \changes{v1.4}{2003/11/22}{Included cognizance of article option in \cs{@smemmain}
+% (from patch v1.7)}
+% \changes{v1.61803}{2008/01/30}{Changed timing of \cs{clear[double]page} in
+% \cs{@smemmain} (David Wilson, mempatch v4.5)}
+% \changes{v1.61803}{2008/01/30}{Changed clear pages in \cs{@smemmain}
+% (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\@smemmain}{%
+ \@mainmattertrue
+ \setcounter{secnumdepth}{\value{maxsecnumdepth}}
+ \ifartopt
+ \if@twoside
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \else
+ \cleardoublepage
+ \@memmain@floats
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memmain}
+% \begin{macrocode}
+\newcommand{\@memmain}{%
+ \@smemmain\pagenumbering{arabic}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memback@floats}
+% \changes{v1.6180339f}{Added \cs{@memback@floats}}
+% Factoring out the float counter domination, in case someone wants
+% something added or changed
+% \begin{macrocode}
+\newcommand\@memback@floats{%
+ \counterwithout{figure}{chapter}
+ \counterwithout{table}{chapter}
+ \setcounter{figure}{0}
+ \setcounter{table}{0}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\backmatter}
+% This command turns off chapter numbering but leaves the page numbering alone.
+% It twiddles the numbering caption numbering.
+% The back matter may start on any new page.
+% \changes{v0.3}{2001/07/09}{\cs{backmatter} uses the secnumdepth counter}
+% \changes{v1.4}{2003/11/22}{Included cognizance of article option in \cs{backmatter}
+% (from patch v1.7)}
+% \begin{macrocode}
+\newcommand{\backmatter}{%
+ \ifartopt
+ \clearpage
+ \else
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \fi
+ \@mainmatterfalse
+ \setcounter{secnumdepth}{-10}
+ \ifartopt\else
+ \@memback@floats
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Book}
+%
+% This was added at the request of Frederic Connes who said that in
+% Frency typography there was often a division above the \cs{part} level.
+%
+% \begin{macro}{\theHbook}
+% \begin{macro}{\toclevel@book}
+% These are needed if the \Lpack{hyperref} is used.
+% \begin{macrocode}
+\newcommand*{\theHbook}{\arabic{book}}
+\newcommand*{\toclevel@book}{-2}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\book}
+% \begin{macro}{\book*}
+% \cs{book}\marg{title} starts a new book division called \meta{title}.
+% The actual typesetting of the title is done by \cs{@book} or \cs{@sbook}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{book} and its entourage (mempatch v4.4)}
+% \begin{macrocode}
+\newcommand*{\book}{%
+ \@setupbook
+ \secdef\@book\@sbook}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\beforebookskip}
+% \begin{macro}{\midbookskip}
+% \begin{macro}{\afterbookskip}
+% These three macros are the skips before, in the middle, and after the
+% Book heading.
+% \begin{macrocode}
+\newcommand*{\beforebookskip}{\null\vfil}
+\newcommand*{\midbookskip}{\par\vskip 2\onelineskip}
+\newcommand*{\afterbookskip}{\vfil\newpage}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@setupbook}
+% This macro does the work of setting up for the \cs{book} command.
+% A single column page, normally recto, with a \pstyle{book} pagestyle is
+% started.
+% \begin{macrocode}
+\newcommand{\@setupbook}{%
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \thispagestyle{book}%
+ \if@twocolumn
+ \onecolumn
+ \@tempswatrue
+ \else
+ \@tempswafalse
+ \fi
+ \beforebookskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\booknamefont}
+% \begin{macro}{\booknumfont}
+% \begin{macro}{\booktitlefont}
+% These three macros specify the fonts for the book name and number, and
+% for the book title, respectively.
+% \begin{macrocode}
+\newcommand*{\booknamefont}{\normalfont\huge\bfseries}
+\newcommand*{\booknumfont}{\normalfont\huge\bfseries}
+\newcommand*{\booktitlefont}{\normalfont\Huge\bfseries}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printbookname}
+% \begin{macro}{\booknamenum}
+% \begin{macro}{\printbooknum}
+% \begin{macro}{\printbooktitle}
+% Macros to print the various books of a Book heading.
+% \begin{macrocode}
+\newcommand*{\printbookname}{\booknamefont \bookname}
+\newcommand*{\booknamenum}{\space}
+\newcommand*{\printbooknum}{\booknumfont \thebook}
+\newcommand*{\printbooktitle}[1]{\booktitlefont #1}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\membookinfo}
+% \begin{macro}{\membookstarinfo}
+% \begin{macrocode}
+\newcommand{\membookinfo}[3]{}
+\newcommand{\membookstarinfo}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@book}
+% \cs{@book}\oarg{short}\marg{long} typesets the title of a \cs{book}
+% book. There is a number if \cs{secnumdepth} is greater than -3.
+% \begin{macrocode}
+\long\def\@book[#1]#2{%
+ \M@gettitle{#1}%
+% \end{macrocode}
+% For continuity we store the toc entry in \verb?\f@rtoc? before
+% writing it to the \verb?.toc? file. We also provide a hook to be
+% able to transform it.
+% \changes{v3.6k}{2012/09/18}{Provided \cs{f@rtoc} and hook}
+% \changes{v3.6k}{2013/04/24}{Added \cs{mempreaddbooktotochook} and \cs{mempostaddbooktotochook}}
+% \begin{macrocode}
+ \def\f@rtoc{#1}%
+ \@nameuse{book@f@rtoc@before@write@hook}%
+ \phantomsection
+ \mempreaddbooktotochook
+ \ifnum \c@secnumdepth >-3\relax
+ \refstepcounter{book}%
+ \addcontentsline{toc}{book}%
+ {\protect\booknumberline{\thebook}\f@rtoc}%
+ \membookinfo{\thebook}{\f@rtoc}{#2}%
+ \else
+ \addcontentsline{toc}{book}{\f@rtoc}%
+ \membookinfo{}{\f@rtoc}{#2}%
+ \fi
+ \mempostaddbooktotochook
+% \end{macrocode}
+% Empty the marks, center the title on the page, and set the normal font.
+% \changes{v3.6j}{2011/03/03}{Set \cs{parskip} to zero, such that a
+% non-zero \cs{parskip} does not interfer with the title layout}
+% \begin{macrocode}
+ \bookpagemark{#1}%
+ {\centering
+ \interlinepenalty \@M
+ \parskip\z@
+ \normalfont
+% \end{macrocode}
+% Print the number, if there is one, then the title below. Macro \cs{@endbook}
+% tidies everything up at the end.
+% \begin{macrocode}
+ \ifnum \c@secnumdepth >-3\relax
+ \printbookname \booknamenum \printbooknum
+ \midbookskip
+ \fi
+ \printbooktitle{#2}\par}%
+ \@endbook}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mempreaddbooktotochook}
+% \begin{macro}{\mempostaddbooktotochook}
+% Hooks executed just before and just after \cs{book} adds something
+% to the ToC. Does nothing by default
+% \begin{macrocode}
+\newcommand\mempreaddbooktotochook{}
+\newcommand\mempostaddbooktotochook{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@sbook}
+% \cs{@sbook}\marg{long} formats the title of a \cs{book*} book. It is
+% simpler than \cs{@book} because there is no number to print.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@sbook}}
+% \changes{v3.6j}{2011/03/03}{Set \cs{parskip} to zero here as well}
+% \begin{macrocode}
+\long\def\@sbook#1{%
+ \M@gettitle{#1}%
+ \phantomsection
+ \membookstarinfo{#1}%
+ {\centering
+ \interlinepenalty \@M
+ \parskip\z@
+ \normalfont
+ \printbooktitle{#1}\par}%
+ \@endbook}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifm@mnobooknewpage}
+% \begin{macro}{\m@mnobooknewpagetrue}
+% \begin{macro}{\m@mnobooknewpagefalse}
+% \begin{macro}{\bookblankpage}
+% \begin{macro}{\nobookblankpage}
+% The declaration \cs{nobookblankpage} prevents \cs{book} from
+% outputting a further (blank) page when it finishes. The default is set by
+% \cs{bookblankpage}.
+% \begin{macrocode}
+\newif\ifm@mnobooknewpage
+ \m@mnobooknewpagefalse
+\newcommand*{\bookblankpage}{\m@mnobooknewpagefalse}
+\newcommand*{\nobookblankpage}{\m@mnobooknewpagetrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bookpageend}
+% \begin{macro}{\@endbook}
+% This finishes off both \cs{@book} and \cs{@sbook}.
+% Following a \cs{nobookblankpage} nothing is done, otherwise
+% (after \cs{bookblankpage}) the current page is flushed,
+% and an extra blank page is created if both \Lopt{twoside} and
+% \Lopt{openright} are in effect.
+% At the end, if necessary, two column mode is switched back on.
+% \changes{v1.61803398}{2009/07/26}{PW: Added \cs{bookpageend} as cover for \cs{@endbook}}
+% \begin{macrocode}
+\newcommand*{\bookpageend}{\afterbookskip
+ \ifm@mnobooknewpage
+ \else
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{afterbook}%
+ \newpage
+ \fi
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
+\def\@endbook{\bookpageend}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ps@book}
+% \begin{macro}{\ps@afterbook}
+% Pagestyles for the book page and the (blank) page after a book page.
+% \begin{macrocode}
+\aliaspagestyle{book}{empty}
+\aliaspagestyle{afterbook}{empty}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Part}
+%
+% \begin{macro}{\part}
+% \cs{part}\marg{title} starts a new Part called \meta{title}.
+% The actual typesetting of the title is done by \cs{@part} or \cs{@spart}.
+% \begin{macrocode}
+\newcommand{\part}{%
+ \@setuppart
+ \secdef\@part\@spart}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\beforepartskip}
+% \begin{macro}{\midpartskip}
+% \begin{macro}{\afterpartskip}
+% These three macros are the skips before, in the middle, and after the
+% Part heading.
+% \changes{v1.61803}{2008/01/30}{Changed \cs{midpartskip} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\beforepartskip}{\null\vfil}
+\newcommand{\midpartskip}{\par\vskip 2\onelineskip}
+\newcommand{\afterpartskip}{\vfil\newpage}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@setuppart}
+% This macro does the work of setting up for the \cs{part} command.
+% A single column page, normally recto, with a \pstyle{part} pagestyle is started.
+% \begin{macrocode}
+\newcommand{\@setuppart}{%
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \thispagestyle{part}%
+ \if@twocolumn
+ \onecolumn
+ \@tempswatrue
+ \else
+ \@tempswafalse
+ \fi
+ \beforepartskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\partnamefont}
+% \begin{macro}{\partnumfont}
+% \begin{macro}{\parttitlefont}
+% These three macros specify the fonts for the part name and number, and
+% for the part title, respectively.
+% \changes{v0.2}{2001/06/03}{Rewrote the typesetting for Part titles}
+% \begin{macrocode}
+\newcommand{\partnamefont}{\normalfont\huge\bfseries}
+\newcommand{\partnumfont}{\normalfont\huge\bfseries}
+\newcommand{\parttitlefont}{\normalfont\Huge\bfseries}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printpartname}
+% \begin{macro}{\partnamenum}
+% \begin{macro}{\printpartnum}
+% \begin{macro}{\printparttitle}
+% Macros to print the various parts of a Part heading.
+% \begin{macrocode}
+\newcommand{\printpartname}{\partnamefont \partname}
+\newcommand{\partnamenum}{\space}
+\newcommand{\printpartnum}{\partnumfont \thepart}
+\newcommand{\printparttitle}[1]{\parttitlefont #1}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mempartinfo}
+% \begin{macro}{\mempartstarinfo}
+% \verb?\mempartinfo{\thepart}{short}{long}? \\
+% \verb?\mempartstarinfo{long}? \\
+% \changes{v1.61803}{2008/01/30}{Made \cs{mempartinfo} long (mempatch v4.9).}
+% \begin{macrocode}
+\newcommand{\mempartinfo}[3]{}
+\newcommand{\mempartstarinfo}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@part}
+% \cs{@part}\oarg{short}\marg{long} typesets the title of a \cs{part}
+% part. There is a number if \cs{secnumdepth} is greater than -2.
+% \changes{v1.3}{2002/11/14}{Used \cs{partnumberline} in \cs{@part}}
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@part}}
+% \changes{v1.618}{2005/09/03}{Replaced \cs{markboth} by \cs{partmark}
+% in \cs{@part} courtesy of Frederic Connes (mempatch v3.11)}
+% \begin{macrocode}
+\long\def\@part[#1]#2{%
+ \M@gettitle{#1}%
+% \end{macrocode}
+% For continuity we store the toc entry in \verb?\f@rtoc? before
+% writing it to the \verb?.toc? file. We also provide a hook to be
+% able to transform it.
+% \changes{v3.6k}{2012/09/18}{Provided \cs{f@rtoc} and hook}
+% \changes{v3.6k}{2013/04/24}{Added \cs{mempreaddparttotochook} and \cs{mempostaddparttotochook}}
+% \begin{macrocode}
+ \def\f@rtoc{#1}%
+ \@nameuse{part@f@rtoc@before@write@hook}%
+ \phantomsection
+ \mempreaddparttotochook
+ \ifnum \c@secnumdepth >-2\relax
+ \refstepcounter{part}%
+ \addcontentsline{toc}{part}%
+ {\protect\partnumberline{\thepart}\f@rtoc}%
+ \mempartinfo{\thepart}{\f@rtoc}{#2}%
+ \else
+ \addcontentsline{toc}{part}{\f@rtoc}%
+ \mempartinfo{}{\f@rtoc}{#2}%
+ \fi
+ \mempostaddparttotochook
+% \end{macrocode}
+% Empty the marks, center the title on the page, and set the normal font.
+% \changes{v3.6j}{2011/03/03}{Set \cs{parskip} to zero inside the
+% group, such that a non-zero \cs{parskip} does not interfer with the
+% title layout}
+% \begin{macrocode}
+ \partmark{#1}%
+ {\centering
+ \interlinepenalty \@M
+ \parskip\z@
+ \normalfont
+% \end{macrocode}
+% Print the number, if there is one, then the title below. Macro \cs{@endpart}
+% tidies everything up at the end.
+% \begin{macrocode}
+ \ifnum \c@secnumdepth >-2\relax
+ \printpartname \partnamenum \printpartnum
+ \midpartskip
+ \fi
+ \printparttitle{#2}\par}%
+ \@endpart}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mempreaddparttotochook}
+% \begin{macro}{\mempostaddparttotochook}
+% Hooks executed just before and just after \cs{part} adds something
+% to the ToC. Does nothing by default
+% \begin{macrocode}
+\newcommand\mempreaddparttotochook{}
+\newcommand\mempostaddparttotochook{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@spart}
+% \cs{@spart}\marg{long} formats the title of a \cs{part*} part. It is
+% simpler than \cs{@part} because there is no number to print.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@spart}}
+% \changes{v3.6j}{2011/03/03}{Set \cs{parskip} to zero here as well}
+% \begin{macrocode}
+\long\def\@spart#1{%
+ \M@gettitle{#1}%
+ \phantomsection
+ \mempartstarinfo{#1}%
+ {\centering
+ \interlinepenalty \@M
+ \parskip\z@
+ \normalfont
+ \printparttitle{#1}\par}%
+ \@endpart}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifm@mnopartnewpage}
+% \begin{macro}{\m@mnopartnewpagetrue}
+% \begin{macro}{\m@mnopartnewpagefalse}
+% \begin{macro}{\partblankpage}
+% \begin{macro}{\nopartblankpage}
+% The declaration \cs{nopartblankpage} prevents \cs{part} from
+% outputting a blank page when it finishes. The default is set by
+% \cs{partblankpage}. This code was originally supplied by Frederic Connes.
+% \changes{v1.61803}{2008/01/30}{Added \cs{partblankpage} and
+% \cs{nopartblankpage} (mempatch v v4.4).}
+% \begin{macrocode}
+\newif\ifm@mnopartnewpage
+ \m@mnopartnewpagefalse
+\newcommand*{\partblankpage}{\m@mnopartnewpagefalse}
+\newcommand*{\nopartblankpage}{\m@mnopartnewpagetrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\partpageend}
+% \begin{macro}{\@endpart}
+% This finishes off both \cs{@part} and \cs{@spart}.
+% Following a \cs{nopartblankpage} nothing is done, otherwise
+% (after \cs{partblankpage}) the current page is flushed.
+% In the standard \Lpack{book} class if
+% two-sided mode is on a blank page is then produced. I think that this looks
+% odd when the \Lopt{openany} option is in force, so here it only produces
+% an extra blank page if both \Lopt{twoside} and \Lopt{openright} are
+% in effect.
+%
+% At the end, if necessary, two column mode is switched back on.
+% \changes{v1.61803}{2008/01/30}{Used the afterpart pagestyle in \cs{@endpart}}
+% \changes{v1.61803398}{2009/07/26}{PW: Added \cs{partpageend} as cover for \cs{@endpart}}
+% \begin{macrocode}
+\newcommand*{\partpageend}{\afterpartskip
+ \ifm@mnopartnewpage
+ \else
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{afterpart}%
+ \newpage
+ \fi
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
+\def\@endpart{\partpageend}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ps@afterpart}
+% Pagestyle for the (blank) page after a part page.
+% \changes{v1.61803}{2008/01/30}{Added afterpart pagestyle (mempatch v4.4)}
+% \begin{macrocode}
+\aliaspagestyle{afterpart}{empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Chapter}
+%
+% \begin{macro}{\chapter}
+% The command to start a new chapter. Chapters always start on a new page
+% with a \pstyle{chapter} pagestyle. Floats are not allowed at the top of the page.
+% The typesetting is done by either \cs{@chapter} or \cs{@schapter}.
+% \changes{v0.3}{2001/07/09}{Changed \cs{chapter} for article option}
+% \changes{v1.0}{2001/10/24}{Changed chapter page clearing to \cs{clearforchapter}}
+% \changes{v1.2}{2002/07/27}{New optarg in \cs{chapter} for short heading}
+% \changes{v1.618}{2005/09/03}{Made article chapter start on a newline (mempatch v3.5)}
+% \changes{v3.6e}{2010/07/16}{Factored out the \cs{@afterindentfalse}}
+% \changes{v3.6h}{2011/02/07}{Added the chapter block}
+% \begin{macrocode}
+\newcommand\chapter{%
+% \end{macrocode}
+% The block macro can be defined to execute a \cs{FloatBlock} when we
+% are in article mode. Outside article mode \cs{clearforchapter} is
+% expected to be used for this.
+% \begin{macrocode}
+ \ifartopt\par\@nameuse{chapterblock}\else
+ \clearforchapter
+ \thispagestyle{chapter}
+ \global\@topnum\z@
+ \fi
+% \@afterindentfalse
+ \m@mindentafterchapter
+ \@ifstar{\@m@mschapter}{\@m@mchapter}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mindentafterchapter}
+% \begin{macro}{\indentafterchapter}
+% \begin{macro}{\noindentafterchapter}
+% In order to make whether to indent the first paragraph after af
+% chapter configurable, we store \verb?\@afterindenttrue/false? in
+% \verb?\m@mindentafterchapter?, and provide
+% \verb?\indentafterchapter? and \verb?\noindentafterchapter? to set
+% it to a suitable value.
+% \begin{macrocode}
+\newcommand*\indentafterchapter{\def\m@mindentafterchapter{\@afterindenttrue}}
+\newcommand*\noindentafterchapter{\def\m@mindentafterchapter{\@afterindentfalse}}
+% \end{macrocode}
+% Default is not to indent.
+% \begin{macrocode}
+\noindentafterchapter
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@m@mchapter}
+% \begin{macro}{\ch@pt@c}
+% \begin{macro}{\m@m@empty}
+% Intermediate and support macros for the extra optional argument
+% to \cs{chapter}. Have to do this long windedly otherwise dear old
+% \Lpack{hyperref} barfs.
+%
+% The code for two optional arguments is based on a posting
+% to \ctt{} by Robin Fairbairns (1997/04/12 \textit{Re: Several optional
+% arguments for macro?}).
+% \changes{v1.618}{2005/09/04}{Major changes to \cs{chapter} macros (from Morten Hogholm 2005/08/30)}
+% \begin{macrocode}
+\newcommand{\@m@mchapter}[1][]{%
+ \def\ch@pt@c{#1}% capture first optional arg
+ \@ifnextchar[{\@chapter}{\@chapter[]}%
+}
+\def\m@m@empty{\@empty}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memchapinfo}
+% \begin{macro}{\memchapstarinfo}
+% \begin{macro}{\memappchapinfo}
+% \begin{macro}{\memappchapstarinfo}
+% \verb?\memchapinfo{num}{toc}{head}{full}? \\
+% \verb?\memchapstarinfo{short}{full}?
+% \changes{v1.618}{2005/09/06}{Added \cs{memchapinfo}}
+% \begin{macrocode}
+\newcommand{\memchapinfo}[4]{}
+\newcommand{\memchapstarinfo}[2]{}
+\newcommand{\memappchapinfo}[4]{}
+\newcommand{\memappchapstarinfo}[2]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifm@mpn@new@chap}
+% \begin{macro}{\m@mpn@new@chapfalse}
+% \begin{macro}{\m@mpn@new@chaptrue}
+% \begin{macro}{\ifm@mpn@new@schap}
+% \begin{macro}{\m@mpn@new@schapfalse}
+% \begin{macro}{\m@mpn@new@schaptrue}
+% These are for supporting the page/end notes, flagging that a
+% \verb?\chapter(*)? has been called.
+% \changes{v1.61803}{2008/01/30}{Added \cs{ifm@mpn@new@chap} and
+% \cs{ifm@mpn@new@chap} (mempatch v4.5)}
+% \begin{macrocode}
+\newif\ifm@mpn@new@chap
+ \m@mpn@new@chapfalse
+\newif\ifm@mpn@new@schap
+ \m@mpn@new@schapfalse
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@chapter}
+% \begin{macro}{\f@rtoc}
+% \begin{macro}{\f@rhdr}
+% \begin{macro}{\f@rbody}
+% \cs{@chapter}\oarg{tocmark}\marg{title}
+% typesets the title of a \cs{chapter}.
+% There is a number if \cs{secnumdepth} is greater than -1 and \cs{@mainmatter}
+% is TRUE.
+%
+% \changes{v1.2}{2002/07/27}{Complete rewrite of \cs{@chapter}}
+% \changes{v1.3}{2002/11/14}{Changed \cs{numberline} to \cs{chapternumberline}
+% in \cs{@chapter}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{f@rbody} to \cs{@chapter},
+% plus newchapter flag (mempatch v4.5)}
+% \changes{v1.6180339g}{2009/07/13}{added \cs{m@mpn@new@schapfalse}
+% otherwise both might end up true at the same time}
+% \begin{macrocode}
+\def\@chapter[#1]#2{%
+ \m@mpn@new@chaptrue%
+ \m@mpn@new@schapfalse%
+ \def\f@rbdy{#2}%
+ \ifx\ch@pt@c\@empty % no optional args
+ \def\f@rtoc{#2}%
+ \def\f@rhdr{#2}%
+ \else % at least one opt arg
+ \let\f@rtoc\ch@pt@c
+ \ifx\@empty#1\@empty
+ \let\f@rhdr\ch@pt@c
+ \else
+ \def\f@rhdr{#1}%
+ \fi
+ \fi
+ \m@m@Andfalse
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \m@m@Andtrue
+ \fi
+ \fi
+ \ifm@m@And
+ \refstepcounter{chapter}%
+ \fi
+% \end{macrocode}
+% Deal with the \Lopt{article} option.
+% \begin{macrocode}
+ \ifartopt
+ \@makechapterhead{#2}%
+ \@afterheading
+ \chaptermark{\f@rhdr}%
+ \else
+% \end{macrocode}
+% Store the (short) title via \cs{chaptermark}, and add some whitespace to
+% the LoF and LoT. Then fiddle when we are using two columns, calling
+% \cs{@makechapterhead} to do the typesetting.
+% \changes{v0.3}{2001/07/09}{Changed \cs{@chapter} for article option}
+% \begin{macrocode}
+ \chaptermark{\f@rhdr}
+ \insertchapterspace
+ \if@twocolumn
+ \@topnewpage[\@makechapterhead{#2}]%
+ \else
+ \@makechapterhead{#2}%
+ \fi
+ \@afterheading
+ \fi
+% \end{macrocode}
+% When working with \Lpack{hyperref} it is not possible to add, say,
+% upper casing to ToC entries via \cs{cftchapterfont}. We provide a
+% hook, such that users can transform \cs{f@rtoc} before it is
+% actually written to the \texttt{.toc} file.
+% \changes{v3.6k}{2012/09/18}{Added}
+% \begin{macrocode}
+ \@nameuse{chapter@f@rtoc@before@write@hook}%
+% \end{macrocode}
+% Vittorio De Martino (\texttt{demartino.vittoria@grtn.it}) on
+% 31 March 2003 reported that for articled chapters, which do not do
+% any \cs{clearpage}, \cs{addcontents} had to come after the title.
+% \changes{v1.4}{2003/11/16}{Changed \cs{@chapter} to match patches v1.n}
+% \changes{v3.6k}{2013/04/24}{Added pretoc and posttoc hooks}
+% \begin{macrocode}
+ \mempreaddchaptertotochook%
+ \ifm@m@And
+ \ifanappendix
+ \addcontentsline{toc}{appendix}{%
+ \protect\chapternumberline{\thechapter}\f@rtoc}%
+ \memappchapinfo{\thechapter}{\f@rtoc}{\f@rhdr}{#2}%
+ \else
+ \addcontentsline{toc}{chapter}{%
+ \protect\chapternumberline{\thechapter}\f@rtoc}%
+ \memchapinfo{\thechapter}{\f@rtoc}{\f@rhdr}{#2}%
+ \fi
+ \else
+ \addcontentsline{toc}{chapter}{\f@rtoc}%
+ \ifanappendix
+ \memappchapinfo{}{\f@rtoc}{\f@rhdr}{#2}%
+ \else
+ \memchapinfo{}{\f@rtoc}{\f@rhdr}{#2}%
+ \fi
+ \fi
+ \mempostaddchaptertotochook%
+% \end{macrocode}
+% Add hook for title referencing.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@chapter}}
+% \changes{v3.6k}{2013/04/24}{Added \cs{memendofchapterhook}}.
+% The hook at the very end can be used to automatically add a new page
+% right after \cs{chapter}.
+% \begin{macrocode}
+ \ifheadnameref\M@gettitle{\f@rhdr}\else\M@gettitle{\f@rtoc}\fi%
+ \memendofchapterhook%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\mempreaddchaptertotochook}
+% \begin{macro}{\mempostaddchaptertotochook}
+% \begin{macro}{\memendofchapterhook}
+% These two hooks are executed before \cs{chapter} adds anything to
+% the TOC and after it does so. It can be used to add hooks into the
+% TOC such that parts can be switched on and off. By default they do nothing.
+% \begin{macrocode}
+\newcommand\mempreaddchaptertotochook{}
+\newcommand\mempostaddchaptertotochook{}
+\newcommand\memendofchapterhook{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\settocpreprocessor}
+% \changes{v3.6k}{2012/09/18}{Added}
+% This can be used to set a hook which users can fill in in order to
+% get the toc material preprocessed before writing it to the
+% \verb?.toc? file. The primary use for this is as a workaround when
+% \Lpack{hyperref} is used, and one want to have, say, upper cased toc
+% entries. Example of use
+% \begin{verbatim}
+% \makeatletter
+% \settocpreprocessor{chapter}{%
+% \let\temp@f@rtoc\f@rtoc
+% \def\f@rtoc{\texorpdfstring{\MakeTextUppercase{\temp@f@rtoc}}{\temp@f@rtoc}}
+% }
+% \makeatother
+% \end{verbatim}
+% The idea comes from \url{http://tex.stackexchange.com/q/11892/3929}
+% eliminating the need for patching.
+% \begin{macrocode}
+\newcommand\settocpreprocessor[2]{%
+ \@namedef{#1@f@rtoc@before@write@hook}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makechapterhead}
+% This \emph{really} typesets a \cs{chapter}. Leave some whitespace and prepare to
+% set \cs{raggedright}.
+% \changes{v1.3}{2002/10/10}{Added \cs{printchapternonum} to
+% \cs{@makechapterhead}}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{@makechapterhead}}
+% \changes{v3.6j}{2011/03/01}{Set \cs{parskip} to zero such that a
+% non-zero \cs{parskip} to not interfer with the placement of the title}
+% \begin{macrocode}
+\def\@makechapterhead#1{%
+ \chapterheadstart% \vspace*{50\p@}%
+ {%\parindent \z@ \raggedright \normalfont
+ \parskip \z@
+ \parindent \z@ \memRTLraggedright \normalfont
+% \end{macrocode}
+% If there is a number, typeset it, otherwise call \cs{printchapternonum}.
+% \begin{macrocode}
+ \ifm@m@And
+ \printchaptername \chapternamenum \printchapternum
+ \afterchapternum % \par\nobreak \vskip 20\p@
+ \else
+ \printchapternonum
+ \fi
+% \end{macrocode}
+% Typeset the title.
+% \begin{macrocode}
+ \interlinepenalty\@M
+ \printchaptertitle{#1} % \Huge \bfseries #1
+ \afterchaptertitle % \par\nobreak \vskip 40\p@
+ }}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\insertchapterspace}
+% By default, a \cs{chapter} inserts some vertical space into the LoF and LoT.
+% The macro \cs{insertchapterspace} performs the insertion.
+% \changes{v0.33}{2001/08/31}{Added \cs{insertchapterspace}}
+% \begin{macrocode}
+\newcommand*{\insertchapterspace}{%
+ \addtocontents{lof}{\protect\addvspace{10pt}}%
+ \addtocontents{lot}{\protect\addvspace{10pt}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\beforechapskip}
+% \begin{macro}{\midchapskip}
+% \begin{macro}{\afterchapskip}
+% Lengths separating the various parts of a chapter heading.
+% \begin{macrocode}
+\newlength{\beforechapskip}\setlength{\beforechapskip}{50pt}
+\newlength{\midchapskip}\setlength{\midchapskip}{20pt}
+\newlength{\afterchapskip}\setlength{\afterchapskip}{40pt}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@chs@def@ult}
+% This sets up all the definitions and defaults used in \cs{@makechapterhead}
+% and \cs{@makeschapterhead}.
+% \changes{v1.3}{2002/10/10}{Added \cs{printchapternonum} to \cs{@chs@def@ult}}
+% \changes{v1.61803}{2008/01/30}{Made \cs{@chs@def@ult} set all default chapter values}
+% \begin{macro}{\chapterheadstart}
+% \begin{macro}{\printchaptername}
+% \begin{macro}{\chapternamenum}
+% \begin{macro}{\printchapternum}
+% \begin{macro}{\afterchapternum}
+% \begin{macro}{\printchapternum}
+% \begin{macro}{\printchapternonum}
+% \begin{macro}{\printchaptertitle}
+% \begin{macro}{\afterchaptertitle}
+% \begin{macrocode}
+\newcommand{\@chs@def@ult}{%
+ \def\chapterheadstart{\vspace*{\beforechapskip}}%
+ \def\printchaptername{\chapnamefont \@chapapp}%
+ \def\chapternamenum{\space}%
+ \def\printchapternum{\chapnumfont \thechapter}%
+ \def\afterchapternum{\par\nobreak\vskip \midchapskip}%
+ \def\printchapternonum{}%
+ \def\printchaptertitle##1{\chaptitlefont ##1}%
+ \def\afterchaptertitle{\par\nobreak\vskip \afterchapskip}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\chapnamefont}
+% \begin{macro}{\chapnumfont}
+% \begin{macro}{\chaptitlefont}
+% Fonts for setting chapter name, number, and title.
+% \begin{macrocode}
+ \def\chapnamefont{\normalfont\huge\bfseries}%
+ \def\chapnumfont{\normalfont\huge\bfseries}%
+ \def\chaptitlefont{\normalfont\Huge\bfseries}%
+ \setlength{\beforechapskip}{50pt}%
+ \setlength{\midchapskip}{20pt}%
+ \setlength{\afterchapskip}{40pt}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@m@mschapter}
+% This deals with the new optional argument for starred chapters.
+% \begin{macrocode}
+\newcommand{\@m@mschapter}[2][\@empty]{%
+ \@schapter{#2}%
+ \ifx \@empty#1
+ \def\f@rhdr{#2}%
+ \else% opt arg
+ \def\f@rhdr{#1}%
+ \setcounter{secnumdepth}{-10}%
+ \chaptermark{#1}%
+ \setcounter{secnumdepth}{\value{maxsecnumdepth}}%
+ \fi
+ \ifanappendix
+ \memappchapstarinfo{\f@rhdr}{#2}%
+ \else
+ \memchapstarinfo{\f@rhdr}{#2}%
+ \fi
+ \ifheadnameref\M@gettitle{\f@rhdr}\else\M@gettitle{#2}\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@schapter}
+% \begin{macro}{\f@rbdy}
+% \cs{@schapter}\marg{long} typesets the title of a
+% \cs{chapter*}. It is easier than the \cs{@chapter} as there is no number
+% to worry about.
+% \changes{v0.3}{2001/07/09}{Changed \cs{@schapter} for article option}
+% \changes{v1.2}{2002/07/27}{Major rewrite of \cs{@schapter}}
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@schapter}}
+% \changes{v1.61803}{2008/01/30}{Changed \cs{@schapter} like
+% \cs{@chapter} (mempatch v4.5)}
+% \changes{v1.6180339g}{2009/07/13}{added \cs{m@mpn@new@chapfalse}
+% otherwise both might end up true at the same time}
+% \begin{macrocode}
+\newcommand{\@schapter}[1]{%
+ \m@mpn@new@schaptrue%
+ \m@mpn@new@chapfalse%
+ \def\f@rbdy{#1}%
+ \ifartopt
+ \@makeschapterhead{#1}%
+ \else
+ \if@twocolumn
+ \@topnewpage[\@makeschapterhead{#1}]%
+ \else
+ \@makeschapterhead{#1}%
+ \fi
+ \fi
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@makeschapterhead}
+% This \emph{really} typesets a \cs{chapter*}, and is similar to \cs{@makechapterhead}.
+% \changes{v1.3}{2002/10/10}{Added \cs{printchapternonum} to
+% \cs{@makeschapterhead}}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{@makeschapterhead}}
+% \changes{v3.6j}{2011/0301}{Made sure the \cs{parskip} is zero inside
+% the title area, otherwise placement might come out wrong}
+% \begin{macrocode}
+\def\@makeschapterhead#1{%
+ \chapterheadstart
+ {%\parindent \z@ \raggedright \normalfont
+ \parskip \z@%
+ \parindent \z@ \memRTLraggedright \normalfont
+ \printchapternonum
+ \interlinepenalty\@M
+ \printchaptertitle{#1}%
+ \afterchaptertitle}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Chapter styling}
+%
+%
+% \begin{macro}{\makechapterstyle}
+% \begin{macro}{\chapterstyle}
+% \cs{chapterstyle}\marg{style} is like \cs{pagestyle}, except it's for
+% chapters.
+%
+% \cs{makechapterstyle}\marg{style}\marg{text} creates
+% or overrides the \meta{style} chapter style defining it as \meta{text}
+% So, \verb?\makechapterstyle{fred}{code}? specifies that the chapter style
+% \pstyle{fred}
+% is defined as the macro \verb?\chs@fred{code}?,
+% and \verb?\chapterstyle{fred}? calls the macro \cs{chs@fred}.
+% \begin{macrocode}
+\newcommand{\makechapterstyle}[2]{\@namedef{chs@#1}{\@chs@def@ult #2}}
+\newcommand{\chapterstyle}[1]{\@nameuse{chs@#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Set the \pstyle{default} chapter style.
+% \changes{v0.2}{2001/06/03}{Added code when making the default chapterstyle}
+% \changes{v1.61803}{2008/01/30}{Simplified specification of the default chapterstyle}
+% \begin{macrocode}
+\makechapterstyle{default}{}%
+ %% \setlength{\beforechapskip}{50pt}
+ %% \def\chapterheadstart{\vspace*{\beforechapskip}}
+ %% \def\chapnamefont{\normalfont\huge\bfseries}
+ %% \def\printchaptername{\chapnamefont \@chapapp}
+ %% \def\chapternamenum{\space}
+ %% \def\chapnumfont{\normalfont\huge\bfseries}
+ %% \def\printchapternum{\chapnumfont \thechapter}
+ %% \setlength{\midchapskip}{20pt}
+ %% \def\afterchapternum{\par\nobreak\vskip \midchapskip}
+ %% \def\printchapternonum{}
+ %% \def\chaptitlefont{\normalfont\Huge\bfseries}
+ %% \def\printchaptertitle##1{\chaptitlefont ##1}
+ %% \setlength{\afterchapskip}{40pt}
+ %% \def\afterchaptertitle{\par\nobreak\vskip \afterchapskip}
+\chapterstyle{default}
+
+% \end{macrocode}
+%
+% \begin{macro}{\chs@section}
+% The \pstyle{section} chapter style. It prints the heading as though it
+% were a section.
+% \changes{v1.0a}{2002/01/18}{Made \cs{chapnumfont} change in section
+% chapterstyle explicit}
+% \begin{macrocode}
+\makechapterstyle{section}{%
+ \chapterstyle{default}
+ \renewcommand{\printchaptername}{}
+ \renewcommand{\chapternamenum}{}
+ \renewcommand{\chapnumfont}{\normalfont\Huge\bfseries}
+ \renewcommand{\printchapternum}{\chapnumfont \thechapter\space}
+ \renewcommand{\afterchapternum}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@article}
+% The \pstyle{article} chapter style. It prints the heading as though it
+% were a section in an \Lpack{article} class document.
+% \changes{v0.3}{2001/07/09}{Added article chapterstyle}
+% \changes{v1.0a}{2002/01/18}{Made \cs{chapnumfont} change in article chapterstyle explicit}
+% \changes{v1.4}{2003/11/22}{Replaced \cs{space} by \cs{quad} in article chapterstyle
+% (from patch v1.7)}
+% \begin{macrocode}
+\makechapterstyle{article}{%
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{3.5ex \@plus 1ex \@minus .2ex}
+ \renewcommand*{\chapterheadstart}{\vspace{\beforechapskip}}
+ \setlength{\afterchapskip}{2.3ex \@plus .2ex}
+ \renewcommand{\printchaptername}{}
+ \renewcommand{\chapternamenum}{}
+ \renewcommand{\chaptitlefont}{\normalfont\Large\bfseries}
+ \renewcommand{\chapnumfont}{\chaptitlefont}
+ \renewcommand{\printchapternum}{\chapnumfont \thechapter\quad}
+ \renewcommand{\afterchapternum}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@reparticle}
+% The \pstyle{reparticle} chapter style. It replicates the appearance
+% of a \cs{section} in an \Lpack{article} class document.
+% \changes{v1.61803}{2008/01/30}{Added reparticle chapterstyle (mempatch v4.3)}
+% \begin{macrocode}
+\makechapterstyle{reparticle}{%
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{3.5ex \@plus 1ex \@minus .2ex}
+ \renewcommand*{\chapterheadstart}{\vspace{\beforechapskip}}
+ \setlength{\afterchapskip}{2.3ex \@plus .2ex}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\chaptitlefont}{\normalfont\Large\bfseries}
+ \renewcommand*{\chapnumfont}{\chaptitlefont}
+ \renewcommand*{\printchapternum}{\@hangfrom{\chapnumfont \thechapter\quad}}%
+ \renewcommand*{\afterchapternum}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reparticle}
+% Call this to get division heads to replicate the \Lopt{article} class.
+% For example: \\
+% \verb?\ifartopt \reparticle \fi? \\
+% The \cs{chapter} commands must still be used, though.
+% \changes{v1.61803}{2008/01/30}{Added \cs{reparticle} (mempatch v4.3)}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{reparticle}}
+% \begin{macrocode}
+\newcommand*{\reparticle}{%
+ \chapterstyle{reparticle}
+%%% \setsecheadstyle{\normalfont\large\bfseries\raggedright}
+ \setsecheadstyle{\normalfont\large\bfseries\memRTLraggedright}%
+%%% \setsubsecheadstyle{\normalfont\bfseries\raggedright}
+ \setsubsecheadstyle{\normalfont\bfseries\memRTLraggedright}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@hangnum}
+% The \pstyle{hangnum} style puts the chapter number in the margin.
+% \begin{macrocode}
+\makechapterstyle{hangnum}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapnumfont}{\chaptitlefont}
+ \settowidth{\chapindent}{\chapnumfont 999}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{%
+ \noindent\llap{\makebox[\chapindent][l]{\chapnumfont \thechapter}}}
+ \renewcommand*{\afterchapternum}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chapindent}
+% \begin{macro}{\chs@companion}
+% The \pstyle{companion} style is like that in the \textit{\LaTeX{} Companion}
+% series. It requires the \cs{chapindent} length. The user needs
+% to be careful to have a wide enough spine margin on verso pages
+% if the title may appear on a verso page.
+% \changes{v0.31}{2001/07/24}{Changed adjustwidth* to adjustwidth in companion chapterstyle}
+% \begin{macrocode}
+\newlength{\chapindent}
+
+\makechapterstyle{companion}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapnamefont}{\normalfont\LARGE\scshape}
+ \renewcommand*{\printchaptername}{\raggedleft\chapnamefont \@chapapp}
+ \renewcommand*{\chapnumfont}{\normalfont\Huge}
+ \setlength{\chapindent}{\marginparsep}
+ \addtolength{\chapindent}{\marginparwidth}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \begin{adjustwidth}{}{-\chapindent}
+ \raggedleft \chaptitlefont ##1\par\nobreak
+ \end{adjustwidth}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\chs@demo}
+% An exotic chapter style for demonstration purposes.
+% \begin{macrocode}
+\makechapterstyle{demo}{%
+ \chapterstyle{default}
+ \renewcommand*{\printchaptername}{\centering}
+ \renewcommand*{\printchapternum}{\chapnumfont \numtoName{\c@chapter}}
+ \renewcommand*{\chaptitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hrule\vskip\onelineskip \raggedleft \chaptitlefont ##1}
+ \renewcommand*{\afterchaptertitle}%
+ {\vskip\onelineskip \hrule\vskip \afterchapskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.61803}{2008/01/30}{Added chapterstyles: bianchi, bringhurst,
+% brotherton, chappel, culver, dash, demo2, ell, Ger,
+% lyhne, madsen, pedersen, southall, thatcher, veelo,
+% verville, demo3 (mempatch v4.6)}
+% \begin{macro}{\chs@bianchi}
+% Posted to CTT on 2003/12/09, \textit{New chapter style: chapter vs chapter*}
+% by Stefano Bianchi.
+% \begin{macrocode}
+\makechapterstyle{bianchi}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapnamefont}{\normalfont\Large\sffamily\itshape}
+ \renewcommand*{\chapnumfont}{\normalfont\huge}
+ \renewcommand*{\printchaptername}{%
+ \chapnamefont\centering\@chapapp}
+ \renewcommand*{\printchapternum}{\chapnumfont \textit{\thechapter}}
+ \renewcommand*{\chaptitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hrule\vskip\onelineskip \centering \chaptitlefont\textbf{##1}\par}
+ \renewcommand*{\afterchaptertitle}{\vskip\onelineskip \hrule\vskip
+ \afterchapskip}
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\chapnumfont \textit{9}}\afterchapternum}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@bringhurst}
+% My bringhurst style.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to bringhurst chapterstyle}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeLowercase} $\to$ \cs{MakeTextLowercase}}
+% \begin{macrocode}
+\makechapterstyle{bringhurst}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapterheadstart}{}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{}
+ \renewcommand*{\afterchapternum}{}
+ \renewcommand*{\printchaptertitle}[1]{%
+ %%% \raggedright\Large\scshape\MakeLowercase{##1}}
+ \memRTLraggedright\Large\scshape\MakeTextLowercase{##1}}
+ \renewcommand*{\afterchaptertitle}{%
+ \vskip\onelineskip \hrule\vskip\onelineskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@brotherton}
+% An extremely simple chapterstyle created by William Adams for Mike
+% Brotherton's science fiction novel \textit{Star Dragon}, posted to CTT
+% 2006/12/09, \textit{An example of a novel?}.
+% \begin{macrocode}
+\makechapterstyle{brotherton}{%
+ \chapterstyle{default}
+ \renewcommand*{\printchapternum}{\chapnumfont
+ \ifanappendix \thechapter \else \numtoName{\c@chapter}\fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@chappell}
+% My Chappell style
+% \begin{macrocode}
+\makechapterstyle{chappell}{%
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{0pt}
+ \renewcommand*{\chapnamefont}{\large\centering}
+ \renewcommand*{\chapnumfont}{\large}
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\printchaptername \chapnumfont 1}
+ \afterchapternum
+ \vskip \onelineskip \vskip -\topskip}
+ \renewcommand*{\chaptitlefont}{\Large\itshape}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hrule\vskip\onelineskip \centering\chaptitlefont ##1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@culver}
+% By me in an answer to Christopher Culver on CTT,
+% \textit{"Biblical" formatting, how?} on 2004/03/29,where I called it
+% the `biblical' style.
+% \begin{macrocode}
+\makechapterstyle{culver}{%
+ \chapterstyle{default}
+ \chapterstyle{article}%
+ \renewcommand*{\thechapter}{\Roman{chapter}}
+ \renewcommand*{\printchapternum}{% center number/title
+ \centering\chapnumfont \thechapter\space\space}%
+ \renewcommand*{\printchapternonum}{\centering}
+ \renewcommand*{\clearforchapter}{}% no new page
+ \aliaspagestyle{chapter}{headings}}% no special pagestyle
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@dash}
+% A very simple style of mine but I couldn't think of a good name for it.
+% \begin{macrocode}
+\makechapterstyle{dash}{%
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{5\onelineskip}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\chapnumfont}{\normalfont\large}
+ \settoheight{\midchapskip}{\chapnumfont 1}
+ \renewcommand*{\printchapternum}{\centering \chapnumfont
+ \rule[0.5\midchapskip]{1em}{0.4pt} \thechapter\
+ \rule[0.5\midchapskip]{1em}{0.4pt}}
+ \renewcommand*{\afterchapternum}{\par\nobreak\vskip 0.5\onelineskip}
+ \renewcommand*{\printchapternonum}{\centering
+ \vphantom{\chapnumfont 1}\afterchapternum}
+ \renewcommand*{\chaptitlefont}{\normalfont\Large}
+ \renewcommand*{\printchaptertitle}[1]{\centering \chaptitlefont ##1}
+ \setlength{\afterchapskip}{2.5\onelineskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@demo2}
+% My second version of the demo chapterstyle.
+% \begin{macrocode}
+\makechapterstyle{demo2}{%
+ \chapterstyle{default}
+ \renewcommand*{\printchaptername}{\centering}
+ \renewcommand*{\printchapternum}{\chapnumfont
+ \ifanappendix \thechapter \else \numtoName{\c@chapter}\fi}
+ \renewcommand*{\chaptitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hrule\vskip\onelineskip \raggedleft \chaptitlefont ##1}
+ \renewcommand*{\afterchaptertitle}{%
+ \vskip\onelineskip \hrule\vskip \afterchapskip}
+ \setlength{\beforechapskip}{3\baselineskip}
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\chapnumfont One}
+ \afterchapternum%
+ \vskip\topskip}
+ \setlength{\beforechapskip}{2\onelineskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@demo3}
+% My third version of the demo chapterstyle.
+% \begin{macrocode}
+\makechapterstyle{demo3}{%
+ \chapterstyle{default}
+ \renewcommand*{\printchaptername}{\centering}
+ \renewcommand*{\chapnumfont}{\normalfont\HUGE\itshape}
+ \renewcommand*{\printchapternum}{\chapnumfont
+ \ifanappendix \thechapter \else \numtoName{\c@chapter}\fi}
+ \renewcommand*{\chaptitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hrule\vskip\onelineskip \raggedleft \chaptitlefont ##1}
+ \renewcommand*{\afterchaptertitle}{%
+ \vskip\onelineskip \hrule\vskip \afterchapskip}
+ \setlength{\beforechapskip}{0pt}
+ \setlength{\midchapskip}{2\onelineskip}
+ \setlength{\afterchapskip}{2\onelineskip}
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\chapnumfont One}
+ \afterchapternum%
+ \vskip\topskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@ell}
+% Another of my styles which I'll probably use for my next book.
+%
+% James Dietrich\footnote{\texttt{jdietrch@fastmail.fm}} (2014/05/29)
+% reports that the line and number part of the \textsf{ell} chapter
+% style does not align correctly if the page is excessively
+% stretched. The style is reimplemented using \Lenv{tabularx} instead.
+% \changes{v3.7d}{2014/11/05}{Reimplemeted the ell chapter style}
+% \begin{macro}{\chs@ell@helper}
+% For code reuse (the slightly strange values come from trial and
+% error to match the original look):
+% \begin{macrocode}
+\newcommand\chs@ell@helper[1]{%
+ \par%
+ \begin{adjustwidth}{}{-\chapindent}
+ \begin{tabularx}{\linewidth}{>{\raggedleft\arraybackslash}X|}%|emacs
+ \leavevmode\chapnumfont #1\vphantom{1}%
+ \hspace*{3.6pt}%
+ \rule[-13.5pt]{0pt}{14.8mm}%
+ \\%
+ \hline%
+ \end{tabularx}%
+ \end{adjustwidth}%
+ \par%
+ }%
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\makechapterstyle{ell}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapnumfont}{\normalfont\HUGE\sffamily}
+ \renewcommand*{\chaptitlefont}{\normalfont\huge\sffamily}
+ \settowidth{\chapindent}{\chapnumfont 111}
+ % \renewcommand*{\chapterheadstart}{\begingroup
+ % \vspace*{\beforechapskip}%
+ % \begin{adjustwidth}{}{-\chapindent}%
+ % \hrulefill
+ % \smash{\rule{0.4pt}{15mm}}
+ % \end{adjustwidth}\endgroup}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{%
+ % \begin{adjustwidth}{}{-\chapindent}
+ % \hfill
+ % \raisebox{10mm}[0pt][0pt]{\chapnumfont \thechapter}%
+ % \hspace*{1em}
+ % \end{adjustwidth}\vspace*{-3.0\onelineskip}
+ \chs@ell@helper{\thechapter}%
+ }
+ \renewcommand\printchapternonum{%
+ \chs@ell@helper{}\afterchapternum}
+ \renewcommand*{\printchaptertitle}[1]{%
+ %\vskip\onelineskip
+ \raggedleft {\chaptitlefont ##1}\par\nobreak}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@ger}
+% Posted to CTT on 2002/04/12 \textit{Fancy Headings, Chapter Headings} by Gerardo Garcia.
+% \begin{macrocode}
+\makechapterstyle{ger}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapterheadstart}{\vspace*{\beforechapskip}
+ \mbox{}\\\mbox{}\rule[0pt]{\textwidth}{0.4pt}\par}
+ \setlength{\midchapskip}{20pt}
+ \renewcommand*{\printchaptertitle}[1]{\chaptitlefont ##1
+ \\\mbox{}\rule[5pt]{\textwidth}{0.4pt}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@lyhne}
+% Posted to CTT 2006/02/09 \textit{Glossary}, by Anders Lyhne.
+% It requires the \Lpack{graphicx} package. I have modified it to remove the
+% new length and adjusted the unnumbered appearance.
+% \begin{macrocode}
+\makechapterstyle{lyhne}{% needs graphicx package
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{1.5cm}
+ \setlength{\afterchapskip}{1cm}
+ \setlength{\midchapskip}{2cm}
+ \renewcommand*{\chapnamefont}{\normalfont\normalsize\scshape\raggedleft}
+ \renewcommand*{\chaptitlefont}{\normalfont\normalsize\bfseries\sffamily\raggedleft}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{\makebox[0pt][l]{\hspace{0.2em}%
+ \resizebox{!}{2ex}{\chapnamefont\bfseries\sffamily\thechapter}}}
+ \renewcommand*{\afterchapternum}{\par\hspace{1.5cm}\hrule\vspace{0.2cm}}
+ \renewcommand*{\printchapternonum}{\vphantom{\chapnamefont 1}\afterchapternum}
+ \renewcommand*{\afterchaptertitle}{\vskip 0.2cm
+ \hrule\vskip\afterchapskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\chs@madsen}
+% Posted to CTT on 2003/12/09, \textit{New chapter style: chapter vs chapter*}
+% by Lars Madsen.
+% This requires the \Lpack{graphicx} package,
+% \changes{v1.61803398c}{2009/11/15}{Updated to provide a better
+% unnumbered look}
+% \changes{v3.6d}{2010/05/13}{the unnumbered version may be executed
+% in a context where \cs{thechapter} is not weldefined, replaced with
+% a 1}
+% \begin{macrocode}
+\makechapterstyle{madsen}{% requires graphicx package
+ \chapterstyle{default}
+ \renewcommand*{\chapnamefont}{%
+ \normalfont\Large\scshape\raggedleft}
+ \renewcommand*{\chaptitlefont}{%
+ \normalfont\Huge\bfseries\sffamily\raggedleft}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{%
+ \makebox[0pt][l]{\hspace{0.4em}%
+ \resizebox{!}{4ex}{%
+ \chapnamefont\bfseries\sffamily\thechapter}%
+ }%
+ }%
+ \renewcommand*{\printchapternonum}{%
+ \chapnamefont \phantom{\printchaptername \chapternamenum%
+ \makebox[0pt][l]{\hspace{0.4em}%
+ \resizebox{!}{4ex}{%
+ \chapnamefont\bfseries\sffamily 1}%
+ }%
+ }%
+ \afterchapternum %
+ }%
+ \renewcommand*{\afterchapternum}{%
+ \par\hspace{1.5cm}\hrule\vskip\midchapskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\colorchapnum}
+% \begin{macro}{\colorchaptitle}
+% \begin{macro}{\chs@pedersen}
+% Posted to CTT 2006/01/31, \textit{Chapter style}, by Troels Pedersen.
+% It requires the \Lpack{graphicx} package and possibly the \Lpack{color}
+% package. I have used a \cs{sidebar} instead of the original \cs{marginpar},
+% and eliminated a new length. The original color specification, the same for
+% the title and nunmber, can now be set via \cs{colorchapnum} and
+% \cs{colorchaptitle}.
+% \begin{macrocode}
+\newcommand*{\colorchapnum}{}
+\newcommand*{\colorchaptitle}{}
+\makechapterstyle{pedersen}{%
+ \chapterstyle{default}
+ \setlength{\beforechapskip}{-20pt}
+ \setlength{\afterchapskip}{10pt}
+ \renewcommand*{\chapnamefont}{\normalfont\LARGE\itshape}
+ \renewcommand*{\chapnumfont}{\normalfont\HUGE\itshape\colorchapnum}
+ \renewcommand*{\chaptitlefont}{\normalfont\huge\itshape\colorchaptitle}
+ \renewcommand*{\afterchapternum}{}
+ \renewcommand*{\printchaptername}{}
+ \setlength{\midchapskip}{20mm}% was \numberheight
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\printchapternum}{%
+ \sidebar{\raisebox{0pt}[0pt][0pt]{\makebox[0pt][l]{%
+ \resizebox{!}{\midchapskip}{\chapnumfont\thechapter}}}}}
+ \renewcommand*{\printchaptertitle}[1]{\chaptitlefont ##1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\chs@southall}
+% Style provided by Thomas Dye. I have modified the original to eliminate
+% the use of new lengths.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to southall chapterstyle}
+% \begin{macrocode}
+%% Thomas Dye's southall chapter style
+\makechapterstyle{southall}{%
+ \chapterstyle{default}
+ \setlength{\afterchapskip}{5\baselineskip}
+ \setlength{\beforechapskip}{36pt}% \headindent
+ \setlength{\midchapskip}{\textwidth}% \rightblock
+ \addtolength{\midchapskip}{-\beforechapskip}
+ \renewcommand*{\chapterheadstart}{\vspace*{2\baselineskip}}
+%%% \renewcommand*{\chaptitlefont}{\huge\rmfamily\raggedright}
+ \renewcommand*{\chaptitlefont}{\huge\rmfamily\memRTLraggedright}
+ \renewcommand*{\chapnumfont}{\chaptitlefont}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\afterchapternum}{}
+ \renewcommand*{\printchapternum}{%
+ \begin{minipage}[t][\baselineskip][b]{\beforechapskip}
+ {\vspace{0pt}\chapnumfont%%%\figureversion{lining}
+ \thechapter}
+ \end{minipage}}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \hfill\begin{minipage}[t]{\midchapskip}
+ {\vspace{0pt}\chaptitlefont ##1\par}\end{minipage}}
+ \renewcommand*{\afterchaptertitle}{%
+ \par\vspace{\baselineskip}%
+ \hrulefill \par\nobreak\noindent \vskip \afterchapskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@thatcher}
+% Original posted to CTT on 2006/01/18 by Scott Thatcher,
+% \textit{memoir: chapter headings capitalize math symbols}. I have modified
+% it to cater for multiline titles, appendices, and unnumbered
+% chapters.
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeLowercase} $\to$ \cs{MakeTextLowercase}}
+% \begin{macrocode}
+\makechapterstyle{thatcher}{%
+ \chapterstyle{default}
+ \renewcommand*{\chapterheadstart}{}
+ \renewcommand*{\printchaptername}{%
+ \centerline{\chapnumfont{\@chapapp\ \thechapter}}}
+ \renewcommand*{\chapternamenum}{}
+ \renewcommand*{\chapnumfont}{\normalfont\scshape\MakeTextLowercase}
+ \renewcommand*{\printchapternum}{}
+ \renewcommand*{\afterchapternum}{%
+ \par\centerline{\parbox{0.5in}{\hrulefill}}\par}
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\chapnumfont \@chapapp 1}\par
+ \parbox{0.5in}{}\par}
+ \renewcommand*{\chaptitlefont}{\normalfont\large}
+ \renewcommand*{\printchaptertitle}[1]{%
+ \centering \chaptitlefont\MakeTextUppercase{##1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@veelo}
+% This, from Baastian Veelo, has been noted in the documentation for
+% quite a time.
+% I have modified the original to eliminate the need for extra lengths.
+% It well suits trimmed documents.
+% We are scaling the chapter number, which most DVI viewers
+% will not display accurately. It requires the graphicx package.
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\makechapterstyle{veelo}{%
+% \chapterstyle{default}
+ \setlength{\afterchapskip}{40pt}
+ \renewcommand*{\chapterheadstart}{\vspace*{40pt}}
+ \renewcommand*{\afterchapternum}{\par\nobreak\vskip 25pt}
+ \renewcommand*{\chapnamefont}{\normalfont\LARGE\flushright}
+ \renewcommand*{\chapnumfont}{\normalfont\HUGE}
+ \renewcommand*{\chaptitlefont}{\normalfont\HUGE\bfseries\flushright}
+ \renewcommand*{\printchaptername}{%
+ \chapnamefont\MakeTextUppercase{\@chapapp}}
+ \renewcommand*{\chapternamenum}{}
+% \setlength{\numberheight}{18mm}
+% \setlength{\barlength}{\paperwidth}
+% \addtolength{\barlength}{-\textwidth}
+% \addtolength{\barlength}{-\spinemargin}
+ \setlength{\beforechapskip}{18mm}% \numberheight
+ \setlength{\midchapskip}{\paperwidth}% \barlength
+ \addtolength{\midchapskip}{-\textwidth}
+ \addtolength{\midchapskip}{-\spinemargin}
+ \renewcommand*{\printchapternum}{%
+ \makebox[0pt][l]{%
+ \hspace{.8em}%
+ \resizebox{!}{\beforechapskip}{\chapnumfont \thechapter}%
+ \hspace{.8em}%
+ \rule{\midchapskip}{\beforechapskip}%
+ }%
+ }%
+ \makeoddfoot{plain}{}{}{\thepage}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@verville}
+% I posted the original to CTT on 2005/01/18, \textit{Headers and special
+% formatting of sections}, in answer to a question by
+% Guy Verville. This version caters for unnumbered chapters.
+% \begin{macrocode}
+\makechapterstyle{verville}{%
+ % \chapterstyle{default}
+ \setlength{\beforechapskip}{0pt}
+ \renewcommand*{\printchaptername}{}
+ \renewcommand*{\printchapternum}{%
+ \hrule \vskip 0.5\onelineskip
+ \Huge \centering \thechapter.\ }
+ \renewcommand*{\printchapternonum}{%
+ \hrule \vskip 0.5\onelineskip
+ \Huge \centering}
+ \renewcommand*{\afterchapternum}{}
+ \setlength{\midchapskip}{0pt}
+ \renewcommand*{\printchaptertitle}[1]{%
+ ##1 \par
+ \vskip 0.5\onelineskip
+ \hrule}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@crosshead}
+% A centered chapterstyle (from Bringhurst)
+% \changes{v1.61803}{2008/01/30}{Added chapterstyles: crosshead, dowding,
+% komalike, ntglike, tandh, and wilsondob}
+% \begin{macrocode}
+\makechapterstyle{crosshead}{%
+ \setlength{\beforechapskip}{2\onelineskip}%
+ \renewcommand*{\chapterheadstart}{\vspace{\beforechapskip}}%
+ \setlength{\afterchapskip}{2\onelineskip \@plus .2\onelineskip
+ \@minus 0.2\onelineskip}%
+ \renewcommand*{\printchaptername}{}%
+ \renewcommand*{\chapternamenum}{}%
+ \renewcommand*{\chapnumfont}{\normalfont\LARGE\bfseries}%
+ \renewcommand*{\chaptitlefont}{\chapnumfont}%
+ \renewcommand*{\printchapternum}{%
+ \centering\chapnumfont \thechapter\quad}%
+ \renewcommand{\afterchapternum}{}%
+ \renewcommand*{\printchapternonum}{\centering}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@dowding}
+% A centered chapterstyle (from Dowding's \textit{Finer Points})
+% \begin{macrocode}
+\makechapterstyle{dowding}{%
+ \setlength{\beforechapskip}{2\onelineskip}%
+ \setlength{\afterchapskip}{1.5\onelineskip \@plus .1\onelineskip
+ \@minus 0.167\onelineskip}%
+ \renewcommand*{\chapnamefont}{\normalfont}%
+ \renewcommand*{\chapnumfont}{\chapnamefont}%
+ \renewcommand*{\printchapternum}{\centering\chapnumfont \ifanappendix \thechapter
+ \else \numtoName{\c@chapter}\fi}%
+ \renewcommand*{\chaptitlefont}{\normalfont\itshape\huge\centering}%
+ \renewcommand*{\printchapternonum}{%
+ \vphantom{\printchaptername}\vskip\midchapskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@komalike}
+% A chapterstyle approximating the KOMA script style (\texttt{scrbook.cls})
+% \begin{macrocode}
+\makechapterstyle{komalike}{%
+ \setlength{\beforechapskip}{2\onelineskip}%
+ \setlength{\afterchapskip}{1.5\onelineskip \@plus .1\onelineskip
+ \@minus 0.167\onelineskip}%
+ \renewcommand*{\printchaptername}{}%
+ \renewcommand*{\chapternamenum}{}%
+ \renewcommand*{\chapnumfont}{\normalfont\LARGE\sffamily\bfseries}%
+ \renewcommand*{\printchapternum}{\chapnumfont \thechapter\space}%
+ \renewcommand*{\afterchapternum}{}%
+ \renewcommand*{\chaptitlefont}{\normalfont\LARGE\sffamily\bfseries}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@ntglike}
+% A chapterstyle approximating the NTG style (\texttt{boek.cls})
+% \begin{macrocode}
+\makechapterstyle{ntglike}{%
+ \setlength{\beforechapskip}{50pt \@plus 20pt}%
+ \renewcommand*{\chapnamefont}{\normalfont\Large\bfseries}%
+ \renewcommand*{\chapnumfont}{\normalfont\Large\bfseries}%
+ \renewcommand*{\chaptitlefont}{\normalfont\Large\bfseries}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@tandh}
+% A chapterstyle based on Thames \& Hudson \textit{Typography}.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to tandh chapterstyle}
+% \begin{macrocode}
+\makechapterstyle{tandh}{%
+ \setlength{\beforechapskip}{1\onelineskip}%
+ \setlength{\afterchapskip}{2\onelineskip \@plus .1\onelineskip
+ \@minus 0.167\onelineskip}%
+ \renewcommand*{\printchaptername}{}%
+ \renewcommand*{\chapternamenum}{}%
+ \renewcommand*{\chapnumfont}{\normalfont\huge\bfseries}%
+ \renewcommand*{\printchapternum}{\chapnumfont \thechapter\quad}%
+ \renewcommand*{\afterchapternum}{}%
+%%% \renewcommand*{\chaptitlefont}{\chapnumfont\raggedright}}
+ \renewcommand*{\chaptitlefont}{\chapnumfont\memRTLraggedright}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chs@wilsondob}
+% A chapterstyle based on Adrian Wilson's \textit{Design of books}.
+% \begin{macrocode}
+\makechapterstyle{wilsondob}{%
+ \setlength{\beforechapskip}{2\onelineskip}%
+ \setlength{\afterchapskip}{4\onelineskip \@plus .1\onelineskip
+ \@minus 0.167\onelineskip}%
+ \renewcommand*{\printchaptername}{}%
+ \renewcommand*{\chapternamenum}{}%
+ \renewcommand*{\chapnumfont}{\normalfont\Huge\itshape}%
+ \renewcommand*{\printchapternum}{\raggedleft\chapnumfont \thechapter\quad}%
+ \renewcommand*{\afterchapternum}{}%
+ \renewcommand*{\chaptitlefont}{\chapnumfont}%
+ \renewcommand*{\printchapternonum}{\raggedleft}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Lower level headings}
+%
+% These commands all make use of \cs{@startsection}. However,
+% for the purposes of the class the kernel version needs modification
+% to support:
+% \begin{itemize}
+% \item make short pages (where a section heading is moved to the top
+% of the next page) ragged bottom;
+% \item provide headings with two optional arguments.
+% \end{itemize}
+%
+%
+% We will tweak \cs{@startsection} so that a short page (where a section
+% heading is moved from the bottom of the page to the top of the next)
+% can be set \cs{raggedbottom}.
+%
+% \begin{macro}{\ifraggedbottomsection}
+% \begin{macro}{\raggedbottomsectiontrue}
+% \begin{macro}{\raggedbottomsectionfalse}
+% \begin{macro}{\raggedbottomsection}
+% \begin{macro}{\normalbottomsection}
+% \begin{macro}{\bottomsectionpenalty}
+% \cs{raggedbottomsectiontrue} for ragged short pages.
+% \changes{v1.3}{2002/11/14}{Added \cs{ifraggedbottomsection}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{raggedbottomsection} and
+% \cs{normalbottomsection}}
+% \changes{v3.6k}{2012/07/22}{Made the \cs{raggedbottomsection}
+% penalty configurable}
+% \begin{macrocode}
+\newif\ifraggedbottomsection
+ \raggedbottomsectionfalse
+\newcommand*{\raggedbottomsection}{\raggedbottomsectiontrue}
+\newcommand*{\normalbottomsection}{\raggedbottomsectionfalse}
+\newcommand*{\bottomsectionpenalty}{\z@}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bottomsectionskip}
+% Decreasing this length increases short page bottom flushness.
+% \changes{v1.3}{2002/11/14}{Added \cs{bottomsectionskip}}
+% \begin{macrocode}
+\newlength{\bottomsectionskip}
+ \setlength{\bottomsectionskip}{10mm}
+
+% \end{macrocode}
+% \end{macro}
+%
+% We will add a second optional argument for \cs{section}, etc.
+% See the \ctt{} thread \textit{`Long headers'} 15 Jan 2003.
+%
+% The kernel \cs{@dblarg} is used in situations where the default
+% value for an optional argument is the same as the required argument.
+% Schematically, \\
+% \verb?\@dblarg -> Main, Main? \\
+% The macros \cs{@trplargomm} and \cs{@trplargoom} are extensions to this
+% idea for two optional arguments.
+%
+% \begin{macro}{\@trplargomm}
+% \begin{macro}{\@xtrplargomm}
+% \begin{macro}{\@xxtrplarg}
+% \verb?\@trplargomm -> Opt, Main, Main?
+% \begin{macrocode}
+\newcommand{\@trplargomm}[1]{%
+ \@ifnextchar[{\@xtrplargomm{#1}}%
+ {\@xxtrplarg{#1}}}
+\long\def\@xtrplargomm#1[#2]{\@dblarg{#1[#2]}}
+\newcommand{\@xxtrplarg}[2]{#1[{#2}][{#2}]{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@trplargoom}
+% \begin{macro}{\@xtrplargoom}
+% \verb?\@trplargoom -> Opt, Opt, Main?
+% \begin{macrocode}
+\newcommand{\@trplargoom}[1]{%
+ \@ifnextchar[{\@xtrplargoom{#1}}%
+ {\@xxtrplarg{#1}}}
+\long\def\@xtrplargoom#1[#2]{%
+ \@ifnextchar[{#1[{#2}]}%
+ {#1[{#2}][{#2}]}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memsecinfo}
+% \begin{macro}{\memsecstarinfo}
+% \verb?\memsecinfo{secname}{\thenum}{toc}{head}{title}? \\
+% \verb?\memsecstarinfo{secname}{title}? \\
+% \begin{macrocode}
+\newcommand{\memsecinfo}[5]{}
+\newcommand{\memsecstarinfo}[2]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@startsection}
+% \begin{macro}{\m@msecn@me}
+% Change kernel \cs{@startsection} to: \\
+% \begin{itemize}
+% \item Make short pages raggedbottom. This is based on the thread
+% \textit{Can \cs{flushbottom} and \cs{section} be made to live together?}
+% on \ctt{} in September 2002.
+% \changes{v1.3}{2002/11/14}{Modified \cs{@startsection} for raggedbottoming}
+% \item add an extra optional argument.
+% \changes{v1.4}{2003/11/22}{Added extra optional arg to \cs{@startsection}
+% (from patch v1.4)}
+% \item make sure it is not effected by a non-zero \cs{parskip}
+% \changes{v3.6j}{2011/03/02}{added the above feature}
+% \end{itemize}
+% The original is in \file{ltsect.dtx}. \\
+% \cs{@startsection}\marg{name}\marg{level}\marg{indent} \\
+% \hspace*{1.5in} \marg{beforeskip}\marg{afterskip}\marg{style}
+% \begin{macrocode}
+\renewcommand{\@startsection}[6]{%
+% \end{macrocode}
+% \changes{v3.6h}{2011/02/07}{Added float block hook}
+% \begin{macrocode}
+ \@nameuse{#1block}%
+% \end{macrocode}
+% Do raggedbottom stuff.
+% \changes{v3.6k}{2012/07/22}{Made the \cs{raggedbottomsection}
+% penalty configurable}
+% \begin{macrocode}
+ \ifraggedbottomsection\if@nobreak\else
+ \vskip\z@\@plus\bottomsectionskip
+ \penalty\bottomsectionpenalty
+ \vskip\z@\@plus -\bottomsectionskip
+ \fi\fi
+% \end{macrocode}
+% Save the section name.
+% \begin{macrocode}
+ \def\m@msecn@me{#1}%
+% \end{macrocode}
+% The original code.
+% \begin{macrocode}
+ \if@noskipsec \leavevmode \fi
+ \par
+ \@tempskipa #4\relax
+ \@afterindenttrue
+ \ifdim \@tempskipa <\z@
+ \@tempskipa -\@tempskipa \@afterindentfalse
+ \fi
+ \if@nobreak
+ \everypar{}%
+ \else
+% \end{macrocode}
+% Slight change such that the effect of \cs{parskip} is cancelled
+% \changes{v3.6j}{2011/03/02}{Adding a negative \cs{parskip} seem to
+% be able to remove the effect of a non-zero \cs{parskip}}
+% \begin{macrocode}
+ \addpenalty\@secpenalty\addvspace\@tempskipa
+ \addvspace{-\parskip}% <--- added 2011/03/02
+ \fi
+% \end{macrocode}
+% For the extra optional argument, change the original \verb?\@dblarg{\@sect{...?
+% below to \verb?\@trplargoom{\M@sect{...?.
+% \begin{macrocode}
+ \@ifstar
+ {\@ssect{#3}{#4}{#5}{#6}}%
+ {\@trplargoom{\M@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.6j}{2011/03/02}{Added the change of the kernel \cs{@xsect}}
+% \begin{macro}{\@xsect}
+% In order to fulfill removing the effect that a non-zero
+% \cs{parskip} has on the sectional spacing, we also have to patch
+% the kernel \cs{@xsect}. (The original is found in latex.ltx)
+% \begin{macrocode}
+\def\@xsect#1{%
+ \@tempskipa #1\relax
+ \ifdim \@tempskipa>\z@
+ \par \nobreak
+ \vskip \@tempskipa
+ \vskip-\parskip%<--- added 2011/03/02
+ \@afterheading
+ \else
+ \@nobreakfalse
+ \global\@noskipsectrue
+ \everypar{%
+ \if@noskipsec
+ \global\@noskipsecfalse
+ {\setbox\z@\lastbox}%
+ \clubpenalty\@M
+ \begingroup \@svsechd \endgroup
+ \unskip
+ \@tempskipa #1\relax
+ \hskip -\@tempskipa
+ \else
+ \clubpenalty \@clubpenalty
+ \everypar{}%
+ \fi}%
+ \fi
+ \ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+% %
+% \begin{macro}{\M@sect}
+% At least the \Lpack{hyperref} and \Lpack{nameref} packages, and
+% possibly other packages, modify the kernel \cs{@sect} assuming 8 args.
+% That's why I've called my version, which has 9 args, something
+% else (i.e., \cs{M@sect}). This version also has the support
+% for title referencing. \\
+% \cs{M@sect}\marg{name}\marg{level}\marg{indent}\marg{beforeskip}\marg{afterskip}\marg{style}\\ \hspace*{0.5in} \oarg{toc}\oarg{head}\marg{title}
+% \changes{v1.4}{2003/11/22}{Added \cs{M@sect}}
+% \begin{macrocode}
+\def\M@sect#1#2#3#4#5#6[#7][#8]#9{%
+ \ifheadnameref\M@gettitle{#8}\else\M@gettitle{#7}\fi
+ \ifnum #2>\c@secnumdepth
+ \let\@svsec\@empty
+ \memsecinfo{#1}{}{#7}{#8}{#9}%
+ \else
+ \refstepcounter{#1}%
+ \protected@edef\@svsec{\@seccntformat{#1}\relax}%
+ \memsecinfo{#1}{\@nameuse{the#1}}{#7}{#8}{#9}%
+ \fi
+ \@tempskipa #5\relax
+ \ifdim \@tempskipa>\z@
+ \begingroup
+ #6{%
+ \@hangfrom{\hskip #3\relax\@svsec}%
+ \interlinepenalty \@M #9\@@par}%
+ \endgroup
+ \csname #1mark\endcsname{#8}%
+ \addcontentsline{toc}{#1}{%
+ \ifnum #2>\c@secnumdepth \else
+ \protect\numberline{\csname the#1\endcsname}%
+ \fi
+ #7}%
+ \else
+ \def\@svsechd{%
+ #6{\hskip #3\relax
+ \@svsec #9}%
+ \csname #1mark\endcsname{#8}%
+ \addcontentsline{toc}{#1}{%
+ \ifnum #2>\c@secnumdepth \else
+ \protect\numberline{\csname the#1\endcsname}%
+ \fi
+ #7}}%
+ \fi
+ \@xsect{#5}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@ssect}
+% Add hook for name reference to \cs{section*} etc. \\
+% \cs{@ssect}\marg{indent}\marg{beforeskip}\marg{afterskip}\marg{style}\marg{title}
+% \changes{v1.61803}{2008/01/30}{Used corrected number of arguments to
+% \cs{memsecstarinfo} in \cs{@ssect} (Gabriel Guernik, mempatch v4.1)}
+% \begin{macrocode}
+\let\@mem@old@ssect\@ssect
+\def\@ssect#1#2#3#4#5{%
+ \M@gettitle{#5}%
+ \memsecstarinfo{\m@msecn@me}{#5}%
+ \@mem@old@ssect{#1}{#2}{#3}{#4}{#5}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\section}
+% A normal heading with white space above and below and no indentation
+% of the first paragraph.
+% By default the heading is set in a \verb?\Large\bfseries? font.
+% \begin{macrocode}
+\newcommand{\section}{%
+ \sechook%
+ \@startsection{section}{1}% level 1
+ {\secindent}% heading indent
+ {\beforesecskip}% skip before the heading
+ {\aftersecskip}% skip after the heading
+ {\normalfont\secheadstyle}} % font
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sechook}
+% \begin{macro}{\setsechook}
+% \cs{sechook} is called at the start of a \cs{section} and
+% \cs{setsechook}\marg{code} redefines it.
+% \begin{macrocode}
+\newcommand{\sechook}{}
+\newcommand{\setsechook}[1]{\renewcommand{\sechook}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\secindent}
+% \begin{macro}{\beforesecskip}
+% \begin{macro}{\aftersecskip}
+% \begin{macro}{\secheadstyle}
+% \begin{macro}{\setsecindent}
+% \begin{macro}{\setbeforesecskip}
+% \begin{macro}{\setaftersecskip}
+% \begin{macro}{\setsecheadstyle}
+% \cs{secindent} is the indentation of the section heading from the left margin,
+% \cs{beforesecskip} and \cs{aftersecskip} specify the white space before
+% and after the heading, and \cs{secheadstyle} specifies the heading style.
+% These are set to the default values for the \Lpack{book} class,
+% except that the heading will be \cs{raggedright}, thus preventing
+% hyphenation. The
+% \cs{set...} commands are for the user to change the values.
+% \changes{v1.61803398}{@009/07/17}{Added bidi support to default secheadstyle}
+% \begin{macrocode}
+\newlength{\secindent}
+\newcommand{\setsecindent}[1]{\setlength{\secindent}{#1}}
+ \setsecindent{\z@}
+\newskip\beforesecskip
+\newcommand{\setbeforesecskip}[1]{\setlength{\beforesecskip}{#1}}
+ \setbeforesecskip{-3.5ex \@plus -1ex \@minus -.2ex}
+\newskip\aftersecskip
+\newcommand{\setaftersecskip}[1]{\setlength{\aftersecskip}{#1}}
+ \setaftersecskip{2.3ex \@plus .2ex}
+\newcommand{\secheadstyle}{}
+\newcommand{\setsecheadstyle}[1]{\renewcommand{\secheadstyle}{#1}}
+%%% \setsecheadstyle{\Large\bfseries\raggedright}
+ \setsecheadstyle{\Large\bfseries\memRTLraggedright}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\subsection}
+% A normal heading with white space above and below and no indentation
+% of the first paragraph.
+% By default the heading is set in a \verb?\large\bfseries? font.
+% \begin{macrocode}
+\newcommand{\subsection}{%
+ \subsechook%
+ \@startsection{subsection}{2}% level 2
+ {\subsecindent}% heading indent
+ {\beforesubsecskip}% skip before the heading
+ {\aftersubsecskip}% skip after the heading
+ {\normalfont\subsecheadstyle}} % font
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subsechook}
+% \begin{macro}{\setsubsechook}
+% \cs{subsechook} is called at the start of a \cs{subsection} and
+% \cs{setsubsechook}\marg{code} redefines it.
+% \begin{macrocode}
+\newcommand{\subsechook}{}
+\newcommand{\setsubsechook}[1]{\renewcommand{\subsechook}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\subsecindent}
+% \begin{macro}{\beforesubsecskip}
+% \begin{macro}{\aftersubsecskip}
+% \begin{macro}{\subsecheadstyle}
+% \begin{macro}{\setsubsecindent}
+% \begin{macro}{\setbeforesubsecskip}
+% \begin{macro}{\setaftersubsecskip}
+% \begin{macro}{\setsubsecheadstyle}
+% The macros for controlling \cs{subsection} headings.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to default subsec headstyle}
+% \begin{macrocode}
+\newlength{\subsecindent}
+\newcommand{\setsubsecindent}[1]{\setlength{\subsecindent}{#1}}
+ \setsubsecindent{\z@}
+\newskip\beforesubsecskip
+\newcommand{\setbeforesubsecskip}[1]{\setlength{\beforesubsecskip}{#1}}
+ \setbeforesubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}
+\newskip\aftersubsecskip
+\newcommand{\setaftersubsecskip}[1]{\setlength{\aftersubsecskip}{#1}}
+ \setaftersubsecskip{1.5ex \@plus .2ex}
+\newcommand{\subsecheadstyle}{}
+\newcommand{\setsubsecheadstyle}[1]{\renewcommand{\subsecheadstyle}{#1}}
+%%% \setsubsecheadstyle{\large\bfseries\raggedright}
+ \setsubsecheadstyle{\large\bfseries\memRTLraggedright}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\subsubsection}
+% A normal heading with white space above and below and no indentation
+% of the first paragraph.
+% By default the heading is set in a \verb?\normalsize\bfseries? font.
+% \begin{macrocode}
+\newcommand{\subsubsection}{%
+ \subsubsechook%
+ \@startsection{subsubsection}{3}% level 3
+ {\subsubsecindent}% heading indent
+ {\beforesubsubsecskip}% skip before the heading
+ {\aftersubsubsecskip}% skip after the heading
+ {\normalfont\subsubsecheadstyle}} % font
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subsubsechook}
+% \begin{macro}{\setsubsubsechook}
+% \cs{subsubsechook} is called at the start of a \cs{subsubsection} and
+% \cs{setsubsubsechook}\marg{code} redefines it.
+% \begin{macrocode}
+\newcommand{\subsubsechook}{}
+\newcommand{\setsubsubsechook}[1]{\renewcommand{\subsubsechook}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\subsubsecindent}
+% \begin{macro}{\beforesubsubsecskip}
+% \begin{macro}{\aftersubsubsecskip}
+% \begin{macro}{\subsubsecheadstyle}
+% \begin{macro}{\setsubsubsecindent}
+% \begin{macro}{\setbeforesubsubsecskip}
+% \begin{macro}{\setaftersubsubsecskip}
+% \begin{macro}{\setsubsubsecheadstyle}
+% The macros for controlling \cs{subsubsection} headings.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to default subsubsec headstyle}
+% \begin{macrocode}
+\newlength{\subsubsecindent}
+\newcommand{\setsubsubsecindent}[1]{%
+ \setlength{\subsubsecindent}{#1}}
+ \setsubsubsecindent{\z@}
+\newskip\beforesubsubsecskip
+\newcommand{\setbeforesubsubsecskip}[1]{%
+ \setlength{\beforesubsubsecskip}{#1}}
+ \setbeforesubsubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}
+\newskip\aftersubsubsecskip
+\newcommand{\setaftersubsubsecskip}[1]{%
+ \setlength{\aftersubsubsecskip}{#1}}
+ \setaftersubsubsecskip{1.5ex \@plus .2ex}
+\newcommand{\subsubsecheadstyle}{}
+\newcommand{\setsubsubsecheadstyle}[1]{%
+ \renewcommand{\subsubsecheadstyle}{#1}}
+%%% \setsubsubsecheadstyle{\normalsize\bfseries\raggedright}
+ \setsubsubsecheadstyle{\normalsize\bfseries\memRTLraggedright}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\paragraph}
+% A runin heading with white space above and to the right of the heading.
+% By default the heading is set in a \verb?\normalsize\bfseries? font.
+% \begin{macrocode}
+\newcommand{\paragraph}{%
+ \parahook%
+ \@startsection{paragraph}{4}% level 4
+ {\paraindent}% heading indent
+ {\beforeparaskip}% skip before the heading
+ {\afterparaskip}% skip after the heading
+ {\normalfont\paraheadstyle}} % font
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\parahook}
+% \begin{macro}{\setparahook}
+% \cs{parahook} is called at the start of a \cs{paragraph} and
+% \cs{setparahook}\marg{code} redefines it.
+% \begin{macrocode}
+\newcommand{\parahook}{}
+\newcommand{\setparahook}[1]{\renewcommand{\parahook}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\paraindent}
+% \begin{macro}{\beforeparaskip}
+% \begin{macro}{\afterparaskip}
+% \begin{macro}{\paraheadstyle}
+% \begin{macro}{\setparaindent}
+% \begin{macro}{\setbeforeparaskip}
+% \begin{macro}{\setafterparaskip}
+% \begin{macro}{\setparaheadstyle}
+% The macros for controlling \cs{paragraph} headings.
+% \begin{macrocode}
+\newlength{\paraindent}
+\newcommand{\setparaindent}[1]{\setlength{\paraindent}{#1}}
+ \setparaindent{\z@}
+\newskip\beforeparaskip
+\newcommand{\setbeforeparaskip}[1]{\setlength{\beforeparaskip}{#1}}
+ \setbeforeparaskip{3.25ex \@plus 1ex \@minus .2ex}
+\newskip\afterparaskip
+\newcommand{\setafterparaskip}[1]{\setlength{\afterparaskip}{#1}}
+ \setafterparaskip{-1em}
+\newcommand{\paraheadstyle}{}
+\newcommand{\setparaheadstyle}[1]{\renewcommand{\paraheadstyle}{#1}}
+ \setparaheadstyle{\normalsize\bfseries}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\subparagraph}
+% A runin heading with white space above and to the right of the heading.
+% By default the heading is set in a \verb?\normalsize\bfseries? font.
+% \begin{macrocode}
+\newcommand{\subparagraph}{%
+ \subparahook%
+ \@startsection{subparagraph}{5}% level 5
+ {\subparaindent}% heading indent
+ {\beforesubparaskip}% skip before the heading
+ {\aftersubparaskip}% skip after the heading
+ {\normalfont\subparaheadstyle}} % font
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subparahook}
+% \begin{macro}{\setsubparahook}
+% \cs{subparahook} is called at the start of a \cs{subparagraph} and
+% \cs{setsubparahook}\marg{code} redefines it.
+% \begin{macrocode}
+\newcommand{\subparahook}{}
+\newcommand{\setsubparahook}[1]{\renewcommand{\subparahook}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\subparaindent}
+% \begin{macro}{\beforesubparaskip}
+% \begin{macro}{\aftersubparaskip}
+% \begin{macro}{\subparaheadstyle}
+% \begin{macro}{\setsubparaindent}
+% \begin{macro}{\setbeforesubparaskip}
+% \begin{macro}{\setaftersubparaskip}
+% \begin{macro}{\setsubparaheadstyle}
+% The macros for controlling \cs{subparagraph} headings.
+% \begin{macrocode}
+\newlength{\subparaindent}
+\newcommand{\setsubparaindent}[1]{%
+ \setlength{\subparaindent}{#1}}
+ \setsubparaindent{\parindent}
+\newskip\beforesubparaskip
+\newcommand{\setbeforesubparaskip}[1]{%
+ \setlength{\beforesubparaskip}{#1}}
+ \setbeforesubparaskip{3.25ex \@plus 1ex \@minus .2ex}
+\newskip\aftersubparaskip
+\newcommand{\setaftersubparaskip}[1]{%
+ \setlength{\aftersubparaskip}{#1}}
+ \setaftersubparaskip{-1em}
+\newcommand{\subparaheadstyle}{}
+\newcommand{\setsubparaheadstyle}[1]{%
+ \renewcommand{\subparaheadstyle}{#1}}
+ \setsubparaheadstyle{\normalsize\bfseries}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sethangfrom}
+% The macro \cs{sethangfrom}\marg{code} is a user-level command
+% for changing the definition of \cs{@hangfrom}. Use \verb?#1? in \meta{code}
+% for the argument to \cs{@hangfrom} (or \verb?##1? if used inside another macro).
+% \changes{v0.2}{2001/06/03}{Added \cs{sethangfrom}}
+% \begin{macrocode}
+\newcommand{\sethangfrom}[1]{\renewcommand{\@hangfrom}[1]{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsecnumformat}
+% The macro \cs{setsecnumformat}\marg{code} is a user-level command
+% for changing the definition of \cs{@seccntformat}. Use \verb?#1? in \meta{code}
+% for the argument to \cs{@seccntformat} (or \verb?##1? if used inside another macro).
+% \changes{v0.2}{2001/06/03}{Added \cs{setsecnumformat}}
+% \begin{macrocode}
+\newcommand{\setsecnumformat}[1]{\renewcommand{\@seccntformat}[1]{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hangsecnum}
+% \begin{macro}{\defaultsecnum}
+% These are declarations for putting sectional numbers in the margin,
+% or the default sectional number formatting.
+% \changes{v0.2}{2001/06/03}{Added \cs{hangsecnum} and \cs{defaultsecnum}}
+% \begin{macrocode}
+\newcommand{\hangsecnum}{%
+ \def\@seccntformat##1{\llap{\csname the##1\endcsname\quad}}}
+\newcommand{\defaultsecnum}{%
+ \def\@seccntformat##1{\csname the##1\endcsname\quad}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Anonymous headings}
+%
+% \begin{macro}{\plainbreak}
+% \cs{plainbreak}\marg{num} generates \meta{num} blanks lines and
+% suppresses the indentation of a following paragraph. The starred
+% version, \cs{plainbreak*}, does not suppress paragraph indentation.
+% \changes{v0.2}{2001/06/03}{Added starred version of \cs{plainbreak}}
+% \begin{macrocode}
+\newcommand{\plainbreak}{\@ifstar{\@spbreak}{\@pbreak}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@pbreak}
+% \begin{macro}{\@spbreak}
+% These are the internal forms for the two versions of \cs{plainbreak}.
+% The code for \cs{@pbreak} is almost a straight copy of code posted to
+% \ctt{} by Donald Arseneau on 2001/03/26.
+% \begin{macrocode}
+\newcommand*{\@pbreak}[1]{\par
+ \penalty -100
+ \vskip #1\onelineskip \@plus 2\onelineskip
+ \penalty -20
+ \vskip \z@ \@plus -2\onelineskip
+ \@afterindentfalse
+ \@afterheading}
+\newcommand*{\@spbreak}[1]{\par
+ \penalty -100
+ \vskip #1\onelineskip \@plus 2\onelineskip
+ \penalty -20
+ \vskip \z@ \@plus -2\onelineskip
+ \@afterindenttrue
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\fancybreak}
+% \cs{fancybreak}\marg{text} typesets \meta{text} centered. For example,
+% \verb?\fancybreak{{*}\\{* * *}\\{*}}?. It suppresses indentation of the
+% following paragraph. The starred version leaves indentation as is.
+% \changes{v0.2}{2001/06/03}{Added starred version of \cs{fancybreak}}
+% \changes{v1.3}{2002/11/14}{Tweaked \cs{fancybreak} to remove underfull hbox}
+% \changes{v1.61803}{2008/01/30}{Changed fancybreak code to end the paragraph
+% it started (Dan Leucking mempatch v4.5)}
+% \begin{macrocode}
+\newcommand{\fancybreak}{\@ifstar{\@sfbreak}{\@fbreak}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@fbreak}
+% \begin{macro}{\@sfbreak}
+% These are the internal forms for the two versions of \cs{fancybreak}.
+% \begin{macrocode}
+\newcommand{\@fbreak}[1]{\par
+ \penalty -100
+ \noindent\parbox{\linewidth}{\centering #1}%%\null
+ \par
+%% \penalty -20
+%% \vskip -\onelineskip
+ \@afterindentfalse
+ \@afterheading}
+\newcommand{\@sfbreak}[1]{\par
+ \penalty -100
+ \noindent\parbox{\linewidth}{\centering #1}%%\null
+ \par
+%% \penalty -20
+%% \vskip -\onelineskip
+ \@afterindenttrue
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\plainfancybreak}
+% The \cs{plainfancybreak}\marg{space}\marg{num}\marg{text} acts
+% like \cs{plainbreak}\marg{num} in the middle of a page and like
+% \cs{fancybreak}\marg{text} at the bottom of a page. The \meta{space}
+% argument is the vertical space required for the \meta{num} blank lines
+% and some additional lines of text. From experiments, it seems that
+% \meta{space} should be at least (3+\meta{num}) lines (\cs{onelineskip}).
+% There is also a starred version, \cs{plainfancybreak*}, to match the other
+% starred break commands.
+% \changes{v0.2}{2001/06/03}{Added \cs{plainfancybreak} and supporting macros}
+% \begin{macrocode}
+\newcommand{\plainfancybreak}{\@ifstar{\@spfbreak}{\@pfbreak}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@pfbreak}
+% \begin{macro}{\@spfbreak}
+% These are the internal macros for the unstarred and starred versions
+% of \cs{plainfancybreak}. They essentially do the same thing, except they call,
+% respectively, the unstarred and starred internal versions of \cs{plainbreak}
+% and \cs{fancybreak}. The code for checking the amount of space left on the
+% page is from an early, and abandoned, version of the code for \cs{needspace}.
+% \begin{macrocode}
+\newcommand{\@pfbreak}[3]{\par
+ \@tempdimc\pagegoal \advance\@tempdimc-\pagetotal
+ \ifdim #1>\@tempdimc \@fbreak{#3}\else \@pbreak{#2}\fi}
+\newcommand{\@spfbreak}[3]{\par
+ \@tempdimc\pagegoal \advance\@tempdimc-\pagetotal
+ \ifdim #1>\@tempdimc \@sfbreak{#3}\else \@spbreak{#2}\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% From the thread \textit{Customizing section hooks in memoir.cls} on \ctt{}
+% in October 2002 it appeared that \cs{plainfancybreak} may be fragile.
+% Donald Arseneau said that \cs{plainfancybreak} guessed at the amount
+% of space available and gave code based on a modified output routine
+% to make it more robust. The following code is based on that thread.
+% \changes{v1.3}{2002/11/14}{Added lots of code for new \cs{pfbreak}}
+%
+% \begin{macro}{\pen@ltyabovepfbreak}
+% \begin{macro}{\pen@ltybelowpfbreak}
+% Penalities for communication with the output routine.
+% \begin{macrocode}
+\newcommand*{\pen@ltyabovepfbreak}{2}
+\newcommand*{\pen@ltybelowpfbreak}{-4}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pfbreakskip}
+% The vertical space taken by the plain and fancy breaks.
+% \begin{macrocode}
+\newlength{\pfbreakskip}
+ \setlength{\pfbreakskip}{2\baselineskip}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfbreakdisplay}
+% This is the fancybreak display, which must fit into \cs{pfbreakskip}
+% vertical space.
+% \begin{macrocode}
+\newcommand{\pfbreakdisplay}{*\quad*\quad*}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfbre@kdispl@y}
+% Typesets \cs{pfbreakdisplay} vertically and horizontally centered.
+% \begin{macrocode}
+\def\pfbre@kdispl@y{\vbox to 1\pfbreakskip{\vss
+ \hb@xt@ \columnwidth{\hss \pfbreakdisplay \hss}%
+ \vss}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nopfbreakOutput}
+% Save the current output routine.
+% \begin{macrocode}
+\edef\nopfbreakOutput{\the\output}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfbreakOutput}
+% Special output to handle the \cs{pfbreak}.
+% \begin{macrocode}
+\def\pfbreakOutput{%
+ \ifnum\outputpenalty=\pen@ltyabovepfbreak
+ \nopfbreakOutput
+ \pfbre@kdispl@y
+ \nobreak
+ \vskip-\pfbreakskip
+ \else\ifnum\outputpenalty=\pen@ltybelowpfbreak
+ \unvbox 255\relax
+ \nobreak
+ \vskip-\pfbreakskip
+ \pfbre@kdispl@y
+ \break
+ \else
+ \nopfbreakOutput
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\output}
+% Use the new \cs{pfbreak} output routine.
+% \begin{macrocode}
+\output={\pfbreakOutput}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfbreak}
+% Typesets a plain break in the middle of the page, otherwise
+% a fancybreak at either the bottom or top of the page.
+% \begin{macrocode}
+\newcommand{\pfbreak}{\@ifstar{\@spfbreakgap}{\@pfbreakgap}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@pfbreakgap}
+% Unstarred version of \cs{pfbreak}.
+% \changes{v3.6h}{2010/10/06}{fixed \cs{@pfbreakgab} kudos to DA for
+% the fix}
+% \begin{macrocode}
+\newcommand{\@pfbreakgap}{%
+ \par {%
+ \skip@\lastskip
+ \nobreak
+ \vskip -\ifdim\prevdepth>\maxdepth \maxdepth
+ \else\ifdim\prevdepth>-1000pt\prevdepth
+ \else\ifinner 0pt
+ \else \pagedepth
+ \fi \fi \fi
+ \vskip -\skip@
+ \ifdim\skip@<\pfbreakskip
+ \advance\skip@ -1\skip@ \advance\skip@ 1\pfbreakskip
+ \fi
+ \penalty\pen@ltyabovepfbreak
+ \prevdepth\z@ % added
+ \vskip\skip@
+ \penalty\pen@ltybelowpfbreak
+ }
+ \@afterindentfalse
+ \@afterheading
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@spfbreakgap}
+% Starred version of \cs{pfbreak}.
+% \changes{v3.6h}{2010/10/06}{fixed \cs{@pfbreakgab} kudos to DA for
+% the fix}
+% \begin{macrocode}
+\newcommand{\@spfbreakgap}{%
+ \par {%
+ \skip@\lastskip
+ \nobreak
+ \vskip -\ifdim\prevdepth>\maxdepth \maxdepth
+ \else\ifdim\prevdepth>-1000pt\prevdepth
+ \else\ifinner 0pt
+ \else \pagedepth
+ \fi \fi \fi
+ \vskip -\skip@
+ \ifdim\skip@<\pfbreakskip
+ \advance\skip@ -1\skip@ \advance\skip@ 1\pfbreakskip
+ \fi
+ \penalty\pen@ltyabovepfbreak
+ \prevdepth\z@ % added
+ \vskip\skip@
+ \penalty\pen@ltybelowpfbreak
+ }
+ \@afterindenttrue
+ \@afterheading
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% While on the subject of breaks\ldots
+%
+% \begin{macro}{\noprelistbreak}
+% Putting this immediately before a list (e.g., \Lenv{itemize}) should
+% prevent a page break at that point.
+% \changes{v1.2}{2002/07/27}{Added \cs{noprelistbreak}}
+% \begin{macrocode}
+\newcommand*{\noprelistbreak}{\@nobreaktrue\nopagebreak}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Division head styles}
+%
+% The styles of the division heads should go together. As an aid the
+% class supplies some ready made collections.
+% \changes{v1.6180}{2008/01/30}{Added division head styles}
+%
+% \begin{macro}{\makeheadstyles}
+% \begin{macro}{\headstyles}
+% \begin{macro}{\@hds@def@ult}
+% \begin{macro}{\hds@default}
+% \cs{makeheadstyles}\marg{name}\marg{code} creates the \meta{name} collection
+% of division head styles, defined by \meta{code}. \cs{headstyles}\marg{name}
+% makes the \meta{name} division head styles the current styles.
+% \begin{macrocode}
+\newcommand{\makeheadstyles}[2]{%
+ \@namedef{hds@#1}{\@hds@def@ult #2}}
+\newcommand*{\headstyles}[1]{\@nameuse{hds@#1}}
+% \end{macrocode}
+% \cs{@hds@def@ult} is the default set of division head styles.
+% \begin{macrocode}
+\newcommand*{\@hds@def@ult}{%
+% Default \cs{book} style
+% \begin{macrocode}
+% book
+ \renewcommand*{\beforebookskip}{\null\vfil}%
+ \renewcommand*{\midbookskip}{\par\vskip 20pt}%
+ \renewcommand*{\afterbookskip}{\vfil\newpage}%
+ \renewcommand*{\booknamefont}{\normalfont\huge\bfseries}%
+ \renewcommand*{\booknumfont}{\normalfont\huge\bfseries}%
+ \renewcommand*{\booktitlefont}{\normalfont\Huge\bfseries}%
+ \renewcommand*{\printbookname}{\booknamefont \bookname}%
+ \renewcommand*{\booknamenum}{\space}%
+ \renewcommand*{\printbooknum}{\booknumfont \thebook}%
+ \renewcommand*{\printbooktitle}[1]{\booktitlefont{##1}}%
+% \end{macrocode}
+% Default \cs{part} style
+% \begin{macrocode}
+% part
+ \renewcommand*{\beforepartskip}{\null\vfil}%
+ \renewcommand*{\midpartskip}{\par\vskip 20pt}%
+ \renewcommand*{\afterpartskip}{\vfil\newpage}%
+ \renewcommand*{\partnamefont}{\normalfont\huge\bfseries}%
+ \renewcommand*{\partnumfont}{\normalfont\huge\bfseries}%
+ \renewcommand*{\parttitlefont}{\normalfont\Huge\bfseries}%
+ \renewcommand*{\printpartname}{\partnamefont \partname}%
+ \renewcommand*{\partnamenum}{\space}%
+ \renewcommand*{\printpartnum}{\partnumfont \thepart}%
+ \renewcommand*{\printparttitle}[1]{\parttitlefont{##1}}%
+% \end{macrocode}
+% Default \cs{chapter} style.
+% \begin{macrocode}
+ \@chs@def@ult% default chapterstyle
+% \end{macrocode}
+% Default \cs{section} style
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to default sec headstyle}
+% \begin{macrocode}
+% section
+ \setsechook{}
+ \setsecindent{\z@}%
+ \setbeforesecskip{-3.5ex \@plus -1ex \@minus -.2ex}%
+ \setaftersecskip{2.3ex \@plus .2ex}%
+%%% \setsecheadstyle{\Large\bfseries\raggedright}%
+ \setsecheadstyle{\Large\bfseries\memRTLraggedright}%
+% \end{macrocode}
+% Default \cs{subsection} style
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to default subsec headstyle}
+% \begin{macrocode}
+% subsection
+ \setsubsechook{}%
+ \setsubsecindent{\z@}%
+ \setbeforesubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}%
+ \setaftersubsecskip{1.5ex \@plus .2ex}%
+%%% \setsubsecheadstyle{\large\bfseries\raggedright}%
+ \setsubsecheadstyle{\large\bfseries\memRTLraggedright}%
+% \end{macrocode}
+% Default \cs{subsubsection} style
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to default subsubsec headstyle}
+% \begin{macrocode}
+% subsubsection
+ \setsubsubsechook{}%
+ \setsubsubsecindent{\z@}%
+ \setbeforesubsubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}%
+ \setaftersubsubsecskip{1.5ex \@plus .2ex}%
+%%% \setsubsubsecheadstyle{\normalsize\bfseries\raggedright}%
+ \setsubsubsecheadstyle{\normalsize\bfseries\memRTLraggedright}%
+% \end{macrocode}
+% Default \cs{paragraph} style
+% \begin{macrocode}
+% paragraph
+ \setparahook{}%
+ \setparaindent{\z@}%
+ \setbeforeparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalsize\bfseries}%
+% \end{macrocode}
+% Default \cs{paragraph} style
+% \begin{macrocode}
+% subparagraph
+ \setsubparahook{}%
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalsize\bfseries}}
+
+% \end{macrocode}
+% Set up and use the default head styles
+% \begin{macrocode}
+\makeheadstyles{default}{}
+\headstyles{default}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\addperiod}
+% Puts a period at the end of its argument.
+% \begin{macrocode}
+\newcommand*{\addperiod}[1]{#1.}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@memman}
+% Head styles used in the \textit{The Memoir Class} user guide. In this,
+% as the later ones, only changes from the defaults need specifying.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to the memman headstyles}
+% \begin{macrocode}
+\makeheadstyles{memman}{%
+% book changes
+ \renewcommand*{\booknamefont}{\normalfont\huge\sffamily}
+ \renewcommand*{\booknumfont}{\normalfont\huge\sffamily}
+ \renewcommand*{\booktitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\midbookskip}{\par\vskip 2\onelineskip}%
+% part changes
+ \renewcommand*{\partnamefont}{\normalfont\huge\sffamily}
+ \renewcommand*{\partnumfont}{\normalfont\huge\sffamily}
+ \renewcommand*{\parttitlefont}{\normalfont\Huge\sffamily}
+ \renewcommand*{\midpartskip}{\par\vskip 2\onelineskip}%
+% chapter
+ \chapterstyle{demo3}
+% section
+ \setbeforesecskip{-1.333\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{0.667\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsecheadstyle{\normalfont\scshape\raggedright}%
+ \setsecheadstyle{\normalfont\scshape\memRTLraggedright}%
+% subsection
+ \setbeforesubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsecheadstyle{\normalfont\bfseries\raggedright}%
+ \setsubsecheadstyle{\normalfont\bfseries\memRTLraggedright}%
+% subsubsection
+ \setbeforesubsubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsubsecheadstyle{\normalfont\normalsize\itshape\raggedright}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\itshape\memRTLraggedright}%
+% paragraph
+ \setbeforeparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\itshape\addperiod}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\itshape\addperiod}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@bringhurst}
+% Head styles based on Bringhurst's book
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to bringhurst headstyles}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeLowercase} $\to$ \cs{MakeTextLowercase}}
+% \begin{macrocode}
+\makeheadstyles{bringhurst}{%
+% chapter
+\chapterstyle{bringhurst}
+% section
+ \setbeforesecskip{-1\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{1\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsecheadstyle{\normalfont\raggedright\scshape\MakeLowercase}%
+ \setsecheadstyle{\normalfont\memRTLraggedright\scshape\MakeTextLowercase}%
+% subsection
+ \setbeforesubsecskip{-1.0\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{1.0\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsecheadstyle{\sethangfrom{\noindent ####1}\normalfont\itshape\raggedright}%
+ \setsubsecheadstyle{\sethangfrom{\noindent ####1}\normalfont\itshape\memRTLraggedright}%
+% subsubsection
+ \setbeforesubsubsecskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubsubsecskip{-1em}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\scshape\MakeTextLowercase}%
+% paragraph
+ \setbeforeparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\itshape\addperiod}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\itshape\addperiod}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@crosshead}
+% Head styles based on one of Bringhurst's suggestions.
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\makeheadstyles{crosshead}{%
+ \chapterstyle{crosshead}
+% section
+ \setbeforesecskip{-1.25\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{0.75\onelineskip \@plus 0.1\onelineskip}%
+ \setsecheadstyle{\normalfont\centering\MakeTextUppercase}%
+% subsection
+ \setbeforesubsecskip{-1.25\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{0.75\onelineskip \@plus 0.1\onelineskip}%
+ \setsubsecheadstyle{\normalfont\centering\bfseries}%
+% subsubsection
+ \setbeforesubsubsecskip{-.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsubsecskip{.333\onelineskip \@plus 0.1\onelineskip}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\centering\scshape\MakeTextLowercase}%
+% paragraph
+ \setbeforeparaskip{-.667\onelineskip
+ \@plus -02.5\onelineskip \@minus -0.25\onelineskip}%
+ \setafterparaskip{.333\onelineskip \@plus 0.1\onelineskip}%
+ \setparaheadstyle{\normalfont\normalsize\centering\itshape}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\scshape\MakeTextLowercase}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@dowding}
+% Head styles based on Dowding's \textit{Finer Points}.
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeLowercase} $\to$ \cs{MakeTextLowercase}}
+% \begin{macrocode}
+\makeheadstyles{dowding}{%
+% chapter
+ \chapterstyle{dowding}
+% section
+ \setbeforesecskip{-2\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{1\onelineskip \@plus 0.1\onelineskip}%
+ \setsecheadstyle{\normalfont\centering\MakeTextUppercase}%
+% subsection
+ \setbeforesubsecskip{-1.2\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{0.8\onelineskip \@plus 0.1\onelineskip}%
+ \setsubsecheadstyle{\normalfont\scshape\centering\MakeTextLowercase}%
+% subsubsection
+ \setbeforesubsubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\centering\itshape}%
+% paragraph
+ \setbeforeparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\itshape\addperiod}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\itshape\addperiod}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@komalike}
+% Head styles based on KOMA script classes (\texttt{scrbook.cls}).
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to komalike headstyles}
+% \begin{macrocode}
+\makeheadstyles{komalike}{%
+% part
+ \renewcommand*{\partnamefont}{\huge\sffamily\bfseries}%
+ \renewcommand*{\partnumfont}{\huge\sffamily\bfseries}%
+ \renewcommand*{\parttitlefont}{\huge\sffamily\bfseries}%
+% chapter
+ \chapterstyle{komalike}
+% section
+ \setbeforesecskip{-3.5ex \@plus -1ex \@minus -.2ex}%
+ \setaftersecskip{2.3ex \@plus .2ex}%
+%%% \setsecheadstyle{\normalfont\Large\sffamily\bfseries\raggedright}%
+ \setsecheadstyle{\normalfont\Large\sffamily\bfseries\memRTLraggedright}%
+% subsection
+ \setbeforesubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}%
+ \setaftersubsecskip{1.5ex \@plus .2ex}%
+%%% \setsubsecheadstyle{\normalfont\large\sffamily\bfseries\raggedright}%
+ \setsubsecheadstyle{\normalfont\large\sffamily\bfseries\memRTLraggedright}%
+% subsubsection
+ \setbeforesubsubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}%
+ \setaftersubsubsecskip{1.5ex \@plus .2ex}%
+%%% \setsubsubsecheadstyle{\normalfont\normalsize\sffamily\bfseries\raggedright}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\sffamily\bfseries\memRTLraggedright}%
+% paragraph
+ \setbeforeparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\sffamily\bfseries}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\sffamily\bfseries}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@ntglike}
+% Head styles based on the NTG classes (\texttt{boek.cls}).
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\makeheadstyles{ntglike}{%
+% part
+ \renewcommand*{\partnamefont}{\Large\bfseries\MakeTextUppercase}%
+ \renewcommand*{\partnumfont}{\Large\bfseries}%
+ \renewcommand*{\parttitlefont}{\Large\MakeTextUppercase}%
+% chapter
+ \chapterstyle{ntglike}
+% section
+ \setbeforesecskip{-2\onelineskip
+ \@plus -1\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{0.5\onelineskip}%
+ \setsecheadstyle{\normalfont\large\bfseries}%
+% subsection
+ \setbeforesubsecskip{-1\onelineskip
+ \@plus -.5\onelineskip \@minus -.25\onelineskip}%
+ \setaftersubsecskip{0.01\onelineskip}%
+ \setsubsecheadstyle{\normalfont\normalsize\bfseries}%
+% subsubsection
+ \setbeforesubsubsecskip{-1\onelineskip
+ \@plus -.5\onelineskip \@minus -.25\onelineskip}%
+ \setaftersubsubsecskip{0.01\onelineskip}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\slshape}%
+% paragraph
+ \setbeforeparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\slshape}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{3.25ex \@plus 1ex \@minus .2ex}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\slshape}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@tandh}
+% Head styles based on Thames \& Hudson \textit{Typography}.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to tandh headstyles}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\makeheadstyles{tandh}{%
+% chapter
+ \chapterstyle{tandh}
+% section
+ \setbeforesecskip{-2\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{1\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsecheadstyle{\normalfont\raggedright\MakeUppercase}%
+ \setsecheadstyle{\normalfont\memRTLraggedright\MakeTextUppercase}%
+% subsection
+ \setbeforesubsecskip{-1.2\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{0.8\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsecheadstyle{\normalfont\Large\itshape\raggedright}%
+ \setsubsecheadstyle{\normalfont\Large\itshape\memRTLraggedright}%
+% subsubsection
+ \setbeforesubsubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsubsecheadstyle{\normalfont\normalsize\bfseries\raggedright}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\bfseries\memRTLraggedright}%
+% paragraph
+ \setbeforeparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\itshape\addperiod}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\itshape\addperiod}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hds@wilsondob}
+% Head styles based on Adrian Wilson's \textit{The Design of Books}.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to wilsondob headstyles}
+% \changes{c3.6k}{2012/09/18}{\cs{MakeUppercase} $\to$ \cs{MakeTextUppercase}}
+% \begin{macrocode}
+\makeheadstyles{wilsondob}{%
+% chapter
+ \chapterstyle{wilsondob}
+% section
+ \setbeforesecskip{-1.333\onelineskip
+ \@plus -0.5\onelineskip \@minus -.5\onelineskip}%
+ \setaftersecskip{0.667\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsecheadstyle{\normalfont\raggedright\MakeUppercase}%
+ \setsecheadstyle{\normalfont\memRTLraggedright\MakeTextUppercase}%
+% subsection
+ \setbeforesubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsecheadstyle{\normalfont\Large\itshape\raggedright}%
+ \setsubsecheadstyle{\normalfont\Large\itshape\memRTLraggedright}%
+% subsubsection
+ \setbeforesubsubsecskip{-0.667\onelineskip
+ \@plus -0.25\onelineskip \@minus -0.25\onelineskip}%
+ \setaftersubsubsecskip{0.333\onelineskip \@plus 0.1\onelineskip}%
+%%% \setsubsubsecheadstyle{\normalfont\normalsize\raggedright\scshape\MakeLowercase}%
+ \setsubsubsecheadstyle{\normalfont\normalsize\memRTLraggedright\scshape\MakeTextLowercase}%
+% paragraph
+ \setbeforeparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setafterparaskip{-1em}%
+ \setparaheadstyle{\normalfont\normalsize\itshape\addperiod}%
+% subparagraph
+ \setsubparaindent{\parindent}%
+ \setbeforesubparaskip{1.0\onelineskip
+ \@plus 0.5\onelineskip \@minus 0.2\onelineskip}%
+ \setaftersubparaskip{-1em}%
+ \setsubparaheadstyle{\normalfont\normalsize\itshape\addperiod}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Appendices}
+%
+% \begin{macro}{\ifanappendix}
+% \begin{macro}{\anappendixtrue}
+% \begin{macro}{\anappendixfalse}
+% \begin{macro}{\appendix}
+% In the standard \Lpack{book} class the \cs{appendix} command does the
+% following:
+% \begin{itemize}
+% \item Resets the chapter and section counters to zero
+% \item Sets \cs{@chapapp} to \cs{appendixname}.
+% \item Redefines \cs{thechapter} to produce alphabetic appendix numbers.
+% \end{itemize}
+% \changes{v1.618}{2005/09/03}{Added \cs{ifanappendix} (mempatch v3.12)}
+% \begin{macrocode}
+\newif\ifanappendix
+ \anappendixfalse
+\newcommand{\appendix}{\par
+ \setcounter{chapter}{0}%
+ \setcounter{section}{0}%
+ \gdef\@chapapp{\appendixname}%
+ \gdef\thechapter{\@Alph\c@chapter}%
+ \anappendixtrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% This class provides additional appendixing capabilities.
+%
+%
+% \begin{macro}{\appendixpage}
+% \begin{macro}{\appendixpage*}
+% The command to typeset a page announcing the start of the appendices.
+% It is based on the \cs{part} definition. The normal version
+% makes an entry in the ToC but the starred version does not.
+% \changes{v0.33}{2001/08/31}{Changed implementation of \cs{appendixpage}}
+% \begin{macrocode}
+\newcommand{\appendixpage}{%
+ \@ifstar{\@sapppage}{\@apppage}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memapppageinfo}
+% \begin{macro}{\memapppagestarinfo}
+% \verb?\memapppageinfo{\appendixpagename}? \\
+% \verb?\memapppagestarinfo{\appendixpagename}? \\
+% \begin{macrocode}
+\newcommand{\memapppageinfo}[1]{}
+\newcommand{\memapppagestarinfo}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@apppage}
+% \cs{@apppage} typesets an appendix page and makes an entry in the ToC.
+% \changes{v3.6k}{2013/04/25}{Added \cs{mempre/postaddchaptertotochook}}
+% \begin{macrocode}
+\def\@apppage{%
+ \@setuppart
+ \mempreaddapppagetotochook
+ \addappheadtotoc
+ \mempostaddapppagetotochook
+ \partmark{\appendixpagename}%
+ \memapppageinfo{\appendixpagename}%
+ {\centering
+ \interlinepenalty \@M
+ \normalfont
+ \printparttitle{\appendixpagename}\par}%
+ \@endpart}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mempreaddapppagetotochook}
+% \begin{macro}{\mempostaddapppagetotochook}
+% Hooks before and after adding something to the ToC. Does nothing
+% by default.
+% \begin{macrocode}
+\newcommand\mempreaddapppagetotochook{}
+\newcommand\mempostaddapppagetotochook{}
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@sapppage}
+% \cs{@sapppage} typesets an appendix page and does not make an entry in the ToC.
+% \begin{macrocode}
+\def\@sapppage{%
+ \@setuppart
+ \partmark{\appendixpagename}%
+ \memapppagestarinfo{\appendixpagename}%
+ {\centering
+ \interlinepenalty \@M
+ \normalfont
+ \printparttitle{\appendixpagename}\par}%
+ \@endpart}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\addappheadtotoc}
+% This command adds an `appendices' line to the ToC. The style is the same
+% as used in \Lpack{tocbibind} for the `List of figures' line. That is,
+% as a Chapter heading.
+% \changes{v1.61803}{2008/01/30}{Added \cs{phantomsection} to \cs{addappheadtotoc}
+% (mempatch v4.9)}
+% \begin{macrocode}
+\def\addappheadtotoc{%
+ \phantomsection\addcontentsline{toc}{chapter}{\appendixtocname}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ppsavesec}
+% \begin{macro}{\@pprestoresec}
+% \begin{macro}{\@ppsaveapp}
+% \begin{macro}{\restoreapp}
+% For the \Lenv{appendices} environment we need to save and restore the
+% main document division number and the appendix number. The \cs{restoreapp}
+% command is the one for the user.
+% \begin{macrocode}
+\newcounter{@ppsavesec}
+\newcounter{@ppsaveapp}
+\setcounter{@ppsaveapp}{0}
+\newcommand{\@ppsavesec}{%
+ \setcounter{@ppsavesec}{\value{chapter}}}
+\newcommand{\@pprestoresec}{%
+ \setcounter{chapter}{\value{@ppsavesec}}}
+\newcommand{\@ppsaveapp}{%
+ \setcounter{@ppsaveapp}{\value{chapter}}}
+\newcommand{\restoreapp}{%
+ \setcounter{chapter}{\value{@ppsaveapp}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@resets@pp}
+% Resets the appropriate sectioning counters and names. This does almost
+% exactly
+% what the default \cs{appendix} command does, except that it saves and
+% restores sectional numbering. It saves the sectional number at the start
+% and restores the appendix number at the end.
+% \begin{macrocode}
+\newcommand{\@resets@pp}{%
+ \par
+ \@ppsavesec
+ \setcounter{section}{0}%
+ \setcounter{chapter}{0}%
+ \renewcommand\@chapapp{\appendixname}%
+ \renewcommand\thechapter{\@Alph\c@chapter}%
+ \restoreapp
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{appendices}
+% This is the heart of the package. Start it off by doing the resetting
+% done by the \cs{appendix} command but also save the main counters. At the
+% end of the environment save the appendix number and restore the main counters.
+% \begin{macrocode}
+\newenvironment{appendices}%
+ {\@resets@pp\anappendixtrue}%
+ {\@ppsaveapp\@pprestoresec\anappendixfalse}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\setthesection}
+% The user commands for specifying the numbering style for subappendices.
+% \begin{macrocode}
+\newcommand{\setthesection}{\thechapter.\Alph{section}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@resets@ppsub}
+% Similar to \cs{@resets@pp} except that it is for use within the
+% \Lenv{subappendices} environment; as such, it is a bit simpler.
+% \begin{macrocode}
+\newcommand{\@resets@ppsub}{
+ \par
+ \setcounter{section}{0}
+ \renewcommand{\thesection}{\setthesection}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifnamesubappendix}
+% \begin{macro}{\namesubappendixtrue}
+% \begin{macro}{\namesubappendixfalse}
+% \begin{macro}{\namedsubappendices}
+% \begin{macro}{\unnamedsubappendices}
+% Switch for adding an `appendix' name before subappendix numbers.
+% \changes{v1.0}{2001/11/13}{Added \cs{ifnamesubappendix}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{namedsubappendices} and
+% \cs{unnamedsubappendices}}
+% \begin{macrocode}
+\newif\ifnamesubappendix
+ \namesubappendixfalse
+\newcommand*{\namedsubappendices}{\namesubappendixtrue}
+\newcommand*{\unnamedsubappendices}{\namesubappendixfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{subappendices}
+% The environment for subappendices. Start it off by doing the resetting
+% of the \cs{section} command.
+% \changes{v1.0}{2001/11/13}{Modified subappendices environment}
+% \begin{macrocode}
+\newenvironment{subappendices}{%
+ \@resets@ppsub
+% \end{macrocode}
+% Change the definition of \cs{addappheadtotoc} to give a \texttt{section} entry.
+% \changes{v1.618}{2005/09/02}{Fixed bookmark for \cs{appendixpage} (mempatch v2.3)}
+% \begin{macrocode}
+ \def\addappheadtotoc{\phantomsection
+ \addcontentsline{toc}{section}{\appendixtocname}}
+% \end{macrocode}
+% To implement the naming we do cunning things with the
+% \cs{@seccntformat} command.
+% \begin{macrocode}
+ \ifnamesubappendix
+ \def\sectionname{\appendixname}
+ \def\@seccntformat##1{\@ifundefined{##1name}%
+ {}{\csname ##1name\endcsname\ }%
+ \csname the##1\endcsname\quad}
+ \fi
+% \end{macrocode}
+% That's it.
+% \begin{macrocode}
+ }{}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\@formatsecmark@pp}
+% Formats the page header for a redefined \cs{sectionmark}.
+% \begin{macrocode}
+% unused?
+% \newcommand{\@formatsecmark@pp}[1]{%
+% \MakeUppercase{\appendixname\space
+% \ifnum \c@secnumdepth >\z@
+% \thesection\quad
+% \fi
+% #1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Appendixpage-like pages}
+% \changes{v1.618}{2005/09/03}{Added \cs{newleadpage} and friends (mempatch v3.0)}
+%
+%
+% This capability was suggested to me by Lars Madsen on 2004/11/28.
+%
+% \begin{macro}{\leadpagetoclevel}
+% \begin{macro}{\newleadpage}
+% \begin{macro}{\renewleadpage}
+% \verb?\newleadpage[<page-style>]{<cmdname>}{<title>}? creates new macros
+% called \verb?\cmdname? and \verb?\cmdname*? that when called typeset a
+% page like an Appendixpage, with a title \verb?<title>? using
+% page style \verb?<page-style>? (default empty). The
+% plain version adds an entry to the ToC but the starred \verb?\cmdname*?
+% does not. \cs{renewleadpage} changes the definitions.
+%
+% The ToC entry style is set by \cs{leadpagetoclevel} (default chapter). To have a part-type entry: \\
+% \verb?\renewcommand*{\leadpagetoclevel}{part}?. \\
+% The \cs{partmark} command is used if you need to mark the title.
+% \begin{macrocode}
+\newcommand*{\leadpagetoclevel}{chapter}
+\newcommand*{\newleadpage}[3][empty]{%
+ \@namedef{#2}{\@ifstar{\dlfm@msapppage{#1}{#2}{#3}}%
+ {\dlfm@mapppage{#1}{#2}{#3}}}}
+\newcommand*{\renewleadpage}[3][empty]{%
+ \@namedef{#2}{\@ifstar{\dlfm@msapppage{#1}{#2}{#3}}%
+ {\dlfm@mapppage{#1}{#2}{#3}}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memleadpageinfo}
+% \begin{macro}{\memleadpagestarinfo}
+% \verb?\memleadpageinfo{pstyle}{name}{title}? \\
+% \verb?\memleadpagestarinfo{pstyle}{name}{title}? \\
+% \begin{macrocode}
+\newcommand{\memleadpageinfo}[3]{}
+\newcommand{\memleadpagestarinfo}[3]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dlfm@msapppage}
+% \begin{macro}{\dlfm@mapppage}
+% Implement the starred and regular versions of \verb?\(re)newleadpage?
+% \begin{macrocode}
+\newcommand*{\dlfm@msapppage}[3]{%
+ \@setuppart
+ \partmark{#3}%
+ \memleadpagestarinfo{#1}{#2}{#3}%
+ {\centering
+ \interlinepenalty \@M
+ \normalfont
+ \printparttitle{#3}\par
+ \thispagestyle{#1}}%
+ \dlfm@m@endpart{#1}}
+\newcommand*{\dlfm@mapppage}[3]{%
+ \@setuppart
+ \phantomsection
+ \addcontentsline{toc}{\leadpagetoclevel}{#3}%
+ \partmark{#3}%
+ \memleadpageinfo{#1}{#2}{#3}%
+ {\centering
+ \interlinepenalty \@M
+ \normalfont
+ \printparttitle{#3}\par
+ \thispagestyle{#1}}%
+ \dlfm@m@endpart{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dlfm@m@endpart}
+% Finishes off a part-like page.
+% \begin{macrocode}
+\newcommand*{\dlfm@m@endpart}[1]{%
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{#1}%
+ \newpage
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Paragraphs}
+%
+% Much of the code in this section is taken from my \textit{Glisterings}
+% columns~\cite{GLISTER07,GLISTER08}.
+% \changes{v1.6180339c}{2009/01/09}{Added several new paragraph types}
+%
+% \begin{macro}{\memorigdbs}
+% \begin{macro}{\memorigpar}
+% \begin{macro}{\atcentercr}
+% \cs{memorigdbs} saves the original definition of \verb?\\? and
+% \cs{memorigpar} saves the original \cs{par}. The macro \cs{atcentercr}
+% provides a user call to \cs{@centercr}. These could come in handy for
+% odd paragraph shapes.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{memorigdbs} and
+% \cs{memorigpar} \cs{atcentercr}}
+% \begin{macrocode}
+\let\memorigdbs\\
+\let\memorigpar\par
+\let\atcentercr\@centercr
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Normal (block) paragraphs}
+%
+%
+% \begin{macro}{\flushleftright}
+% Sets the paragraphing to \LaTeX's normal form.
+% \changes{v1.61803}{2008/01/30}{Used \cs{@flushglue} in \cs{flushleftright} and
+% \cs{centerlastline} (mempatch v4.7)}
+% \changes{v1.6180339c}{2009/01/09}{Extended \cs{flushleftright} to set all
+% the regular paragraphing controls}
+% \begin{macrocode}
+\newcommand*{\flushleftright}{%
+ \let\\\memorigdbs
+ \leftskip\z@skip
+ \rightskip\leftskip
+ \parfillskip\@flushglue
+ \everypar{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\linenottooshort}
+% This declaration \cs{linenottooshort}\oarg{length} specifies paragraphs
+% such that the last line is at least about \meta{length} long (the default
+% is 4em).
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{linenottooshort} paragraph}
+% \begin{macrocode}
+\newcommand*{\linenottooshort}[1][4em]{%
+ \@tempdima=\hsize
+ \advance\@tempdima -#1
+ \leftskip\z@skip
+ \rightskip\leftskip
+ \parfillskip=\@tempdima \@minus \@tempdima}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\russianpar}
+% Using \cs{russianpar} instead of \cs{par} to end a paragraph causes it
+% to be set according to Russian typography, where the last line of a
+% multiline paragraph must be either at least as
+% long as \cs{parindent} and have at least \cs{parindent} space at the
+% right, or it must be flushleft and flushright.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{russianpar} paragraph}
+% \begin{macrocode}
+\newcommand*{\russianpar}{\ifhmode\unskip
+ \strut\vadjust{}\nobreak
+ \discretionary{}%
+ {\hbox{\hskip2\parindent
+ \vrule depth 273sp width 0sp height \ht\strutbox}}%
+ {\hbox{\hskip\parindent}}%
+ \hskip-2\parindent \@minus 2\parindent
+ \hskip\hsize \@minus \hsize
+ \kern\z@ \parfillskip\z@
+ \memorigpar
+ \ifdim\prevdepth=273sp
+ \nobreak
+ \vskip-2\baselineskip
+ \hbox{\strut}%
+ \fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lastlineparrule}
+% \begin{macro}{\lastlinerulefill}
+% Using \cs{lastlinerulefill} instead of \cs{par} to end a paragraph
+% causes all short lines to be filled at the right by a rule
+% (\cs{lastlineparrule}) extending to the righthand margin.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{lastlineparrule} and
+% \cs{lastlinerulefill} paragraph}
+% \begin{macrocode}
+\newcommand*{\lastlineparrule}{%
+ \hrule height 0.5ex depth \@tempdimb\relax}
+\newcommand*{\lastlinerulefill}{%
+ \let\\\@centercr
+ \@tempdimb=-0.5ex \advance\@tempdimb 0.4pt
+ \unskip\nobreak\space
+ \leaders\lastlineparrule\hskip\@flushglue
+ \vadjust{}{\parfillskip\z@\memorigpar}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Centered lines}
+%
+% \begin{macro}{\centerlastline}
+% This declaration specifies normal paragraphs except that the last line of
+% each is centered.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{centerlastline}}
+% \begin{macrocode}
+\newcommand*{\centerlastline}{%
+%%% \leftskip\@flushglue
+ \memRTLleftskip\@flushglue
+%%% \rightskip=\z@ plus -1fil
+ \memRTLrightskip=\z@ plus -1fil
+ \parfillskip=\z@ plus 2fil}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\leftcenterright}
+% This declaration specifies paragraphs where the first line is flushleft
+% (raggedright), the
+% last is flushright (raggedleft) and all inbetween are centered.
+% Set \verb?\everypar{}? afterwards.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{leftcenterright} paragraph}
+% \begin{macrocode}
+\newcommand*{\leftcenterright}{%;
+ \let\\\break
+ \parindent\z@
+ \leftskip\@flushglue
+ \rightskip\leftskip
+ \parfillskip \z@ \@plus -1fil
+ \everypar={\hskip \z@ \@plus -1fil}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\centerfloat}
+% This is a version of \cs{centering} that can be used to center a wide
+% float with respect to the text block (normally the left of a wide float
+% is aligned with the left of the textblock). This can only be used for
+% centering something where LaTeX knows the width (e.g., a figure or a
+% table / tabular).
+%
+% This is a modified version of code by Robin Fairbairns
+% (CTT, \textit{Re: Centering a table: problem with rotating.sty, maybe
+% a strange document class?}, 3 Jan 2009).
+% \changes{v1.6180339c}{2009/01/11}{Added \cs{centerfloat}}
+% \begin{macrocode}
+\newcommand*{\centerfloat}{%
+ \parindent \z@
+ \leftskip \z@ \@plus 1fil \@minus \textwidth
+ \rightskip\leftskip
+ \parfillskip \z@skip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Ragged}
+%
+% The kernel code for raggedright (in \file{ltmiscen.dtx}):
+% \begin{verbatim}
+% \def\raggedright{%
+% \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+% \leftskip\z@skip
+% \parindent\z@}
+% %% \@flushglue = 0pt plus 1fil %% from ltalloc.dtx
+% %% \z@skip = 0pt plus 0pt minus 0pt %%
+% \end{verbatim}
+% produces very ragged text with no paragraph indent.
+%
+% \begin{macro}{\ragrparindent}
+% \begin{macro}{\raggedyright}
+% \cs{raggedyright}\oarg{plus} provides controllable ragged right paragraphs.
+% \changes{v1.4}{2003/12/10}{Added \cs{raggedyright}}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{raggedyright}}
+% \begin{macrocode}
+\newdimen\ragrparindent
+ \setlength{\ragrparindent}{\parindent}
+\newcommand{\raggedyright}[1][2em]{%
+ \let\\\@centercr\@rightskip \z@ \@plus #1\relax
+%%% \rightskip\@rightskip
+ \memRTLrightskip\@rightskip
+%%% \leftskip\z@skip
+ \memRTLleftskip\z@skip
+ \parindent\ragrparindent}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\justlastraggedleft}
+% This declaration specifies paragraphs where the lines are justified,
+% except for the last which is raggedleft (flushright)..
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{justlastraggedleft} paragraph}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{justlastraggedleft}}
+% \begin{macrocode}
+\newcommand*{\justlastraggedleft}{%
+%%% \leftskip\@flushglue
+ \memRTLleftskip\@flushglue
+%%% \rightskip-\leftskip
+ \memRTLrightskip-\memRTLleftskip
+ \parfillskip\leftskip
+ \parindent \z@}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\raggedrightthenleft}
+% This declaration specifies paragraphs where the first line is raggedright
+% (flushleft) and all the rest are raggedleft (flushright). Note that
+% this alters \cs{everpar}, which may need to be reset afterwards to
+% \verb?\everypar{}?.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{raggedrightthenleft} paragraph}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{raggedrightthenleft}}
+% \begin{macrocode}
+\newcommand*{\raggedrightthenleft}{%
+ \parindent \z@
+%%% \leftskip \z@ \@plus 1fill
+ \memRTLleftskip \z@ \@plus 1fill
+%%% \rightskip\@flushglue
+ \memRTLrightskip\@flushglue
+ \parfillskip \z@
+ \everypar{\hskip \z@ \@plus -1fill}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Hanging}
+%
+% \begin{macro}{\hangfrom}
+% This is a user-level
+% version of the kernel \cs{@hangfrom} macro (only the name is
+% changed) as defined in \file{ltsec.dtx}.
+%
+% \cs{hangfrom}\marg{text} puts \meta{text} in a box and makes a hanging
+% paragraph of the following material (a bit like a description item).
+% \changes{v1.4}{2003/11/22}{Added \cs{hangfrom} (from patch v1.9)}
+% \begin{macrocode}
+\newcommand{\hangfrom}[1]{%
+ \setbox\@tempboxa\hbox{{#1}}%
+ \hangindent \wd\@tempboxa\noindent\box\@tempboxa}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hangpara}
+% \cs{hangpara}\marg{indent}\marg{afternum} at the start of a
+% paragraph will make it hung. If \meta{indent} is positive the left
+% will be indented, otherwise the right. If \meta{afternum}, say N,
+% is positive the N+1 th lines onwards will be indented. For N negative,
+% the first N lines will be indented.
+% \begin{macrocode}
+\newcommand{\hangpara}[2]{\hangindent#1\hangafter#2\noindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{hangparas}
+% \verb?\begin{hangparas}?\marg{indent}\marg{afternum} hangs
+% a series of paragraphs.
+% \begin{macrocode}
+\newenvironment{hangparas}[2]{\setlength{\parindent}{\z@}
+ \everypar={\hangpara{#1}{#2}}}{\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \subsubsection{Miscellaneous}
+%
+% \begin{macro}{\leftspringright}
+% \cs{leftspringright}\marg{leftfrac}\marg{rightfrac}\marg{lefttext}\marg{righttext}
+% sets the \meta{lefttext} flushleft (raggedright) in a column \meta{leftfrac}
+% of the current textwidth and the \meta{righttext} flushright (raggedleft)
+% in a column \meta{rightfrac} of the textwidth, with space
+% (1.0 - \meta{leftfrac} - \meta{rightfrac})
+% of the textwidth between them. Both \meta{leftfrac} and \meta{rightfrac}
+% must be given as decimal numbers (e.g., \texttt{0.25} not \texttt{1/4}).
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{leftspringright} paragraph}
+% \begin{macrocode}
+\newcommand{\leftspringright}[4]{%
+ \@tempdimb=\hsize
+ \par\noindent\hbox to\@tempdimb{%
+ \vtop{\hsize=#1\@tempdimb \flushleft#3\par}\hss
+ \vtop{\hsize=#2\@tempdimb \flushright#4\par}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sourceatright}
+% Putting \cs{sourceatright}\oarg{length}\marg{text} at the end of a
+% paragraph will set \meta{text} flushright on the same line provided the line
+% is short enough to allow \meta{length} (default 2em) between the end of the
+% line and \meta{text}. If there is not enough space then \meta{text} is
+% set flushright on the following line.
+% \changes{v1.6180339c}{2009/01/09}{Added \cs{sourceatright} paragraph}
+% \begin{macrocode}
+\newcommand*{\sourceatright}[2][2em]{{%
+ \unskip\nobreak\hfil\penalty50
+ \hskip#1\hbox{}\nobreak\hfil{#2}
+ \parfillskip\z@\finalhyphendemerits=0\par}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Lists}
+%
+% \subsection{General List Parameters}
+%
+% The following commands are used to set the default values for the list
+% environment's parameters. See the \LaTeX{} manual for an explanation
+% of the meanings of the parameters. Defaults for the list
+% environment are set as follows. First, \cs{rightmargin},
+% \cs{listparindent} and \cs{itemindent} are set to 0pt. Then, for a Kth
+% level list, the command \cs{@listK} is called, where `K' denotes `i',
+% '`i', ... , `vi'. (I.e., \cs{@listiii} is called for a third-level
+% list.) By convention, \cs{@listK} should set \cs{leftmargin} to
+% \cs{leftmarginK}.
+%
+%
+% \begin{macro}{\leftmargin}
+% \begin{macro}{\leftmargini}
+% \begin{macro}{\leftmarginii}
+% \begin{macro}{\leftmarginiii}
+% \begin{macro}{\leftmarginiv}
+% \begin{macro}{\leftmarginv}
+% \begin{macro}{\leftmarginvi}
+% For efficiency, level-one list's values are defined at top level, and
+% \cs{@listi} is defined to set only \cs{leftmargin}.
+%
+% In two column mode the margins should be smaller than in one column typesetting.
+% \begin{macrocode}
+\if@twocolumn
+ \setlength{\leftmargini}{2em}
+\else
+ \setlength{\leftmargini}{2.5em}
+\fi
+% \end{macrocode}
+% The value of \cs{leftmargin} has to be set at this outer level.
+% \begin{macrocode}
+\leftmargin \leftmargini
+% \end{macrocode}
+% Lower level list margins are calculated so that they are indented
+% more than the label in an outer list.
+% \begin{macrocode}
+\setlength{\leftmarginii}{2.2em}
+\setlength{\leftmarginiii}{1.87em}
+\setlength{\leftmarginiv}{1.7em}
+\if@twocolumn
+ \setlength{\leftmarginv}{.5em}
+ \setlength{\leftmarginvi}{.5em}
+\else
+ \setlength{\leftmarginv}{1em}
+ \setlength{\leftmarginvi}{1em}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\itemindent}
+% Here we set the \cs{itemindent} which is the extra indentation before
+% a label.
+% \begin{macrocode}
+\setlength{\itemindent}{\z@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\labelsep}
+% \begin{macro}{\labelwidth}
+% \cs{labelsep} is the distance between the label and the text of an
+% item; \cs{labelwidth} is the width of the label.
+% \begin{macrocode}
+\setlength{\labelsep}{0.5em}
+\setlength{\labelwidth}{\leftmargini}
+ \addtolength{\labelwidth}{-\labelsep}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@beginparpenalty}
+% \begin{macro}{\@endparpenalty}
+% These penalties are inserted before and after a list or paragraph
+% environment. They are set to a bonus value to encourage page
+% breaking at these points.
+% \begin{macro}{\@itempenalty}
+% This penalty is inserted between list items.
+% \begin{macrocode}
+\@beginparpenalty -\@lowpenalty
+\@endparpenalty -\@lowpenalty
+\@itempenalty -\@lowpenalty
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{macro}{\everylistparindent}
+% \begin{macro}{\list}
+% The kernel sets \cs{listparindent} to zero within a \cs{list}, where it
+% can be overridden in \cs{list}'s second argument. Here it is set to
+% \cs{everyparlistindent} by default, which in turn is 0pt.
+% \begin{macrocode}
+\newdimen\everylistparindent
+ \everylistparindent \z@
+\renewcommand*{\list}[2]{%
+ \ifnum \@listdepth >5\relax
+ \@toodeep
+ \else
+ \global\advance\@listdepth\@ne
+ \fi
+ \rightmargin\z@
+ \listparindent\everylistparindent
+ \itemindent\z@
+ \csname @list\romannumeral\the\@listdepth\endcsname
+ \def\@itemlabel{#1}%
+ \let\makelabel\@mklab
+ \@nmbrlistfalse
+ #2\relax
+ \@trivlist
+ \parskip\parsep
+ \parindent\listparindent
+ \advance\linewidth -\rightmargin
+ \advance\linewidth -\leftmargin
+ \advance\@totalleftmargin \leftmargin
+ \parshape \@ne \@totalleftmargin \linewidth
+ \ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\parsepi}
+% \begin{macro}{\topsepi}
+% \begin{macro}{\itemsepi}
+% \begin{macro}{\parsepii}
+% \begin{macro}{\topsepii}
+% \begin{macro}{\topsepiii}
+% Lists may be nested and the exact layout depends on the level
+% of nesting. These lengths are used to control the nesting-level
+% aspects.
+% \begin{macrocode}
+\newlength{\parsepi}
+\newlength{\topsepi}
+\newlength{\itemsepi}
+\newlength{\parsepii}
+\newlength{\topsepii}
+\newlength{\topsepiii}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\itemsepii}
+% \begin{macro}{\itemsepiii}
+% \begin{macro}{\partopsepii}
+% \begin{macro}{\partopsepii}
+% We need some new lengths for lists to cater for non-zero \cs{parskip}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{itemsepii}, \cs{itemsepiii} and
+% \cs{partopsepii} (mempatch v4.6)}
+% \begin{macrocode}
+\newlength{\itemsepii}
+\newlength{\itemsepiii}
+\newlength{\partopsepii}
+\newlength{\partopsepiii}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setnzplist}
+% Common code for non-zero \cs{parskip} in lists.
+% \begin{macrocode}
+\newcommand*{\setnzplist}{%
+ \partopsep \p@ \@plus\z@ \@minus\p@
+ \topsepi\z@
+ \parsepi\parskip
+ \itemsepi\z@
+ \topsepii\z@
+ \parsepii\parskip
+ \itemsepii\z@
+ \topsepiii\z@
+%% \parsepiii\parskip
+ \itemsepiii\z@}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\defaultlists}
+% The standard \LaTeX\ classes have list parameters that give some
+% separation between lists and \cs{item}s in lists. This macro sets
+% those values. This is a simplification of memoir's original, and will
+% apply to any font size.
+% \changes{v1.61803}{2008/01/30}{Complete replacement of \cs{defaultlists}
+% (mempatch 4.5)}
+% \begin{macrocode}
+\newcommand*{\defaultlists}{%
+ \setlength{\partopsep}{0.2\onelineskip \@plus 0.1\onelineskip
+ \@minus 0.1\onelineskip}%
+ \parsepi = 0.3333\onelineskip \@plus 0.1667\onelineskip \@minus \p@
+ \itemsepi = \parsepi
+ \topsepi = 0.6667\onelineskip \@plus 0.3333\onelineskip
+ \@minus 0.2\onelineskip
+ \parsepii = 0.1667\onelineskip \@plus \p@ \@minus \p@
+ \topsepii = \parsepi
+ \topsepiii = \parsepii
+ \everylistparindent \listparindent
+% \end{macrocode}
+% Additional code to cater for non-zero \cs{parskip}s.
+% \changes{v1.61803}{2008/01/30}{Modified \cs{defaultlists} for
+% non-zero \cs{parskip} (memptach v4.6)}
+% \begin{macrocode}
+ \itemsepii\parsepii
+ \itemsepiii\topsepiii
+ \partopsepiii \p@ \@plus\z@ \@minus\p@
+ \ifm@mnzpskip
+ \setnzplist
+ \fi}
+\defaultlists
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\firmlists}
+% \begin{macro}{\firmlists*}
+% \begin{macro}{\m@msfirmlists}
+% \begin{macro}{\m@mfirmlists}
+% These give approximately half the vertical spacing of the default lists,
+% with all spaces equal. The starred version allows slightly less space
+% before and after the list when it is preceded by a blank line.
+% \changes{v1.61803}{2008/01/30}{Added \cs{firmlists}, etc. (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\firmlists}{%
+ \@ifstar{\m@msfirmlists}{\m@mfirmlists}}
+
+\newcommand*{\m@msfirmlists}{
+ \setlength{\partopsep}{\z@ \@plus \p@ \@minus \p@}%
+ \parsepi = 0.1667\onelineskip \@plus 0.0833\onelineskip \@minus \p@
+ \itemsepi = \parsepi
+ \topsepi = \parsepi
+ \parsepii = 0.0833\onelineskip \@plus \p@ \@minus \p@
+ \topsepii = \parsepi
+ \topsepiii = \parsepii
+ \everylistparindent\listparindent}
+
+\newcommand*{\m@mfirmlists}{
+ \setlength{\partopsep}{0.1\onelineskip \@plus 0.05\onelineskip
+ \@minus 0.05\onelineskip}%
+ \parsepi = 0.1667\onelineskip \@plus 0.0833\onelineskip \@minus \p@
+ \itemsepi = \parsepi
+ \topsepi = \parsepi
+ \parsepii = 0.0833\onelineskip \@plus \p@ \@minus \p@
+ \topsepii = \parsepi
+ \topsepiii = \parsepii
+ \everylistparindent\listparindent}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tightlists}
+% \begin{macro}{\tightlists*}
+% \begin{macro}{\m@mstightlists}
+% \begin{macro}{\m@mtightlists}
+% This macro sets the parameters for lists that have less open vertical
+% space in them. I think that these look neater than the defaults.
+% Effectively, no additional vertical space is added.
+% The starred version allows slightly no extra space
+% before and after the list when it is preceded by a blank line,
+% whereas the unstarred version puts half a \cs{onelineskip}
+% before \emph{and} after.
+% \changes{v1.61803}{2008/01/30}{Revised \cs{tightlists}, etc. (mempatch v4.5)}
+% \changes{v1.61803}{2008/01/30}{Revised \cs{tightlists} for non-zero
+% \cs{parskip}(mempatch v4.6)}
+% \begin{macrocode}
+\newcommand*{\tightlists}{%
+ \@ifstar{\m@mstightlists}{\m@mtightlists}}
+
+\newcommand*{\m@mstightlists}{%
+ \setlength{\partopsep}{\z@ \@plus \p@ \@minus \p@}%
+ \parsepi = \z@ \@plus \p@ \@minus \p@
+ \itemsepi = \parsepi
+ \topsepi = \z@ \@plus \p@ \@minus \p@
+ \parsepii = \z@ \@plus \p@ \@minus \p@
+ \topsepii = \parsepi
+ \topsepiii = \parsepii
+ \everylistparindent\parindent
+ \ifm@mnzpskip
+ \setnzplist
+ \partopsepiii\partopsep
+ \fi}
+
+\newcommand*{\m@mtightlists}{%
+ \setlength{\partopsep}{0.5\onelineskip \@plus \p@ \@minus \p@}%
+ \parsepi = \z@ \@plus \p@ \@minus \p@
+ \itemsepi = \parsepi
+ \topsepi = \z@ \@plus \p@ \@minus \p@
+ \parsepii = \z@ \@plus \p@ \@minus \p@
+ \topsepii = \parsepi
+ \topsepiii = \parsepii
+ \everylistparindent\parindent
+ \ifm@mnzpskip
+ \setnzplist
+ \partopsepiii\partopsep
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\firmlist}
+% \begin{macro}{\tightlist}
+% These two macros can be used at the start of a list environment to
+% reduce the vertical gaps. \cs{tightlist} removes all interior spaces
+% while \cs{firmlist} only removes some.
+% \changes{v0.3}{2001/07/09}{Added \cs{firmlist} and reimplemented the
+% original \cs{tightlist}}
+% \begin{macrocode}
+\newcommand{\firmlist}{%
+ \setlength{\itemsep}{0.5\itemsep}\setlength{\parskip}{0.5\parskip}}
+\newcommand{\tightlist}{%
+ \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% The space before and after a \Lenv{trivlist} environment is controlled
+% by the \cs{topsep} and \cs{partopsep} skips. There are several environments,
+% such as \Lenv{center}, that are defined as a \Lenv{trivlist}.
+%
+% \begin{macro}{\m@msavetopsep}
+% \begin{macro}{\m@msavepartopsep}
+% \begin{macro}{\savetrivseps}
+% \begin{macro}{\restoretrivseps}
+% Two skips to store the \cs{topsep} and \cs{partopsep} values and a means
+% of setting them and restoring them.
+% \changes{v1.6}{2004/01/28}{Added methods for adjusting the space around
+% a trivlist}
+% \begin{macrocode}
+\newskip\m@msavetopsep
+\newskip\m@msavepartopsep
+\newcommand*{\savetrivseps}{%
+ \m@msavetopsep\topsep
+ \m@msavepartopsep\partopsep}
+\newcommand*{\restoretrivseps}{%
+ \topsep\m@msavetopsep
+ \partopsep\m@msavepartopsep}
+% \end{macrocode}
+% Save the initial \cs{topsep} and \cs{partopsep} values.
+% \begin{macrocode}
+\savetrivseps
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\zerotrivseps}
+% A macro to zero \cs{topsep} and \cs{partopsep}.
+% \begin{macrocode}
+\newcommand*{\zerotrivseps}{%
+ \topsep\z@
+ \partopsep\z@}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@listI}
+% \begin{macro}{\@listi}
+% \cs{@listI} defines top level and \cs{@listi} values of
+% \cs{leftmargin}, \cs{parsep}, \cs{topsep}, and \cs{itemsep}
+%
+% \begin{macrocode}
+\def\@listi{\leftmargin\leftmargini
+ \parsep\parsepi
+ \topsep\topsepi
+ \itemsep\itemsepi}
+\let\@listI\@listi
+% \end{macrocode}
+% We should initialise these parameters to the standard defaults
+% \begin{macrocode}
+\defaultlists
+\@listi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@listii}
+% \begin{macro}{\@listiii}
+% \begin{macro}{\@listiv}
+% \begin{macro}{\@listv}
+% \begin{macro}{\@listvi}
+% Here are the same macros for the lower level lists.
+% \begin{macrocode}
+\def\@listii{\leftmargin\leftmarginii
+ \labelwidth\leftmarginii
+ \advance\labelwidth-\labelsep
+ \topsep\topsepii
+ \parsep\parsepii
+% \end{macrocode}
+% \changes{v3.7g}{2016/11/22}{Typo: \cs{itemsep} should here point at
+% \cs{itemsepii}, reported by Thomas Koeppe, private email}
+% \begin{macrocode}
+ \itemsep\itemsepii}
+
+\def\@listiii{\leftmargin\leftmarginiii
+ \labelwidth\leftmarginiii
+ \advance\labelwidth-\labelsep
+ \topsep\topsepiii
+ \parsep\z@
+%%% \itemsep\topsep
+%%% \partopsep \p@ \@plus\z@ \@minus\p@
+ \itemsep\itemsepiii
+ \partopsep\partopsepiii}
+
+\def\@listiv{\leftmargin\leftmarginiv
+ \labelwidth\leftmarginiv
+ \advance\labelwidth-\labelsep}
+
+\def\@listv{\leftmargin\leftmarginv
+ \labelwidth\leftmarginv
+ \advance\labelwidth-\labelsep}
+
+\def\@listvi{\leftmargin\leftmarginvi
+ \labelwidth\leftmarginvi
+ \advance\labelwidth-\labelsep}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Enumerate}
+%
+%
+% The enumerate environment uses four counters: \Lcount{enumi},
+% \Lcount{enumii}, \Lcount{enumiii} and \Lcount{enumiv}, where
+% \Lcount{enumN} controls the numbering of the Nth level
+% enumeration.
+%
+% \begin{macro}{\theenumi}
+% \begin{macro}{\theenumii}
+% \begin{macro}{\theenumiii}
+% \begin{macro}{\theenumiv}
+% The counters are already defined in \file{latex.dtx}, but their
+% representation is changed here.
+%
+% \begin{macrocode}
+\renewcommand{\theenumi}{\@arabic\c@enumi}
+\renewcommand{\theenumii}{\@alph\c@enumii}
+\renewcommand{\theenumiii}{\@roman\c@enumiii}
+\renewcommand{\theenumiv}{\@Alph\c@enumiv}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\labelenumi}
+% \begin{macro}{\labelenumii}
+% \begin{macro}{\labelenumiii}
+% \begin{macro}{\labelenumiv}
+% The label for each item is generated by the commands\\
+% \cs{labelenumi} \ldots\ \cs{labelenumiv}.
+% \begin{macrocode}
+\newcommand{\labelenumi}{\theenumi.}
+\newcommand{\labelenumii}{\theenumii)}
+\newcommand{\labelenumiii}{\theenumiii.}
+\newcommand{\labelenumiv}{\theenumiv.}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\p@enumii}
+% \begin{macro}{\p@enumiii}
+% \begin{macro}{\p@enumiv}
+% The expansion of \verb?\p@enumN\theenumN? defines the output of a
+% \cs{ref} command when referencing an item of the Nth level of an
+% enumerated list.
+% \begin{macrocode}
+\renewcommand{\p@enumii}{\theenumi}
+\renewcommand{\p@enumiii}{\theenumi(\theenumii)}
+\renewcommand{\p@enumiv}{\p@enumiii\theenumiii}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% The following is taken directly from David Carlisle's
+% \Lpack{enumerate} package.
+%
+% START OF DAVID CARLISLE'S CODE AND COMMENTARY
+%
+% This package gives the enumerate environment an optional argument
+% which determines the style in which the counter is printed.
+%
+% An occurence of one of the tokens \verb?A a I i? or \verb?1? produces the value
+% of the counter printed with (respectively) \verb?\Alph \alph \Roman \roman?
+% or \cs{arabic}.
+%
+% These letters may be surrounded by any strings involving any other
+% \TeX\ expressions, however the tokens \verb?A a I i 1? must be inside a
+% \verb?{ }? group if they are not to be taken as special.
+%
+%
+% \begin{macro}{\@enlab}
+% Internal token register used to build up the label command from the
+% optional argument.
+% \begin{macrocode}
+\newtoks\@enLab
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enQmark}
+% This just expands to a `?'. \cs{ref} will produce this, if no counter
+% is printed.
+% \begin{macrocode}
+\def\@enQmark{?}
+% \end{macrocode}
+% \end{macro}
+%
+% The next four macros build up the command that will print the item
+% label. They each gobble one token or group from the optional argument,
+% and add corresponding tokens to the register \cs{@enLab}. They each end
+% with a call to \cs{@enloop}, which starts the processing of the next
+% token.
+% \begin{macro}{\@enLabel}
+% Add the counter to the label. \verb?#2? will be one of the `special'
+% tokens \verb?A a I i 1?, and is thrown away. \verb?#1? will be a command
+% like \cs{Roman}.
+% \begin{macrocode}
+\def\@enLabel#1#2{%
+ \edef\@enThe{\noexpand#1{\@enumctr}}%
+ \@enLab\expandafter{\the\@enLab\csname the\@enumctr\endcsname}%
+ \@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enSpace}
+% \begin{macro}{\@enSp@ce}
+% Add a space to the label. The tricky bit is to gobble the space token,
+% as you can not do this with a macro argument.
+% \begin{macrocode}
+\def\@enSpace{\afterassignment\@enSp@ce\let\@memtempa= }
+\def\@enSp@ce{\@enLab\expandafter{\the\@enLab\space}\@enloop}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@enGroup}
+% Add a \verb?{ }? group to the label.
+% \begin{macrocode}
+\def\@enGroup#1{\@enLab\expandafter{\the\@enLab{#1}}\@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enOther}
+% Add anything else to the label
+% \begin{macrocode}
+\def\@enOther#1{\@enLab\expandafter{\the\@enLab#1}\@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enloop}
+% \begin{macro}{\@enloop@}
+% The body of the main loop.
+% Eating tokens this way instead of using \cs{@tfor} lets you see
+% spaces and \textbf{all} braces. \cs{@tfor} would treat \verb?a? and
+% \verb?{a}? as special, but not \verb?{{a}}?.
+% \begin{macrocode}
+\def\@enloop{\futurelet\@entemp\@enloop@}
+% \end{macrocode}
+% \begin{macrocode}
+\def\@enloop@{%
+ \ifx A\@entemp \def\@memtempa{\@enLabel\Alph }\else
+ \ifx a\@entemp \def\@memtempa{\@enLabel\alph }\else
+ \ifx i\@entemp \def\@memtempa{\@enLabel\roman }\else
+ \ifx I\@entemp \def\@memtempa{\@enLabel\Roman }\else
+ \ifx 1\@entemp \def\@memtempa{\@enLabel\arabic}\else
+ \ifx \@sptoken\@entemp \let\@memtempa\@enSpace \else
+ \ifx \bgroup\@entemp \let\@memtempa\@enGroup \else
+ \ifx \@enum@\@entemp \let\@memtempa\@gobble \else
+ \let\@memtempa\@enOther
+% \end{macrocode}
+% Hook for possible extensions
+% \begin{macrocode}
+ \@enhook
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi\fi\fi\fi\fi\fi\fi\fi
+% \end{macrocode}
+% \end{macro}
+% Process the current token, then look at the next.
+% \begin{macrocode}
+ \@memtempa}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enhook}
+% Hook for possible extensions.
+% Some packages may want to extend the number of special characters
+% that are associated with counter representations. This feature
+% was requested to enable Russian alphabetic counting, but here
+% I give an example of a footnote symbol counter, triggered by \verb?*?.
+%
+% To enable a new counter type based on a letter, you just need
+% to add a new \cs{ifx} clause by analogy with the code above.
+% So for example to make \verb?*? trigger footnote symbol counting.
+% a package should do the following.
+%
+% Initialise the hook, in case the package is loaded before
+% \textsf{enumerate}.
+%\begin{verbatim}
+% \providecommand\@enhook{}
+%\end{verbatim}
+%
+% Add to the hook a new \cs{ifx} clause that associates \verb?*? with the
+% \cs{fnsymbol} counter command.
+%\begin{verbatim}
+% \g@addto@macro\@enhook{%
+% \ifx *\@entemp
+% \def\@memtempa{\@enLabel\fnsymbol}%
+% \fi}
+%\end{verbatim}
+% This code sequence should work whether it is loaded before or after
+% this enumerate package. Any number of new counter types may be added
+% in this way.
+%
+% At this point we just need initialise the hook, taking care not
+% to over write any definitions another package may already have added.
+% (PRW: as this is now in a class, it can be defined instead of
+% \cs{provide}d).
+% \begin{macrocode}
+%% \providecommand\@enhook{}
+ \newcommand\@enhook{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\enumerate}
+% The new \Lenv{enumerate} environment. This is the first half of the
+% original enumerate environment. If there is an optional argument, call
+% \cs{@@enum@} to define the label commands, otherwise call
+% \cs{@enum@} which is the second half of the original definition.
+% \begin{macrocode}
+\def\enumerate{%
+ \ifnum \@enumdepth >3 \@toodeep\else
+ \advance\@enumdepth \@ne
+ \edef\@enumctr{enum\romannumeral\the\@enumdepth}\fi
+ \@ifnextchar[{\@@enum@}{\@enum@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@enum@}
+% Handle the optional argument..
+% \begin{macrocode}
+\def\@@enum@[#1]{%
+% \end{macrocode}
+% Initialise the loop which will break apart the optional argument.
+% The command to print the label is built up in \cs{@enlab}.
+% \cs{@enThe} will be used to define \cs{theenum}\,$n$.
+% \begin{macrocode}
+ \@enLab{}\let\@enThe\@enQmark
+% \end{macrocode}
+% The \cs{@enum@} below is never expanded, it is used to detect the end
+% of the token list.
+% \begin{macrocode}
+ \@enloop#1\@enum@
+% \end{macrocode}
+% Issue a warning if we did not find one of the `special' tokens.
+% \begin{macrocode}
+ \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
+ ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
+% \end{macrocode}
+% Define \cs{labelenum}$\,n$ and \cs{theenum}$\,n$.
+% \begin{macrocode}
+ \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
+ \expandafter\let\csname the\@enumctr\endcsname\@enThe
+% \end{macrocode}
+% Set the counter to 7 so that we get the width of `vii' if roman
+% numbering is in force then set \cs{leftmargin}$\,n$. to the width of the
+% label plus \cs{labelsep}.
+% \begin{macrocode}
+ \csname c@\@enumctr\endcsname7
+ \expandafter\settowidth
+ \csname leftmargin\romannumeral\@enumdepth\endcsname
+ {\the\@enLab\hspace{\labelsep}}%
+% \end{macrocode}
+% Finally call \cs{@enum@} which is the second half of the original
+% definition.
+% \begin{macrocode}
+ \@enum@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enum@}
+% All the list parameters have now been defined, so call \cs{list}. This
+% is taken straight from the original definition of \cs{enumerate}.
+% \begin{macrocode}
+\def\@enum@{\list{\csname label\@enumctr\endcsname}%
+ {\usecounter{\@enumctr}\def\makelabel##1{\hss\llap{##1}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% END OF DAVID CARLISLE'S CODE AND COMMENTARY
+%
+%
+%
+% \subsection{Itemize}
+%
+%
+% \begin{macro}{\labelitemi}
+% \begin{macro}{\labelitemii}
+% \begin{macro}{\labelitemiii}
+% \begin{macro}{\labelitemiii}
+% Itemization is controlled by the commands: \cs{labelitemi},
+% \cs{labelitemii}, etc., which define
+% the labels of the various itemization levels: the symbols used are:
+% bullet (\textbullet), bold en-dash (\textbf{\textendash}),
+% centered asterisk (\textasteriskcentered), and centered dot
+% (\textperiodcentered).
+%
+% \begin{macrocode}
+\newcommand{\labelitemi}{\textbullet}
+\newcommand{\labelitemii}{\normalfont\bfseries \textendash}
+\newcommand{\labelitemiii}{\textasteriskcentered}
+\newcommand{\labelitemiv}{\textperiodcentered}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% It seems like a reasonable idea to give the \Lenv{itemize} environment
+% an optional argument to match \Lenv{enumerate}. Fortunately this seems
+% to be much simpler and I might even be able to work it out for myself.
+%
+% \begin{environment}{itemize}
+% This is a hack at the kernel code for \Lenv{itemize}.
+% \begin{macrocode}
+\renewcommand{\itemize}[1][\@empty]{%
+ \ifnum \@itemdepth >\thr@@\@toodeep\else
+ \advance\@itemdepth\@ne
+ \ifx \@empty #1\else % optional argument
+ \@namedef{labelitem\romannumeral\the\@itemdepth}{#1}%
+ \fi
+ \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
+ \expandafter
+ \list
+ \csname\@itemitem\endcsname
+ {\def\makelabel##1{\hss\llap{##1}}}%
+ \fi}
+\let\enditemize =\endlist
+
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Description}
+%
+% The class defines two description environment, the standard one and a `block'
+% one, and also two semi-configurable versions.
+%
+% \changes{v1.2}{2002/07/27}{Now two `description' environments.}
+%
+% \begin{environment}{description}
+% The description environment is defined here -- while the default itemize
+% and enumerate environments are defined in \file{latex.dtx}.
+%
+% \changes{v1.2}{2002/07/27}{The \texttt{description} environment now matches
+% the standard layout.}
+% \begin{macrocode}
+\newenvironment{description}%
+ {\list{}{\labelwidth\z@ \itemindent-\leftmargin
+ \let\makelabel\descriptionlabel}}%
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\descriptionlabel}
+% To change the formatting of the label, you must redefine
+% \cs{descriptionlabel}.
+%
+% \begin{macrocode}
+\newcommand*{\descriptionlabel}[1]{\hspace\labelsep
+ \normalfont\bfseries #1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{blockdescription}
+% The `block' description environment.
+%
+% \changes{v1.2}{2002/07/27}{Renamed original \texttt{description} environment
+% to \texttt{blockdescription}.}
+% \begin{macrocode}
+\newenvironment{blockdescription}%
+ {\list{}{\labelwidth\z@ \itemindent 0.5em \labelsep 0.5em
+ \let\makelabel\blockdescriptionlabel}}%
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\blockdescriptionlabel}
+% In order to change the formatting of the label, you must redefine
+% the macro \cs{blockdescriptionlabel}.
+%
+% \begin{macrocode}
+\newcommand*{\blockdescriptionlabel}[1]{%%% \hspace\labelsep
+ \normalfont\bfseries #1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{labelled}
+% This is a version of the description environment which takes the
+% name, without the backslash, of some \cs{labelcode} as its argument.
+% For example:
+% \begin{verbatim}
+% \newcommand*{\sflabel}[1]{\hspace\labelsep \normalfont\sffamily #1}
+% \begin{labelled}{sflabel}
+% \item[label] using a sans font for the labels
+% \end{verbatim}
+% \changes{v1.6180339f}{2009/04/25}{Added labelled environment}
+% \begin{macrocode}
+\newenvironment{labelled}[1]%
+ {\list{}{\labelwidth\z@ \itemindent-\leftmargin
+ \def\m@malabel{\@nameuse{#1}} \let\makelabel\m@malabel}}%
+ {\endlist}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{flexlabelled}
+% \verb?\begin{flexlabelled}{labelcode}{labelwidth}{labelsep}{itemindent}{leftmargin}{rightmargin}?
+% lets you specify some of the parameters for a description-like list.
+% The first argument is as for the labelled environment. The others are all
+% lengths for the various parameters; a \verb?*? instead of a length means
+% that that argument is to be ignored.
+% \changes{v1.6180339f}{2009/04/25}{Added flexlabelled environment}
+% \begin{macrocode}
+\newenvironment{flexlabelled}[6]%
+ {\list{}{\nametest{#2}{*}%
+ \ifsamename\else \labelwidth #2 \fi
+ \nametest{#3}{*}%
+ \ifsamename\else \labelsep #3 \fi
+ \nametest{#4}{*}%
+ \ifsamename\else \itemindent #4 \fi
+ \nametest{#5}{*}%
+ \ifsamename\else \leftmargin #5 \fi
+ \nametest{#6}{*}%
+ \ifsamename\else \rightmargin #6 \fi
+ \def\m@malabel{\@nameuse{#1}} \let\makelabel\m@malabel}}%
+ {\endlist}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Quotation}
+%
+% \begin{environment}{quotation}
+% The quotation environment is defined by making clever use of
+% the list environment's parameters. The lines in the environment
+% are set smaller than \cs{textwidth}. The first line of a paragraph
+% inside this environment is indented.
+%
+% \begin{macrocode}
+\newenvironment{quotation}%
+ {\list{}{\listparindent 1.5em%
+ \itemindent \listparindent
+ \rightmargin \leftmargin
+ \parsep \z@ \@plus\p@}%
+ \item[]}%
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Quote}
+%
+%
+% \begin{environment}{quote}
+% The quote environment is like the quotation environment except
+% that paragraphs are not indented.
+%
+% \begin{macrocode}
+\newenvironment{quote}%
+ {\list{}{\rightmargin\leftmargin}%
+ \item[]}%
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Theorem}
+%
+% This document class does not define it's own theorem environments,
+% the defaults, supplied by \file{latex.dtx} are available.
+%
+% \subsection{Listing of symbols and abbreviations}
+%
+% Another element is the listing of symbols
+% and abbreviations.
+%
+% \begin{environment}{symbols}
+% \begin{macro}{\symbollabel}
+% \begin{macrocode}
+\newcommand{\symbollabel}[1]{{#1 \hfill}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\newenvironment{symbols}{\list{}%
+ {\itemindent 0em \leftmargin 8em
+ \labelsep 1em \labelwidth 5em
+ \let\makelabel\symbollabel}}%
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\symboldef}
+% Within a \Lenv{symbols} environment the command
+% \cs{symboldef}\marg{symbol}\marg{meaning}
+% is used to specify and explain each symbol or abbreviation.
+% \begin{macrocode}
+\newcommand{\symboldef}[2]{\item[#1] #2}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Abstracts}
+%
+% Books usually do not have abstracts, but I decided to add in the code
+% from the \Lpack{abstract}
+% package~\cite{ABSTRACT}.
+% \changes{v0.3}{2001/07/09}{Added code for abstracts}
+%
+%
+% We just have the \Lpack{report} or \Lpack{article} style for the
+% abstract with no \Lopt{titlepage} option. The original code,
+% from \file{classes.dtx} for this is:
+% \begin{verbatim}
+% \newenvironment{abstract}{%
+% \if@twocolumn
+% \section*{\abstractname}
+% \else
+% \small
+% \begin{center}%
+% {\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}%%
+% \end{center}%
+% \quotation
+% \fi}%
+% {\if@twocolumn\else\endquotation\fi}
+% \end{verbatim}
+%
+%
+% The following \cs{if...} commands are for implementing various options.
+% \begin{macro}{\if@bsonecol}
+% \begin{macro}{\ifadd@bstotoc}
+% \begin{macro}{\ifnumber@bs}
+% \begin{macro}{\if@bsrunin}
+% \begin{macrocode}
+\newif\if@bsonecol
+ \@bsonecoltrue
+\newif\ifadd@bstotoc
+ \add@bstotocfalse
+\newif\ifnumber@bs
+ \number@bsfalse
+\newif\if@bsrunin
+ \@bsruninfalse
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\abstractcol}
+% \begin{macro}{\abstractintoc}
+% \begin{macro}{\abstractnum}
+% \begin{macro}{\abstractrunin}
+% These are the use-level commands for setting the options. If
+% the abstract is runin, then it must not be numbered otherwise
+% adding it to the ToC might result in something peculiar.
+% \begin{macrocode}
+\newcommand{\abstractcol}{\@bsonecolfalse}
+\newcommand{\abstractintoc}{\add@bstotoctrue}
+\newcommand{\abstractnum}{\number@bstrue\@bsruninfalse}
+\newcommand{\abstractrunin}{\@bsrunintrue\number@bsfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% The next set of macros comprise the
+% implementation of the \Lenv{abstract} environment.
+%
+% \begin{macro}{\abstractnamefont}
+% \begin{macro}{\abstracttextfont}
+% These two macros are for specifying the fonts for typesetting the
+% abstract's title and text. They are initialised for the default case
+% (i.e., no class options).
+% \begin{macrocode}
+\newcommand{\abstractnamefont}{\normalfont\small\bfseries}
+\newcommand{\abstracttextfont}{\normalfont\small}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\abscolnamefont}
+% \begin{macro}{\abscoltextfont}
+% These two macros are for specifying the fonts for typesetting the
+% abstract's title and text in a two column document where the abstarct
+% is part of a column.
+% \changes{v1.61803}{2008/01/30}{Added \cs{abscolnamefont} and
+% \cs{abscoltextfont} (mempatch v4.8)}
+% \begin{macrocode}
+\newcommand{\abscolnamefont}{\normalfont\Large\bfseries}
+\newcommand{\abscoltextfont}{\normalfont}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\absnamepos}
+% \begin{macro}{\abstitleskip}
+% \cs{absnamepos} specifies the environment in which the abstract's title
+% name will be typeset, and the length \cs{abstitleskip} is an adjustement
+% to the vertical space between the title and the abstract's text. These
+% are initialised for the default case.
+% \begin{macrocode}
+\newcommand{\absnamepos}{center}
+\newlength{\abstitleskip} \setlength{\abstitleskip}{-0.5em}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\absleftindent}
+% \begin{macro}{\abs@leftindent}
+% \begin{macro}{\absrightindent}
+% \begin{macro}{\absparindent}
+% \begin{macro}{\absparsep}
+% The abstract's text is typeset as a single item list, called
+% \texttt{@bstr@ctlist}. These lengths set the left and right margin indents, the
+% paragraph indentation, and the inter-paragraph vertical space. Their
+% initial values are all class option-dependent.
+% \changes{v1.618}{2005/09/03}{Added \cs{abs@leftindent} per Lars Madsen (mempatch v3.0)}
+% \begin{macrocode}
+\newlength{\absleftindent}
+ \absleftindent=\leftmargin
+\newdimen\abs@leftindent
+ \abs@leftindent=\leftmargin
+\newlength{\absrightindent}
+ \absrightindent=\leftmargin
+\newlength{\absparindent}
+\newlength{\absparsep}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\abslabeldelim}
+% \begin{macro}{\@bslabeldelim}
+% The contents of \cs{abslabeldelim} are typeset after a run-in heading.
+% \begin{macrocode}
+\newcommand{\abslabeldelim}[1]{\def\@bslabeldelim{#1}}
+\abslabeldelim{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@bsrunintitle}
+% This macro typeset the run-in heading.
+% \begin{macrocode}
+\newcommand{\@bsrunintitle}{%
+ \hspace*{\abstitleskip}{\abstractnamefont\abstractname\@bslabeldelim}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setup@bstract}
+% Now arrange to set all the class option-dependent values.
+% \changes{v1.618}{2005/09/03}{Used \cs{abs@leftindent} in \cs{setup@bstract} (mempatch v3.0)}
+% \changes{v1.61803}{2008/01/30}{Changed \cs{setup@bstract} to cater for
+% \cs{abscolnamefont}, etc., and don't set
+% \cs{absrightindent} to \cs{absleftindent}.}
+% \begin{macrocode}
+\newcommand{\setup@bstract}{%
+ \abs@leftindent=\absleftindent
+ \if@twocolumn
+% \end{macrocode}
+% Values for the \Lopt{twocolumn} class option.
+% \begin{macrocode}
+ \if@bsonecol
+ \else
+ \abs@leftindent=\z@
+ \absrightindent=\z@
+ \renewcommand*{\abstractnamefont}{\abscolnamefont}
+ \renewcommand*{\abstracttextfont}{\abscoltextfont}
+ \renewcommand*{\absnamepos}{flushleft}
+ \setlength{\abstitleskip}{-2ex}
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\AtBeginDocument{\setlength{\absparindent}{\parindent}
+ \setlength{\absparsep}{\parskip}}
+
+% \end{macrocode}
+%
+% \begin{environment}{@bstr@ctlist}
+% The abstract's text is typeset within the \Lenv{@bstr@ctlist} list environment.
+% \changes{v1.618}{2005/09/03}{Used \cs{abs@leftindent} in \cs{@bstr@ctlist} (mempatch v3.0)}
+% \begin{macrocode}
+\newenvironment{@bstr@ctlist}{%
+ \list{}{%
+ %%\topsep \z@
+ \partopsep \z@
+ \listparindent \absparindent
+ \itemindent \listparindent
+ \leftmargin \abs@leftindent
+ \rightmargin \absrightindent
+ \parsep \absparsep}%
+ \item\relax}
+ {\endlist}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\put@bsintoc}
+% This macro adds the abstract's title to the ToC. It does nothing if
+% the abstract is being numbered.
+% \begin{macrocode}
+\newcommand{\put@bsintoc}{%
+ \ifadd@bstotoc
+ \ifnumber@bs\else
+ \phantomsection
+ \addcontentsline{toc}{chapter}{\abstractname}
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\num@bs}
+% This macro generates a numbered abstract heading.
+% \begin{macrocode}
+\newcommand{\num@bs}{\chapter{\abstractname}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{abstract}
+% At last we are in position to define the \Lenv{abstract} environment. This
+% follows very much along the lines of the standard class definitions, but with
+% macros inserted at strategic points.
+%
+% The \Lopt{twocolumn} option and the default case. These use the same code
+% as any style differences are embedded in the new macros.
+% \begin{macrocode}
+\newenvironment{abstract}{%
+ \setup@bstract
+ \if@bsrunin\else
+ \ifnumber@bs \num@bs \else
+ \begin{\absnamepos}\abstractnamefont\abstractname\end\absnamepos%
+ \vspace{\abstitleskip}%
+ \fi
+ \fi
+ \put@bsintoc%
+ \begin{@bstr@ctlist}\if@bsrunin\@bsrunintitle\fi\abstracttextfont}%
+ {\par\end{@bstr@ctlist}}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{onecolabstract}
+% An environment for typesetting a single column abstract,
+% particularly as the optional argument to the \cs{twocolumn} command.
+% \begin{macrocode}
+\newenvironment{onecolabstract}{%
+ \begin{@twocolumnfalse}\begin{abstract}}{%
+ \end{abstract}\end{@twocolumnfalse}}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\thanks}
+% \begin{macro}{\@bs@thanks}
+% We have to keep the contents of the \cs{thanks} commands as normally these
+% are emptied by the \cs{maketitle} command. I do this by extending the definition
+% of the \cs{thanks} (from \file{ltsect.dtx}) command,
+% so that \cs{@bs@thanks} has a copy of the contents
+% of \cs{@thanks}.
+% \begin{macrocode}
+\addtoiargdef{\thanks}{}{%
+ \protected@xdef\@bs@thanks{\@bs@thanks
+ \protect\footnotetext[\the\c@footnote]{#1}}%
+}
+\let\@bs@thanks\@empty
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\saythanks}
+% This macro typesets any \cs{thanks} commands \emph{after} using
+% \texttt{onecolabstract}.
+% \begin{macrocode}
+\newcommand{\saythanks}{\begingroup
+ \renewcommand{\thefootnote}{\fnsymbol{footnote}}\@bs@thanks
+ \endgroup\global\let\@bs@thanks\@empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Verse}
+%
+% The class provides a more flexible \Lenv{verse} environment than the
+% standard classes. This is based on the \Lpack{verse}
+% package~\cite{VERSE}.
+% \changes{v1.0}{2001/10/30}{Complete rewrite of verse typesetting}
+%
+% \subsection{Environments}
+%
+% Before proceeding with the main, here are some macros for aspects
+% of line numbering.
+%
+% \begin{macro}{\c@vslineno}
+% \begin{macro}{\c@poemline}
+% \begin{macro}{\c@modulo@vs}
+% \begin{macro}{\c@memfvsline}
+% We need counters for stanza and poem lines. The \texttt{memfvsline}
+% counter is for adjusting the starting line for verse line numbers.
+% \changes{v1.1}{2002/03/10}{Added poemline and modulo@vs counters}
+% \changes{v1.61803}{2008/01/30}{Added memfvsline counter (mempatch v4.9)}
+% \begin{macrocode}
+\newcounter{vslineno}
+\newcounter{poemline}
+\newcounter{modulo@vs}
+\newcounter{memfvsline}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\poemlines}
+% \cs{poemlines}\marg{nth} specifies that every \meta{nth} line of
+% a poem is to be numbered.
+% \changes{v1.1}{2002/03/10}{Added \cs{poemlines}}
+% \changes{v1.2}{2002/07/27}{\cs{poemlines} now just calls \cs{linenumberfrequency}}
+% \changes{v1.61803}{2008/01/30}{Deleted \cs{poemlines}.}
+% \begin{macrocode}
+%%%\newcommand{\poemlines}[1]{\linenumberfrequency{#1}%
+%%% \@memwarn{Use \string\linenumberfrequency\space
+%%% instead of \string\poemlines}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\linenumberfont}
+% \begin{macro}{\vlvnumfont}
+% Set line numbering font(s).
+% \begin{macrocode}
+\newcommand{\linenumberfont}[1]{\def\vlvnumfont{#1}}
+%%% \linenumberfont{\small\rmfamily}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifbvcountlines}
+% \begin{macro}{\bvcountlinestrue}
+% \begin{macro}{\bvcountlinesfalse}
+% Looking ahead, TRUE for (boxed) verbatim line numbers to be printed. Default
+% is not to print them. Not that \cs{linenumberfrequency} twiddles with this.
+% \begin{macrocode}
+\newif\ifbvcountlines% TRUE to print line numbers of (boxed) verbatim lines
+ \bvcountlinesfalse
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\linenumberfrequency}
+% \begin{macro}{\linemodnum}
+% Set numbering intervals (number modulo). Default is modulus 0.
+% \begin{macrocode}
+\newcommand{\linenumberfrequency}[1]{%
+ \ifnum #1< \@ne
+ \def\linemodnum{0\relax}
+ \bvcountlinesfalse
+ \else
+ \def\linemodnum{#1\relax}
+ \bvcountlinestrue
+ \fi}
+
+%%%%\linenumberfrequency{0}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setverselinenums}
+% \cs{setverselinenums}\marg{firstline}\marg{startnumsat} sets the first line
+% number to \meta{firstline} and the first line number to be printed is
+% \meta{startnumsat}. Use within the \Lenv{verse} environment before the
+% first verse. Note that \\
+% \verb?firstline <= startnumsat < firstline + linenumberfrequency?
+% \changes{v1.61803}{2008/01/30}{Added \cs{setverselinenums} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\setverselinenums}[2]{%
+ \c@poemline #1\relax \advance\c@poemline \m@ne
+ \refstepcounter{poemline}%
+ \ifnum\z@<\linemodnum% we are printing line numbers
+ \@tempcnta #2\relax
+ \divide\@tempcnta\linemodnum
+ \multiply\@tempcnta\linemodnum
+ \c@memfvsline #2\relax
+ \advance\c@memfvsline-\@tempcnta
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.1}{2002/03/24}{Added \cs{getmodulo@vs}}
+% \changes{v1.2}{2002/07/27}{Using \cs{getthelinenumber} instead of \cs{getmodulo@vs}}
+%
+% \begin{macro}{\getthelinenumber}
+% \cs{getthelinenumber}\marg{counter}\marg{start} returns \cs{thecounter}
+% if it is exactly divisible by \cs{linenumberfrequency}, provided this is
+% not zero. \meta{start} is the first number.
+% \changes{v1.61802}{2008/01/30}{Generalised \cs{getthelinenumber} to cater
+% for set of first line number.}
+% \begin{macrocode}
+\newcommand{\getthelinenumber}[2]{%
+ \ifnum\@ne>\linemodnum% no line numbers
+ \else
+ \ifnum\@ne=\linemodnum% every line numbered
+ \@nameuse{the#1}%
+ \else
+ \@tempcnta=\@nameuse{c@#1}%
+ \advance\@tempcnta -\@nameuse{c@#2}%
+ \divide\@tempcnta \linemodnum
+ \multiply\@tempcnta \linemodnum
+ \advance\@tempcnta \@nameuse{c@#2}%
+ \ifnum\@tempcnta=\@nameuse{c@#1}\@nameuse{the#1}\fi
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifaltindent}
+% This should be set TRUE for indenting alternate lines.
+% \begin{macrocode}
+\newif\ifaltindent
+ \altindentfalse
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifpattern}
+% This should be set TRUE for indenting lines according to a pattern.
+% \begin{macrocode}
+\newif\ifpattern
+ \patternfalse
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifstarpattern}
+% This should be set TRUE for indenting lines according in a \Lenv{patverse*}
+% environment.
+% \changes{v1.1}{2002/03/8}{Added \cs{ifstarpattern}}
+% \begin{macrocode}
+\newif\ifstarpattern
+ \starpatternfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vleftskip}
+% \begin{macro}{\vrightskip}
+% Skips to the left and right of a line of verse.
+% \changes{v1.1}{2002/03/24}{Added \cs{vleftskip} and \cs{vrightskip}}
+% \changes{v1.2}{2002/07/27}{Changed defaults for \cs{vleftskip} and \cs{vrightskip}}
+% \begin{macrocode}
+\newlength{\vleftskip}
+ \setlength{\vleftskip}{3em}
+\newlength{\vrightskip}
+ \setlength{\vrightskip}{1em}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\stanzaskip}
+% Skip between stanzas.
+% \changes{v1.2}{2002/07/07}{Added \cs{stanzaskip}}
+% \begin{macrocode}
+\newlength{\stanzaskip}
+ \setlength{\stanzaskip}{\onelineskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\flagverse}
+% \cs{flagverse}\marg{flag} inserts \meta{flag} at the left (of a line).
+% \changes{v1.1}{2002/03/24}{Added \cs{flagverse}}
+% \changes{v1.61803398}{2009/07/17}{Added bidi suport to \cs{flagverse}}
+% \begin{macrocode}
+\newcommand{\flagverse}[1]{%
+%%% \hskip-\vleftskip\llap{#1}\hskip\vleftskip\ignorespaces}
+ \hskip-\memRTLvleftskip\llap{#1}\hskip\memRTLvleftskip\ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\versewidth}
+% The length \cs{versewidth} is a convenience length for the user.
+% \begin{macrocode}
+\newlength{\versewidth}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vgap}
+% \begin{macro}{\vin}
+% \begin{macro}{\vindent}
+% The length \cs{vgap} is used as the basis for spacing. \cs{vin} makes
+% a horizontal space of \cs{vgap} and \cs{vindent} is the indentation
+% of wrapped lines.
+% \begin{macrocode}
+\newlength{\vgap} \setlength{\vgap}{1.5em}
+\newcommand{\vin}{\hspace*{\vgap}}
+\newlength{\vindent} \setlength{\vindent}{2\vgap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\vinphantom}
+% Macro to leave blank space coresponding to a string.
+% \changes{v1.4}{2003/02/27}{Added \cs{vinphantom} (patch 1.1)}
+% \begin{macrocode}
+\newcommand{\vinphantom}[1]{\leavevmode\phantom{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vleftofline}
+% Macro to insert something immediately to the left of the start
+% of the line.
+% \changes{v1.618}{2005/09/14}{Added \cs{vleftofline}}
+% \begin{macrocode}
+\newcommand*{\vleftofline}[1]{\leavevmode\llap{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vleftmargin}
+% Length to adjust the default left margin within a verse environment.
+% \changes{v1.618}{2005/09/18}{Added \cs{vleftmargin}}
+% \begin{macrocode}
+\newdimen\vleftmargin
+ \vleftmargin=\leftmargini
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verselinebreak}
+% Break a verse line by inserting \cs{newline}.
+% \changes{v1.1}{2002/03/28}{Modified \cs{verselinebreak}}
+% \changes{v1.61803}{2008/01/30}{Removed extraneous space from \cs{verselinebreak} (mempatch v4.4, Aaron Rendahl)}
+% \begin{macrocode}
+\newcommand{\verselinebreak}[1][\z@]{\newline\hspace*{#1}\ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\incr@vsline}
+% Increment the line counters.
+% \changes{v1.1}{2002/03/24}{Added poemline counter to \cs{incr@vsline}}
+% \begin{macrocode}
+\newcommand{\incr@vsline}{%
+ \refstepcounter{poemline}%
+ \stepcounter{vslineno}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vsifbang}
+% Like the kernel \cs{@ifstar} except it looks for an exclamation mark!
+% \changes{v1.1}{2002/03/24}{Added \cs{@vsifbang}}
+% \begin{macrocode}
+\newcommand{\@vsifbang}[1]{\@ifnextchar !{\@firstoftwo{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vsifgt}
+% Like the kernel \cs{@ifstar} except it looks for a \verb?>? character.
+% \changes{v1.1}{2002/03/28}{Added \cs{@vsifgt}}
+% \begin{macrocode}
+\newcommand{\@vsifgt}[1]{\@ifnextchar >{\@firstoftwo{#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verselinenumbersright}
+% \begin{macro}{\verselinenumbersleft}
+% \begin{macro}{\@vstypelinenum}
+% Declarations for setting line numbers at the right (the default)
+% or the left..
+% \changes{v1.61803}{2008/01/30}{Added \cs{verselinenumbersright} and
+% \cs{verselinenumbersleft} (mempatch v4.4, v4.9)}
+% \begin{macrocode}
+\newcommand*{\verselinenumbersright}{\def\@vstypelinenum{\@vslnumright}}
+\newcommand*{\verselinenumbersleft}{\def\@vstypelinenum{\@vslnumleft}}
+\verselinenumbersright
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@vslnumright}
+% \begin{macro}{\@vslnumleft}
+% Internal code for right/left line numbers.
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{@vslnumright}
+% and \cs{@vslnumleft}}
+% \changes{v3.7g}{2018/02/28}{Added \cs{nobreak} to both
+% \cs{@vslnumright} and \cs{@vslnumleft}, reported on
+% \protect\url{https://tex.stackexchange.com/a/415939/3929}, to avoid strange
+% double line breaks}
+% \begin{macrocode}
+\newcommand*{\@vslnumright}{%
+ \nobreak%
+ \hfill\rlap{%\kern\vrightskip\kern\rightmargin%
+ \kern\memRTLvrightskip\kern\rightmargin%
+ \vlvnumfont\getthelinenumber{poemline}{memfvsline}}}
+\newcommand*{\@vslnumleft}{%
+ \nobreak%
+ \hfill\rlap{%\kern-\textwidth\kern-\vrightskip%
+ \kern-\textwidth\kern-\memRTLvrightskip%
+ \vlvnumfont\getthelinenumber{poemline}{memfvsline}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@vscentercr}
+% This puts the poem line number in the margin, increments
+% the line numbers, and then deals with the options. It is based
+% on the kernel \cs{@centercr}.
+% This has to handle various forms of the \verb?\\? command: \verb?\\?,
+% \verb?\\*?, \verb?\\!?, and \verb?\\>?, together with an optional length argument.
+% \changes{v1.1}{2002/03/28}{Major rewrite of \cs{@vscentercr} and friends}
+% \changes{v1.2}{2002/07/27}{Changed \cs{@vscentercr} to use general
+% linenumbering}
+% \changes{v1.61803}{2008/01/30}{Changed \cs{@vscentercr} for left/right numbers
+% (mempatch v4.4)}
+% \begin{macrocode}
+\newcommand{\@vscentercr}{%
+ \ifhmode \unskip\else \@nolnerr\fi
+ \@vstypelinenum%
+% \end{macrocode}
+% For \verb?>? call \cs{verselinebreak} to process it.
+% \begin{macrocode}
+ \@vsifgt{\verselinebreak}{%
+ \incr@vsline
+% \end{macrocode}
+% If the call is \verb?\\*...? call \cs{@vsxcentercr} to handle the \verb?*...?.
+% If the call is \verb?\\!?, do nothing.
+% If the call is \verb?\\![...]?, call \cs{@vsicentercr} to handle the \verb?[...]?.
+% Otherwise, call \cs{@vsxcentercr}.
+% \begin{macrocode}
+ \par\@ifstar{\nobreak\@vsxcentercr}{%
+% \end{macrocode}
+% \begin{macrocode}
+ \@vsifbang{\@ifnextchar[ {\@vsicentercr}{}}{\@vsxcentercr}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vsxcentercr}
+% Processes \verb?\\*?, and either calls cs{@vsicentercr} to handle a \verb?[length]?,
+% or \cs{start@vsline}.
+% \changes{v1.1}{2002/03/24}{Added \cs{@vsxcentercr}}
+% \begin{macrocode}
+\newcommand{\@vsxcentercr}{\addvspace{-\parskip}%
+ \@ifnextchar[ {\@vsicentercr}{\start@vsline}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vsicentercr}
+% Processes \verb?(\\...)[length]? and then calls \cs{start@vsline}.
+% \changes{v1.1}{2002/03/24}{Added \cs{@vsicentercr}}
+% \begin{macrocode}
+\def\@vsicentercr[#1]{\vskip #1\ignorespaces \start@vsline}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\start@vsline}
+% This is called at the start of every verse line except the first.
+% \changes{v1.1}{2002/03/28}{Added \cs{ifstarpattern} to \cs{start@vsline}}
+% \changes{v1.61}{2004/03/21}{Used counter for vslineno, not \cs{thevslineno}
+% in \cs{start@vsline}}
+% \begin{macrocode}
+\newcommand{\start@vsline}{%
+ \ifaltindent\ifodd\c@vslineno\else\vin\fi\fi%
+ \ifpattern\get@vsindent\fi%
+ \ifstarpattern\getstar@vsindent\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theHpoemline}
+% For the \Lpack{hyperref} package need a way of distinguishing
+% lines of a poem. See the thread \textit{PDFTEX/Hyperef hates memoir verse
+% environment?} on \ctt{} October 2002.
+% \changes{v1.3}{2002/11/14}{Added verse counter and \cs{theHpoemline}}
+% \begin{macrocode}
+\newcounter{verse}
+\setcounter{verse}{0}
+\newcommand{\theHpoemline}{\theverse.\thepoemline}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{verse}
+% The extended \Lenv{verse} environment. It sets the verse line counter,
+% then defines the particular list environment adjusting the margins
+% to center according to the length parameter. If the length parameter
+% is at least the \cs{linewidth} then the `centering' defaults to
+% the original \Lenv{verse} layout.
+% \changes{v1.1}{2001/08/03}{Initialise the line counter to 1, not 0, in
+% all cases}
+% \changes{v1.1}{2002/03/28}{Changes to verse environment for line numbering}
+% \changes{v1.3}{2002/11/14}{Changes to verse environment for hyperref}
+% \changes{v1.4}{2002/02/27}{Let verses wider than the \cs{linewidth}
+% take the full width (patch(1.1)}
+% \changes{v1.618}{2005/09/03}{Fix vertical spacing in the verse environment (mempatch v3.3)}
+% \begin{macrocode}
+\newenvironment{verse}[1][\linewidth]{%
+ \refstepcounter{verse}%
+ \setcounter{poemline}{0}\refstepcounter{poemline}%
+ \setcounter{vslineno}{1}%
+ \let\\=\@vscentercr
+ \list{}{\itemsep \z@
+ \itemindent -\vindent
+ \listparindent\itemindent
+ \leftmargin \vleftmargin
+ \parsep \stanzaskip
+ \ifdim #1<\linewidth% %% short line
+ \rightmargin \z@
+ \leftmargin \linewidth
+ \advance\leftmargin -#1\relax
+ \advance\leftmargin -0.5\leftmargin
+ \advance\leftmargin \vindent
+ \else
+ \ifdim #1>\linewidth% %% long line
+ \rightmargin \z@
+ \leftmargin \vindent
+ \else% %% default
+ \rightmargin \leftmargin
+ \advance\leftmargin \vindent
+ \fi
+ \fi}
+ \item[]}{\endlist}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{altverse}
+% This sets \cs{altindenttrue} (afterwards false) and initialises the line counter.
+% \changes{v1.1}{2002/03/28}{Added \cs{starpatternfalse} to altverse}
+% \begin{macrocode}
+\newenvironment{altverse}%
+ {\starpatternfalse\patternfalse\altindenttrue
+ \setcounter{vslineno}{1}}%
+ {\altindentfalse}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Patterns}
+%
+% The pattern code is based on the idea of converting a string of
+% digits to an array of digits, and then being able to access the
+% digit at a particular position in the array.
+%
+%
+% \begin{macro}{\ifbounderror}
+% A flag set TRUE if an attempt is made to access an array element outside
+% the array limits.
+% \begin{macrocode}
+\newif\ifbounderror
+ \bounderrorfalse
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifinteger}
+% A flag to indicate if a `number' is an integer (TRUE) or not (FALSE).
+% \begin{macrocode}
+\newif\ifinteger
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@chrsinstr}
+% A counter for the number of characters.
+% \begin{macrocode}
+\newcounter{chrsinstr} % CHARactersINSTRing
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\newarray}
+% \cs{newarray}\marg{arrayname}\marg{low}\marg{high} defines
+% an array called \meta{arrayname} (no backslash e.g. \verb?MyArray?),
+% with low and high limts \meta{low} and \meta{high}.
+% \begin{macrocode}
+\newcommand{\newarray}[3]{%
+ \@nameedef{#1-low}{#2}%
+ \@nameedef{#1-high}{#3}%
+ \ifnum #3<#2
+ \@memerror{Limits for array #1 are in reverse order}{\@ehc}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\stringtoarray}
+% \cs{stringtoarray}\marg{arrayname}\marg{string} puts each character
+% from \meta{string} sequentially into the \meta{arrayname} array, starting
+% with \meta{low} = 1. It checks for an empty \meta{string} and handles that
+% specially.
+% \begin{macrocode}
+\newcommand{\stringtoarray}[2]{%
+ \def\@vsarrayname{#1}%
+ \protected@edef\the@vsstring{#2}%
+ \newarray{\@vsarrayname}{1}{1}%
+ \@ifmtarg{#2}{%
+ \c@chrsinstr \z@
+ \@namedef{\@vsarrayname-1}{}
+ }{%
+ \c@chrsinstr \@ne
+ \expandafter\@vsstringtoarray \the@vsstring\@vsend
+ }}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@vsstringtoarray}
+% Recursively adds characters to the array \cs{@vsarrayname}, incrementing
+% the array's high limit.
+% \begin{macrocode}
+\def\@vsstringtoarray #1#2\@vsend{%
+ \@namedef{\@vsarrayname-\the\c@chrsinstr}{#1}
+ \@nameedef{\@vsarrayname-high}{\the\c@chrsinstr}
+ \@ifmtarg{#2}{%
+ \def\@vsinext{}%
+ }{%
+ \advance\c@chrsinstr \@ne
+ \def\@vsinext{%
+ \@vsstringtoarray #2\@vsend%
+ }%
+ }
+ \@vsinext}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\setarrayelement}
+% \cs{setarrayelement}\marg{arrayname}\marg{index}\marg{value} sets
+% the \meta{arrayname} array's element at \meta{index} to \meta{value}.
+% \begin{macrocode}
+\newcommand{\setarrayelement}[3]{%
+ \checkarrayindex{#1}{#2}%
+ \@nameedef{#1-#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\getarrayelement}
+% \cs{getarrayelement}\marg{arrayname}\marg{index}\marg{value}
+% defines the parameterless macro \meta{value} (e.g., \cs{result}) to be
+% the value at \meta{index} in the \meta{arrayname} array.
+% \begin{macrocode}
+\newcommand{\getarrayelement}[3]{%
+ \checkarrayindex{#1}{#2}%
+ \protected@edef#3{\@nameuse{#1-#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\checkarrayindex}
+% \cs{checkarrayindex}\marg{arrayname}\marg{index} checks that
+% the \meta{index} of the \meta{arrayname} array is valid. \cs{ifbounderror}
+% is set FALSE if everything is OK, otherwise it is set TRUE.
+% \begin{macrocode}
+\newcommand{\checkarrayindex}[2]{%
+ \bounderrorfalse
+ \expandafter\ifx\csname #1-low\endcsname\relax%
+ \ifpattern\else
+ \@memerror{No array called #1}{\@ehc}%
+ \fi
+ \bounderrortrue
+ \fi
+ \ifnum #2<\@nameuse{#1-low}\relax%
+ \ifpattern\else
+ \@memerror{Index #2 outside limits for array #1}{\@ehc}%
+ \fi
+ \bounderrortrue
+ \fi
+ \ifnum #2>\@nameuse{#1-high}\relax%
+ \ifpattern\else
+ \@memerror{Index #2 outside limits for array #1}{\@ehc}%
+ \fi
+ \bounderrortrue
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\arraytostring}
+% \cs{arraytostring}\marg{arrayname}\marg{string} converts the
+% characters in the \meta{arrayname} array into the parameterless macro
+% \meta{string} (e.g., \cs{MyString}).
+% \begin{macrocode}
+\newcommand{\arraytostring}[2]{%
+ \def#2{}%
+ \c@chrsinstr = \@nameuse{#1-low}%
+ \@vsarraytostring{#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@vsarraytostring}
+% \cs{@vsarraytostring}\marg{arrayname}\marg{string} recursively
+% adds the (character) elements from \meta{arrayname} to \meta{string}.
+% \begin{macrocode}
+\newcommand{\@vsarraytostring}[2]{%
+ \ifnum\c@chrsinstr>\@nameuse{#1-high}\else
+ \protected@edef#2{#2\@nameuse{#1-\thechrsinstr}}%
+ \advance\c@chrsinstr\@ne%
+ \@vsarraytostring{#1}{#2}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\checkifinteger}
+% \cs{checkifinteger}\marg{num} checks if \meta{num} is an integer.
+% If it is, then \cs{ifinteger} is set TRUE, otherwise it is set FALSE.
+% (Code based on Donald Arseneau's \Lpack{cite} package).
+% \begin{macrocode}
+\newcommand{\checkifinteger}[1]{%
+ \protected@edef\@vsa{#1}%
+ \ifcat _\ifnum9<1\gobm{#1} _\else A\fi
+ \integertrue%
+ \else
+ \integerfalse%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\gobm}
+% \cs{gobm}\marg{num} is defined as \meta{num}. It could be defined as: \\
+% \verb?\newcommand{\gobm}[1]{\ifx-#1\expandafter\gobm\else#1\fi}? \\
+% which would remove a leading minus sign (hyphen) from its argument
+% (\verb?gobm? = gobble minus sign).
+% (Code from a posting to \ctt{} by Donald Arseneau on 1997/07/21).
+% \begin{macrocode}
+\newcommand{\gobm}[1]{#1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\indentpattern}
+% \cs{indentpattern}\marg{digits} stores \meta{digits} for use as
+% a verse indentation pattern.
+% \begin{macrocode}
+\newcommand{\indentpattern}[1]{%
+ \stringtoarray{Array@vs}{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\get@vsindent}
+% \cs{get@vsindent} gets the indent pattern digit for the \cs{thevslineno},
+% then uses this to specify the line indentation as \verb?digit*\vgap?.
+% \changes{v1.61}{2004/03/21}{Changed \cs{get@vsindent} to use counter
+% value number instead of \cs{thevslineno}}
+% \begin{macrocode}
+\newcommand{\get@vsindent}{%
+ \getarrayelement{Array@vs}{\number\value{vslineno}}{\@vspat}%
+ \ifbounderror
+ \arraytostring{Array@vs}{\@vsp@t}%
+ \@memwarn{%
+ Index `\thevslineno' for pattern `\@vsp@t' is out of bounds}%
+ \def\@vspat{0}%
+ \else
+ \checkifinteger{\@vspat}%
+ \ifinteger\else
+ \arraytostring{Array@vs}{\@vsp@t}%
+ \@memwarn{%
+ `\@vspat' at index `\thevslineno' in pattern `\@vsp@t'
+ is not a digit}%
+ \def\@vspat{0}%
+ \fi
+ \fi
+ \ifcase\@vspat\else\hspace*{\@vspat\vgap}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\getstar@vsindent}
+% \cs{getstar@vsindent} gets the indent pattern digit for the \Lenv{patverse*}
+% environment,
+% then uses this to specify the line indentation as \verb?digit*\vgap?.
+% It lets the pattern repeat by resetting the \texttt{vslineno} counter.
+% \changes{v1.1}{2002/03/28}{Added \cs{getstar@vsindent}}
+% \begin{macrocode}
+\newcommand{\getstar@vsindent}{%
+ \expandafter\ifx\csname Array@vs-high\endcsname\relax
+ \@memerror{A pattern has not been specified}{\@ehc}
+ \else
+ \ifnum\c@vslineno>\@nameuse{Array@vs-high}%
+ \setcounter{vslineno}{1}%
+ \fi
+ \get@vsindent
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{patverse}
+% The environment for setting verse line indents according to a pattern.
+% It starts by setting \cs{ifpattern} TRUE, any other flags to FALSE,
+% and initialises the line number. It ends by setting \cs{ifpattern} FALSE.
+% \changes{v1.1}{2002/03/28}{Added \cs{starpatternfalse} to patverse}
+% \begin{macrocode}
+\newenvironment{patverse}%
+ {\starpatternfalse\patterntrue\altindentfalse
+ \setcounter{vslineno}{1}}%
+ {\patternfalse}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{patverse*}
+% The environment for setting verse line indents according to a repeating
+% pattern.
+% It starts by setting \cs{ifstarpattern} TRUE, any other flags to FALSE,
+% and initialises the line number. It ends by setting \cs{ifstarpattern} FALSE.
+% \changes{v1.1}{2002/03/28}{Added patverse* environment}
+% \begin{macrocode}
+\newenvironment{patverse*}%
+ {\starpatterntrue\patternfalse\altindentfalse
+ \setcounter{vslineno}{1}}%
+ {\starpatternfalse}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Titles}
+%
+% \begin{macro}{\poemtitle}
+% Typeset a poem title (like \cs{section} or other). The actual work
+% is done by \cs{@vsptitle} (plain) or \cs{@vssptitle} (starred).
+% \begin{macrocode}
+\newcommand{\poemtitle}{\par%
+ \secdef\@vsptitle\@vssptitle}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\poemtoc}
+% The kind of entry \cs{poemtitle} is to make in the ToC.
+% \begin{macrocode}
+\newcommand{\poemtoc}{section}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mempoeminfo}
+% \begin{macro}{\mempoemstarinfo}
+% \verb?\mempoeminfo{title}? \\
+% \verb?\mempoemstarinfo{title}? \\
+% \changes{v1.61803}{2008/01/30}{Made \cs{mempoeminfo} and fiends \cs{long}
+% (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\mempoeminfo}[1]{}
+\newcommand{\mempoemstarinfo}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@vsptitle}
+% Typeset a \cs{poemtitle}.
+% \changes{v1.3}{2002/11/14}{Added \cs{phantomsection} to \cs{@vsptitle}}
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@vsptitle}}
+% \begin{macrocode}
+\long\def\@vsptitle[#1]#2{%
+ \phantomsection
+ \addcontentsline{toc}{\poemtoc}{#1}%
+ \M@gettitle{#1}%
+ \mempoeminfo{#1}%
+ \poemtitlemark{#1}%
+ \@vstypeptitle{#2}%
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vssptitle}
+% Typeset a \cs{poemtitle*}.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@vssptitle}}
+% \begin{macrocode}
+\long\def\@vssptitle#1{%
+ \M@gettitle{#1}%
+ \mempoemstarinfo{#1}%
+ \@vstypeptitle{#1}%
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vstypeptitle}
+% This \emph{really} typesets the title.
+% \begin{macrocode}
+\newcommand{\@vstypeptitle}[1]{%
+ \vspace{\beforepoemtitleskip}%
+ {\poemtitlefont #1\par}%
+ \vspace{\afterpoemtitleskip}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\poemtitlefont}
+% \begin{macro}{\poemtitlemark}
+% Sets the appearance to the title of a poem, and something for a header.
+% \begin{macrocode}
+\newcommand{\poemtitlefont}{\normalfont\large\bfseries\centering}
+\newcommand{\poemtitlemark}[1]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\beforepoemtitleskip}
+% \begin{macro}{\afterpoemtitleskip}
+% Lengths before and after a poem title, using approximately \cs{section}
+% values.
+% \begin{macrocode}
+\newlength{\beforepoemtitleskip}
+ \setlength{\beforepoemtitleskip}{3.5ex \@plus 1ex \@minus .2ex}
+\newlength{\afterpoemtitleskip}
+ \setlength{\afterpoemtitleskip}{2.3ex \@plus.2ex}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\if@numptitle}
+% \begin{macro}{\@numptitletrue}
+% \begin{macro}{\@numptitlefalse}
+% \begin{macro}{\NumberPoemTitle}
+% \begin{macro}{\PlainPoemTitle}
+% Following the \cs{NumberPoemTitle} declaration \cs{PoemTitle}s are numbered.
+% The \cs{PlainPoemTitle} declaration produces unnumbered titles.
+% \begin{macrocode}
+\newif\if@numptitle
+\newcommand*{\NumberPoemTitle}{\@numptitletrue}
+\newcommand*{\PlainPoemTitle}{\@numptitlefalse}
+\NumberPoemTitle
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@poem}
+% \begin{macro}{\thepoem}
+% \begin{macro}{\theHpoem}
+% Counter for poem titles.
+% \begin{macrocode}
+\newcounter{poem}\setcounter{poem}{0}
+ \renewcommand*{\thepoem}{\@arabic\c@poem}
+\newcommand*{\theHpoem}{\arabic{poem}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\poemtitlestarmark}
+% \begin{macro}{\poemtitlepstyle}
+% \begin{macro}{\poemtitlestarpstyle}
+% \cs{poemtitlemark}\marg{poemf@rhdr} is used for marks for a \cs{PoemTitle} and
+% \cs{poemtitlestarmark}\marg{poemf@hdr} is for marks for \cs{PoemTitle*}.
+% The \cs{poemtitlepstyle} and \cs{poemtitlestarpstyle} macros are provided
+% as hooks so that, for example, pagestyles can be set for the regular
+% and starred versions of \cs{PoemTitle}. By default these macros do nothing.
+% \begin{macrocode}
+\newcommand*{\poemtitlestarmark}[1]{}
+\newcommand*{\poemtitlepstyle}{}
+\newcommand*{\poemtitlestarpstyle}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PoemTitle}
+% The command to produce a article style chapter-like (numbered) poem title.
+% \changes{v1.618}{2005/09/09}{Added \cs{PoemTitle}}
+% \begin{macrocode}
+\newcommand\PoemTitle{%
+ \par
+ \@afterindentfalse
+ \@ifstar{\@m@msPoemTitle}{\@m@mPoemTitle}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@m@mPoemTitle}
+% \begin{macro}{\poemt@c}
+% Intermediate and support macros for the extra optional argument
+% to \cs{PoemTitle}. Have to do this long windedly otherwise dear old
+% \Lpack{hyperref} barfs.
+% \begin{macrocode}
+\newcommand{\@m@mPoemTitle}[1][]{%
+ \def\poemt@c{#1}% capture first optional arg
+ \@ifnextchar[{\@PoemTitle}{\@PoemTitle[]}%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memPoemTitleinfo}
+% \begin{macro}{\memPoemTitlestarinfo}
+% \verb?\memPoemTitleinfo{num}{toc}{head}{full}? \\
+% \verb?\memPoemTitlestarinfo{short}{full}?
+% \begin{macrocode}
+\newcommand{\memPoemTitleinfo}[4]{}
+\newcommand{\memPoemTitlestarinfo}[2]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@PoemTitle}
+% \begin{macro}{\poemf@rtoc}
+% \begin{macro}{\poemf@rhdr}
+% \cs{@PoemTitle}\oarg{tocmark}\marg{title}
+% typesets the title of a \cs{PoemTitle}.
+% There is a number for \cs{@numptitletrue} and \cs{@mainmattertrue}.
+% \begin{macrocode}
+\def\@PoemTitle[#1]#2{%
+ \phantomsection
+ \ifx\poemt@c\@empty % no optional args
+ \def\poemf@rtoc{#2}%
+ \def\poemf@rhdr{#2}%
+ \else % at least one opt arg
+ \let\poemf@rtoc\poemt@c
+ \ifx\@empty#1\@empty
+ \let\poemf@rhdr\poemt@c
+ \else
+ \def\poemf@rhdr{#1}%
+ \fi
+ \fi
+ \m@m@Andfalse
+ \if@numptitle
+ \if@mainmatter
+ \m@m@Andtrue
+ \fi
+ \fi
+ \ifm@m@And
+ \refstepcounter{poem}%
+ \fi
+% \end{macrocode}
+% Store the (short) title via \cs{poemtitlemark} and call
+% \cs{\@makePoemTitlehead} to do the typesetting.
+% \begin{macrocode}
+ \@makePoemTitlehead{#2}%
+ \@afterheading
+ \poemtitlemark{\poemf@rhdr}%
+ \poemtitlepstyle
+% \end{macrocode}
+% Add the title to the ToC.
+% \begin{macrocode}
+ \ifm@m@And
+ \addcontentsline{toc}{\poemtoc}{%
+ \protect\numberline{\thepoem}\poemf@rtoc}%
+ \memPoemTitleinfo{\thepoem}{\poemf@rtoc}{\poemf@rhdr}{#2}%
+ \else
+ \addcontentsline{toc}{\poemtoc}{\poemf@rtoc}%
+ \memPoemTitleinfo{}{\poemf@rtoc}{\poemf@rhdr}{#2}%
+ \fi
+% \end{macrocode}
+% Add hook for title referencing.
+% \begin{macrocode}
+ \ifheadnameref\M@gettitle{\poemf@rhdr}\else\M@gettitle{\poemf@rtoc}\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makePoemTitlehead}
+% This \emph{really} typesets a \cs{PoemTitle}. Leave some whitespace.
+% \begin{macrocode}
+\def\@makePoemTitlehead#1{{%
+ \PoemTitleheadstart
+ \parindent \z@ \normalfont
+% \end{macrocode}
+% If there is a number, typeset it, otherwise call \cs{printPoemTitlenonum}.
+% \begin{macrocode}
+ \ifm@m@And
+ \printPoemTitlenum
+ \afterPoemTitlenum
+ \else
+ \printPoemTitlenonum
+ \fi
+% \end{macrocode}
+% Typeset the title.
+% \begin{macrocode}
+ \interlinepenalty\@M
+ \printPoemTitletitle{#1}%
+ \afterPoemTitle}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@PTchs@def@ult}
+% This sets up all the definitions used in \cs{@makePoemTitlehead}
+% and \cs{@makesPoemTitlehead}.
+% \begin{macro}{\PoemTitleheadstart}
+% \begin{macro}{\printPoemTitlenum}
+% \begin{macro}{\afterPoemTitlenum}
+% \begin{macro}{\printPoemTitlenonum}
+% \begin{macro}{\printPoemTitletitle}
+% \begin{macro}{\afterPoemTitle}
+% \begin{macrocode}
+\newcommand{\@PTchs@def@ult}{%
+ \def\PoemTitleheadstart{\vspace{\beforePoemTitleskip}}
+ \def\printPoemTitlenum{\PoemTitlenumfont \thepoem}
+ \def\afterPoemTitlenum{\par\nobreak\vskip \midPoemTitleskip}
+ \def\printPoemTitlenonum{}
+ \def\printPoemTitletitle##1{\PoemTitlefont ##1}
+ \def\afterPoemTitle{\par\nobreak\vskip \afterPoemTitleskip}}
+\@PTchs@def@ult
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\PoemTitlenumfont}
+% \begin{macro}{\PoemTitlefont}
+% Fonts for setting the Poem Title number and title.
+% \begin{macrocode}
+\newcommand*{\PoemTitlenumfont}{\normalfont\large\centering}
+\newcommand*{\PoemTitlefont}{\normalfont\large\centering}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\beforePoemTitleskip}
+% \begin{macro}{\midPoemTitleskip}
+% \begin{macro}{\afterPoemTitleskip}
+% Lengths separating the various parts of a Poem Title heading.
+% \begin{macrocode}
+\newlength{\beforePoemTitleskip}
+ \setlength{\beforePoemTitleskip}{1\onelineskip}
+\newlength{\midPoemTitleskip}
+ \setlength{\midPoemTitleskip}{0pt}
+\newlength{\afterPoemTitleskip}
+ \setlength{\afterPoemTitleskip}{1\onelineskip}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@m@msPoemTitle}
+% This deals with the optional argument for starred PoemTitles.
+% \begin{macrocode}
+\newcommand{\@m@msPoemTitle}[2][\@empty]{%
+ \@sPoemTitle{#2}%
+ \ifx \@empty#1
+ \def\poemf@rhdr{#2}%
+ \else % opt arg
+ \def\poemf@rhdr{#1}%
+ \fi
+ \poemtitlestarmark{\poemf@rhdr}%
+ \poemtitlestarpstyle
+ \memPoemTitlestarinfo{\poemf@rhdr}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@sPoemTitle}
+% \cs{@sPoemTitle}\marg{long} typesets the title of a
+% \cs{PoemTitle*}. It is easier than the \cs{@PoemTitle} as there is no number
+% or ToC entry to worry about.
+% \begin{macrocode}
+\newcommand{\@sPoemTitle}[1]{%
+ \@makesPoemTitlehead{#1}%
+ \@afterheading
+ \M@gettitle{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makesPoemTitlehead}
+% This \emph{really} typesets a \cs{PoemTitle*}, and is similar to
+% \cs{@makePoemTitlehead}.
+% \begin{macrocode}
+\def\@makesPoemTitlehead#1{{%
+ \PoemTitleheadstart
+ \parindent \z@ \normalfont
+ \printPoemTitlenonum
+ \interlinepenalty\@M
+ \printPoemTitletitle{#1}
+ \afterPoemTitle}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{Setting parameters for existing environments}
+%
+% \subsection{Array and tabular}
+%
+% \begin{macro}{\arraycolsep}
+% The columns in an array environment are separated by
+% 2\cs{arraycolsep}.
+% \begin{macrocode}
+\setlength\arraycolsep{5\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tabcolsep}
+% The columns in an tabular environment are separated by
+% 2\cs{tabcolsep}.
+% \begin{macrocode}
+\setlength\tabcolsep{6\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\arrayrulewidth}
+% The width of rules in the array and tabular environments is given
+% by\\ \cs{arrayrulewidth}.
+% \begin{macrocode}
+\setlength\arrayrulewidth{.4\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\doublerulesep}
+% The space between adjacent rules in the array and tabular
+% environments is given by \cs{doublerulesep}.
+% \begin{macrocode}
+\setlength\doublerulesep{2\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tabbing}
+%
+% \begin{macro}{\tabbingsep}
+% This controls the space that the \verb?\'? command puts in. (See
+% \LaTeX{} manual for an explanation.)
+% \begin{macrocode}
+\setlength\tabbingsep{\labelsep}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Minipage}
+%
+% \begin{macro}{\@minipagerestore}
+% The macro \cs{@minipagerestore} is called upon entry to a minipage
+% environment to set up things that are to be handled differently
+% inside a minipage environment. In the standard styles it does
+% nothing, as was the case originally for memoir.
+%
+% Memoir extends it to support verbatim footnotes (see later) in minipages
+% and also for abnormal parskips (see later).
+% \changes{v1.61803}{2008/01/30}{Collected \cs{@minipagerestore} modifications together}
+% \begin{macrocode}
+\newcommand{\@minipagerestore}{%
+% \end{macrocode}
+% For \cs{verbfootnote} to work in a minipage we have to use
+% \cs{@verbmpfootnotetext} instead of \cs{@verbfootnotetext}.
+% \begin{macrocode}
+ \let\@verbfootnotetext\@verbmpfootnotetext
+% \end{macrocode}
+% The next is for enabling the extended footnotes in a minipage.
+% \begin{macrocode}
+ \m@mdoextrafeetmini
+% \end{macrocode}
+% And this is for abnormal parskips.
+% \begin{macrocode}
+ \ifm@mnzpskip \parskip=\m@mabparskip\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mpfootins}
+% Minipages have their own footnotes; \verb?\skip\@mpfootins? plays
+% the same r\^ole for footnotes in a minipage as \verb?\skip\footins? does
+% for ordinary footnotes.
+%
+% \begin{macrocode}
+\skip\@mpfootins = \skip\footins
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Framed boxes}
+%
+% \begin{macro}{\fboxsep}
+% The space left by \cs{fbox} and \cs{framebox} between the box and the
+% text in it.
+% \begin{macro}{\fboxrule}
+% The width of the rules in the box made by \cs{fbox} and \cs{framebox}.
+% \begin{macrocode}
+\setlength\fboxsep{3\p@}
+\setlength\fboxrule{.4\p@}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Equation and eqnarray}
+%
+% \begin{macro}{\theequation}
+% The equation counter will be reset at beginning of a new chapter
+% and the equation number will be prefixed by the chapter number.
+%
+% This code must follow the \cs{chapter} definition, or more exactly
+% the definition of the chapter counter.
+% \begin{macrocode}
+\@addtoreset{equation}{chapter}
+\renewcommand{\theequation}{%
+ \ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\jot}
+% \cs{jot} is the extra space added between lines of an eqnarray
+% environment. The default value is used.
+% \begin{macrocode}
+% \setlength\jot{3pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@eqnnum}
+% The macro \cs{@eqnnum} defines how equation numbers are to appear in
+% equations. Again the default is used.
+%
+% \begin{macrocode}
+% \def\@eqnnum{(\theequation)}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Array and tabularx}
+%
+% \subsection{Array}%
+%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{array} package. Now replaced by requiring the packge instead.
+% \begin{macrocode}
+\RequirePackage{array}[2018/04/30]
+% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
+%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{array} and replaced it with requiring the \Lpack{array} package
+% instead.}
+%
+% ^^A % The description and code are essentially copied from the \Lpack{array}
+% ^^A package~\cite{ARRAY}.
+% ^^A
+% \begin{macrocode}
+ %
+ % %%%%%%%%%% Array package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% Frank Mittelbach & David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+ % %%%%%%%%%% Copy corresponds to array.sty 2016/10/06 v2.4d %%%%%%%%%
+% \end{macrocode}
+% ^^A \changes{v3.7g}{2018/03/05}{Updated the embedded copy of the
+% ^^A \Lpack{array} package to version 2.4d, 2016/10/06}
+% ^^A \begin{dlf}
+% ^^A dlf: The \Lpack{array} package has redundant code (caused by a
+% ^^A quick mashing of and earlier \Lpack{array} version and the
+% ^^A \Lpack{newaray} package). In thus update (2018/03/05) this
+% ^^A redundant code is \emph{not} removed as it makes it very hard to
+% ^^A see where there are class changes to the \Lpack{array} code, and
+% ^^A when stuff is simply removed. We'll leave it up to the LaTeXteam to
+% ^^A clean up the \Lpack{array} code at some point.
+% ^^A
+% ^^A The following is a carbon copy of the DTX code from
+% ^^A \verb|array.dtx|, package specific \cs{changes} lines have been
+% ^^A removed, and we have made any error/warning messages class specific,
+% ^^A instead of package specific.
+% ^^A \end{dlf}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The construction of the preamble}
+% ^^A
+% ^^A It is obvious that those environments will consist mainly of an
+% ^^A \verb=\halign=, because \TeX\ typesets tables using this primitive.
+% ^^A That is why we will now take a look at the algorithm which determines
+% ^^A a preamble for a \verb=\halign= starting with a given user preamble
+% ^^A using the options mentioned above.
+% ^^A
+% ^^A The most interesting macros of this implementation are without doubt
+% ^^A those which are responsible for the construction of the preamble for
+% ^^A the \verb=\halign=. The underlying algorithm was developed by
+% ^^A \textsc{Lamport} (resp.\ \textsc{Knuth}, see texhax V87\#??), and it
+% ^^A has been extended and improved.
+% ^^A
+% ^^A The user preamble will be read \textsf{token} by \textsf{token}. A
+% ^^A \textsf{token} is a single character like \texttt{c} or a block
+% ^^A enclosed in \verb={...}=. For example the preamble of
+% ^^A \verb=\begin{tabular}=\linebreak[0]\verb={lc||c@{\hspace{1cm}}}= consists of
+% ^^A the \textsf{token} \texttt{l}, \texttt{c}, \texttt{|}, \texttt{|},
+% ^^A \texttt{@} and \verb=\hspace{1cm}=.
+% ^^A
+% ^^A The currently used \textsf{token} and the one, used before, are needed
+% ^^A to decide on how the construction of the preamble has to be
+% ^^A continued.
+% ^^A In the example mentioned above the \texttt{l} causes the preamble
+% ^^A to begin with \verb=\hskip\tabcolsep=. Furthermore
+% ^^A \verb=# \hfil= would be appended to define a flush left column.
+% ^^A The next \textsf{token} is a \texttt{c}. Because it was preceded by an
+% ^^A \texttt{l} it generates a new column. This is done with
+% ^^A \verb=\hskip \tabcolsep & \hskip \tabcolsep=. The column which is to
+% ^^A be centered will be appended with \verb=\hfil # \hfil=.
+% ^^A The \textsf{token} \texttt{|} would then add a space of
+% ^^A \verb=\hskip \tabcolsep=
+% ^^A and a vertical line because the last
+% ^^A \textsf{tokens} was a \texttt{c}.
+% ^^A The following \textsf{token} \texttt{|} would only add a space
+% ^^A \verb=\hskip \doublerulesep= because it was preceded by the
+% ^^A \textsf{token} \texttt{|}. We will not discuss our example further but
+% ^^A rather take a look at the general case of constructing preambles.
+% ^^A
+% ^^A The example shows that the desired preamble for the
+% ^^A \verb=\halign= can be constructed as soon as the action of all
+% ^^A combinations
+% ^^A of the preamble \textsf{tokens} are specified. There are 18 such
+% ^^A \textsf{tokens}
+% ^^A so we have $19 \cdot 18 = 342$ combinations if we count the
+% ^^A beginning of
+% ^^A the preamble as a special \textsf{token}. Fortunately, there are many
+% ^^A combinations which generate the same spaces, so we can define
+% ^^A \textsf{token} classes. We will identify a
+% ^^A \textsf{token} within a class with a number, so we can insert the
+% ^^A formatting (for example of a column).
+% ^^A Table~\ref{tab:Klassen} lists all \textsf{token} classes and
+% ^^A their corresponding numbers.
+% ^^A \begin{table}[ht]
+% ^^A \begin{center}
+% ^^A \begin{tabular}[t]{>{\ttfamily}ccc}
+% ^^A \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
+% ^^A c & 0 & 0 \\
+% ^^A l & 0 & 1 \\
+% ^^A r & 0 & 2 \\
+% ^^A p-arg & 0 & 3 \\
+% ^^A t-arg & 0 & 4 \\
+% ^^A b-arg & 0 & 5 \\
+% ^^A | & 1 & 0 \\
+% ^^A !-arg & 1 & 1 \\
+% ^^A <-arg & 2 & --- \\
+% ^^A >-arg & 3 & ---
+% ^^A \end{tabular}
+% ^^A \kern3mm \vrule \kern3mm%
+% ^^A \begin{tabular}[t]{>{\ttfamily}ccc}
+% ^^A \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
+% ^^A Start & 4 & --- \\
+% ^^A @-arg & 5 & --- \\
+% ^^A ! & 6 & --- \\
+% ^^A @ & 7 & --- \\
+% ^^A < & 8 & --- \\
+% ^^A > & 9 & --- \\
+% ^^A p & 10 & 3 \\
+% ^^A t & 10 & 4 \\
+% ^^A b & 10 & 5
+% ^^A \end{tabular}
+% ^^A \end{center}
+% ^^A \caption{Classes of preamble \textsf{tokens}}
+% ^^A \label{tab:Klassen}
+% ^^A \end{table}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@chclass}
+% ^^A \begin{macro}{\@chnum}
+% ^^A \begin{macro}{\@lastchclass}
+% ^^A The class and the number of the current \textsf{token} are saved in
+% ^^A the
+% ^^A \textsf{count} registers \verb=\@chclass=
+% ^^A and \verb=\@chnum=, while the class of the previous
+% ^^A \textsf{token} is stored in the
+% ^^A \textsf{count} register \verb=\@lastchclass=.
+% ^^A All of the mentioned registers are already allocated in
+% ^^A \texttt{latex.tex},
+% ^^A which is the reason why the following three lines of code are
+% ^^A commented out.
+% ^^A Later throughout the text I will not mention it again explicitly
+% ^^A whenever I use a \verb=%= sign. These parts are already defined in
+% ^^A \texttt{latex.tex}.
+% \begin{macrocode}
+ % % \newcount \@chclass
+ % % \newcount \@chnum
+ % % \newcount \@lastchclass
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@addtopreamble}
+% ^^A We will save the already constructed preamble for
+% ^^A the \verb=\halign=
+% ^^A in the global macro \verb=\@preamble=. This will then be
+% ^^A enlarged with
+% ^^A the command \verb=\@addtopreamble=.
+% \begin{macrocode}
+ % \def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The character class of a \textsf{token}}
+% ^^A
+% ^^A \begin{macro}{\@testpach}
+% ^^A With the help of \verb=\@lastchclass= we can now define a macro
+% ^^A which determines the class and the number of a given preamble
+% ^^A \textsf{token}
+% ^^A and assigns them to the registers
+% ^^A \verb=\@chclass= and \verb=\@chnum=.
+% \begin{macrocode}
+ % \def\@testpach{\@chclass
+% \end{macrocode}
+% ^^A First we deal with the cases in which the \textsf{token}
+% ^^A (\verb=#1=) is the argument of \texttt{!}, \texttt{@}, \texttt{<} or
+% ^^A \texttt{>}. We can see this from the value of \verb=\@lastchclass=:
+% \begin{macrocode}
+ % \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+ % \ifnum \@lastchclass=7 5 \else
+ % \ifnum \@lastchclass=8 \tw@ \else
+ % \ifnum \@lastchclass=9 \thr@@
+% \end{macrocode}
+% ^^A Otherwise we will assume that the \textsf{token} belongs to the
+% ^^A class $0$
+% ^^A and assign the corresponding number to \verb=\@chnum= if our
+% ^^A assumption is correct.
+% \begin{macrocode}
+ % \else \z@
+% \end{macrocode}
+% ^^A If the last \textsf{token} was a \texttt{p}, \texttt{m} or a
+% ^^A \texttt{b}, \verb=\@chnum= already has the right value. This is the
+% ^^A reason for the somewhat curious choice of the \textsf{token}
+% ^^A numbers in class $10$.
+% \begin{macrocode}
+ % \ifnum \@lastchclass = 10 \else
+% \end{macrocode}
+% ^^A Otherwise we will check if \verb=\@nextchar= is either a \texttt{c},
+% ^^A \texttt{l} or an \texttt{r}. Some applications change the
+% ^^A catcodes of certain characters like ``\texttt{@}'' in
+% ^^A \texttt{amstex.sty}. As a result the tests below would fail since
+% ^^A they assume non-active character tokens. Therefore we evaluate
+% ^^A \verb=\@nextchar= once thereby turning the first token of its
+% ^^A replacement text into a char. At this point here this should have
+% ^^A been the only char present in \verb=\@nextchar= which put into via a
+% ^^A \verb=\def=.
+% \begin{macrocode}
+ % \edef\@nextchar{\expandafter\string\@nextchar}%
+ % \@chnum
+ % \if \@nextchar c\z@ \else
+ % \if \@nextchar l\@ne \else
+ % \if \@nextchar r\tw@ \else
+% \end{macrocode}
+% ^^A If it is a different \textsf{token}, we know that the class was
+% ^^A not $0$. We assign the value $0$ to \verb=\@chnum= because this value
+% ^^A is needed for the \texttt{|}--\textsf{token}. Now we must check
+% ^^A the remaining classes. Note that the value of \verb=\@chnum= is
+% ^^A insignificant here for most classes.
+% \begin{macrocode}
+ % \z@ \@chclass
+ % \if\@nextchar |\@ne \else
+ % \if \@nextchar !6 \else
+ % \if \@nextchar @7 \else
+ % \if \@nextchar <8 \else
+ % \if \@nextchar >9 \else
+% \end{macrocode}
+% ^^A The remaining permitted \textsf{tokens} are \texttt{p},
+% ^^A \texttt{m} and \texttt{b} (class $10$).
+% \begin{macrocode}
+ % 10
+ % \@chnum
+ % \if \@nextchar m\thr@@\else
+ % \if \@nextchar p4 \else
+ % \if \@nextchar b5 \else
+% \end{macrocode}
+% ^^A Now the only remaining possibility is a forbidden \textsf{token},
+% ^^A so we choose class $0$ and number $0$ and give an error message.
+% ^^A Then we finish the macro by closing all \verb=\if='s.
+% \begin{macrocode}
+ % \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
+ % \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Multiple columns ($*$--form)}
+% ^^A
+% ^^A \begin{macro}{\@xexpast}
+% ^^A \begin{macro}{\the@toks}
+% ^^A \begin{macro}{\the@toksz}
+% ^^A \label{@xexpast} Now we discuss the macro that deletes all forms
+% ^^A of type \verb=*{=\textit{N\/}\verb=}{=\textit{String\/}\verb=}= from a user
+% ^^A preamble and replaces them with \textit{N} copies of
+% ^^A \textit{String}. Nested $*$--expressions are dealt with
+% ^^A correctly, that means $*$--expressions are not substituted if
+% ^^A they are in explicit braces, as in \verb=@{*}=.
+% ^^A
+% ^^A This macro is called via
+% ^^A \verb=\@xexpast=\meta{preamble}\verb=*0x\@@=.
+% ^^A The $*$--expression \verb=*0x= is being used to terminate the
+% ^^A recursion,
+% ^^A as we shall see later, and \verb=\@@= serves as an argument
+% ^^A delimiter. \verb=\@xexpast= has four arguments. The first
+% ^^A one is the part of the
+% ^^A user preamble before the first $*$--expression while the second
+% ^^A and third ones are the arguments of the first $*$--expression
+% ^^A (that is \textit{N} and \textit{String} in the notation mentioned
+% ^^A above).
+% ^^A The fourth argument is the rest of the preamble.
+% \begin{macrocode}
+ % \def\@xexpast#1*#2#3#4\@@{%
+% \end{macrocode}
+% ^^A The number of copies of \textit{String} (\verb=#2=) that are to be
+% ^^A produced will be saved in a \textsf{count} register.
+% \begin{macrocode}
+ % \@tempcnta #2
+% \end{macrocode}
+% ^^A We save the part of the preamble which does not
+% ^^A contain a $*$--form (\verb=#1=)
+% ^^A in a \PlainTeX\ \textsf{token} register.
+% ^^A We also save \textit{String} (\verb=#3=) using a \LaTeX\
+% ^^A \textsf{token} register.
+% \begin{macrocode}
+ % \toks@={#1}\@temptokena={#3}%
+% \end{macrocode}
+% ^^A Now we have to use a little trick to produce \textit{N} copies of
+% ^^A \textit{String}.
+% ^^A We could try \verb=\def\@tempa{#1}= and then
+% ^^A \textit{N} times \verb=\edef\@tempa{\@tempa#3}=. This would have the
+% ^^A undesired effect that all macros within \verb=#1= and \verb=#3=
+% ^^A would be expanded, although, for example, constructions like
+% ^^A \verb=@{..}= are not supposed to be changed.
+% ^^A That is why we \verb=\let= two control sequences to
+% ^^A be equivalent to \verb=\relax=.
+% \begin{macrocode}
+ % \let\the@toksz\relax \let\the@toks\relax
+% \end{macrocode}
+% ^^A Then we ensure that \verb=\@tempa= contains
+% ^^A \verb={\the@toksz\the@toks...\the@toks}= (the macro
+% ^^A \verb=\the@toks= exactly \textit{N\/} times) as substitution text.
+% \begin{macrocode}
+ % \def\@tempa{\the@toksz}%
+ % \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ % {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+% \end{macrocode}
+% ^^A If \textit{N\/} was greater than zero we prepare for another call
+% ^^A of \verb=\@xexpast=. Otherwise we assume we have reached the end of
+% ^^A the user preamble, because we had appended \verb=*0x\@@= when we first
+% ^^A called \verb=\@xexpast=. In other words: if the user inserts
+% ^^A \verb=*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it.
+% \begin{macrocode}
+ % \let \@tempb \@xexpast \else
+ % \let \@tempb \@xexnoop \fi
+% \end{macrocode}
+% ^^A Now we will make sure that the part of the user preamble, which
+% ^^A was already dealt with, will be saved again in \verb=\@tempa=.
+% \begin{macrocode}
+ % \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ % \edef\@tempa{\@tempa}%
+% \end{macrocode}
+% ^^A We have now evaluated the first $*$--expression, and the user
+% ^^A preamble up to this point
+% ^^A is saved in \verb=\@tempa=. We will put the contents of
+% ^^A \verb=\@tempa= and the rest of the user preamble together and work
+% ^^A on the result with \verb=\@tempb=. This macro either corresponds
+% ^^A to \verb=\@xexpast=, so that the next
+% ^^A $*$--expression is handled, or to the macro \verb=\@xexnoop=,
+% ^^A which only ends the recursion by deleting its argument.
+% \begin{macrocode}
+ % \expandafter \@tempb \@tempa #4\@@}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xexnoop}
+% ^^A So the first big problem is solved. Now it is easy to
+% ^^A specify \verb=\@xexnoop=.
+% ^^A Its argument is delimited by \verb=\@@= and it simply expands to
+% ^^A nothing.
+% \begin{macrocode}
+ % % \def\@xexnoop#1\@@{}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The insertion of declarations
+% ^^A (\texttt{>}, \texttt{<}, \texttt{!}, \texttt{@})}
+% ^^A
+% ^^A
+% ^^A The preamble will be enlarged with the help of \verb=\xdef=, but the
+% ^^A arguments of \texttt{>}, \texttt{<},~\texttt{!}\ and \texttt{@} are
+% ^^A not supposed to be expanded during the construction (we want an
+% ^^A implementation that doesn't need a \verb=\protect=). So we have to find a
+% ^^A way to inhibit the expansion of those arguments.
+% ^^A
+% ^^A We will solve this problem with \textsf{token} registers. We need
+% ^^A one register for every \texttt{!}\ and \texttt{@}, while we need two
+% ^^A for every \texttt{c}, \texttt{l}, \texttt{r}, \texttt{m}, \texttt{p}
+% ^^A or \texttt{b}. This limits the number of columns of a table because
+% ^^A there are only 256 \textsf{token} registers. But then, who needs
+% ^^A tables with more than 100 columns?
+% ^^A
+% ^^A One could also find a solution which only needs two or three
+% ^^A \textsf{token} registers by proceeding similarly as in the macro
+% ^^A \verb=\@xexpast= (see page \pageref{@xexpast}). The advantage of our
+% ^^A approach is the fact that we avoid some of the problems that arise
+% ^^A with the other method\footnote{Maybe there are also historical
+% ^^A reasons.}.
+% ^^A
+% ^^A So how do we proceed? Let us assume that we had \verb=!{foo}= in the
+% ^^A user preamble and say we saved \texttt{foo} in
+% ^^A \textsf{token} register $5$. Then we call
+% ^^A \verb=\@addtopreamble{\the@toks5}= where
+% ^^A \verb=\the@toks= is defined in a way that it does not expand
+% ^^A (for example it could be equivalent to \verb=\relax=). Every
+% ^^A following call
+% ^^A of \verb=\@addtopreamble= leaves \verb=\the@toks5= unchanged in
+% ^^A \verb=\@preamble=. If the construction of the preamble is completed
+% ^^A we change the definition of \verb=\the@toks= to
+% ^^A \verb=\the\toks= and expand \verb=\@preamble= for the last time.
+% ^^A During this process all parts of the form
+% ^^A \verb=\the@toks=\meta{Number}
+% ^^A will be substituted by the contents of the respective \textsf{token}
+% ^^A registers.
+% ^^A
+% ^^A As we can see from this informal discussion the construction of the
+% ^^A preamble has to take place within a group, so that the
+% ^^A \textsf{token} registers we use will be freed later on. For that
+% ^^A reason we keep all assignments to \verb=\@preamble= global; therefore the
+% ^^A replacement text of this macro will remain the same after we leave
+% ^^A the group.
+% ^^A
+% ^^A \begin{macro}{\count@}
+% ^^A We further need a \textsf{count} register to remember which
+% ^^A \textsf{token} register is to be used next. This will be
+% ^^A initialized with $-1$ if we want to begin with the \textsf{token}
+% ^^A register $0$. We use the \PlainTeX\ scratch register \verb=\count@=
+% ^^A because everything takes place locally. All we have to do is
+% ^^A insert \verb=\the@toks= \verb=\the= \verb=\count@= into the preamble.
+% ^^A \verb=\the@toks= will remain unchanged and \verb=\the\count@= expands into
+% ^^A the saved number.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\prepnext@tok}
+% ^^A The macro \verb=\prepnext@tok= is in charge of preparing the next
+% ^^A \textsf{token} register. For that purpose we increase
+% ^^A \verb=\count@= by $1$:
+% \begin{macrocode}
+ % \def\prepnext@tok{\advance \count@ \@ne
+% \end{macrocode}
+% ^^A Then we locally delete any contents the
+% ^^A \textsf{token} register might have.
+% \begin{macrocode}
+ % \toks\count@{}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\save@decl}
+% ^^A During the construction of the preamble the current
+% ^^A \textsf{token} is always saved in the macro \verb=\@nextchar= (see the
+% ^^A definition of \verb=\@mkpream= on page \pageref{@mkpream}). The macro
+% ^^A \verb=\save@decl= saves it into the next free \textsf{token} register,
+% ^^A i.e.\ in \verb=\toks\count@=.
+% \begin{macrocode}
+ % \def\save@decl{\toks\count@ \expandafter{\@nextchar}}
+% \end{macrocode}
+% ^^A The reason for the use of \verb=\relax= is the following
+% ^^A hypothetical situation in the preamble:
+% ^^A \quad \verb=..\the\toks1\the\toks2..= \quad \TeX\ expands
+% ^^A \verb=\the\toks2= first in order to find out if the digit \verb=1=
+% ^^A is followed by other digits. E.g.\ a \verb=5= saved in the
+% ^^A \textsf{token} register $2$ would lead \TeX\ to insert the contents
+% ^^A of \textsf{token} register $15$ instead of $1$ later on.
+% ^^A
+% ^^A The example above referred to an older version of \verb=\save@decl= which
+% ^^A inserted a \verb=\relex= inside the token register. This is now moved to
+% ^^A the places where the actual token registers are inserted (look for
+% ^^A \verb=\the@toks=) because the old version would still make= @=
+% ^^A expressions to moving arguments since after expanding the second
+% ^^A register while looking for the end of the number the contents of the
+% ^^A token register is added so that later on the whole register will be
+% ^^A expanded. This serious bug was found after nearly two years
+% ^^A international use of this package by Johannes Braams.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A How does the situation look like, if we want to add another column
+% ^^A to the preamble, i.e.\ if we have found a \texttt{c}, \texttt{l},
+% ^^A \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in the user
+% ^^A preamble? In this case we have the problem of the \textsf{token}
+% ^^A register from \verb=>{..}= and \verb=<{..}= having to be inserted at this
+% ^^A moment because formatting instructions like \verb=\hfil= have to be set
+% ^^A around them. On the other hand it is not known yet, if any \verb=<{..}=
+% ^^A instruction will appear in the user preamble at all.
+% ^^A
+% ^^A We solve this problem by adding two \textsf{token} registers at a
+% ^^A time. This explains, why we have freed the \textsf{token} registers
+% ^^A in \verb=\prepnext@tok=.
+% ^^A
+% ^^A \begin{macro}{\insert@column}
+% ^^A \begin{macro}{\@sharp}
+% ^^A We now define the macro \verb=\insert@column= which will do
+% ^^A this work for us.
+% \begin{macrocode}
+ % \def\insert@column{%
+% \end{macrocode}
+% ^^A Here, we assume that the \textsf{count} register
+% ^^A \verb=\@tempcnta= has saved the value $\verb=\count@= - 1$.
+% \begin{macrocode}
+ % \the@toks \the \@tempcnta
+% \end{macrocode}
+% ^^A Next follows the \verb=#= sign which specifies the place
+% ^^A where the text of the column shall be inserted. To avoid
+% ^^A errors during the expansions in
+% ^^A \verb=\@addtopreamble= we hide this sign in the command
+% ^^A \verb=\@sharp= which is temporarily occupied with
+% ^^A \verb=\relax= during the build-up of the preamble.
+% ^^A To remove unwanted spaces before and after the column text, we set
+% ^^A an \verb=\ignorespaces= in front and a \verb=\unskip= afterwards.
+% \begin{macrocode}
+ % \ignorespaces \@sharp \unskip
+% \end{macrocode}
+% ^^A Then the second \textsf{token} register follows whose number should
+% ^^A be saved in \verb=\count@=.
+% ^^A We make sure that there will be no further expansion after reading
+% ^^A the number, by finishing with \verb=\relax=. The case above is not
+% ^^A critical since it is ended by \verb=\ignorespaces=.
+% \begin{macrocode}
+ % \the@toks \the \count@ \relax}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The separation of columns}
+% ^^A
+% ^^A \begin{macro}{\@addamp}
+% ^^A In the preamble a \verb=&= has to be inserted between any two columns;
+% ^^A before the first column there should not be a \verb=&=. As the user
+% ^^A preamble may start with a \texttt{|} we have to remember somehow
+% ^^A if we have already inserted a \verb=#= (i.e.\ a column). This is done
+% ^^A with the boolean variable \verb=\if@firstamp= that we test in
+% ^^A \verb=\@addamp=, the macro that inserts the \verb=&=.
+% \begin{macrocode}
+ % % \newif \@iffirstamp
+ % % \def\@addamp{\if@firstamp \@firstampfalse
+ % % \else \@addtopreamble &\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@acol}
+% ^^A \begin{macro}{\@acolampacol}
+% ^^A \begin{macro}{\col@sep}
+% ^^A We will now define some abbreviations for the extensions,
+% ^^A appearing most often in the preamble build-up.
+% ^^A Here \verb=\col@sep= is a \textsf{dimen} register which is set
+% ^^A equivalent to \verb=\arraycolsep= in an \textsf{array}--environment,
+% ^^A otherwise it is set equivalent to \verb=\tabcolsep=.
+% \begin{macrocode}
+ % \newdimen\col@sep
+ % \def\@acol{\@addtopreamble{\hskip\col@sep}}
+ % % \def\@acolampacol{\@acol\@addamp\@acol}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The macro \texttt{\textbackslash @mkpream}}
+% ^^A
+% ^^A \begin{macro}{\@mkpream}
+% ^^A \begin{macro}{\the@toks}
+% ^^A \label{@mkpream}
+% ^^A Now we can define the macro which builds up the preamble for the
+% ^^A \verb=\halign=.
+% ^^A First we initialize \verb=\@preamble=, \verb=\@lastchclass=
+% ^^A and the boolean variable \verb=\if@firstamp=.
+% \begin{macrocode}
+ % \def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+% \end{macrocode}
+% ^^A During the build-up of the preamble we cannot directly use the
+% ^^A \verb=#= sign; this would lead to an error message in the next
+% ^^A \verb=\@addtopreamble= call.
+% ^^A Instead, we use the command \verb=\@sharp= at places where later
+% ^^A a \verb=#= will be.
+% ^^A This command is at first given the meaning \verb=\relax=;
+% ^^A therefore it will not be expanded when the preamble
+% ^^A is extended.
+% ^^A In the macro \verb=\@array=, shortly before the \verb=\halign=
+% ^^A is carried out, \verb=\@sharp= is given its final meaning.
+% ^^A
+% ^^A In a similar way,
+% ^^A we deal with the commands \verb=\@startpbox= and
+% ^^A \verb=\@endpbox=, although the reason is different here: these
+% ^^A macros expand in many \textsf{tokens} which would delay the
+% ^^A build-up of the preamble.
+% \begin{macrocode}
+ % \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+% \end{macrocode}
+% ^^A Now we remove possible $*$-forms in the user preamble with the
+% ^^A command \verb=\@xexpast=. As we already know, this command saves
+% ^^A its result in the macro \verb=\@tempa=.
+% \begin{macrocode}
+ % \@xexpast #1*0x\@@
+% \end{macrocode}
+% ^^A Afterwards we initialize all registers and macros, that we need
+% ^^A for the build-up of the preamble.
+% ^^A Since we want to start with the \textsf{token} register $0$,
+% ^^A \verb=\count@= has to contain the value $-1$.
+% \begin{macrocode}
+ % \count@\m@ne
+ % \let\the@toks\relax
+% \end{macrocode}
+% ^^A Then we call up \verb=\prepnext@tok= in order to prepare the
+% ^^A \textsf{token} register $0$ for use.
+% \begin{macrocode}
+ % \prepnext@tok
+% \end{macrocode}
+% ^^A To evaluate the user preamble (without stars) saved in
+% ^^A \verb=\@tempa= we use the \LaTeX--macro \verb=\@tfor=.
+% ^^A The strange appearing construction with \verb=\expandafter= is
+% ^^A based on the fact that we have to put the replacement text of
+% ^^A \verb=\@tempa= and not the macro \verb=\@tempa= to this
+% ^^A \LaTeX--macro.
+% \begin{macrocode}
+ % \expandafter \@tfor \expandafter \@nextchar
+ % \expandafter :\expandafter =\@tempa \do
+% \end{macrocode}
+% ^^A The body of this loop (the group after the \verb=\do=)
+% ^^A is executed for one \textsf{token} at a time, whereas
+% ^^A the current \textsf{token} is saved in \verb=\@nextchar=.
+% ^^A At first we evaluate the current \textsf{token} with the already
+% ^^A defined macro \verb=\@testpach=, i.e.\ we assign to
+% ^^A \verb=\@chclass= the character class and to \verb=\@chnum=
+% ^^A the character number of this \textsf{token}.
+% \begin{macrocode}
+ % {\@testpach
+% \end{macrocode}
+% ^^A Then we branch out depending on the value of \verb=\@chclass= into
+% ^^A different macros that extend the preamble respectively.
+% \begin{macrocode}
+ % \ifcase \@chclass \@classz \or \@classi \or \@classii
+ % \or \save@decl \or \or \@classv \or \@classvi
+ % \or \@classvii \or \@classviii \or \@classix
+ % \or \@classx \fi
+% \end{macrocode}
+% ^^A Two cases deserve our special attention: Since the current
+% ^^A \textsf{token} cannot have the character class $4$ (start) we
+% ^^A have skipped this possibility. If the character class is $3$,
+% ^^A only the content of \verb=\@nextchar= has to be saved into the current
+% ^^A \textsf{token} register; therefore we call up \verb=\save@decl=
+% ^^A directly and save a macro name. After the preamble has been
+% ^^A extended we assign the value of \verb=\@chclass= to the counter
+% ^^A \verb=\@lastchclass= to assure that this information will be available
+% ^^A during the next run of the loop.
+% \begin{macrocode}
+ % \@lastchclass\@chclass}%
+% \end{macrocode}
+% ^^A After the loop has been finished space must still be added to
+% ^^A the created preamble, depending on the last \textsf{token}.
+% ^^A Depending on the value of \verb=\@lastchclass= we perform
+% ^^A the necessary operations.
+% \begin{macrocode}
+ % \ifcase\@lastchclass
+% \end{macrocode}
+% ^^A If the last class equals $0$ we add a
+% ^^A \verb=\hskip \col@sep=.
+% \begin{macrocode}
+ % \@acol \or
+% \end{macrocode}
+% ^^A If it equals $1$ we do not add any additional space so that the
+% ^^A horizontal lines do not exceed the vertical ones.
+% \begin{macrocode}
+ % \or
+% \end{macrocode}
+% ^^A Class $2$ is treated like class $0$ because a \verb=<{...}= can
+% ^^A only directly follow after class $0$.
+% \begin{macrocode}
+ % \@acol \or
+% \end{macrocode}
+% ^^A Most of the other possibilities can only appear if the user
+% ^^A preamble was defective. Class $3$ is not allowed since after a
+% ^^A \verb=>{..}= there must always follow a \texttt{c}, \texttt{l},
+% ^^A \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an
+% ^^A error and ignore the declaration given by \verb={..}=.
+% \begin{macrocode}
+ % \@preamerr \thr@@ \or
+% \end{macrocode}
+% ^^A If \verb=\@lastchclass= is $4$ the user preamble has been empty.
+% ^^A To continue, we insert a \verb=#= in the preamble.
+% \begin{macrocode}
+ % \@preamerr \tw@ \@addtopreamble\@sharp \or
+% \end{macrocode}
+% ^^A Class $5$ is allowed again. In this case
+% ^^A (the user preamble ends with \verb=@{..}=) we need not
+% ^^A do anything.
+% \begin{macrocode}
+ % \or
+% \end{macrocode}
+% ^^A Any other case means that the arguments to \verb=@=, \texttt{!},
+% ^^A \texttt{<}, \texttt{>}, \texttt{p}, \texttt{m} or \texttt{b} have
+% ^^A been forgotten. So we report an error and ignore the last
+% ^^A \textsf{token}.
+% \begin{macrocode}
+ % \else \@preamerr \@ne \fi
+% \end{macrocode}
+% ^^A Now that the build-up of the preamble is almost finished we can
+% ^^A insert the \textsf{token} registers and therefore redefine
+% ^^A \verb=\the@toks=. The actual insertion, though, is performed
+% ^^A later.
+% \begin{macrocode}
+ % \def\the@toks{\the\toks}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The macros \texttt{\textbackslash @classz}
+% ^^A to \texttt{\textbackslash @classx}}
+% ^^A
+% ^^A The preamble is extended by the macros \verb=\@classz= to
+% ^^A \verb=\@classx= which are called by \verb=\@mkpream=
+% ^^A depending on \verb=\@lastchclass=
+% ^^A (i.e. the character class of the last \textsf{token}).
+% ^^A \begin{macro}{\@classx}
+% ^^A First we define =\@classx= because of its important r\^ole.
+% ^^A When it is called we find that the current
+% ^^A \textsf{token} is \texttt{p}, \texttt{m} or \texttt{b}.
+% ^^A That means that a new column has to start.
+% \begin{macrocode}
+ % \def\@classx{%
+% \end{macrocode}
+% ^^A Depending on the value of \verb=\@lastchclass= different actions
+% ^^A must take place:
+% \begin{macrocode}
+ % \ifcase \@lastchclass
+% \end{macrocode}
+% ^^A If the last character class was $0$ we separate the columns by
+% ^^A \verb=\hskip\col@sep= followed by \verb=&= and another
+% ^^A \verb=\hskip\col@sep=.
+% \begin{macrocode}
+ % \@acolampacol \or
+% \end{macrocode}
+% ^^A If the last class was class $1$ --- that means that a vertical
+% ^^A line was
+% ^^A drawn, --- before this line a \verb=\hskip\col@sep= was inserted.
+% ^^A Therefore there has to be only a \verb=&= followed by
+% ^^A \verb=\hskip\col@sep=. But this \verb=&= may be inserted only
+% ^^A if this is not the first column. This process is controlled
+% ^^A by \verb=\if@firstamp= in the macro \verb=\addamp=.
+% \begin{macrocode}
+ % \@addamp \@acol \or
+% \end{macrocode}
+% ^^A Class $2$ is treated like class $0$ because \verb=<{...}= can only
+% ^^A follow after class $0$.
+% \begin{macrocode}
+ % \@acolampacol \or
+% \end{macrocode}
+% ^^A Class $3$ requires no actions because all things necessary have
+% ^^A been done by the preamble \textsf{token} \texttt{>}.
+% \begin{macrocode}
+ % \or
+% \end{macrocode}
+% ^^A Class $4$ means that we are at the beginning of the preamble.
+% ^^A Therefore we start the preamble with \verb=\hskip\col@sep= and
+% ^^A then call \verb=\@firstampfalse=. This makes sure that a later
+% ^^A \verb=\@addamp= inserts the character
+% ^^A \verb=&= into the preamble.
+% \begin{macrocode}
+ % \@acol \@firstampfalse \or
+% \end{macrocode}
+% ^^A For class $5$ \textsf{tokens} only the character \verb=&= is inserted
+% ^^A as a column separator. Therefore we call \verb=\@addamp=.
+% \begin{macrocode}
+ % \@addamp
+% \end{macrocode}
+% ^^A Other cases are impossible. For an example
+% ^^A $\verb=\@lastchclass= = 6$---as it might appear in a
+% ^^A preamble of the form \verb=...!p...=---\texttt{p} would have
+% ^^A been taken as an argument of \texttt{!}\ by \verb=\@testpach=.
+% \begin{macrocode}
+ % \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classz}
+% ^^A If the character class of the last \textsf{token} is $0$ we have
+% ^^A \texttt{c}, \texttt{l}, \texttt{r} or an argument of \texttt{m},
+% ^^A \texttt{b} or\ \texttt{p}. In the first three cases the preamble
+% ^^A must be extended the same way as if we had class $10$. The
+% ^^A remaining two cases do not require any action because the space
+% ^^A needed was generated by the last \textsf{token} (i.e.\
+% ^^A \texttt{m}, \texttt{b} or \texttt{p}). Since \verb=\@lastchclass= has
+% ^^A the value $10$ at this point nothing happens when \verb=\@classx= is
+% ^^A called. So the macro \verb=\@chlassz= may start like this:
+% \begin{macrocode}
+ % \def\@classz{\@classx
+% \end{macrocode}
+% ^^A According to the definition of \verb=\insert@column= we must store
+% ^^A the number of the \textsf{token} register in which a preceding
+% ^^A \verb=>{..}= might have stored its argument into
+% ^^A \verb=\@tempcnta=.
+% \begin{macrocode}
+ % \@tempcnta \count@
+% \end{macrocode}
+% ^^A To have $\verb=\count@= = \verb=\@tmpcnta= + 1$ we prepare
+% ^^A the next \textsf{token} register.
+% \begin{macrocode}
+ % \prepnext@tok
+% \end{macrocode}
+% ^^A Now the preamble must be extended with the column whose format
+% ^^A can be determined by \verb=\@chnum=.
+% \begin{macrocode}
+ % \@addtopreamble{\ifcase \@chnum
+% \end{macrocode}
+% ^^A If \verb=\@chnum= has the value $0$ a centered column has to be
+% ^^A generated.
+% ^^A So we begin with stretchable space.
+% \begin{macrocode}
+ % \hfil
+% \end{macrocode}
+% ^^A The command \verb=\d@llarbegin= follows expanding into \verb=\begingroup=
+% ^^A (in the \textsf{tabular}--environment) or into \verb=$=. Doing this
+% ^^A (provided an appropriate setting of \verb=\d@llarbegin=) we achieve
+% ^^A that the contents of the columns of an \textsf{array}--environment
+% ^^A are set in math mode while those of a \textsf{tabular}--environment
+% ^^A are set in LR mode.
+% \begin{macrocode}
+ % \d@llarbegin
+% \end{macrocode}
+% ^^A Now we insert the contents of the two \textsf{token} registers
+% ^^A and the symbol
+% ^^A for the column entry (i.e.\ \verb=#= or
+% ^^A more precise \verb=\@sharp=) using \verb=\insert@column=.
+% \begin{macrocode}
+ % \insert@column
+% \end{macrocode}
+% ^^A We end this case with \verb=\d@llarend= and \verb=\hfil= where \verb=\d@llarend=
+% ^^A again is either \verb=$= or \verb=\endgroup=.
+% \begin{macrocode}
+ % \d@llarend \hfil \or
+% \end{macrocode}
+% ^^A The templates for \texttt{l} and \texttt{r} (i.e.\ \verb=\@chnum= $1$
+% ^^A or $2$) are generated the same way. Since one \verb=\hfil= is
+% ^^A missing the text is moved to the relevant side.
+% ^^A The \verb=\kern\z@= is needed in case of an empty column
+% ^^A entry. Otherwise
+% ^^A the \verb=\unskip= in \verb=\insert@column= removes the
+% ^^A \verb=\hfil=. Changed to \verb=\hskip1sp= so that it interacts better with
+% ^^A \verb=\@bsphack=.
+% \begin{macrocode}
+ % \hskip1sp\d@llarbegin \insert@column \d@llarend \hfil \or
+ % \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \or
+% \end{macrocode}
+% ^^A The templates for \texttt{p}, \texttt{m} and \texttt{b} mainly
+% ^^A consist of a \textsf{box}. In case of \texttt{m} it is generated
+% ^^A by \verb=\vcenter=. This command is allowed only in math
+% ^^A mode. Therefore we start with a~\verb=$=.
+% \begin{macrocode}
+ % $\vcenter%$ emacs
+% \end{macrocode}
+% ^^A The part of the templates which is the same in all three cases
+% ^^A (\texttt{p}, \texttt{m} and \texttt{b})
+% ^^A is built by the macros \verb=\@startpbox= and
+% ^^A \verb=\@endpbox=. \verb=\@startpbox= has an argument:
+% ^^A the width of the column which is stored in the current
+% ^^A \textsf{token} (i.e.\ \verb=\@nextchar=).
+% ^^A Between these two macros we find the well known
+% ^^A \verb=\insert@column=.
+% \begin{macrocode}
+ % \@startpbox{\@nextchar}\insert@column \@endpbox $\or%$ emacs
+% \end{macrocode}
+% ^^A The templates for \texttt{p} and \texttt{b} are generated in the
+% ^^A same way though we do not need the \verb=$= characters because we use
+% ^^A \verb=\vtop= or \verb=\vbox=.
+% \begin{macrocode}
+ % \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+ % \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
+% \end{macrocode}
+% ^^A Other values for \verb=\@chnum= are impossible. Therefore we
+% ^^A end the arguments to \verb=\@addtopreamble= and \verb=\ifcase=.
+% ^^A Before we come to the end of \verb=\@classz= we have to
+% ^^A prepare the next \textsf{token} register.
+% \begin{macrocode}
+ % \fi}\prepnext@tok}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classix}
+% ^^A In case of class $9$ (\texttt{>}--\textsf{token}) we first check
+% ^^A if the character class of the last
+% ^^A \textsf{token} was $3$. In this case we have a
+% ^^A user preamble of the form \verb=..>{...}>{...}..= which
+% ^^A is not allowed. We only give an error message and continue.
+% ^^A So the declarations defined by the first \verb=>{...}=
+% ^^A are ignored.
+% \begin{macrocode}
+ % \def\@classix{\ifnum \@lastchclass = \thr@@
+ % \@preamerr \thr@@ \fi
+% \end{macrocode}
+% ^^A Furthermore, we call up \verb=\@class10= because afterwards always a
+% ^^A new column is started by \texttt{c}, \texttt{l}, \texttt{r},
+% ^^A \texttt{p}, \texttt{m} or \texttt{b}.
+% \begin{macrocode}
+ % \@classx}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classviii}
+% ^^A If the current \textsf{token} is a \texttt{<} the last character
+% ^^A class must be $0$. In this case it is not necessary to extend the
+% ^^A preamble. Otherwise we output an error message, set \verb=\@chclass=
+% ^^A to $6$ and call \verb=\@classvi=. By doing this we achieve that
+% ^^A \texttt{<} is treated like \texttt{!}.
+% \begin{macrocode}
+ % \def\@classviii{\ifnum \@lastchclass >\z@
+ % \@preamerr 4\@chclass 6 \@classvi \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@arrayrule}
+% ^^A There is only one incompatibility with the original definition:
+% ^^A the definition of \verb=\@arrayrule=. In the original a line without
+% ^^A width\footnote{So the space between \texttt{cc} and \texttt{c|c}
+% ^^A is equal.} is created by multiple insertions of
+% ^^A \verb=\hskip .5\arrayrulewidth=.
+% ^^A We only insert a vertical line into the
+% ^^A preamble. This is done to prevent problems with \TeX's main
+% ^^A memory when generating tables with many vertical lines in them
+% ^^A (especially in the case of \textsf{floats}).
+% \begin{macrocode}
+ % \def\@arrayrule{\@addtopreamble \vline}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classvii}
+% ^^A As a consequence it follows that in case of class $7$
+% ^^A (\verb=@= \textsf{token}) the preamble need not to be extended.
+% ^^A In the original definition $\verb=\@lastchclass= = 1$
+% ^^A is treated by inserting \verb=\hskip .5\arrayrulewidth=.
+% ^^A We only check if the last \textsf{token} was of class $3$ which is
+% ^^A forbidden.
+% \begin{macrocode}
+ % \def\@classvii{\ifnum \@lastchclass = \thr@@
+% \end{macrocode}
+% ^^A If this is true we output an error message and
+% ^^A ignore the declarations stored
+% ^^A by the last \verb=>{...}=, because these are overwritten
+% ^^A by the argument of \texttt{@}.
+% \begin{macrocode}
+ % \@preamerr \thr@@ \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classvi}
+% ^^A If the current \textsf{token} is a regular \texttt{!}\ and the
+% ^^A last class was $0$ or $2$ we extend the preamble with
+% ^^A \verb=\hskip\col@sep=. If the last \textsf{token} was of class $1$
+% ^^A (for instance \texttt{|}) we extend with \verb=\hskip \doublerulesep=
+% ^^A because the construction \verb=!{...}= has to be treated like
+% ^^A \texttt{|}.
+% \begin{macrocode}
+ % \def\@classvi{\ifcase \@lastchclass
+ % \@acol \or
+ % \@addtopreamble{\hskip \doublerulesep}\or
+ % \@acol \or
+% \end{macrocode}
+% ^^A Now \verb=\@preamerr...= should follow because a
+% ^^A user preamble of the form \verb=..>{..}!.= is not allowed.
+% ^^A To save memory we call \verb=\@classvii= instead which also
+% ^^A does what we want.
+% \begin{macrocode}
+ % \@classvii
+% \end{macrocode}
+% ^^A If \verb=\@lastchclass= is $4$ or $5$ nothing has to be done.
+% ^^A Class $6$ to $10$ are not possible.
+% ^^A So we finish the macro.
+% \begin{macrocode}
+ % \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classii}
+% ^^A \begin{macro}{\@classiii}
+% ^^A In the case of character classes $2$ and $3$ (i.e.\ the argument
+% ^^A of \texttt{<} or \texttt{>}) we only have to store the current
+% ^^A \textsf{token} (\verb=\@nextchar=) into the corresponding
+% ^^A \textsf{token} register since the preparation and
+% ^^A insertion of these registers
+% ^^A are done by the macro \verb=\@classz=.
+% ^^A This is equivalent to calling \verb=\save@decl= in the case of
+% ^^A class $3$. To save command identifiers we do this call up
+% ^^A in the macro \verb=\@mkpream=.
+% ^^A
+% ^^A Class $2$ exhibits a more complicated situation: the
+% ^^A \textsf{token} registers have already been inserted by
+% ^^A \verb=\@classz=. So the value of \verb=\count@= is too high
+% ^^A by one. Therefore we decrease \verb=\count@= by $1$.
+% \begin{macrocode}
+ % \def\@classii{\advance \count@ \m@ne
+% \end{macrocode}
+% ^^A Next we store the current \textsf{token} into the correct
+% ^^A \textsf{token} register by calling \verb=\save@decl= and then
+% ^^A increase the value of \verb=\count@= again. At this point we
+% ^^A can save memory once more (at the cost of time) if we use the
+% ^^A macro \verb=\prepnext@tok=.
+% \begin{macrocode}
+ % \save@decl\prepnext@tok}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classv}
+% ^^A If the current \textsf{token} is of class $5$ then it is an
+% ^^A argument of a \texttt{@} \textsf{token}. It must be stored into a
+% ^^A \textsf{token} register.
+% \begin{macrocode}
+ % \def\@classv{\save@decl
+% \end{macrocode}
+% ^^A We extend the preamble with a command which inserts this
+% ^^A \textsf{token} register into the preamble when its construction
+% ^^A is finished. The user expects that this argument is worked out in
+% ^^A math mode if it was used in an
+% ^^A \textsf{array}--environment. Therefore we surround it with
+% ^^A \verb=\d@llar...='s.
+% \begin{macrocode}
+ % \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+% \end{macrocode}
+% ^^A Finally we must prepare the next \textsf{token} register.
+% \begin{macrocode}
+ % \prepnext@tok}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classi}
+% ^^A In the case of class $0$ we were able to generate the necessary
+% ^^A space between columns by using the macro \verb=\@classx=.
+% ^^A Analogously the macro \verb=\@classvi= can be used for class $1$.
+% \begin{macrocode}
+ % \def\@classi{\@classvi
+% \end{macrocode}
+% ^^A Depending on \verb=\@chnum= a vertical line
+% \begin{macrocode}
+ % \ifcase \@chnum \@arrayrule \or
+% \end{macrocode}
+% ^^A or (in case of \verb=!{...}=) the current \textsf{token} --- stored
+% ^^A in \verb=\@nextchar= --- has to be inserted into the preamble.
+% ^^A This corresponds to calling \verb=\@classv=.
+% \begin{macrocode}
+ % \@classv \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@startpbox}
+% ^^A In \verb=\@classz= the macro \verb=\@startpbox= is used.
+% ^^A The width of the \textsf{parbox} is passed as an argument.
+% ^^A \verb=\vcenter=, \verb=\vtop= or \verb=\vbox= are already in the
+% ^^A preamble. So we start with the braces for the wanted box.
+% \begin{macrocode}
+ % \def\@startpbox#1{\bgroup
+% \end{macrocode}
+% ^^A The argument is the width of the box. This information has to be
+% ^^A assigned to \verb=\hsize=.
+% ^^A Then we assign default values to several parameters used in a
+% ^^A \textsf{parbox}.
+% \begin{macrocode}
+ % \setlength\hsize{#1}\@arrayparboxrestore
+% \end{macrocode}
+% ^^A Our main problem is to obtain the same distance between succeeding
+% ^^A lines of the \textsf{parbox}.
+% ^^A We have to remember that the distance between two \textsf{parboxes}
+% ^^A should be defined by \verb=\@arstrut=. That means that it can be
+% ^^A greater than the distance in a \textsf{parbox}.
+% ^^A Therefore it is not enough to set a \verb=\@arstrut= at the
+% ^^A beginning and at the end of the \textsf{parbox}. This would
+% ^^A dimension the distance
+% ^^A between first and second line and the distance between the two
+% ^^A last lines of the \textsf{parbox} wrongly.
+% ^^A To prevent this we set an invisible rule of height
+% ^^A \verb=\@arstrutbox=
+% ^^A at the beginning of the \textsf{parbox}. This has no effect on the
+% ^^A depth of the first line. At the end of the \textsf{parbox} we set
+% ^^A analogously another invisible rule which only affects the depth
+% ^^A of the last line. It is necessary to wait inserting this strut
+% ^^A until the paragraph actually starts to allow for things like
+% ^^A \verb=\parindent= changes via \verb=>{...}=.
+% \begin{macrocode}
+ % \everypar{%
+ % \vrule \@height \ht\@arstrutbox \@width \z@
+ % \everypar{}}%
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@endpbox}
+% ^^A If there are any declarations defined by \verb=>{...}=
+% ^^A and \verb=<{...}=
+% ^^A they now follow in the macro \verb=\@classz= --- the contents
+% ^^A of the column in between.
+% ^^A So the macro \verb=\@endpbox= must insert the \textsf{specialstrut}
+% ^^A mentioned earlier and then close the group opened by
+% ^^A \verb=\@startpbox=.
+% \begin{macrocode}
+ % \def\@endpbox{\@finalstrut\@arstrutbox \egroup\hfil}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Building and calling \texttt{\textbackslash halign}}
+% ^^A
+% ^^A \begin{macro}{\@array}
+% ^^A After we have discussed the macros needed for the evaluation
+% ^^A of the user preamble we can define the macro \verb=\@array=
+% ^^A which uses these macros to create a \verb=\halign=.
+% ^^A It has two arguments. The first one is a position argument
+% ^^A which can be \texttt{t}, \texttt{b} or \texttt{c}; the
+% ^^A second one describes the wanted preamble,
+% ^^A e.g.\ it has the form \verb=|c|c|c|=.
+% \begin{macrocode}
+ % \def\@array[#1]#2{%
+% \end{macrocode}
+% ^^A First we define a \textsf{strut} whose size basically corresponds
+% ^^A to a normal \textsf{strut} multiplied by the factor
+% ^^A \verb=\arraystretch=.
+% ^^A This \textsf{strut} is then inserted into every row and enforces
+% ^^A a minimal distance between two rows.
+% ^^A Nevertheless, when using horizontal lines, large letters
+% ^^A (like accented capital letters) still collide with such lines.
+% ^^A Therefore at first we add to the height of a normal \textsf{strut}
+% ^^A the value of the parameter \verb=\extrarowheight=.
+% \begin{macrocode}
+ % \@tempdima \ht \strutbox
+ % \advance \@tempdima by\extrarowheight
+ % \setbox \@arstrutbox \hbox{\vrule
+ % \@height \arraystretch \@tempdima
+ % \@depth \arraystretch \dp \strutbox
+ % \@width \z@}%
+% \end{macrocode}
+% ^^A Then we open a group, in which the user preamble is evaluated by
+% ^^A the macro \verb=\@mkpream=. As we know this must happen locally.
+% ^^A This macro creates a preamble for a \verb=\halign= and saves
+% ^^A its result globally in the control sequence \verb=\@preamble=.
+% \begin{macrocode}
+ % \begingroup
+ % \@mkpream{#2}%
+% \end{macrocode}
+% ^^A We again redefine \verb=\@preamble= so that a call up of \verb=\@preamble=
+% ^^A now starts the \verb=\halign=. Thus also the arguments of \texttt{>},
+% ^^A \texttt{<}, \texttt{@} and \texttt{!}, saved in the
+% ^^A \textsf{token} registers are inserted into the preamble. The
+% ^^A \verb=\tabskip= at the beginning and end of the preamble is set to
+% ^^A \textsf{0pt} (in the beginning by the use of \verb=\ialign=). Also the
+% ^^A command \verb=\@arstrut= is build in, which inserts the
+% ^^A \verb=\@arstrutbox=, defined above. Of course, the opening brace after
+% ^^A \verb=\ialign= has to be implicit as it will be closed in \verb=\endarray=
+% ^^A or another macro.
+% ^^A
+% ^^A The \verb=\noexpand= in front of \verb=\ialign= does no harm in standard \LaTeX{}
+% ^^A and was added since some experimental support for using text glyphs in math
+% ^^A redefines \verb=\halign= with the result that is becomes expandable with
+% ^^A disastrous results in cases like this.
+% ^^A In the kernel definition for this macro the problem does
+% ^^A not surface because there \verb=\protect= is set (which is not necessary in this
+% ^^A implementation as there is no arbitrary user input that can get expanded) and
+% ^^A the experimental code made the redefinition robust. Whether this is the right
+% ^^A approach is open to question; consider the \verb=\noexpand= a courtesy to allow an
+% ^^A unsupported redefinition of a \TeX{} primitive for the moment (as people rely
+% ^^A on that experimental code).
+% \begin{macrocode}
+ % \xdef\@preamble{\noexpand \ialign \@halignto
+ % \bgroup \@arstrut \@preamble
+ % \tabskip \z@ \cr}%
+% \end{macrocode}
+% ^^A What we have not explained yet is the macro \verb=\@halignto=
+% ^^A that was just used. Depending on its replacement text the
+% ^^A \verb=\halign= becomes a \verb=\halign= \texttt{to} \meta{dimen}.
+% ^^A Now we close the group again. Thus
+% ^^A \verb=\@startpbox= and \verb=\@endpbox= as well as all
+% ^^A \textsf{token} registers get their former meaning back.
+% \begin{macrocode}
+ % \endgroup
+% \end{macrocode}
+% ^^A To support the \texttt{delarray.sty} package we include a hook
+% ^^A into this part of the code which is a no-op in the main package.
+% \begin{macrocode}
+ % \@arrayleft
+% \end{macrocode}
+% ^^A Now we decide depending on the position argument in which
+% ^^A \textsf{box} the \verb=\halign= is to be put. (\verb=\vcenter= may be used
+% ^^A because we are in math mode.)
+% \begin{macrocode}
+ % \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+% \end{macrocode}
+% ^^A Now another implicit opening brace appears; then definitions
+% ^^A which shall stay local follow. While constructing the
+% ^^A \verb=\@preamble= in \verb=\@mkpream= the \verb=#= sign must be
+% ^^A hidden in the macro \verb=\@sharp= which is \verb=\let= to
+% ^^A \verb=\relax= at that moment (see definition of \verb=\@mkpream=
+% ^^A on page~\pageref{@mkpream}).
+% ^^A All these now get their actual meaning.
+% \begin{macrocode}
+ % \bgroup
+ % \let \@sharp ##\let \protect \relax
+% \end{macrocode}
+% ^^A With the above defined \textsf{struts} we fix down the distance
+% ^^A between rows by setting \verb=\lineskip= and \verb=\baselineskip=
+% ^^A to \textsf{0pt}. Since there have to be set \verb=$='s
+% ^^A around every column in the \textsf{array}--environment
+% ^^A the parameter \verb=\mathsurround= should
+% ^^A also be set to \textsf{0pt}. This prevents additional space between
+% ^^A the rows. The
+% ^^A \PlainTeX--macro \verb=\m@th= does this.
+% \begin{macrocode}
+ % \lineskip \z@
+ % \baselineskip \z@
+ % \m@th
+% \end{macrocode}
+% ^^A Beside, we have to assign a special meaning (which we still have
+% ^^A to specify) to the line separator \verb=\\=. We also have to
+% ^^A redefine the command \verb=\par= in such a way that empty lines in
+% ^^A \verb=\halign= cannot do any damage. We succeed in doing so
+% ^^A by choosing something that will disappear when expanding.
+% ^^A After that we only have to call up \verb=\@preamble= to
+% ^^A start the wanted \verb=\halign=.
+% \begin{macrocode}
+ % \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\arraybackslash}
+% ^^A Restore \verb=\\= for use in array and tabular environment (after
+% ^^A \verb=\raggedright= etc.).
+% \begin{macrocode}
+ % \def\arraybackslash{\let\\\tabularnewline}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\extrarowheight}
+% ^^A The \textsf{dimen} parameter used above also needs to be
+% ^^A allocated. As a default value we use \textsf{0pt}, to ensure
+% ^^A compatibility with standard \LaTeX.
+% \begin{macrocode}
+ % \newdimen \extrarowheight
+ % \extrarowheight=0pt
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@arstrut}
+% ^^A Now the insertion of \verb=\@arstrutbox= through \verb=\@arstut=
+% ^^A is easy since we know exactly in which mode \TeX\ is while working
+% ^^A on the \verb=\halign= preamble.
+% \begin{macrocode}
+ % \def\@arstrut{\unhcopy\@arstrutbox}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The line separator \texttt{\textbackslash\textbackslash}}
+% ^^A
+% ^^A \begin{macro}{\@arraycr}
+% ^^A In the macro \verb=\@array= the line separator \verb=\\= is
+% ^^A \verb=\let= to the command \verb=\@arraycr=.
+% ^^A Its definition starts with a special brace which I have directly
+% ^^A copied from the original definition. It is
+% ^^A necessary, because the \verb=\futurlet= in \verb=\@ifnextchar=
+% ^^A might
+% ^^A expand a following \verb=&= \textsf{token} in a construction like
+% ^^A \verb=\\ &=. This would otherwise end the alignment template at a
+% ^^A wrong time. On the other hand we have to be careful to avoid
+% ^^A producing a real group, i.e.\ \verb={}=, because the command will also
+% ^^A be used for the array environment, i.e.\ in math mode. In that
+% ^^A case an extra \verb={}= would produce an ord atom which could mess up
+% ^^A the spacing. For this reason we use a combination that does not
+% ^^A really produce a group at all but modifies the master counter so
+% ^^A that a \verb=&= will not be considered belonging to the current
+% ^^A \verb=\halign= while we are looking for a \verb=*= or \verb=[=.
+% ^^A For further information see
+% ^^A \cite[Appendix D]{bk:knuth}.
+% \begin{macrocode}
+ % \def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+% \end{macrocode}
+% ^^A Then we test whether the user is using the star form and ignore
+% ^^A a possible star (I also disagree with this procedure, because a
+% ^^A star does not make any sense here).
+% \begin{macrocode}
+ % \@ifstar \@xarraycr \@xarraycr}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xarraycr}
+% ^^A In the command \verb=\@xarraycr= we test if an optional argument
+% ^^A exists.
+% \begin{macrocode}
+ % \def\@xarraycr{\@ifnextchar [%
+% \end{macrocode}
+% ^^A If it does, we branch out into the macro \verb=\@argarraycr= if
+% ^^A not we close the special brace (mentioned above) and end the row
+% ^^A of the \verb=\halign= with a \verb=\cr=.
+% \begin{macrocode}
+ % \@argarraycr {\ifnum 0=`{}\fi\cr}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@argarraycr}
+% ^^A If additional space is requested by the user this case is treated
+% ^^A in the macro \verb=\@argarraycr=. First we close the special brace
+% ^^A and then we test if the additional space is positive.
+% \begin{macrocode}
+ % \def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+% \end{macrocode}
+% ^^A If this is the case we create an invisible vertical rule with
+% ^^A depth \verb=\dp\@arstutbox=${}+{}$\meta{wanted\ space}.
+% ^^A Thus we achieve that all vertical lines specified
+% ^^A in the user preamble by a \texttt{|} are now
+% ^^A generally drawn.
+% ^^A Then the row ends with a \verb=\cr=.
+% ^^A
+% ^^A If the space is negative we end the row at once with a \verb=\cr=
+% ^^A and move back up with a \verb=\vskip=.
+% ^^A
+% ^^A While testing these macros I found out that the
+% ^^A \verb=\endtemplate=
+% ^^A created by \verb=\cr= and \verb=&= is something like an
+% ^^A \verb=\outer= primitive and therefore it should not appear in
+% ^^A incomplete \verb=\if= statements. Thus the following solution was
+% ^^A chosen which hides the \verb=\cr= in other macros when \TeX\
+% ^^A is skipping conditional text.
+% \begin{macrocode}
+ % \expandafter\@xargarraycr\else
+ % \expandafter\@yargarraycr\fi{#1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xargarraycr}
+% ^^A \begin{macro}{\@yargarraycr}
+% ^^A The following macros were already explained above.
+% \begin{macrocode}
+ % \def\@xargarraycr#1{\unskip
+ % \@tempdima #1\advance\@tempdima \dp\@arstrutbox
+ % \vrule \@depth\@tempdima \@width\z@ \cr}
+ % \def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Spanning several columns}
+% ^^A
+% ^^A \begin{macro}{\multicolumn}
+% ^^A If several columns should be held together with a special format
+% ^^A the command \verb=\multicolumn= must be used. It has three
+% ^^A arguments: the number of columns to be covered; the format for
+% ^^A the result column and the actual column entry.
+% \begin{macrocode}
+ % \long\def\multicolumn#1#2#3{%
+% \end{macrocode}
+% ^^A First we combine the given number of columns into a single one;
+% ^^A then we start a new block so that the following definition is kept
+% ^^A local.
+% \begin{macrocode}
+ % \multispan{#1}\begingroup
+% \end{macrocode}
+% ^^A Since a \verb=\multicolumn= should only describe the format of a
+% ^^A result column, we redefine \verb=\@addamp= in such a way that one gets
+% ^^A an error message if one uses more than one \texttt{c},
+% ^^A \texttt{l}, \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in
+% ^^A the second argument. One should consider that this definition is
+% ^^A local to the build-up of the preamble; an \textsf{array}-- or
+% ^^A \textsf{tabular}--environment in the third argument of the
+% ^^A \verb=\multicolumn= is therefore worked through correctly as well.
+% \begin{macrocode}
+ % \def\@addamp{\if@firstamp \@firstampfalse \else
+ % \@preamerr 5\fi}%
+% \end{macrocode}
+% ^^A Then we evaluate the second argument with the help of
+% ^^A \verb=\@mkpream=.
+% ^^A Now we still have to insert the contents of the \textsf{token}
+% ^^A register into the \verb=\@preamble=, i.e.\ we have to say
+% ^^A \verb=\xdef\@preamble{\@preamble}=. This is achieved shorter by
+% ^^A writing:
+% \begin{macrocode}
+ % \@mkpream{#2}\@addtopreamble\@empty
+% \end{macrocode}
+% ^^A After the \verb=\@preamble= is created we forget all local
+% ^^A definitions and occupations of the \textsf{token} registers.
+% \begin{macrocode}
+ % \endgroup
+% \end{macrocode}
+% ^^A In the special situation of \verb=\multicolumn= \verb=\@preamble=
+% ^^A is not needed as preamble for a \verb=\halign= but it is directly
+% ^^A inserted into our table. Thus instead of \verb=\sharp=
+% ^^A there has to be the column entry (\verb=#3=) wanted by the user.
+% \begin{macrocode}
+ % \def\@sharp{#3}%
+% \end{macrocode}
+% ^^A Now we can pass the \verb=\@preamble= to \TeX\ . For safety
+% ^^A we start with an \verb=\@arstrut=. This should usually be in the
+% ^^A template for the first column however we do not know if this
+% ^^A template was overwritten by our \verb=\multicolumn=.
+% ^^A We also add a \verb=\null= at the right end to prevent any following
+% ^^A \verb=\unskip= (for example from \verb=\\[..]=) to remove the \verb=\tabcolsep=.
+% \begin{macrocode}
+ % \@arstrut \@preamble
+ % \null
+ % \ignorespaces}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The Environment Definitions}
+% ^^A
+% ^^A After these preparations we are able to define the environments. They
+% ^^A only differ in the initialisations of \verb=\d@llar...=, \verb=\col@sep=
+% ^^A and \verb=\@halignto=.
+% ^^A
+% ^^A \begin{macro}{\@halignto}
+% ^^A \begin{macro}{\d@llarbegin}
+% ^^A \begin{macro}{\d@llarend}
+% ^^A \verb=\d@llar= has to be
+% ^^A locally asigned since otherwise nested \textsf{tabular} and \textsf{array}
+% ^^A environments (via \verb=\multicolumn=) are impossible.
+% ^^A For 25 years or so \verb=\@halignto= was set globally (to save space on the
+% ^^A save stack, but that was a mistake: if there is a tabular in the
+% ^^A output routine (e.g., in the running header) then that tabular is
+% ^^A able overwrite the \verb=\@halignto=
+% ^^A setting of a tabular in the main text resulting in a very weird error.
+% ^^A When the new font selection scheme is in force we have to
+% ^^A we surround all \verb=\halign= entries
+% ^^A with braces. See remarks in TUGboat 10\#2. Actually we are going
+% ^^A to use \verb=\begingroup= and \verb=\endgroup=. However, this is only
+% ^^A necessary when we are in text mode. In math the surrounding
+% ^^A dollar signs will already serve as the necessary extra grouping
+% ^^A level. Therefore we switch the settings of \verb=\d@llarbegin= and
+% ^^A \verb=\d@llarend= between groups and dollar signs.
+% \begin{macrocode}
+ % \let\d@llarbegin\begingroup
+ % \let\d@llarend\endgroup
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\array}
+% ^^A Our new definition of \verb=\array= then reads:
+% \begin{macrocode}
+ % \def\array{\col@sep\arraycolsep
+ % \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%$ emacs
+% \end{macrocode}
+% ^^A Since there might be an optional argument we call another
+% ^^A macro which is also used by the other environments.
+% \begin{macrocode}
+ % \@tabarray}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@tabarray}
+% ^^A This macro tests for a optional bracket and then calls up
+% ^^A \verb=\@array= or \verb=\@array[c]= (as default).
+% \begin{macrocode}
+ % \def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\tabular}
+% ^^A \begin{macro}{\tabular*}
+% ^^A The environments \textsf{tabular} and \textsf{tabular$*$} differ
+% ^^A only in the initialisation of the command \verb=\@halignto=. Therefore
+% ^^A we define
+% \begin{macrocode}
+ % \def\tabular{\def\@halignto{}\@tabular}
+% \end{macrocode}
+% ^^A and analogously for the star form. We evaluate the argument first
+% ^^A using =\setlength= so that users of the \texttt{calc} package can
+% ^^A write code like\\ \verb=\begin{tabular*}{(\columnwidth-1cm)/2}...=
+% ^^A \begin{macrocode}
+ % \expandafter\def\csname tabular*\endcsname#1{%
+ % \setlength\dimen@{#1}%
+ % \edef\@halignto{to\the\dimen@}\@tabular}
+% ^^A \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@tabular}
+% ^^A The rest of the job is carried out by the \verb=\@tabular= macro:
+% \begin{macrocode}
+ % \def\@tabular{%
+% \end{macrocode}
+% ^^A First of all we have to make sure that we start out in
+% ^^A \textsf{hmode}. Otherwise we might find our table dangling by
+% ^^A itself on a line.
+% \begin{macrocode}
+ % \leavevmode
+% \end{macrocode}
+% ^^A It should be taken into consideration that the macro \verb=\@array=
+% ^^A must be called in math mode. Therefore we open a \textsf{box},
+% ^^A insert a \verb=$= and then assign the correct values to \verb=\col@sep= and
+% ^^A \verb=\d@llar...=.
+% \begin{macrocode}
+ % \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup% $ emacs
+ % \let\d@llarend\endgroup
+% \end{macrocode}
+% ^^A Now everything \textsf{tabular} specific is done and we are able to
+% ^^A call the \verb=\@tabarray= macro.
+% \begin{macrocode}
+ % \@tabarray}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endarray}
+% ^^A When the processing of \textsf{array} is finished we have to
+% ^^A close the \verb=\halign=
+% ^^A and afterwards the surrounding \textsf{box} selected by
+% ^^A \verb=\@array=. To save \textsf{token} space we then redefine
+% ^^A \verb=\@preamble=
+% ^^A because its replacement text isn't longer needed.
+% \begin{macrocode}
+ % \def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endtabular}
+% ^^A \begin{macro}{\endtabular*}
+% ^^A To end a \textsf{tabular} or \textsf{tabular$*$} environment we
+% ^^A call up \verb=\endarray=, close the math mode and then the surrounding
+% ^^A \verb=\hbox=.
+% \begin{macrocode}
+ % \def\endtabular{\endarray $\egroup}%$ emacs
+ % \expandafter\let\csname endtabular*\endcsname=\endtabular
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Last minute definitions}
+% ^^A
+% ^^A
+% ^^A If this file is used as a package file we should \verb=\let= all macros
+% ^^A to \verb=\relax= that were used in the original but are no longer
+% ^^A necessary.
+% \begin{macrocode}
+ % \let\@ampacol=\relax \let\@expast=\relax
+ % \let\@arrayclassiv=\relax \let\@arrayclassz=\relax
+ % \let\@tabclassiv=\relax \let\@tabclassz=\relax
+ % \let\@arrayacol=\relax \let\@tabacol=\relax
+ % \let\@tabularcr=\relax \let\@@endpbox=\relax
+ % \let\@argtabularcr=\relax \let\@xtabularcr=\relax
+% \end{macrocode}
+% ^^A
+% ^^A \begin{macro}{\@preamerr}
+% ^^A We also have to redefine the error routine \verb=\@preamerr= since
+% ^^A new kind of errors are possible.
+% ^^A The code for this macro is not perfect yet;
+% ^^A it still needs too much memory.
+% \begin{macrocode}
+ % \def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
+ % %\PackageError{array}{%
+ % \ClassError{memoir}{% changed in menoir
+ % \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
+ % Missing arg: token ignored\or %1
+ % Empty preamble: `l' used\or %2
+ % >\@tempd token ignored\or %3
+ % <\@tempd changed to !{..}\or %4
+ % Only one column-spec. allowed.\fi}\@ehc} %5
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection
+% ^^A [Defining your own column specifiers]
+% ^^A {Defining your own column specifiers\footnotemark}
+% ^^A
+% ^^A \footnotetext{The code and the documentation in this section was
+% ^^A written by David. So far only the code from newarray was plugged
+% ^^A into array so that some parts of the documentation still claim
+% ^^A that this is newarray and even worse, some parts of the code are
+% ^^A unnecessarily doubled. This will go away in a future release. For
+% ^^A the moment we thought it would be more important to bring both
+% ^^A packages together.}
+% ^^A
+% ^^A \begin{macro}{\newcolumn}
+% ^^A In \texttt{newarray.sty} the macro for specifying new columns was
+% ^^A named \verb"\newcolumn". When the functionality was added to
+% ^^A \texttt{array.sty} the command was renamed \verb"\newcolumntype".
+% ^^A Initially both names were supported, but now (In versions of this
+% ^^A package distributed for \LaTeXe) the old name is not defined.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\newcolumntype}
+% ^^A As
+% ^^A described above, the \verb"\newcolumntype" macro gives users the chance
+% ^^A to define letters, to be used in the same way as the primitive
+% ^^A column specifiers, `c' `p' etc.
+% \begin{macrocode}
+ % \def\newcolumntype#1{%
+% \end{macrocode}
+% ^^A \verb"\NC@char" was added in V2.01 so that active characters, like "@" in
+% ^^A AMS\LaTeX\ may be used. This trick was stolen from \texttt{array.sty}
+% ^^A 2.0h. Note that we need to use the possibly active token,
+% ^^A \verb"#1", in several places, as that is the token that actually
+% ^^A appears in the preamble argument.
+% \begin{macrocode}
+ % \edef\NC@char{\string#1}%
+% \end{macrocode}
+% ^^A First we check whether there is already a definition for this column.
+% ^^A Unlike \verb"\newcommand" we give a warning rather than an error if it is
+% ^^A defined. If it is a new column, add \verb"\NC@do" \meta{column} to
+% ^^A the list \verb"\NC@list".
+% \begin{macrocode}
+ % \@ifundefined{NC@find@\NC@char}%
+ % {\@tfor\next:=<>clrmbp@!|\do{\if\noexpand\next\NC@char
+ % %\PackageWarning{array}%
+ % \@memwarn{Redefining primitive column \NC@char}\fi}% memoir change
+ % \NC@list\expandafter{\the\NC@list\NC@do#1}}%
+ % {%\PackageWarning{array}
+ % \@memwarn{Column \NC@char\space is already defined}}% memoir change
+% \end{macrocode}
+% ^^A Now we define a macro with an argument delimited by the new column
+% ^^A specifier, this is used to find occurrences of this specifier in the
+% ^^A user preamble.
+% \begin{macrocode}
+ % \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
+% \end{macrocode}
+% ^^A If an optional argument was not given, give a default argument of 0.
+% \begin{macrocode}
+ % \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\newcol@}
+% ^^A We can now define the macro which does the rewriting,
+% ^^A \verb"\@reargdef" takes the same arguments as \verb"\newcommand", but
+% ^^A does not check that the command is new. For a column, say `D' with
+% ^^A one argument, define a command \verb"\NC@rewrite@D" with one
+% ^^A argument, which recursively calls \verb"\NC@find" on the user preamble
+% ^^A after replacing the first token or group with the replacement text
+% ^^A specified in the \verb"\newcolumntype" command. \verb"\NC@find" will find the
+% ^^A next occurrence of `D' as it will be \verb"\let" equal to
+% ^^A \verb"\NC@find@D" by \verb"\NC@do".
+% \begin{macrocode}
+ % \def\newcol@#1[#2]#3{\expandafter\@reargdef
+ % \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@}
+% ^^A Having found an occurrence of the new column, save the preamble
+% ^^A before the column in \verb"\@temptokena", then check to see if we
+% ^^A are at the end of the preamble. (A dummy occurrence of the column
+% ^^A specifier will be placed at the end of the preamble by \verb"\NC@do".
+% \begin{macrocode}
+ % \def\NC@#1{%
+ % \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@ifend}
+% ^^A We can tell that we are at the end as \verb"\NC@do" will place a \verb"\relax"
+% ^^A after the dummy column.
+% \begin{macrocode}
+ % \def\NC@ifend{%
+% \end{macrocode}
+% ^^A If we are at the end, do nothing. (The whole preamble will now be in
+% ^^A \verb"\@temptokena".)
+% \begin{macrocode}
+ % \ifx\next\relax
+% \end{macrocode}
+% ^^A Otherwise set the flag \verb"\if@tempswa", and rewrite the column.
+% ^^A \verb"\expandafter" introduced 1n V2.01
+% \begin{macrocode}
+ % \else\@tempswatrue\expandafter\NC@rewrite\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@do}
+% ^^A If the user has specified `C' and `L' as new columns, the list of
+% ^^A rewrites (in the token register \verb"\NC@list") will look like
+% ^^A \verb"\NC@do *" \verb"\NC@do C" \verb"\NC@do L".
+% ^^A So we need to define \verb"\NC@do" as a one argument macro which
+% ^^A initialises the rewriting of the specified column. Let us assume that
+% ^^A `C' is the argument.
+% \begin{macrocode}
+ % \def\NC@do#1{%
+% \end{macrocode}
+% ^^A First we let \verb"\NC@rewrite" and \verb"\NC@find" be
+% ^^A \verb"\NC@rewrite@C" and \verb"\NC@find@C" respectively.
+% \begin{macrocode}
+ % \expandafter\let\expandafter\NC@rewrite
+ % \csname NC@rewrite@\string#1\endcsname
+ % \expandafter\let\expandafter\NC@find
+ % \csname NC@find@\string#1\endcsname
+% \end{macrocode}
+% ^^A Clear the token register \verb"\@temptokena" after putting the present
+% ^^A contents of the register in front of the token \verb"\NC@find". At the
+% ^^A end we place the tokens `\verb"C\relax"' which \verb"\NC@ifend" will use
+% ^^A to detect the end of the user preamble.
+% \begin{macrocode}
+ % \expandafter\@temptokena\expandafter{\expandafter}%
+ % \expandafter\NC@find\the\@temptokena#1\relax}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\showcols}
+% ^^A This macro is useful for debugging \verb"\newcolumntype" specifications,
+% ^^A it is the equivalent of the primitive \verb"\show" command for macro
+% ^^A definitions. All we need to do is locally redefine \verb"\NC@do" to take
+% ^^A its argument (say `C') and then \verb"\show" the (slightly modified)
+% ^^A definition of \verb"\NC@rewrite@C". Actually as the the list always
+% ^^A starts off with \verb"\NC@do *" and we do not want to print the
+% ^^A definition of the $*$-form, define \verb"\NC@do" to throw away the first
+% ^^A item in the list, and then redefine itself to print the rest of the
+% ^^A definitions.
+% \begin{macrocode}
+ % \def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@show}
+% ^^A If the column `C' is defined as above, then
+% ^^A \verb"\show\NC@rewrite@C" would output\\
+% ^^A \verb"\long macro: ->\NC@find >{$}c<{$}".
+% ^^A We want to strip the \verb"long macro: ->" and the \verb"\NC@find". So first we
+% ^^A use \verb"\meaning" and then apply the macro \verb"\NC@strip" to the tokens so
+% ^^A produced and then \verb"\typeout" the required string.
+% \begin{macrocode}
+ % \def\NC@show#1{%
+ % \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
+ % \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@strip}
+% ^^A Delimit the arguments to \verb"\NC@strip" with `\texttt{:}', `\texttt{->}',
+% ^^A a space, and \verb"\@@" to pull out the required parts of the output from
+% ^^A \verb"\meaning".
+% \begin{macrocode}
+ % \def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@list}
+% ^^A Allocate the token register used for the rewrite list.
+% \begin{macrocode}
+ % \newtoks\NC@list
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{The $*$--form}
+% ^^A We view the $*$-form as a slight generalisation of the system
+% ^^A described in the previous subsection. The idea is to define a $*$
+% ^^A column by a command of the form:
+% ^^A \begin{verbatim}
+% ^^A \newcolumntype{*}[2]{%
+% ^^A \count@=#1\ifnum\count@>0
+% ^^A \advance\count@ by -1 #2*{\count@}{#2}\fi}
+% ^^A \end{verbatim}
+% ^^A \begin{macro}{\NC@rewrite@*}\label{NC@rewrite@*}
+% ^^A This does not work however as \verb"\newcolumntype" takes great care not
+% ^^A to expand anything in the preamble, and so the \verb"\if" is never
+% ^^A expanded. \verb"\newcolumntype" sets up various other parts of the
+% ^^A rewrite correctly though so we can define:
+% \begin{macrocode}
+ % \newcolumntype{*}[2]{}
+% \end{macrocode}
+% ^^A Now we must correct the definition of \verb"\NC@rewrite@*". The
+% ^^A following is probably more efficient than a direct translation of
+% ^^A the idea sketched above, we do not need to put a $*$ in the preamble
+% ^^A and call the rewrite recursively, we can just put \verb"#1" copies of
+% ^^A \verb"#2" into \verb"\@temptokena". (Nested $*$ forms will be expanded
+% ^^A when the whole rewrite list is expanded again, see \verb"\@mkpream")
+% \begin{macrocode}
+ % \long\@namedef{NC@rewrite@*}#1#2{%
+% \end{macrocode}
+% ^^A Store the number.
+% \begin{macrocode}
+ % \count@#1\relax
+% \end{macrocode}
+% ^^A Put \verb"#1" copies of \verb"#2" in the token register.
+% \begin{macrocode}
+ % \loop
+ % \ifnum\count@>\z@
+ % \advance\count@\m@ne
+ % \@temptokena\expandafter{\the\@temptokena#2}%
+ % \repeat
+% \end{macrocode}
+% ^^A \verb"\NC@do" will ensure that \verb"\NC@find" is \verb"\let" equal
+% ^^A to \verb"\NC@find@*".
+% \begin{macrocode}
+ % \NC@find}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{Modifications to internal macros of \texttt{array.sty}}
+% ^^A
+% ^^A \begin{macro}{\@xexpast}
+% ^^A \begin{macro}{\@xexnoop}
+% ^^A These macros are used to expand $*$-forms in
+% ^^A \texttt{array.sty}. \verb"\let" them to \verb"\relax" to save space.
+% \begin{macrocode}
+ % \let\@xexpast\relax
+ % \let\@xexnoop\relax
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\save@decl}
+% ^^A We do not assume that the token register is free, we add the new
+% ^^A declarations to the front of the register. This is to allow user
+% ^^A preambles of the form, \verb">{foo}>{bar}..". Users are not encouraged to
+% ^^A enter such expressions directly, but they may result from the
+% ^^A rewriting of \verb"\newcolumntype"'s.
+% \begin{macrocode}
+ % \def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
+ % {\expandafter\@nextchar\the\toks\count@}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@mkpream}
+% ^^A The main modification to \verb"\@mkpream" is to replace the call to
+% ^^A \verb"\@xexpast" (which expanded $*$-forms) by a loop which expands
+% ^^A all \verb"\newcolumntype" specifiers.
+% \begin{macrocode}
+ % \def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ % \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+% \end{macrocode}
+% ^^A Now we remove possible $*$-forms and user-defined column
+% ^^A specifiers in the user preamble by repeatedly executing the list
+% ^^A \verb"\NC@list" until the re-writes have no more effect. The
+% ^^A expanded preamble will then be in the token register
+% ^^A \verb"\@temptokena". Actually we need to know at this point that
+% ^^A this is not \verb"\toks0".
+% \begin{macrocode}
+ % \@temptokena{#1}\@tempswatrue
+ % \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+% \end{macrocode}
+% ^^A Afterwards we initialize all registers and macros, that we need
+% ^^A for the build-up of the preamble.
+% \begin{macrocode}
+ % \count@\m@ne
+ % \let\the@toks\relax
+ % \prepnext@tok
+% \end{macrocode}
+% ^^A Having expanded all tokens defined using \verb"\newcolumntype" (including
+% ^^A \verb"*"), we evaluate the remaining tokens, which are saved in
+% ^^A \verb"\@temptokena". We use the \LaTeX--macro \verb"\@tfor" to inspect each
+% ^^A token in turn.
+% \begin{macrocode}
+ % \expandafter \@tfor \expandafter \@nextchar
+ % \expandafter :\expandafter =\the\@temptokena \do
+% \end{macrocode}
+% ^^A \verb"\@testpatch" does not take an argument since \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+ % {\@testpach
+ % \ifcase \@chclass \@classz \or \@classi \or \@classii
+ % \or \save@decl \or \or \@classv \or \@classvi
+ % \or \@classvii \or \@classviii
+% \end{macrocode}
+% ^^A In \texttt{newarray.sty} class 9 is equivalent to class 10.
+% \begin{macrocode}
+ % \or \@classx
+ % \or \@classx \fi
+ % \@lastchclass\@chclass}%
+ % \ifcase\@lastchclass
+ % \@acol \or
+ % \or
+ % \@acol \or
+ % \@preamerr \thr@@ \or
+ % \@preamerr \tw@ \@addtopreamble\@sharp \or
+ % \or
+ % \else \@preamerr \@ne \fi
+ % \def\the@toks{\the\toks}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classix}
+% ^^A \texttt{array.sty} does not allow repeated \texttt{>}
+% ^^A declarations for the same column. This is allowed in
+% ^^A \texttt{newarray.sty} as documented in the introduction. Removing
+% ^^A the test for this case makes class 9 equivalent to class 10, and
+% ^^A so this macro is redundant. It is \verb"\let" to \verb"\relax" to save
+% ^^A space.
+% \begin{macrocode}
+ % \let\@classix\relax
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classviii}
+% ^^A In \texttt{newarray.sty} explicitly allow class 2, as repeated
+% ^^A \texttt{<} expressions are accepted by this package.
+% \begin{macrocode}
+ % \def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
+ % \@preamerr 4\@chclass 6 \@classvi \fi\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classv}
+% ^^A Class 5 is \texttt{@}-expressions (and is also called by class 1)
+% ^^A This macro was incorrect in Version~1. Now we do not expand the
+% ^^A \verb"@"-expression, but instead explicitly replace an
+% ^^A \verb"\extracolsep" command by an assignment to \verb"\tabskip" by a
+% ^^A method similar to the \verb"\newcolumntype" system described above.
+% ^^A \verb"\d@llarbegin" \verb"\d@llarend" were introduced in V2.01 to match
+% ^^A \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+ % \def\@classv{\save@decl
+ % \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ % \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ % \prepnext@tok}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\NC@ecs}
+% ^^A Rewrite the first occurrence of \verb"\extracolsep{1in}" to
+% ^^A \verb"\tabskip1in\relax". As a side effect discard any tokens after a
+% ^^A second \verb"\extracolsep", there is no point in the user entering two of
+% ^^A these commands anyway, so this is not really a restriction.
+% \begin{macrocode}
+ % \def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+ % \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Support for the \texttt{delarray.sty}}
+% ^^A
+% ^^A The \texttt{delarray.sty} package extends the array syntax by
+% ^^A supporting the notation of delimiters. To this end we extend the
+% ^^A array parsing mechanism to include a hook which can be used by this
+% ^^A (or another) package to do some additional parsing.
+% ^^A
+% ^^A \begin{macro}{\@tabarray}
+% ^^A This macro tests for an optional bracket and then calls up
+% ^^A \verb"\@@array" or \verb"\@@array[c]" (as default).
+% \begin{macrocode}
+ % \def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@@array}
+% ^^A This macro tests could then test an optional delimiter before the
+% ^^A left brace of the main preamble argument. Here in the main package
+% ^^A it simply is let to be \verb"\@array".
+% \begin{macrocode}
+ % \let\@@array\@array
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endarray}
+% ^^A \begin{macro}{\@arrayright}
+% ^^A We have to declare the hook we put into \verb"\@array" above.
+% ^^A A similar hook `\verb"\@arrayright"' will be inserted into the
+% ^^A \verb"\endarray" to gain control. Both defaults to empty.
+% \begin{macrocode}
+ % \def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
+ % \let\@arrayleft\@empty
+ % \let\@arrayright\@empty
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{Support for \texttt{\textbackslash firsthline} and
+% ^^A \texttt{\textbackslash lasthline}}
+% ^^A
+% ^^A The Companion~\cite[p.137]{GOOSSENS94} suggests two additional
+% ^^A commands to control the alignments in case of tabulars with
+% ^^A horizontal lines. They are now added to this package.
+% ^^A
+% ^^A \begin{macro}{\extratabsurround}
+% ^^A The extra space around a table when \verb"\firsthline" or \verb"\lasthline"
+% ^^A are used.
+% \begin{macrocode}
+ % \newlength{\extratabsurround}
+ % \setlength{\extratabsurround}{2pt}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\backup@length}
+% ^^A This register will be used internally by \verb"\firsthline" and
+% ^^A \verb"\lasthline".
+% \begin{macrocode}
+ % \newlength{\backup@length}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\firsthline}
+% ^^A This code can probably be improved but for the moment it should
+% ^^A serve.
+% ^^A
+% ^^A We start by producing a single tabular row without any visible
+% ^^A content that will produce the external reference point in case
+% ^^A \verb"[t]" is used.
+% \begin{macrocode}
+ % \newcommand{\firsthline}{%}} emacs
+ % \multicolumn1c{%
+% \end{macrocode}
+% ^^A Within this row we calculate \verb"\backup@length" to be the height
+% ^^A plus depth of a standard line. In addition we have to add the
+% ^^A width of the \verb"\hline", something that was forgotten in the
+% ^^A original definition.
+% \begin{macrocode}
+ % \global\backup@length\ht\@arstrutbox
+ % \global\advance\backup@length\dp\@arstrutbox
+ % \global\advance\backup@length\arrayrulewidth
+% \end{macrocode}
+% ^^A Finally we do want to make the height of this first line be a bit
+% ^^A larger than usual, for this we place the standard array strut
+% ^^A into it but raised by \verb"\extratabsurround"
+% \begin{macrocode}
+ % \raise\extratabsurround\copy\@arstrutbox
+% \end{macrocode}
+% ^^A Having done all this we end the line and back up by the value of
+% ^^A \verb"\backup@length" and then finally place our \verb"\hline". This should
+% ^^A place the line exactly at the right place but keep the reference
+% ^^A point of the whole tabular at the baseline of the first row.
+% \begin{macrocode}
+ % }\\[-\backup@length]\hline
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\lasthline}
+% ^^A For \verb"\lasthline" the situation is even worse and I got it
+% ^^A completely wrong initially.
+% ^^A
+% ^^A The problem in this case is that if the optional argument \verb"[b]"
+% ^^A is used we do want the reference point of the tabular be at the
+% ^^A baseline of the last row but at the same time do want the the
+% ^^A depth of this last line increased by \verb"\extratabsurround" without
+% ^^A changing the placement \verb"\hline".
+% ^^A
+% ^^A We start by placing the rule followed by an invisible row.
+% \begin{macrocode}
+ % \newcommand{\lasthline}{\hline\multicolumn1c{%}} emacs
+% \end{macrocode}
+% ^^A We now calculate \verb"\backup@length" to be the height and depth of
+% ^^A two lines plus the width of the rule.
+% \begin{macrocode}
+ % \global\backup@length2\ht\@arstrutbox
+ % \global\advance\backup@length2\dp\@arstrutbox
+ % \global\advance\backup@length\arrayrulewidth
+% \end{macrocode}
+% ^^A This will bring us back to the baseline of the second last row:
+% \begin{macrocode}
+ % }\\[-\backup@length]%
+% \end{macrocode}
+% ^^A Thus if we now add another invisible row the reference point of
+% ^^A that row will be at the baseline of the last row (and will be the
+% ^^A reference for the whole tabular). Since this row is invisible we
+% ^^A can enlarge its depth by the desired amount.
+% \begin{macrocode}
+ % \multicolumn1c{%
+ % \lower\extratabsurround\copy\@arstrutbox
+ % }%
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Getting the spacing around rules right}
+% ^^A
+% ^^A Beside a larger functionality \texttt{array.sty} has one
+% ^^A important difference to the standard \texttt{tabular} and
+% ^^A \texttt{array} environments: horizontal and vertical rules make a
+% ^^A table larger or wider, e.g., \verb=\doublerulesep= really denotes
+% ^^A the space between two rules and isn't measured from the middle of
+% ^^A the rules.
+% ^^A
+% ^^A \begin{macro}{\@xhline}
+% ^^A For vertical rules this is implemented by the definitions above,
+% ^^A for horizontal rules we have to take out the backspace.
+% \begin{macrocode}
+ % \CheckCommand*\@xhline{\ifx\reserved@a\hline
+ % \vskip\doublerulesep
+ % \vskip-\arrayrulewidth
+ % \fi
+ % \ifnum0=`{\fi}}
+ % \renewcommand*\@xhline{\ifx\reserved@a\hline
+ % \vskip\doublerulesep
+ % \fi
+ % \ifnum0=`{\fi}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% end array.sty 2016/10/06 v2.4d %%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+% ^^A
+%
+% \subsubsection{Class additions to Array}
+%
+% \begin{macro}{\m@mold@addamp}
+% \begin{macro}{\m@m@addamp}
+% \begin{macro}{\@addamp}
+%
+% In the preamble a \verb?&? has to be inserted between any two columns;
+% before the first column there should not be a \verb?&?. As the user
+% preamble may start with a \verb?|? we have to remember somehow
+% if we have already inserted a \verb?#? (i.e.\ a column). This is done
+% with the boolean variable \cs{if@firstamp} that we test in
+% \cs{@addamp}, the macro that inserts the \verb?&?.
+%
+% \begin{PW}
+% PW: Later on, for horizontal lines in `continuous' tabulars,
+% I need to know how many columns there are in a tabular. I need a modified
+% kernel's \cs{@addamp} to do this and use the kernel's \cs{@curtab}
+% (a counter used in tabbing) to store the number of columns.
+%
+% \cs{m@mold@addamp} stores the kernel's definition of \cs{@addamp}, and
+% \cs{m@m@addamp} is the revised definition.
+% \end{PW}
+%
+% \begin{macrocode}
+\newif \@iffirstamp
+\let\m@mold@addamp\@addamp
+\newcommand*{\m@m@addamp}{%
+ \if@firstamp
+ \@firstampfalse
+ \global\@curtab\@ne
+ \else
+ \@addtopreamble{&}
+ \global\advance\@curtab\@ne
+ \fi}
+\let\@addamp\m@m@addamp
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+
+
+
+% \subsection{D column specifiers} \label{sec:dcolumns}
+%
+%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{cdolumn} package. Now replaced by requiring the packge instead.
+% \begin{macrocode}
+\RequirePackage{dcolumn}[2014/10/28]
+% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
+%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{dcolumn} and replaced it with requiring the \Lpack{dcolumn} package
+% instead.}
+%
+% ^^A The description and code are essentially copied from the
+% ^^A \Lpack{dcolumn} package~\cite{DCOLUMN}.
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+% ^^A
+% ^^A The \Lpack{dcolumn} package~\cite{DCOLUMN} defines \texttt{D}
+% ^^A to be a column specifier
+% ^^A with three arguments.\\
+% ^^A \verb?D?\marg{sep.tex}\marg{sep.dvi}\marg{decimal places}
+% ^^A for columns which are to be aligned on a `decimal point'.
+% ^^A
+% ^^A
+% ^^A The basic ideas behind these macros have been explained earlier.
+% ^^A However they use three
+% ^^A tricks which may be useful in other contexts.
+% ^^A \begin{itemize}
+% ^^A \item The separator is surrounded in extra \verb?{ }?, so that it is set
+% ^^A with \cs{mathord} spacing, otherwise, for instance a `,' would have
+% ^^A extra space after it.
+% ^^A \item The separator is not given its special definition by making it
+% ^^A active, as this would not work for an entry such as \verb?& .5 &?, as the
+% ^^A first token of an alignment entry is read \emph{before} the preamble
+% ^^A part, incase it is an \cs{omit}, in which case the preamble is to be
+% ^^A omitted. Instead we switch the mathcode to (hex) 8000, which makes the
+% ^^A token act as if it were active.
+% ^^A \item Although \verb?\mathcode`.="8000? makes \texttt{.} act as if it
+% ^^A were active, it is still not allowed in constructions such as
+% ^^A \verb?\def.{}?, even in math-mode, so we have to construct an active
+% ^^A version of the separator, this is done by making it the uppercase of
+% ^^A \verb?~?, and then using the construct\\
+% ^^A \verb?\uppercase{\def~}?\marg{definition}.\\
+% ^^A Note that the \meta{definition} is not uppercased, so the definition
+% ^^A can refer to the standard, non-active use of the separator.
+% ^^A \end{itemize}
+% ^^A
+% ^^A \begin{macro}{\DC@}
+% ^^A Set up uppercase tables as required, and then grab the first part of
+% ^^A the numerical argument into \cs{count@}.
+% \begin{macrocode}
+ % \def\DC@#1#2#3{%
+ % \uccode`\~=`#1\relax
+ % \m@th
+ % \afterassignment\DC@x\count@#3\relax{#1}{#2}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@x}
+% ^^A If \cs{count@} is negative, centre on the decimal point. If it is
+% ^^A positive either \verb?#1? will be empty in which case bad out decimal
+% ^^A part to the number of digits specified by \cs{count@} or
+% ^^A it is none empty in which case \cs{count@} contains the
+% ^^A number of digits to the left of the point, and \verb?#1? contains a junk
+% ^^A token (probably \verb?.?) followed by the number of digits to the right
+% ^^A of the point. In either of these latter cases, \cs{DC@right} is used.
+% \begin{macrocode}
+ % \def\DC@x#1\relax#2#3{%
+ % \ifnum\z@>\count@
+ % \expandafter\DC@centre
+ % \else
+ % \expandafter\DC@right
+ % \fi
+ % {#2}{#3}{#1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@centre}
+% ^^A If centering on the decimal point, just need to box up the two halves.
+% \begin{macrocode}
+ % \def\DC@centre#1#2#3{%
+ % \let\DC@end\DC@endcentre
+ % \uppercase{\def~}{$\egroup\setbox\tw@=\hbox\bgroup${#2}}%$
+ % \setbox\tw@=\hbox{${\phantom{{#2}}}$}%
+ % \setbox\z@=\hbox\bgroup$\mathcode`#1="8000 }%$
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@endcentre}
+% ^^A and then pad out the smaller of the two boxes so there is the same
+% ^^A amount of stuff either side of the point.
+% \begin{macrocode}
+ % \def\DC@endcentre{$\egroup%$
+ % \ifdim \wd\z@>\wd\tw@
+ % \setbox\tw@=\hbox to\wd\z@{\unhbox\tw@\hfill}%
+ % \else
+ % \setbox\z@=\hbox to\wd\tw@{\hfill\unhbox\z@}\fi
+ % \box\z@\box\tw@}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@right}
+% ^^A This deals with both the cases where a specified number of decimal
+% ^^A places is given.
+% \begin{macrocode}
+ % \def\DC@right#1#2#3{%
+ % \ifx\relax#3\relax
+% \end{macrocode}
+% ^^A If \verb?#3? is empty, add \cs{hfill} to right align the column, and
+% ^^A Just set \cs{DC@rl} to begin a group, so nothing fancy is done with
+% ^^A the whole number part.
+% \begin{macrocode}
+ % \hfill
+ % \let\DC@rl\bgroup
+ % \else
+% \end{macrocode}
+% ^^A Otherwise set \cs{DC@rl} so that the whole number part is put in a
+% ^^A box \cs{count@} times as wide as a digit.
+% ^^A In order to share code with the other branch, then move \verb?#3? (the
+% ^^A number of decimal places) into \cs{count@} throwing away the `.' from
+% ^^A the user syntax.
+% \begin{macrocode}
+ % \edef\DC@rl{to\the\count@\dimen@ii\bgroup\hss\hfill}%
+ % \count@\@gobble#3\relax
+ % \fi
+% \end{macrocode}
+% ^^A
+% \begin{macrocode}
+ % \let\DC@end\DC@endright
+% \end{macrocode}
+% ^^A Box 2 contains the decimal part, set to \cs{dimen@} which is
+% ^^A calculated below to be \cs{count@} times the width of a digit, plus
+% ^^A the width of the `decimal point'.
+% \begin{macrocode}
+ % \uppercase{\def~}{$\egroup\setbox\tw@\hbox to\dimen@\bgroup${#2}}%
+ % \setbox\z@\hbox{$1$}\dimen@ii\wd\z@
+ % \dimen@\count@\dimen@ii
+ % \setbox\z@\hbox{${#2}$}\advance\dimen@\wd\z@
+ % \setbox\tw@\hbox to\dimen@{}%
+% \end{macrocode}
+% ^^A Box 0 contains the whole number part, either just at its natural
+% ^^A size for right aligned columns, or set to (the old value of)
+% ^^A \cs{count@} times the width of a digit. \cs{DC@rl} defined above
+% ^^A determines the two cases.
+% \begin{macrocode}
+ % \setbox\z@\hbox\DC@rl$\mathcode`#1="8000 }%$
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@endright}
+% ^^A Just finish off the second box, and then put out both boxes.
+% \begin{macrocode}
+ % \def\DC@endright{$\hfil\egroup\box\z@\box\tw@}%$
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{D}
+% ^^A The user interface, define the {\tt D} column to take three arguments.
+% ^^A For special purposes, you may need to directly access \cs{DC@} rather
+% ^^A than the \verb?D? column, eg to get a bold version you could use
+% ^^A\begin{verbatim}
+% ^^A \newcolumntype{E}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
+% ^^A\end{verbatim}
+% \begin{macrocode}
+ % \newcolumntype{D}[3]{>{\DC@{#1}{#2}{#3}}c<{\DC@end}}
+ %
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% end Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+%
+%
+% \subsection{Support for delimeters}
+%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{dearray} package. Now replaced by requiring the packge instead.
+% \begin{macrocode}
+\RequirePackage{delarray}[2014/10/28]
+% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
+%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{delarray} and replaced it with requiring the \Lpack{delarray} package
+% instead.}
+% ^^A
+% ^^A The description and code are essentially from the
+% ^^A \Lpack{delarray} package~\cite{DELARRAY}, v1.01 1994/03/14.
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% Delarray package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+% ^^A
+% ^^A The array syntax is extended by
+% ^^A supporting the notation of delimiters. To this end we extend the
+% ^^A array parsing mechanism to include a hook which can be used by this
+% ^^A (or another) package to do some additional parsing.
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@@array}
+% ^^A This macro tests for an optional delimiter before the left brace
+% ^^A of the main preamble argument. If there is no delimiter,
+% ^^A \cs{@arrayleft} and \cs{@arrayright} are made a no-ops, and
+% ^^A \cs{@array} is called with the positional argument. Otherwise
+% ^^A call \cs{@del@array}.
+% \begin{macrocode}
+ % \def\@@array[#1]{\@ifnextchar\bgroup
+ % {\let\@arrayleft\relax\let\@arrayright\relax\@array[#1]}%
+ % {\@del@array[#1]}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@del@array}
+% ^^A We now know that we have an {\tt array} (or {\tt tabular}) with
+% ^^A delimiters.
+% \begin{macrocode}
+ % \def\@del@array[#1]#2#3#4{%
+% \end{macrocode}
+% ^^A The following line is completely redundant but it does catch errors
+% ^^A involving delimiters before the processing of the alignment begins.
+% ^^A A common error is likely to be omiting the `.' in a
+% ^^A \cs{cases}-type construction. This causes the first token of the
+% ^^A alignment to be gobbled, possibly causing lots of spurious errors
+% ^^A before the cause of the error, the missing delimiter, is discovered as
+% ^^A \cs{@arrayright} puts the alignment and the delimiters together.
+% \begin{macrocode}
+ % \setbox\z@\hbox{$\left#2\right#4$}%
+% \end{macrocode}
+% ^^A In the case of a `c' argument we do not need to rebox the alignment,
+% ^^A so we can define \cs{@arrayleft} and \cs{@arrayright} just to
+% ^^A insert the delimiters.
+% \begin{macrocode}
+ % \if#1c\def\@arrayleft{\left#2}\def\@arrayright{\right#4}%
+% \end{macrocode}
+% ^^A Otherwise we (should) have a {\tt[t]} or {\tt[b]} argument, so first we
+% ^^A store the alignment, without delimiters in box0.
+% \begin{macrocode}
+ % \else\def\@arrayleft{\setbox\z@}%
+% \end{macrocode}
+% ^^A Then after the alignment is finished:
+% \begin{macrocode}
+ % \def\@arrayright{%
+% \end{macrocode}
+% ^^A Calculate the amount the box needs to be lowered (this will be
+% ^^A negative in the case of \verb?[b]?). A little bit of arithmetic cf.\
+% ^^A \theTeXbook, Appendix G, rule 8. We calculate the amount this
+% ^^A way, rather than just taking the difference between the depth of box0
+% ^^A and the depth of the box defined below, as the depth of that box may
+% ^^A be affected by the delimiters if \cs{delimitershortfall} or
+% ^^A \cs{delimiterfactor} have non-standard values.
+% \begin{macrocode}
+ % \dimen@=\dp\z@
+ % \advance\dimen@-\ht\z@
+ % \divide \dimen@ by \tw@
+ % \advance\dimen@ by\fontdimen22 \textfont\tw@
+% \end{macrocode}
+% ^^A Now lower the alignment and the delimiters into place.
+% \begin{macrocode}
+ % \lower\dimen@\hbox{$\left#2\vcenter{\unvbox\z@}\right#4$}}%
+% \end{macrocode}
+% ^^A End the \verb?\if#1c?
+% \begin{macrocode}
+ % \fi
+% \end{macrocode}
+% ^^A Now that we have defined \cs{@arrayleft} and \cs{@arrayright}, call
+% ^^A \cs{@array}.
+% \begin{macrocode}
+ % \@array[#1]{#3}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% end Delarray package code %%%%%%%%%%%%%%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+%
+%
+% \subsection{The tabularx environment}
+%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{tabularx} package. Now replaced by requiring the packge instead.
+% \begin{macrocode}
+\RequirePackage{tabularx}[2016/02/03]
+% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
+%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{tabularx} and replaced it with requiring the \Lpack{tabularx} package
+% instead.}
+
+%
+% ^^A The code and description are essentially from David Carlisle's
+% ^^A \Lpack{tabularx} package~\cite{TABULARX}, v2.07 1999/01/07.
+% ^^A
+% \begin{macrocode}
+ % %%%%%%%%%% Tabularx package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+ % %%% This is a carbon copy of the tabularx dtx sources for v2.11,
+ % %%% 2016/02/03 with two changes: error messages mention the class
+ % %%% instead of tabularx.
+ %
+ % %%%%%%%%%% Tabularx package code v2.11 2016/02/03 %%%%%%%%%%%%%%%%%%%%%
+ %
+% \end{macrocode}
+% ^^A
+% ^^A
+% ^^A
+% ^^A The \Lpack{tabularx} package~\cite{TABULARX} implements a version of the \texttt{tabular}
+% ^^A environment in which the widths of certain columns are calculated so
+% ^^A that the table is is a specified width. The columns that may stretch are
+% ^^A marked by an \texttt{X} in the preamble argument.
+% ^^A
+% ^^A What follows is a carbon copy of the contents of \texttt{tabularx.dtx} with small changes: (1) We make errors/warnings
+% ^^A mention the class instead of \texttt{tabularx}, (2) we strip \texttt{tabularx} related \cs{changes} macros, (3) we
+% ^^A remove loading the \Lpack{array} package, as we already come with a copy.
+% ^^A
+% ^^A First some registers etc.\ that we need.
+% \begin{macrocode}
+ % \newdimen\TX@col@width
+ % \newdimen\TX@old@table
+ % \newdimen\TX@old@col
+ % \newdimen\TX@target
+ % \newdimen\TX@delta
+ % \newcount\TX@cols
+ % \newif\ifTX@
+% \end{macrocode}
+% ^^A
+% ^^A Now a trick to get the body of an environment into a token register, without doing any expansion. This does not do any
+% ^^A real checking of nested environments, so if you should need to nest one {\ttfamily tabularx} inside another, the inner
+% ^^A one must be surrounded by \verb+{ }+.
+% ^^A
+% ^^A \begin{macro}{\tabularx}
+% ^^A Prior to (\texttt{tabularx}) v1.06, this macro took two arguments, which were saved in
+% ^^A separate registers before the table body was saved by \verb+\TX@get@body+.
+% ^^A Unfortunately this disables the \verb|[t]| optional argument. Now just save
+% ^^A the width specification separately, then clear the token register
+% ^^A \verb|\toks@|.
+% ^^A Finally call \verb|\TX@get@body| to begin saving the body of the table.
+% ^^A The \verb|{\ifnum0=`}\fi| was added at (tabularx) v1.03, to allow \Lenv{tabularx} to appear
+% ^^A inside a \verb|\halign|.^^A
+% ^^A \setbox0=\hbox{\footnotesize"\iffalse{\fi\ifnum0=`}\fi"}^^A
+% ^^A \setbox2=\hbox{\footnotesize"\ifnum0=`{}\fi"}^^A
+% ^^A \footnote{This adds an extra level of grouping,
+% ^^A which is not really needed. Instead, I could use \box0\ here, and
+% ^^A \box2\ below, however the code here would then have to be moved after
+% ^^A the first line, because of the footnote to page 386 of the \TeX{}Book,
+% ^^A and I do not think I should be writing code that is so obscure as to
+% ^^A be documented in a footnote in an appendix called ``Dirty Tricks''!}
+% ^^A
+% ^^A This mechanism of grabbing an environment body does have the
+% ^^A disadvantage (shared with the AMS alignment environments) that you
+% ^^A can not make extension environments by code such as
+% ^^A\begin{verbatim}
+% ^^A\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
+% ^^A\end{verbatim}
+% ^^A as the code is looking for a literal string \verb"\end{tabularx}" to stop
+% ^^A scanning. Since version (tabularx) 2.02, one may avoid this problem by using
+% ^^A \verb|\tabularx| and \verb|\endtabularx| directly in the definition:
+% ^^A\begin{verbatim}
+% ^^A\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
+% ^^A\end{verbatim}
+% ^^A The scanner now looks for the end of the current environment (\verb|foo| in
+% ^^A this example.) There are some restrictions on this usage, the
+% ^^A principal one being that \verb|\endtabularx| must not be inside any \verb"{ }" pairs
+% ^^A ao that the code before \verb"\endtabularx" may be extracted and added to the table body
+% ^^A (prior to version (tabularx) 2.09 \verb"\endtabularx" had to be
+% ^^A the \emph{first} token of the `end code' of the environment).
+% \begin{macrocode}
+ % \def\tabularx#1{%
+% \end{macrocode}
+% ^^A Allow \verb"\tabularx" \verb"\endtabularx" (but not \verb"\begin{tabularx}"
+% ^^A \verb"\end{tabularx}") to be used in \verb"\newenvironment" definitions.
+% \begin{macrocode}
+ % \edef\TX@{\@currenvir}%
+ % {\ifnum0=`}\fi
+% \end{macrocode}
+% ^^A \verb"\relax" added at v1.05 so that non-expandable length tokens, like
+% ^^A \verb"\textwidth" do not generate an extra space, and an overfull box.
+% ^^A \verb"\relax" removed again at v4.09 in favour of \verb"\setlength" so if you
+% ^^A use the calc package you can use a width of \verb"(\textwidth-12pt)/2".
+% \begin{macrocode}
+ % \setlength\TX@target{#1}%
+ % \TX@typeout{Target width: #1 = \the\TX@target.}%
+ % \toks@{}\TX@get@body}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\endtabularx}
+% ^^A This does not do very much\ldots
+% \begin{macrocode}
+ % \let\endtabularx\relax
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@get@body}
+% ^^A Place all tokens as far as the first \verb"\end" into a token register.
+% ^^A Then call \verb"\TX@find@end" to see if we are at \verb"\end{tabularx}".
+% \begin{macrocode}
+ % \long\def\TX@get@body#1\end
+ % {\toks@\expandafter{\the\toks@#1}\TX@find@end}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@end}
+% ^^A If we are at \verb"\end{tabularx}", call \verb"\TX@endtabularx", otherwise
+% ^^A add \verb"\end{...}" to the register, and call \verb"\TX@get@body" again.
+% \begin{macrocode}
+ % \def\TX@find@end#1{%
+ % \def\@tempa{#1}%
+ % \ifx\@tempa\TX@\expandafter\TX@endtabularx
+ % \else\toks@\expandafter
+ % {\the\toks@\end{#1}}\expandafter\TX@get@body\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@endtabularxa}
+% ^^A split up the end code, and extract the part that lives in the table body.
+% \begin{macrocode}
+ % \long\def\TX@find@endtabularxa
+ % #1\endtabularx#2\endtabularx#3\TX@find@endtabularxa{%
+ % \ifx\TX@#2\relax\else
+ % \toks@\expandafter{\the\toks@#1}%
+ % \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\TX@find@endtabularxb}
+% ^^A split up the end code, and extract the part that lives outside the table body.
+% \begin{macrocode}
+ % \long\def\TX@find@endtabularxb
+ % #1\endtabularx#2\endtabularx#3\TX@find@endtabularxb{%
+ % \ifx\TX@#2%
+ % \expandafter\@firstoftwo
+ % \else
+ % \expandafter\@secondoftwo
+ % \fi
+ % {#1}{#2}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@endtabularxbb}
+% ^^A Helper to avoid needing 15 consecutive \verb"\expandafter"
+% \begin{macrocode}
+ % \def\TX@find@endtabularxbb{%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxb
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@}
+% ^^A The string {\ttfamily tabularx} as a macro for testing with \verb"\ifx".
+% \begin{macrocode}
+ % \def\TX@{tabularx}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A Now that all the parts of the table specification are stored in
+% ^^A registers, we can begin the work of setting the table.
+% ^^A
+% ^^A The algorithm for finding the correct column widths is as follows.
+% ^^A Firstly set the table with each {\ttfamily X} column the width of the
+% ^^A final table. Assuming that there is at least one {\ttfamily X} column,
+% ^^A this will produce a table that is too wide. Divide the excess width by
+% ^^A the number of {\ttfamily X} columns, and reduce the column width by
+% ^^A this amount. Reset the table. If the table is not now the correct
+% ^^A width, a \verb"\multicolumn" entry must be `hiding' one of the {\ttfamily
+% ^^A X} columns, and so there is one less {\ttfamily X} column affecting
+% ^^A the width of the table. So we reduce by 1 the number of X columns and
+% ^^A repeat the process.
+% ^^A
+% ^^A \begin{macro}{\TX@endtabularx}
+% ^^A Although I have tried to make {\ttfamily tabularx} look like an
+% ^^A environment, it is in fact a command, all the work is done by this
+% ^^A macro.
+% \begin{macrocode}
+ % \def\TX@endtabularx{%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxa\csname end\TX@\endcsname
+ % \endtabularx\TX@\endtabularx\TX@find@endtabularxa
+% \end{macrocode}
+% ^^A Define the {\ttfamily X} column, with an internal version of the
+% ^^A \verb"\newcolumntype" command. The \verb"\expandafter" commands enable
+% ^^A \verb"\NC@newcol" to get the {\em expansion} of\\
+% ^^A \verb"\tabularxcolumn{\TX@col@width}" as its
+% ^^A argument. This will be the definition of an {\ttfamily X} column, as
+% ^^A discussed in section 4.
+% \begin{macrocode}
+ % \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}%
+% \end{macrocode}
+% ^^A Initialise the column width, and the number of {\ttfamily X} columns.
+% ^^A The number of {\ttfamily X} columns is set to one, which means that
+% ^^A the initial count will be one too high, but this value is decremented
+% ^^A before it is used in the main loop.
+% ^^A
+% ^^A Since v1.02, switch the definition of \verb"\verb".
+% \begin{macrocode}
+ % \let\verb\TX@verb
+% \end{macrocode}
+% ^^A Since v1.05, save the values of all \LaTeX\ counters, the list
+% ^^A \verb"\cl@@ckpt" contains the names of all the \LaTeX\ counters that have
+% ^^A been defined so far. We expand \verb"\setcounter" at this point, as it
+% ^^A results in fewer tokens being stored in \verb"\TX@ckpt", but the actual
+% ^^A resetting of the counters occurs when \verb"\TX@ckpt" is expanded after
+% ^^A each trial run.
+% ^^A Actually since v1.07, use something equivalent to the expansion of the
+% ^^A original definition of \verb"\setcounter", so that \verb"tabularx" works in
+% ^^A conjunction with \verb"calc.sty".
+% \begin{macrocode}
+ % \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
+ % \edef\TX@ckpt{\cl@@ckpt}%
+ % \let\@elt\relax
+ % \TX@old@table\maxdimen
+ % \TX@col@width\TX@target
+ % \global\TX@cols\@ne
+% \end{macrocode}
+% ^^A Typeout some headings (unless this is disabled).
+% \begin{macrocode}
+ % \TX@typeout@
+ % {\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
+% \end{macrocode}%
+% ^^A First attempt. Modify the {\ttfamily X} definition to count {\ttfamily
+% ^^A X} columns.
+% \begin{macrocode}
+ % \TX@trial{\def\NC@rewrite@X{%
+ % \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}%
+% \end{macrocode}
+% ^^A Repeatedly decrease column width until table is the correct width,
+% ^^A or stops shrinking, or the columns become two narrow.
+% ^^A If there are no multicolumn entries, this will only take one attempt.
+% \begin{macrocode}
+ % \loop
+ % \TX@arith
+ % \ifTX@
+ % \TX@trial{}%
+ % \repeat
+% \end{macrocode}
+% ^^A One last time, with warnings back on (see appendix D)
+% ^^A use {\ttfamily tabular*} to put it in a box of the right size, in case
+% ^^A the algorithm failed to find the correct size.
+% ^^A
+% ^^A Since v1.04, locally make \verb"\footnotetext" save its argument in a token
+% ^^A register.
+% ^^A Since v1.06, \verb"\toks@" contains the preamble specification,
+% ^^A and possible optional argument, as well as the table body.
+% \begin{macrocode}
+ % {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext
+ % \csname tabular*\expandafter\endcsname\expandafter\TX@target
+ % \the\toks@
+ % \csname endtabular*\endcsname}%
+% \end{macrocode}
+% ^^A Now the alignment is finished, and the \verb"}" has restored the original
+% ^^A meaning of \verb"\@footnotetext" expand the register \verb"\TX@ftn" which will
+% ^^A execute a series of\\
+% ^^A \verb"\footnotetext["\meta{num}\verb"]{"\meta{note}\verb"}"\\
+% ^^A commands. We need to be careful about clearing the register as we may
+% ^^A be inside a nested {\ttfamily tabularx}.
+% \begin{macrocode}
+ % \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
+% \end{macrocode}
+% ^^A Now finish off the {\ttfamily tabularx} environment. Note that we need
+% ^^A \verb"\end{tabularx}" here as the \verb"\end{tabularx}" in the user's
+% ^^A file is never expanded. Now use \verb"\TX@" rather than \verb"tabularx".
+% ^^A
+% ^^A We also need to finish off the group started by \verb"{\ifnum0=`}\fi" in
+% ^^A the macro \verb"\tabularx".
+% \begin{macrocode}
+ % \ifnum0=`{\fi}%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxbb
+ % \expandafter\end\expandafter{\TX@}%
+ % \endtabularx\TX@\endtabularx\TX@find@endtabularxb
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\TX@arith}
+% ^^A Calculate the column width for the next try, setting the flag
+% ^^A \verb"\ifTX@" to false if the loop should be aborted.
+% \begin{macrocode}
+ % \def\TX@arith{%
+ % \TX@false
+ % \@tempdimb\maxdimen
+ % \divide\@tempdimb\TX@cols
+ % \ifdim\TX@col@width>\@tempdimb
+ % \TX@typeout@{Don't exceed \maxdimen}%
+ % \wd\@tempboxa\maxdimen
+ % \fi
+ % \ifdim\TX@old@table=\wd\@tempboxa
+% \end{macrocode}
+% ^^A If we have reduced the column width, but the table width has not
+% ^^A changed, we stop the loop, and output the table (which will cause an
+% ^^A over-full alignment) with the previous value of \verb"\TX@col@width".
+% \begin{macrocode}
+ % \TX@col@width\TX@old@col
+ % \TX@typeout@{Reached minimum width, backing up.}%
+ % \else
+% \end{macrocode}
+% ^^A Otherwise calculate the amount by which the current table is too wide.
+% \begin{macrocode}
+ % \dimen@\wd\@tempboxa
+ % \advance\dimen@ -\TX@target
+ % \ifdim\dimen@<\TX@delta
+% \end{macrocode}
+% ^^A If this amount is less than \verb"\TX@delta", stop. (\verb"\TX@delta"
+% ^^A should be non-zero otherwise we may miss the target due to rounding
+% ^^A error.)
+% \begin{macrocode}
+ % \TX@typeout@{Reached target.}%
+ % \else
+% \end{macrocode}
+% ^^A Reduce the number of effective {\ttfamily X} columns by one. (Checking
+% ^^A that we do not get 0, as this would produce an error later.) Then
+% ^^A divide excess width by the number of effective columns, and calculate
+% ^^A the new column width. Temporarily store this value (times $-1$) in
+% ^^A \verb"\dimen@".
+% \begin{macrocode}
+ % \ifnum\TX@cols>\@ne
+ % \advance\TX@cols\m@ne
+ % \fi
+ % \divide\dimen@\TX@cols
+ % \advance\dimen@ -\TX@col@width
+ % \ifdim \dimen@ >\z@
+% \end{macrocode}
+% ^^A If the new width would be too narrow, abort the loop. At the moment
+% ^^A too narrow, means less than 0\,pt!
+% ^^A
+% ^^A Prior to v2.03, if the loop was aborted here, the X columns were left
+% ^^A with the width of the previous run, but this may make the table far
+% ^^A too wide as initial guesses are always too big. Now force to
+% ^^A \verb"\TX@error@width" which defaults to be 1em. If you want to
+% ^^A get the old behaviour stick\\
+% ^^A \verb"\renewcommand\TX@error@width{\TX@col@width}"\\
+% ^^A in a package file loaded after \textsf{tabularx}.
+% \begin{macrocode}
+ % %\PackageWarning{tabularx}%
+ % \@memwarn{X Columns too narrow (table too wide)\MessageBreak}% <-- change here
+ % \TX@col@width\TX@error@width\relax
+ % \else
+% \end{macrocode}
+% ^^A Otherwise save the old settings, and set the new column width. Set the
+% ^^A flag to true so that the table will be set, and the loop will be
+% ^^A executed again.
+% \begin{macrocode}
+ % \TX@old@col\TX@col@width
+ % \TX@old@table\wd\@tempboxa
+ % \TX@col@width-\dimen@
+ % \TX@true
+ % \fi
+ % \fi
+ % \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@error@width}
+% ^^A If the calculated width is negative, use this instead.
+% \begin{macrocode}
+ % \def\TX@error@width{1em}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@delta}
+% ^^A Accept a table that is within \verb"\hfuzz" of the correct width.
+% \begin{macrocode}
+ % \TX@delta\hfuzz
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A Initialise the {\ttfamily X} column. The definition can be empty here,
+% ^^A as it is set for each {\ttfamily tabularx} environment.
+% \begin{macrocode}
+ % \newcolumntype{X}{}
+% \end{macrocode}
+% ^^A
+% ^^A \begin{macro}{\tabularxcolumn}
+% ^^A The default definition of {\ttfamily X} is \verb"p{#1}".
+% \begin{macrocode}
+ % \def\tabularxcolumn#1{p{#1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@newcol}
+% ^^A A little macro just used to cut down the number of \verb"\expandafter"
+% ^^A commands needed.
+% \begin{macrocode}
+ % \def\TX@newcol{\newcol@{X}[0]}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@trial}
+% ^^A Make a test run.
+% \begin{macrocode}
+ % \def\TX@trial#1{%
+ % \setbox\@tempboxa\hbox{%
+% \end{macrocode}
+% ^^A Any extra commands. This is used on the first run to count the number
+% ^^A of {\ttfamily X} columns.
+% \begin{macrocode}
+ % #1\relax
+% \end{macrocode}
+% ^^A Since v1.04, make \verb"\footnotetext" gobble its arguments. Also locally
+% ^^A clear \verb"\TX@vwarn" so that the warning is generated by the {\ttfamily
+% ^^A final} run, and does not appear in the middle of the table if
+% ^^A \verb"\tracingtabularx".
+% \begin{macrocode}
+ % \let\@footnotetext\TX@trial@ftn
+ % \let\TX@vwarn\@empty
+% \end{macrocode}
+% ^^A Do not nest {\ttfamily tabularx} environments during trial runs. This
+% ^^A would waste time, and the global setting of \verb"\TX@cols" would break the
+% ^^A algorithm.
+% \begin{macrocode}
+ % \expandafter\let\expandafter\tabularx\csname tabular*\endcsname
+ % \expandafter\let\expandafter\endtabularx\csname endtabular*\endcsname
+% \end{macrocode}
+% ^^A Added at v1.05: disable \verb"\write"s during a trial run. This trick is
+% ^^A from the \TeX{}Book.\footnote{Actually the \TeX{}Book trick does
+% ^^A not work correctly, so changed for v2.05.}
+% \begin{macrocode}
+ % \def\write{\begingroup
+ % \def\let{\afterassignment\endgroup\toks@}%
+ % \afterassignment\let\count@}%
+% \end{macrocode}
+% ^^A Turn off warnings (see appendix D). Also prevent them being turned
+% ^^A back on by setting the parameter names to be registers.
+% \begin{macrocode}
+ % \hbadness\@M
+ % \hfuzz\maxdimen
+ % \let\hbadness\@tempcnta
+ % \let\hfuzz\@tempdima
+% \end{macrocode}
+% ^^A Make the table, and finish the hbox.
+% ^^A Since v1.06, \verb"\toks@" contains the preamble specification,
+% ^^A and possible optional argument, as well as the table body.
+% \begin{macrocode}
+ % \expandafter\tabular\the\toks@
+ % \endtabular}%
+% \end{macrocode}
+% ^^A Since v1.05 reset all \LaTeX\ counters, by executing \verb"\TX@ckpt".
+% \begin{macrocode}
+ % \TX@ckpt
+% \end{macrocode}
+% ^^A Print some statistics.
+% ^^A Added \verb"\TX@align" in v1.05, to line up the columns.
+% \begin{macrocode}
+ % \TX@typeout@{\@spaces
+ % \expandafter\TX@align
+ % \the\wd\@tempboxa\space\space\space\space\space\@@
+ % \expandafter\TX@align
+ % \the\TX@col@width\space\space\space\space\space\@@
+ % \@spaces\the\TX@cols}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@align}
+% ^^A Macro added at v1.05, to improve the printing of the tracing info.
+% \begin{macrocode}
+ % \def\TX@align#1.#2#3#4#5#6#7#8#9\@@{%
+ % \ifnum#1<10 \space\fi
+ % \ifnum#1<100 \space\fi
+ % \ifnum#1<\@m\space\fi
+ % \ifnum#1<\@M\space\fi
+ % #1.#2#3#4#5#6#7#8\space\space}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\arraybackslash}
+% ^^A \verb"\\" hack.
+% \begin{macrocode}
+ % \ifx\arraybackslash\@undefined
+ % \def\arraybackslash{\let\\\tabularnewline}
+ % \fi
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\tracingtabularx}
+% ^^A Print statistics on column and table widths.
+% \begin{macrocode}
+ % \def\tracingtabularx{%
+ % %\def\TX@typeout{\PackageWarningNoLine{tabularx}}%
+ % \def\TX@typeout{\ClassWarningNoLine{memoir}}% <--- changed
+ % \def\TX@typeout@##1{\typeout{(tabularx) ##1}}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@typeout}
+% ^^A The default is to be to be quiet
+% \begin{macrocode}
+ % \let\TX@typeout\@gobble
+ % \let\TX@typeout@\@gobble
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@ftn}
+% ^^A A token register for saving footnote texts.
+% \begin{macrocode}
+ % \newtoks\TX@ftn
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@ftntext}
+% ^^A \begin{macro}{\TX@xftntext}
+% ^^A Inside the alignment just save up the footnote text in a token
+% ^^A register.
+% \begin{macrocode}
+ % \long\def\TX@ftntext#1{%
+ % \edef\@tempa{\the\TX@ftn\noexpand\footnotetext
+ % [\the\csname c@\@mpfn\endcsname]}%
+ % \global\TX@ftn\expandafter{\@tempa{#1}}}%
+ % \long\def\TX@xftntext[#1]#2{%
+ % \global\TX@ftn\expandafter{\the\TX@ftn\footnotetext[#1]{#2}}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@trial@ftn}
+% ^^A On trial runs, gobble footnote texts.
+% \begin{macrocode}
+ % \long\def\TX@trial@ftn#1{}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A This last section was added at Version 1.02. Previous versions
+% ^^A documented the fact that \verb"\verb" did not work inside {\ttfamily
+% ^^A tabularx}, but that did not stop people using it! This usually put
+% ^^A \LaTeX\ into an irrecoverable error position, with error messages that
+% ^^A did not mention the cause of the error. The `poor man's \verb"\verb"' (and
+% ^^A \verb"\verb*") defined here is based on page 382 of the \TeX{}Book. As
+% ^^A explained there, doing verbatim this way means that spaces are not
+% ^^A treated correctly, and so \verb"\verb*" may well be useless, however I
+% ^^A consider this section of code to be error-recovery, rather than a real
+% ^^A implementation of verbatim.
+% ^^A
+% ^^A The mechanism is quite general, and any macro which wants to allow a
+% ^^A form of \verb"\verb" to be used within its argument may
+% ^^A \verb"\let\verb=\TX@verb". (Making sure to restore the real definition
+% ^^A later!)
+% ^^A
+% ^^A \verb"\verb" and \verb"\verb*" are subject to the following restrictions:
+% ^^A \begin{enumerate}
+% ^^A \item Spaces in the argument are not read verbatim, but may be skipped
+% ^^A according to \TeX's usual rules.
+% ^^A \item Spaces will be added to the output after control words, even if
+% ^^A they were not present in the input.
+% ^^A \item Unless the argument is a single space, any trailing space,
+% ^^A whether in the original argument, or added as in (2),
+% ^^A will be omitted.
+% ^^A \item The argument must not end with \verb"\", so \verb"\verb|\|" is not
+% ^^A allowed, however, because of (3), \verb"\verb|\ |" produces
+% ^^A \verb"\".
+% ^^A \item The argument must be balanced with respect to \verb"{" and \verb"}". So
+% ^^A \verb"\verb|{|" is not allowed.
+% ^^A \item A comment character like \verb"%" will not appear verbatim. It will
+% ^^A act as usual, commenting out the rest of the input line!
+% ^^A \item The combinations \verb"?`" and \verb"!`" will appear as
+% ^^A {\ttfamily?`} and {\ttfamily!`} if the {\ttfamily cmtt} font is
+% ^^A being used.
+% ^^A \end{enumerate}
+% ^^A
+% ^^A \begin{macro}{\TX@verb}
+% ^^A The internal definition of \verb"\verb". Spaces will be replaced by \verb"~", so
+% ^^A for the star-form, \verb"\let" \verb"~" be \verb*| |, which we obtain as
+% ^^A \verb"\uppercase{*}". Use \verb"{\ifnum0=`}\fi" rather than \verb"\bgroup" to allow
+% ^^A \verb"&" to appear in the argument.
+% \begin{macrocode}
+ % {\uccode`\*=`\ %
+ % \uppercase{\gdef\TX@verb{%
+ % \leavevmode\null\TX@vwarn
+ % {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+ % \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@vb}
+% ^^A Get the `almost verbatim' text using \verb"\meaning". The `\verb"!"' is added to
+% ^^A the front of the user supplied text, to ensure that the whole argument
+% ^^A does not consist of a single \verb"{ }" group. \TeX\ would strip the outer
+% ^^A braces from such a group. The `\verb"!"' will be removed later.
+% ^^A
+% ^^A Originally I followed Knuth, and had \verb"\def\@tempa{##1}", however this
+% ^^A did not allow \verb"#" to appear in the argument. So in v1.04, I changed
+% ^^A this to to use a token register, and \verb"\edef". This allows \verb"#" appear,
+% ^^A but makes each one appear twice!, so later we loop through, replacing
+% ^^A \verb"##" by \verb"#".
+% \begin{macrocode}
+ % \def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+ % \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v}
+% ^^A Strip the initial segment of the \verb"\meaning", including the `\verb"!"'
+% ^^A added earlier.
+% \begin{macrocode}
+ % \def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A As explained above we are going to replace \verb"##" pairs by \verb"#". To do
+% ^^A this we need non-special \verb"#" tokens. Make \verb"*" into a parameter
+% ^^A token so that we can define macros with arguments. The normal meanings
+% ^^A will be restored by the \verb"\endgroup" later.
+% \begin{macrocode}
+ % \begingroup
+ % \catcode`\*=\catcode`\#
+ % \catcode`\#=12
+% \end{macrocode}
+% ^^A
+% ^^A \begin{macro}{\TX@vfirst}
+% ^^A As a special case, prevent the first character from being dropped.
+% ^^A This makes \verb"\verb*| |" produce \verb*| |. Then call \verb"\TX@v@".
+% ^^A This is slightly tricky since v1.04, as I have to ensure that an
+% ^^A actual \verb"#" rather than a command \verb"\let" to \verb"#" is passed on if the
+% ^^A first character is \verb"#".
+% \begin{macrocode}
+ % \gdef\TX@vfirst{%
+ % \if\@tempa#%
+ % \def\@tempb{\TX@v@#}%
+ % \else
+ % \let\@tempb\TX@v@
+ % \if\@tempa\space~\else\@tempa\fi
+ % \fi
+ % \@tempb}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v@}
+% ^^A Loop through the \verb"\meaning", replacing all spaces by \verb"~". If the last
+% ^^A character is a space it is dropped, so that \verb"\verb*|\LaTeX|" produces
+% ^^A \verb"\LaTeX" not \verb*|\LaTeX |. The rewritten tokens are then further
+% ^^A processed to replace \verb"##" pairs.
+% \begin{macrocode}
+ % \gdef\TX@v@*1 *2{%
+ % \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v@hash}
+% ^^A The inner loop, replacing \verb"##" by \verb"#".
+% \begin{macrocode}
+ % \gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A As promised, we now restore the normal meanings of \verb"#" and \verb"*".
+% \begin{macrocode}
+ % \endgroup
+% \end{macrocode}
+% ^^A
+% ^^A \begin{macro}{\TX@vwarn}
+% ^^A Warn the user the first time this \verb"\verb" is used.
+% \begin{macrocode}
+ % \def\TX@vwarn{%
+ % \@warning{\noexpand\verb may be unreliable inside tabularx}%
+ % \global\let\TX@vwarn\@empty}
+% \end{macrocode}
+% ^^A \end{macro}
+% \begin{macrocode}
+ %
+ % %%%%%%%%%% end Tabularx package code v2.11 %%%%%%%%%%%%%%%%%%%%%
+ %
+ %
+ %
+ %
+% \end{macrocode}
+% ^^A
+% ^^A At this point we had better stop anyone trying to load the several
+% ^^A tabular-related packages (as effectively they are already loaded).
+% \begin{macrocode}
+ % %%\@memfakeusepackage{array}
+ % %%\@memfakeusepackage{dcolumn}
+ % %%\@memfakeusepackage{delarray}
+ % %%\@memfakeusepackage{tabularx}
+ %
+% \end{macrocode}
+% ^^A
+% ^^A
+%
+% \subsection{Fear's rules}
+%
+% Simon Fear disapproves of the default \LaTeX{} table rules and
+% wrote the \Lpack{booktabs} package~\cite{BOOKTABS} to provide
+% better horizontal rules. Like many typographers, he abhors vertical rules.
+%
+%
+% \begin{macro}{\bktabrule}
+% The rules in this section are based on \verb?\hrule \@height#1? but this
+% does not
+% work for continuous tabulars. Provide a version of this that
+% can be \cs{let} when necessary.
+% \begin{macrocode}
+\newcommand*{\bktabrule}[1]{%
+ \hrule \@height#1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The following is taken almost verbatim from the \Lpack{booktabs} package,
+% version~1.618, March 2003.
+%
+% \begin{macrocode}
+%%%%%%%%%% Booktabs package code %%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% slightly modified by PRW %%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% by permission of Simon Fear %%%%%%%%%%%%%%%%%%%%%
+
+% \end{macrocode}
+% Danie Els is now (2005) the official maintainer of the \Lpack{booktabs} package. He provided me with
+% some updates to synchronize \Lpack{memoir}, \Lpack{booktabs} and support for \Lpack{colortbl} with \Lpack{booktabs}. I made the appropriate changes/extensions
+% on 2005/09/03 as part of version 1.618 of \Lpack{memoir}.
+%
+% \begin{macro}{\CT@arc@}
+% This supports the \Lpack{bookhands}/\Lpack{colortbl} package combination.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \providecommand*{\CT@arc@}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\heavyrulewidth}
+% \begin{macro}{\lightrulewidth}
+% \begin{macro}{\cmidrulewidth}
+% \begin{macro}{\belowrulesep}
+% \begin{macro}{\belowbottomsep}
+% \begin{macro}{\aboverulesep}
+% \begin{macro}{\abovetopsep}
+% \begin{macro}{\cmidrulesep}
+% \begin{macro}{\cmidrulekern}
+% \begin{macro}{\defaultaddspace}
+% First we set up some new dimensions.
+% \begin{macrocode}
+\newdimen\heavyrulewidth
+\newdimen\lightrulewidth
+\newdimen\cmidrulewidth
+\newdimen\belowrulesep
+\newdimen\belowbottomsep
+\newdimen\aboverulesep
+\newdimen\abovetopsep
+\newdimen\cmidrulesep
+\newdimen\cmidrulekern
+\newdimen\defaultaddspace
+\heavyrulewidth=.08em
+\lightrulewidth=.05em
+\cmidrulewidth=.03em
+\belowrulesep=.65ex
+\belowbottomsep=\z@
+\aboverulesep=.4ex
+\abovetopsep=\z@
+\cmidrulesep=\doublerulesep
+\cmidrulekern=.5em
+\defaultaddspace=.5em
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@cmidla}
+% \begin{macro}{\@cmidlb}
+% \begin{macro}{\@aboverulesep}
+% \begin{macro}{\@belowrulesep}
+% \begin{macro}{\@thisruleclass}
+% \begin{macro}{\@lastruleclass}
+% \begin{macro}{\@thisrulewidth}
+% And some internal counters and other things of no interest to the end user:
+% \begin{macrocode}
+\newcount\@cmidla
+\newcount\@cmidlb
+\newdimen\@aboverulesep
+\newdimen\@belowrulesep
+\newcount\@thisruleclass
+\newcount\@lastruleclass
+\@lastruleclass=0
+\newdimen\@thisrulewidth
+
+% \end{macrocode}
+% which will be described as needed below.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\futurenonspacelet}
+% \begin{macro}{\@BTfnslone}
+% \begin{macro}{\@BTfnsltwo}
+% \begin{macro}{\@BTfnslthree}
+% Next we define a very useful macro (more-or-less straight from the
+% \theTeXbook's Dirty Tricks chapter; documented there). Use
+% \cs{futurenonspacelet} instead of \cs{futurelet} when looking for the next
+% (non-space) token after a macro that has an argument. (After a macro
+% without an argument, space is ignored anyway, so \cs{futurenonspacelet}
+% wouldn't be needed.) This hack allows users to type white
+% space between successive rule commands.
+% \begin{macrocode}
+\def\futurenonspacelet#1{\def\@BTcs{#1}%
+ \afterassignment\@BTfnslone\let\nexttoken= }
+\def\@BTfnslone{\expandafter\futurelet\@BTcs\@BTfnsltwo}
+\def\@BTfnsltwo{\expandafter\ifx\@BTcs\@sptoken\let\next=\@BTfnslthree
+ \else\let\next=\nexttoken\fi \next}
+\def\@BTfnslthree{\afterassignment\@BTfnslone\let\next= }
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Full width rules}
+%
+% When we are not in a \texttt{longtable} environment, we can simply
+% implement the full width rules as a \cs{hrule} in a \verb?\noalign{}?
+% group. But within a \texttt{longtable}, the rule has to be drawn like a
+% \verb?\cmidrule{1-\LT@cols}? (the rationale for this is explained in the
+% \texttt{longtable} documentation).
+
+% In order to allow for both, all the rule macros have to
+% open a \cs{noalign} group immediately, while they work out whether
+% they have been called within a \texttt{longtable}; if you don't do this,
+% \TeX's underlying \cs{halign} process gets hiccups.
+% I use \LaTeX's
+% dirty trick (\verb?\ifnum=0`}?) to fool the parser that the bracket
+% count is OK. The bracket really gets closed after all the skipping
+% at the end of the \cs{@BTendrule} macro.
+
+% The class 1 rules, and \cs{specialrule}, really only differ in the
+% defaults for space above and
+% below, and the width, passed to a common routine, \cs{@BTrule},
+% described below. The spaces, \cs{@aboverulesep} and \cs{@belowrulesep},
+% are set within the \cs{noalign} group, so are inherited by
+% \cs{@BTrule}. Similarly, \cs{@BTrule} knows as much as it needs to
+% about the routine that called it by examining the inherited
+% \cs{@thisruleclass}. The optional width argument is parsed by
+% \cs{@BTrule} after being set to default if absent.
+
+%
+% \begin{macro}{\toprule}
+% \begin{macro}{\midrule}
+% \begin{macro}{\bottomrule}
+% \begin{macro}{\specialrule}
+% \begin{macrocode}
+\def\toprule{\noalign{\ifnum0=`}\fi
+ \@aboverulesep=\abovetopsep
+ \global\@belowrulesep=\belowrulesep
+ \global\@thisruleclass=\@ne
+ \@ifnextchar[{\@BTrule}{\@BTrule[\heavyrulewidth]}}
+
+\def\midrule{\noalign{\ifnum0=`}\fi
+ \@aboverulesep=\aboverulesep
+ \global\@belowrulesep=\belowrulesep
+ \global\@thisruleclass=\@ne
+ \@ifnextchar[{\@BTrule}{\@BTrule[\lightrulewidth]}}
+
+\def\bottomrule{\noalign{\ifnum0=`}\fi
+ \@aboverulesep=\aboverulesep
+ \global\@belowrulesep=\belowbottomsep
+ \global\@thisruleclass=\@ne
+ \@ifnextchar[{\@BTrule}{\@BTrule[\heavyrulewidth]}}
+
+\def\specialrule#1#2#3{\noalign{\ifnum0=`}\fi
+ \@aboverulesep=#2\global\@belowrulesep=#3\global\@thisruleclass=\tw@
+ \@BTrule[#1]}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\addlinespace}
+% An \cs{addlinespace} is essentially a zero-width rule with
+% zero space above and argument (or default) space below. But because
+% the rule is not actually drawn, but is just a \cs{vskip}, there is no
+% need to check if we're in a longtable, so we don't need to call
+% \cs{@BTrule} as for `real' rules. But we do share the \cs{@BTendrule}
+% lookahead and flagsetting code (described below), and the \cs{vskip} is done there.
+% \begin{macrocode}
+\def\addlinespace{\noalign{\ifnum0=`}\fi
+ \@ifnextchar[{\@addspace}{\@addspace[\defaultaddspace]}}
+\def\@addspace[#1]{\global\@belowrulesep=#1\global\@thisruleclass=\tw@
+ \futurelet\@tempa\@BTendrule}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@BTrule}
+% All the rules (except \cs{addlinespace}) share this code.
+% \begin{macrocode}
+\def\@BTrule[#1]{%
+% \end{macrocode}
+% Note (2016/05/16): code rearranged a bit to come back into sync with
+% \Lpack{booktabs} v1.618033.
+%
+% \changes{v3.7f}{2016/05/16}{changed the order so the \cs{ifx} lines
+% come first. From booktabs 2016/04/27 v1.618033}
+% Now we work out, by a very nasty hack, if we're within a
+% \texttt{longtable}. It's easy if \cs{longtable} isn't even defined: then we
+% can't be. But it is not enough just to check if \texttt{longtable} is
+% loaded --- we might be within an ordinary table rather than a
+% longtable. So we look to see if \cs{hline} has been re-defined
+% from its \LaTeX\ definition to be the same as
+% \cs{LT@hline}. (Longtable currently does this redefinition when it opens a
+% \texttt{longtable} environment, but not globally, so it is
+% cleared it when the environment closes.) Another
+% package could potentially do this! And \texttt{longtable} might change the
+% way it implements this! So, it is not entirely safe, but I have
+% found no better way so far.
+%
+% We set up \cs{@BTswitch} to call \cs{@BTnormal} or \cs{@BLTrule}, as
+% appropriate, then call it.
+% \begin{macrocode}
+ \ifx\longtable\undefined
+ \let\@BTswitch\@BTnormal
+ \else\ifx\hline\LT@hline
+ \let\@BTswitch\@BLTrule
+ \else
+ \let\@BTswitch\@BTnormal
+ \fi\fi
+% \end{macrocode}
+% On with the code
+% \begin{macrocode}
+ \global\@thisrulewidth=#1\relax
+% \end{macrocode}
+% Save the width argument (if the user didn't give one, then the
+% calling routine will have called \cs{@BTrule} with the default) in a global
+% variable for later use when drawing the rule.
+% \begin{macrocode}
+ \ifnum\@thisruleclass=\tw@\vskip\@aboverulesep\else
+% \end{macrocode}
+% Specialrules always insert specified space above. (Note: addlinespaces
+% don't come here).
+% \begin{macrocode}
+ \ifnum\@lastruleclass=\z@\vskip\@aboverulesep\else
+ \ifnum\@lastruleclass=\@ne\vskip\doublerulesep\fi\fi\fi
+% \end{macrocode}
+% After text (last rule class 0), precede the rule by \cs{aboverulesep};
+% but if immediately after a
+% previous rule, insert a \cs{doublerulesep}.
+%
+% \begin{macrocode}
+ \@BTswitch}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@BTnormal}
+% This is when we're \emph{not} within a longtable. We are already in a
+% \cs{noalign} group, all we need do is draw an \cs{hrule} and gobble any
+% trailing spaces, then call the closing routine with \cs{@tempa} set
+% equal to the next token in the document.
+% \begin{macrocode}
+% \def\@BTnormal{\hrule
+% \@height \@thisrulewidth\futurenonspacelet\@tempa\@BTendrule}
+\def\@BTnormal{%
+%% \bktabrule{\@thisrulewidth}
+ {\CT@arc@\bktabrule{\@thisrulewidth}}%
+ \futurenonspacelet\@tempa\@BTendrule}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@BLTrule}
+% This is for full width rule within a \texttt{longtable}. First we check if
+% a kerning argument has been used; if so let \cs{@@BLTrule} read it,
+% else call \cs{@@BLTrule} with an empty string:
+% \begin{macrocode}
+\def\@BLTrule{\@ifnextchar({\@@BLTrule}{\@@BLTrule()}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@BLTrule}
+% \begin{macrocode}
+\def\@@BLTrule(#1){\@setrulekerning{#1}%
+\global\@cmidlb\LT@cols
+% \end{macrocode}
+% The \cs{@setrulekerning} routine parses the kerning argument tokens
+% and sets global kerning widths accordingly (or to defaults, if user
+% hasn't set them explicitly). The global assignment to \cs{@cmidlb}
+% sets up the column count for the \cs{@cmidruleb} macro, which is
+% shared with \verb?cmidrules?.
+% \begin{macrocode}
+\ifnum0=`{\fi}%
+% \end{macrocode}
+% Close the currently open \cs{noalign} group. Within a \texttt{longtable},
+% rules are all to be drawn as leaders within a text box that is
+% \cs{LT@cols} columns wide.
+% \begin{macrocode}
+\@cmidruleb
+% \end{macrocode}
+% Draw the rule. We share the \cs{@cmidruleb} code with ordinary \cs{cmidrule}s.
+% \begin{macrocode}
+\noalign{\ifnum0=`}\fi
+% \end{macrocode}
+% We have to open a new noalign immediately else \TeX{} will start a new
+% text box where we don't want one. Then, after gobbling any
+% unwanted white space, we call the closing routine.
+% \begin{macrocode}
+\futurenonspacelet\@tempa\@BTendrule}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@BTendrule}
+% We look one step ahead (token is in \cs{@tempa}) to see if another
+% rule follows (shame on user!). If so, we set \cs{@lastruleclass} equal
+% to \cs{@thisruleclass} (thus setting it up for the following rule). If
+% there isn't a following rule, we clear \cs{@lastruleclass} (ie set it
+% to zero), which isn't technically true since we have just drawn a
+% rule, but sets it up correctly for the next rule encountered, which
+% must be following some intervening text.
+% \begin{macrocode}
+\def\@BTendrule{%
+ \ifx\@tempa\toprule\global\@lastruleclass=\@thisruleclass
+ \else\ifx\@tempa\midrule\global\@lastruleclass=\@thisruleclass
+ \else\ifx\@tempa\bottomrule\global\@lastruleclass=\@thisruleclass
+ \else\ifx\@tempa\cmidrule\global\@lastruleclass=\@thisruleclass
+ \else\ifx\@tempa\specialrule\global\@lastruleclass=\@thisruleclass
+ \else\ifx\@tempa\addlinespace\global\@lastruleclass=\@thisruleclass
+ \else\global\@lastruleclass=\z@\fi\fi\fi\fi\fi\fi
+ \ifnum\@lastruleclass=\@ne\relax\else\vskip\@belowrulesep\fi
+ \ifnum0=`{\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Special subrules}
+%
+% \begin{macro}{\@setrulekerning}
+% The following code parses the trimming arguments (if there are any)
+% for \cs{cmidrule} or a \cs{BLTrule}. The rule
+% will be trimmed left and right by \cs{cmrkern@l} and \cs{cmrkern@l},
+% which are zero by default, set to \cs{cmidrulekern} by the plain
+% \verb?(lr)? arguments, or user set as in \verb?(r{.5em})?. We parse token by
+% token through the arguments. The
+% tokens \verb?r? and \verb?l? cause \cs{cmrkern@r} or \cs{cmrkern@l} to be set to
+% \cs{cmidrulekern}. There is no lookahead to see if a width is the
+% next token; this strategy is efficient for the plain commands,
+% while inefficient for the qualified commands, but more importantly
+% it is much easier to program. Tokens \verb?r? and \verb?l? also set
+% \cs{cmrswitch} so that if the next token turns out to be
+% \marg{wd} then the kerning will be done on the side
+% currently specified. I have been too lazy to program an error
+% message should one encounter tokens other than \verb?r?, \verb?l? or
+% \marg{wd}.
+% \changes{v1.618}{2005/09/03}{Fixed bug in booktabs trim command by improving character comparison code in \cs{@setrulekerning} (mempatch v3.8)}
+% \begin{macrocode}
+\def\@setrulekerning#1{%
+ \global\let\cmrkern@l\z@
+ \global\let\cmrkern@r\z@
+ \@tfor\@tempa :=#1\do
+ {\def\@tempb{r}%
+ \ifx\@tempa\@tempb
+ \global\let\cmrkern@r\cmidrulekern
+ \def\cmrsideswitch{\cmrkern@r}%
+ \else
+ \def\@tempb{l}%
+ \ifx\@tempa\@tempb
+ \global\let\cmrkern@l\cmidrulekern
+ \def\cmrsideswitch{\cmrkern@l}%
+ \else
+ \global\expandafter\let\cmrsideswitch\@tempa
+ \fi
+ \fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cmidrule}
+% \begin{macro}{\@cmidrule}
+% \begin{macro}{\@@cmidrule}
+% The \cs{cmidrule} re-uses \cs{@lastruleclass} in an entirely different
+% way from the full width rules. (Maybe I should have used a
+% different flag; it seemed efficient at the time \ldots). This
+% is (left) set to one if you are in the middle of a row of
+% \cs{cmidrules}, or starting a new one (with \cs{morecmidrules}).
+% Otherwise, when \cs{@lastruleclass} is zero, we precede the
+% rule with \cs{aboverulesep}.
+% \begin{macrocode}
+\def\cmidrule{\noalign{\ifnum0=`}\fi
+ \@ifnextchar[{\@cmidrule}{\@cmidrule[\cmidrulewidth]}}
+\def\@cmidrule[#1]{\@ifnextchar({\@@cmidrule[#1]}{\@@cmidrule[#1]()}}
+\def\@@cmidrule[#1](#2)#3{\@@@cmidrule[#3]{#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@@cmidrule}
+% The above is fiddling around to set defaults for missing optional
+% arguments. We also pass to \cs{@@@cmidrule} in a different order,
+% namely =[a-b]=\verb?{width required}= \verb?{kerning commands}= (this being
+% the order in which the arguments are actually processed):
+% \begin{macrocode}
+\def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax
+ \global\advance\@cmidla\m@ne
+ \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else
+ \global\let\@gtempa\@cmidruleb\fi
+ \global\@cmidlb#2\relax
+ \global\advance\@cmidlb-\@cmidla
+% \end{macrocode}
+% This has set up a switch (\cs{@gtempa}) to call the relevant routine,
+% \cs{@cmidrulea} or \cs{@cmidruleb}, depending on whether we start
+% from column one or not.
+% \begin{macrocode}
+ \global\@thisrulewidth=#3
+% \end{macrocode}
+% That is, set per default or given argument. Then parse any trimming
+% arguments to set, globally, \cs{cmrkern@r} and \cs{cmrkern@l} accordingly:
+% \begin{macrocode}
+ \@setrulekerning{#4}
+% \end{macrocode}
+% Now insert space above if needed, close the \cs{noalign},
+% then switch to appropriate rule drawing routine as determined
+% above (\cs{let} to \cs{@gtempa}):
+% \begin{macrocode}
+ \ifnum\@lastruleclass=\z@\vskip \aboverulesep\fi
+ \ifnum0=`{\fi}\@gtempa
+% \end{macrocode}
+% Having now drawn the rule,
+% open another \cs{noalign}, and call the closing routine:
+% \begin{macrocode}
+ \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xcmidrule}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xcmidrule}
+% In this closing routine, see if another \cs{cmidrule} follows;
+% if so, backspace
+% vertical so it will line up with the one you just drew,
+% and setting \cs{@lastruleclass} to 1 will suppress
+% adding space above the next. If a \cs{morecimdrules} follows,
+% we add (positive) \cs{cmidrulesep} (and again set \cs{@lastruleclass}
+% to one). Otherwise this is the last rule of the current group
+% and we can just add \cs{belowrulesep}. Finally, we close the \cs{noalign}.
+% \begin{macrocode}
+\def\@xcmidrule{\ifx\@tempa\cmidrule\vskip-\@thisrulewidth
+ \global\@lastruleclass=\@ne\else
+ \ifx\@tempa\morecmidrules\vskip \cmidrulesep
+ \global\@lastruleclass=\@ne\else
+ \vskip \belowrulesep\global\@lastruleclass=\z@\fi\fi
+ \ifnum0=`{\fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@cmidrulea}
+% \begin{macro}{\@cmidruleb}
+% This code (called below) actually draws the rules. They are drawn
+% as boxes in text, rather than in a \cs{noalign} group, which permits
+% the left and right kerning.
+% \changes{v3.7f}{2016/05/16}{Added \cs{kern}\cs{z@} to comply to
+% latest booktabs updates. In Booktabs they were added to protect
+% against unskips.}
+% \begin{macrocode}
+\def\@cmidrulea{%
+ \multispan\@cmidla&\multispan\@cmidlb
+%% \unskip\hskip \cmrkern@l\leaders\bktabrule{\@thisrulewidth}\hfill
+ \unskip\hskip \cmrkern@l{%
+ \CT@arc@\leaders\bktabrule{\@thisrulewidth}\hfill\kern\z@}%
+ \hskip \cmrkern@r\cr}
+\def\@cmidruleb{%
+ \multispan\@cmidlb
+%% \unskip\hskip \cmrkern@l\leaders\bktabrule{\@thisrulewidth}\hfill
+ \unskip\hskip \cmrkern@l{%
+ \CT@arc@\leaders\bktabrule{\@thisrulewidth}\hfill\kern\z@}%
+ \hskip \cmrkern@r\cr}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\morecmidrules}
+% This is really a dummy command; all the work is done above
+% within the \cs{cmidrule} routine. We look one step ahead there
+% to see if a \cs{morecmidrules} follows the current \cs{cmidrule},
+% and if so set the flag. Otherwise, \cs{morecmidrules} itself
+% does nothing.
+% \begin{macrocode}
+\def\morecmidrules{\noalign{\relax}}
+
+%%%%%%%%%% end of Booktabs package code %%%%%%%%%%%%%%%%%%%%%
+
+% \end{macrocode}
+% \end{macro}
+%
+% Ensure that the real \Lpack{booktabs} package can't get called.
+% \changes{v1.618}{2005/09/03}{Killed use of real booktabs package (mempatch v3.12)}
+% \begin{macrocode}
+%%\@memfakeusepackage{booktabs}
+
+% \end{macrocode}
+%
+%
+% \subsection{Input files into tabulars, and etex}
+%
+% M.J. Williams (CTT \textit{\cs{noalign} problem with \cs{input} and
+% tabular in memoir class}, 28 Aug 2007) reported that using \cs{input} in a
+% tabular resulted in errors. His example was:
+% \begin{verbatim}
+% ...
+% \begin{tabular}{c|c} \hline
+% 1 & 2 \\ \hline
+% \input{data} \hline
+% 5 & 6 \\ \hline
+% \end{tabular}
+% \end{verbatim}
+% where \texttt{data.tex} contains the single line (and no newline) \\
+% \verb?3 & 4 \\?
+%
+% Morten H{\o}gholm noted that the problem
+% was caused by \Lpack{memoir}'s extension to \cs{input}
+% and gave a solution that depends on processing via
+% \texttt{etex} rather than \texttt{tex}.
+%
+% Here's Morten's fix. Quoting, in part:
+% \begin{quotation}
+% \Lpack{memoir} extends the file loading mechanism by providing
+% \cs{AtBeginFile} and \cs{AtEndFile} whose arguments are executed as
+% the names indicate. \ldots after inputting a file the storage bins are
+% emptied. The problem [in your case] is that this emptying is an
+% assignment and so starts a new tabular cell and \cs{hline} is only
+% allowed after \verb?\\? or other \cs{hline}s.
+%
+% \ldots the tabular environment wraps each tabular cell in additional
+% groups so one can do an explicit test for which type of group we are in.
+% If tested to be in an align group \emph{and} in vertical mode it means
+% TeX hasn't found something to start a new cell and
+% then \cs{noalign} can be used.
+% \end{quotation}
+%
+% \begin{macrocode}
+\ifetex
+ \renewcommand*{\killm@matf}[1]{%
+ \ifnum 6=\currentgrouptype
+ \ifvmode
+ \expandafter\expandafter\expandafter\@firstoftwo
+ \expandafter\expandafter\expandafter\noalign
+ \fi
+ \fi
+ \@firstofone
+ {\@namelet{#1-m@mfb}\relax
+ \@namelet{#1-m@mfe}\relax
+ }%
+ }
+\fi
+
+% \end{macrocode}
+%
+%
+% \subsection{Continuous tabulars}
+%
+% The standard \texttt{tabular} environment is wrapped inside a box
+% (see \verb?\@tabular?),
+% which means that it cannot break across pages. Equivalent environments
+% are provided which are not boxed and so can continue across page
+% boundaries.
+%
+% \begin{macro}{\ctableftskip}
+% \begin{macro}{\ctabrightskip}
+% These skips are inserted at the left and right of continuous tabulars
+% so that their horizontal location can be specified.
+% \begin{macrocode}
+\newskip\ctableftskip \ctableftskip=\fill
+\newskip\ctabrightskip \ctabrightskip=\fill
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ctabular*}
+% \begin{macro}{\@ctabularstar}
+% This starts off the \texttt{ctabular*} continuous tabular environment.
+% The default location is centered. NOTE: This is not for release.
+% \begin{macrocode}
+\expandafter\def\csname ctabular*\endcsname{%
+ \@ifnextchar[ {\@ctabularstar}{\@ctabularstar[c]}}
+\def\@ctabularstar[#1]#2{\global\@curtab\@ne
+ \ctableftskip\fill
+ \ctabrightskip\fill
+ \if l#1% left
+ \ctableftskip\z@
+ \else
+ \if r#1% right
+ \ctabrightskip\z@
+ \fi
+ \fi
+ \setlength\dimen@{#2}%
+ \xdef\@halignto{to\the\dimen@}\NC@tabular}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ctabular}
+% \verb?\ctabular? is similar to \verb?\ctabular*? except that the
+% width is known to be \verb?\hsize?.
+% \begin{macrocode}
+\newcommand*{\ctabular}[1][c]{\global\@curtab\@ne
+ \ctableftskip\fill
+ \ctabrightskip\fill
+ \if l#1% left
+ \ctableftskip\z@
+ \else
+ \if r#1% right
+ \ctabrightskip\z@
+ \fi
+ \fi
+ \gdef\@halignto{to\hsize}\NC@tabular}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NC@tabular}
+% \verb?\NC@tabular?
+% \begin{macrocode}
+\newcommand*{\NC@tabular}{%
+ \par
+ \addvspace{\topsep}
+ \col@sep\tabcolsep
+ \let\d@llarbegin\begingroup
+ \let\d@llarend\endgroup
+ \@NCtabarray}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@NCialign}
+% \begin{macrocode}
+\newcommand*{\@NCialign}{\everycr{}\tabskip\ctableftskip\halign}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@NCtabarray}
+% Effectively a modified version of \verb?\@array?
+% \begin{macrocode}
+\newcommand*{\@NCtabarray}[1]{%
+ \@tempdima \ht\strutbox
+ \advance\@tempdima\extrarowheight
+ \setbox \@arstrutbox \hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp\strutbox
+ \@width\z@}%
+ \begingroup
+%% \@mkpream{@{\hspace{\@totalleftmargin}}#1@{}}%
+ \@mkpream{#1}%
+ \xdef\@preamble{\@NCialign \@halignto
+ \bgroup & \tabskip\z@
+ \@arstrut
+ \@preamble
+ \tabskip\ctabrightskip
+ \cr}%
+ \endgroup
+ \let\@sharp ##\let\protect\relax
+ \lineskip\z@
+ \baselineskip\z@
+ \let\\\@arraycr
+ \let\tabularnewline\\%
+ \let\par\@empty
+ \ctabsetlines
+ \@preamble
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endctabular}
+% \begin{macro}{\endctabular*}
+% End the environments.
+% \begin{macrocode}
+\def\endctabular{%
+ \crcr \egroup
+ \gdef\@preamble{}%
+ \addvspace{\topsep}
+ \noindent}
+\expandafter\let\csname endctabular*\endcsname=\endctabular
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \subsubsection{Horizontal lines}
+%
+% The standard \cs{hline} can produce odd results when used with
+% continuous tabulars, but \cs{hhline} or \cs{cline} are OK.
+% I want a version of \cs{hline}
+% that works with continuous tabulars and has an adjustable width
+% (i.e., thickness). This will be based on a modified \cs{cline}
+%
+% For reference, here are the essentials of the kernel's definitions.
+% \begin{verbatim}
+% \def\hline{%
+% \noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
+% \reserved@a\@xhline}
+% \def\@xhline{%
+% \ifx\reserved@a\hline
+% \vskip\doublerulesep
+% \vskip-\arrayrulewidth
+% \fi
+% \ifnum0=`{\fi}}
+% \def\cline#1{\@cline#1\@nil}
+% \def\@cline#1-#2\@nil{%
+% \omit
+% \@multicnt#1%
+% \advance\@multispan\m@ne
+% \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
+% \@multicnt#2%
+% \advance\@multicnt-#1%
+% \advance\@multispan\@ne
+% \leaders\hrule\@height\arrayrulewidth\hfill
+% \cr
+% \noalign{\vskip-\arrayrulewidth}}
+% \end{verbatim}
+%
+% \begin{macro}{\memcline}
+% \begin{macro}{\m@m@cline}
+% This is a version of the kernel \cs{cline} code that provides
+% a variable width.
+% \begin{macrocode}
+\newcommand*{\memcline}[2]{\m@m@cline[#1]#2\@nil}
+\def\m@m@cline[#1]#2-#3\@nil{%
+ \omit
+ \@multicnt#2%
+ \advance\@multispan\m@ne
+ \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
+ \@multicnt#3%
+ \advance\@multicnt-#2%
+ \advance\@multispan\@ne
+ \leaders\hrule\@height #1\hfill % <- variable \@height value
+ \cr
+ \noalign{\vskip- #1}} % <- variable \@height value
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memhline}
+% \begin{macro}{\m@mhline}
+% A version of \cs{hline}, based on \cs{memcline}, taking a
+% rule width as argument. It draws a \cs{memcline} from the
+% first to the last (\cs{@curtab}) column.
+% \begin{macrocode}
+\newcommand*{\memhline}[1][\arrayrulewidth]{\memcline{#1}{1-\@curtab}}
+\newcommand*{\m@mhline}{\cline{1-\@curtab}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+% Fear's rules also do not play well within continuous tabulars.
+%
+% \begin{macro}{\m@m@BTnormal}
+% Special version of \cs{@BTnormal}
+% \begin{macrocode}
+\def\m@m@BTnormal{%
+ \ifnum0=`{\fi} % closes the \noalign
+ \multispan{\@curtab} \leaders\bktabrule{\@thisrulewidth}\hfill\cr
+ \noalign{\ifnum0=`}\fi
+ \futurenonspacelet\@tempa\@BTendrule}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ctabsetlines}
+% Continuous tabulars cannot use the standard horizontal lines.
+% \begin{macrocode}
+\def\ctabsetlines{%
+ \let\hline\m@mhline
+ \let\@BTnormal\m@m@BTnormal}
+
+% \end{macrocode}
+% \end{macro}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \subsection{Automated tabulations}
+%
+%
+% It can be convenient, especially while drafting a document, to have
+% a list of items put into a tabular without having to mark the ends
+% of the rows.
+%
+% The following is based on plain \TeX{} code given on pages 307--308 of
+% \textit{TeX for the Impatient}~\cite{bk:Impatient}, which provides
+% code for typesetting in columns.
+%
+%
+% \begin{macro}{\abovecolumnspenalty}
+% \begin{macro}{\@linestogo}
+% \begin{macro}{\@cellstogo}
+% \begin{macro}{\@cellsincolumn}
+% \begin{macro}{\crtok}
+% Counters and such.
+% \begin{macrocode}
+\newcount\abovecolumnspenalty
+ \abovecolumnspenalty=10000
+\newcount\@linestogo % lines remaining to be procesed
+\newcount\@cellstogo % cells remaining in column or row
+\newcount\@cellsincolumn % number of lines per column
+\newtoks\crtok
+ \crtok = {\cr}%
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mincolumnwidth}
+% \begin{macro}{\c@lleftskip}
+% \begin{macro}{\c@lrightskip}
+% More things
+% \begin{macrocode}
+\newdimen\@mincolumnwidth
+\let\c@lleftskip\hfil % left skip within a column
+\let\c@lrightskip\hfil % right skip within a column
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\preautotab}
+% \begin{macro}{\postautotab}
+% Hooks into the auto tabulations.
+% \begin{macrocode}
+\let\preautotab\relax
+\let\postautotab\relax
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\autocols}
+% \cs{autocols}\oarg{width}\marg{pos}\marg{num}\marg{style}\marg{comma separated list}
+% arranges the elements in the \meta{comma separated list} into \meta{num}
+% columns, the elements filling each column before moving to the next.
+% That is, the elements are ordered top to bottom and left to right.
+% \begin{macrocode}
+\newcommand{\autocols}[5][0pt]{\par\begingroup
+ \ctabsetlines
+% \end{macrocode}
+% Set the table position
+% \begin{macrocode}
+ \if l#2
+ \raggedright
+ \else
+ \if r#2
+ \raggedleft
+ \else
+ \centering
+ \fi
+ \fi
+% \end{macrocode}
+% Set the column position style
+% \begin{macrocode}
+ \let\c@lleftskip\hfil
+ \let\c@lrightskip\hfil
+ \if l#4
+ \let\c@lleftskip\relax
+ \else
+ \if r#4
+ \let\c@lrightskip\relax
+ \fi
+ \fi
+% \end{macrocode}
+% Count the number of entries and the minimum width (max entry width)
+% for the columns.
+% \begin{macrocode}
+ \@mincolumnwidth\z@
+ \TX@cols=#3
+ \@curtab=#3
+ \@linestogo\z@
+ \@for\@tempa:=#5\do{
+ \advance\@linestogo\@ne
+ \settowidth{\@tempdima}{\@tempa}
+ \ifdim\@tempdima>\@mincolumnwidth
+ \@mincolumnwidth=\@tempdima
+ \fi
+ }
+ \advance\@mincolumnwidth\tabcolsep
+ \linespercol
+% \end{macrocode}
+% Specify what is to be done after every entry
+% \begin{macrocode}
+ \def\@endcolumnactions{%
+ \global\advance\@linestogo\m@ne
+ \ifnum\@cellstogo<\tw@
+ \global\advance\TX@cols\m@ne
+ \ifnum\TX@cols>\z@\linespercol\fi
+ \the\crtok
+ \else
+ &\global\advance\@cellstogo\m@ne
+ \fi}%
+% \end{macrocode}
+% Calculate the width of the columns
+% \begin{macrocode}
+ \ifdim #1 > \z@
+ \TX@col@width=#1
+ \divide\TX@col@width \TX@cols
+ \else
+ \TX@col@width=\@mincolumnwidth
+ \fi
+ \penalty\abovecolumnspenalty
+ \noindent% usually not a paragraph
+% \end{macrocode}
+% Create most of the preamble by looping to add \cs{@cellsincolumn}-1 slots,
+% then the last one which is different.
+% \begin{macrocode}
+ \def\@preamble{}%
+ \begingroup
+ \let\@sharp\relax
+ \ifnum\@cellsincolumn>\@ne
+ \loop
+ \g@addto@macro{\@preamble}{%
+ \hb@xt@ \TX@col@width{%
+ \c@lleftskip\strut\@sharp\c@lrightskip} &}%
+ \advance\@cellsincolumn\m@ne
+ \ifnum\@cellsincolumn>\@ne
+ \repeat
+ \fi
+ \g@addto@macro{\@preamble}{%
+ \hb@xt@ \TX@col@width{\c@lleftskip\strut\@sharp\c@lrightskip}}%
+ \endgroup
+ \let\@sharp ##
+% \end{macrocode}
+% Start the \cs{valign}
+% \begin{macrocode}
+ \tabskip\ctableftskip
+%% \tabskip\z@
+ \valign \bgroup
+ \tabskip\z@
+ \@preamble
+ \tabskip\ctabrightskip\cr
+% \end{macrocode}
+% Add all the entries then finish off.
+% \begin{macrocode}
+ \@for\@tempa:=#5\do{
+ \@tempa\unskip\space\@endcolumnactions}%
+ \the\crtok \egroup \par \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\linespercol}
+% \cs{linespercol} calculates the maximum number of lines that go into
+% a column, where there are \cs{TX@cols} columns and \cs{@linestogo}
+% lines, so that the columns are balanced as well as possible. The result
+% is \cs{@cellstogo}
+% \begin{macrocode}
+\newcommand*{\linespercol}{%
+ \@cellsincolumn=\@linestogo
+ \divide\@cellsincolumn \TX@cols
+ \@cellstogo=\@cellsincolumn
+ \multiply\@cellstogo \TX@cols
+ \@tempcnta=\@linestogo
+ \advance\@tempcnta -\@cellstogo
+ \ifnum \@tempcnta>\z@
+ \advance\@cellsincolumn \@ne
+ \fi
+ \global\@cellstogo=\@cellsincolumn}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\autorows}
+% \cs{autorows}\oarg{width}\marg{pos}\marg{num}\marg{style}\marg{comma separated list}
+% arranges the elements in the \meta{comma separated list} into \meta{num}
+% columns, the elements filling each row before moving to the next.
+% That is, the elements are ordered left to right and top to bottom.
+% By default, each column is the same width, enough for the widest entry.
+% If \meta{width} is a negative length (e.g., -1pt) the columns are set
+% to their natural
+% widths. If \meta{width} is positive (e.g., \cs{textwidth}), column widths
+% are equal widths so that the overal width is \meta{width}.
+% The sideways location of thre tabular is \meta{pos} (l, c, or r), and
+% the column style id \meta{style} (l, c, or r).
+% \begin{macrocode}
+\newcommand{\autorows}[5][0pt]{\par\begingroup
+ \ctabsetlines
+% \end{macrocode}
+% Set the table position
+% \begin{macrocode}
+ \ctableftskip\fill
+ \ctabrightskip\fill
+ \if l#2
+ \ctableftskip\z@
+ \else
+ \if r#2
+ \ctabrightskip\z@
+ \fi
+ \fi
+% \end{macrocode}
+% Set the column position style
+% \begin{macrocode}
+ \let\c@lleftskip\hfil
+ \let\c@lrightskip\hfil
+ \if l#4
+ \let\c@lleftskip\relax
+ \else
+ \if r#4
+ \let\c@lrightskip\relax
+ \fi
+ \fi
+% \end{macrocode}
+% Count the number of entries and the minimum width (max entry width)
+% for the columns.
+% \begin{macrocode}
+ \TX@cols=#3\relax
+ \@curtab=#3\relax
+ \@cellstogo = \TX@cols
+ \@mincolumnwidth\z@
+ \@linestogo\z@
+ \@for\@tempa:=#5\do{%
+ \advance\@linestogo\@ne
+ \settowidth{\@tempdima}{\@tempa}
+ \ifdim\@tempdima>\@mincolumnwidth
+ \@mincolumnwidth=\@tempdima
+ \fi}%
+ \advance\@mincolumnwidth\tabcolsep
+% \end{macrocode}
+% Specify what is to be done after every entry
+% \begin{macrocode}
+ \def\@endcolumnactions{%
+ \global\advance\@linestogo\m@ne
+ \global\advance\@cellstogo\m@ne
+ \ifnum\@cellstogo<\@ne
+ \global\@cellstogo=\TX@cols
+ \the\crtok
+ \else
+ &
+ \fi}%
+% \end{macrocode}
+% Calculate the width of the columns
+% \begin{macrocode}
+ \ifdim #1>\z@
+ \TX@col@width=#1
+ \else
+ \TX@col@width=\hsize
+ \fi
+ \divide\TX@col@width \TX@cols
+ \ifdim #1=\z@
+ \TX@col@width=\@mincolumnwidth
+ \fi
+ \penalty\abovecolumnspenalty
+ \noindent % usually not a paragraph
+ \vskip -\z@ % don't know why we need this, but looks bad without it
+% \end{macrocode}
+% Create most of the preamble by looping to add \cs{@cellsincolumn}-1 slots,
+% then the last one which is different.
+% \begin{macrocode}
+ \def\@preamble{}%
+ \begingroup
+ \let\@sharp\relax
+ \ifnum\TX@cols>\@ne
+ \loop
+ \ifdim #1<\z@
+ \g@addto@macro{\@preamble}{%
+ \strut\c@lleftskip\@sharp\c@lrightskip &}%
+ \else
+ \g@addto@macro{\@preamble}{%
+ \hb@xt@ \TX@col@width{%
+ \strut\c@lleftskip\@sharp\c@lrightskip} &}%
+ \fi
+ \advance\TX@cols\m@ne
+ \ifnum\TX@cols>\@ne
+ \repeat
+ \fi
+ \ifdim #1<\z@
+ \g@addto@macro{\@preamble}{%
+ \strut\c@lleftskip\@sharp\c@lrightskip}%
+ \else
+ \g@addto@macro{\@preamble}{%
+ \hb@xt@ \TX@col@width{\strut\c@lleftskip\@sharp\c@lrightskip}}%
+ \fi
+ \endgroup
+ \let\@sharp ##
+% \end{macrocode}
+% Start the \verb?\halign?
+% \begin{macrocode}
+ \tabskip\ctableftskip
+ \halign to \hsize \bgroup
+ \tabskip\z@
+ \@preamble
+%% \tabskip\ctabrightskip\cr \preautotab
+ \tabskip\ctabrightskip\cr
+% \end{macrocode}
+% Add all the entries then finish off.
+% \begin{macrocode}
+ \@for\@tempa:=#5\do{%
+ \@tempa\unskip\space\@endcolumnactions}%
+%% \the\crtok \postautotab \the\crtok \egroup \endgroup \par
+ \the\crtok \egroup \endgroup \par}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{Floating objects}
+%
+% The file \file{latex.dtx} only defines a number of tools with
+% which floating objects can be defined. This is done in the
+% document class. It needs to define the following macros for each
+% floating object of type \texttt{TYPE} (e.g., \texttt{TYPE} =
+% figure).
+%
+% \begin{description}
+% \item[\texttt{\bslash fps@TYPE}]
+% The default placement specifier for floats of type
+% \texttt{TYPE}.
+%
+% \item[\texttt{\bslash ftype@TYPE}]
+% The type number for floats of type \texttt{TYPE}. Each
+% \texttt{TYPE} has associated a unique positive \texttt
+% {TYPE} number, which is a power of two. E.g., figures might
+% have type number 1, tables type number 2, programs type
+% number 4, etc.
+%
+% \item[\texttt{\bslash ext@TYPE}]
+% The file extension indicating the file on which the contents
+% list for float type \texttt{TYPE} is stored. For example,
+% \cs{ext@figure} = `lof'.
+%
+% \item[\texttt{\bslash fnum@TYPE}]
+% A macro to generate the figure number for a caption. For
+% example, \cs{fnum@TYPE} == `Figure \cs{thefigure}'.
+%
+% \item[\texttt{\bslash @makecaption}{\meta{num}}{\meta{text}}]
+% A macro to make a caption, with \meta{num} the value produced
+% by \cs{fnum@...} and \meta{text} the text of the caption. It
+% can assume it's in a \cs{parbox} of the appropriate width.
+% This will be used for \emph{all} floating objects.
+%
+% \end{description}
+%
+% The actual environment that implements a floating object such as
+% a figure is defined using the macros \cs{@float} and \cs{end@float},
+% which are defined in \file{latex.dtx}.
+%
+% An environment that implements a single column floating object is
+% started with \verb?\@float{TYPE}?\oarg{placement} of type
+% \texttt{TYPE} with \meta{placement} as the placement specifier.
+% The default value of \meta{PLACEMENT} is defined by \cs{fps@TYPE}.
+%
+% The environment is ended by \cs{end@float}. E.g., \cs{figure} ==
+% \verb?\@float{figure}?, \cs{endfigure} == \cs{end@float}.
+%
+%
+% \subsection{Floats}
+%
+% To define a float environment, say \Lenv{fenv}, the following macros must be defined:
+% \begin{itemize}
+% \item \cs{fps@fenv} The default placement specifier (normally \verb?tbp?).
+% \item \cs{ftype@fenv} The type number which is an integer and a power of 2.
+% \item \cs{ext@fenv} The file extension for the contents list.
+% \item \cs{c@fenv} A counter for the environment (for caption numbering).
+% \item \cs{fnum@fenv} A macro to generate the caption `number'.
+% \item \cs{l@fenv} A macro to produce an entry in a list of\ldots.
+% \item \cs{flegtocfenv} A macro to write a \cs{namedlegend} title to a listof file.
+% \item \cs{flegfenv} A macro to typeset the name of a \cs{namedlegend}.
+% \item \cs{toclevel@fenv} Holding a bookmark level (required if the
+% \Lpack{hyperref} package will be used).
+% \end{itemize}
+%
+% \begin{macro}{newflo@tctr}
+% A counter for the type number of a new float. Normally
+% figures are of type 1, tables type 2, and the next float type is then 4, and so
+% on.
+% \begin{macrocode}
+\newcounter{newflo@tctr}
+ \setcounter{newflo@tctr}{1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newfloat}
+% \cs{newfloat}oarg{within}\marg{fenv}\marg{ext}\marg{capname}
+% creates the commands for a new float environment, \meta{fenv} (aka \texttt{X}),
+% using \meta{ext} (aka \texttt{Z}) as the
+% file extension and \meta{capname} for the caption name.
+% \changes{v1.61803}{2008/01/30}{Changed setting of \cs{ftype@X} in
+% \cs{newfloat} to correctly assign float numbers, courtesy Flavian
+% Lambert (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\newfloat}[4][\@empty]{%
+% \end{macrocode}
+% \begin{macro}{\ftype@X}
+% Define the float type, set it to the float counter, and double
+% the counter afterwards.
+% \begin{macrocode}
+%%% \@namedef{ftype@#2}{\value{newflo@tctr}}
+%%% \addtocounter{newflo@tctr}{\value{newflo@tctr}}
+ \expandafter\edef\csname ftype@#2\endcsname{\the\c@newflo@tctr}%
+ \advance\c@newflo@tctr \c@newflo@tctr
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@X}
+% Create the counter for the caption, which must not have been previously
+% defined.
+% \begin{macrocode}
+ \@ifundefined{c@#2}{% counter is not defined
+ \ifx \@empty#1\relax
+ \newcounter{#2}
+ \else
+ \newcounter{#2}[#1]
+ \expandafter\edef\csname the#2\endcsname{%
+ \expandafter\noexpand\csname the#1\endcsname.\noexpand\arabic{#2}}
+ \fi}{}
+ \setcounter{#2}{0}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ext@X}
+% \begin{macro}{\c@Zdepth}
+% Define \cs{ext@X} for the file extension and set the new \verb?Zdepth?
+% depth counter to 1.
+% \begin{macrocode}
+ \@namedef{ext@#2}{#3}% file extension
+ \@ifundefined{c@#3depth}{\newcounter{#3depth}}{}
+ \setcounter{#3depth}{1}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\fps@X}
+% \begin{macro}{\fnum@X}
+% \begin{macro}{\flegX}
+% \begin{macro}{\flegtocX}
+% \cs{fps@X} is the default float placement specification, \cs{fnum@X}
+% typesets the caption name and number, and \cs{flegX} and \cs{flegtocX} are for
+% named legends.
+% \begin{macrocode}
+ \@namedef{fps@#2}{tbp} % position
+ \@namedef{fnum@#2}{#4~\@nameuse{the#2}} % caption naming
+ \@namedef{fleg#2}{#4} % legend naming
+ \@namedef{flegtoc#2}##1{} % legend name in ToC
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{X}
+% \begin{environment}{X*}
+% Finally define the new float environment, in both normal and starred
+% forms. We also al an internal macro that can be used to globally
+% adjust floats, e.g. making all tables in small size.
+% We would like to be able to insert adjustments inside the
+% floats. But the manner in which \cs{@float} works makes it
+% impossible for us to simple insert this into the definitions of the
+% floats.
+% \begin{macrocode}
+ \newenvironment{#2}{\@float{#2}}{\end@float}
+ \newenvironment{#2*}{\@dblfloat{#2}}{\end@dblfloat}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% This ends the definition of \cs{newfloat}.
+% \begin{macrocode}
+} % end \newfloat
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.6i}{2011/02/18}{Added this instead of inserting the
+% adjustment code directly into the environment definitions}
+% \changes{v3.7g}{2017/05/08}{Moved into delayed \cs{@xfloat} redef as
+% we need it to run after \cs{normalsize}}
+% \begin{macro}{\@xfloat}
+% In order to inject adjustment code into the core of the floats we
+% will need to patch the code float macros a little.
+% \begin{macrocode}
+ %\let\mem@old@xfloat\@xfloat
+ %\def\@xfloat#1[#2]{\mem@old@xfloat{#1}[#2]\@nameuse{#1adjustment}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\setfloatlocations}
+% \cs{setfloatlocations}\marg{float}\marg{locs} sets the defualt locations
+% for the \meta{float} class of floats (e.g., \texttt{figure}) to \meta{locs}
+% (initially \texttt{tbp}). For tables you might want to use: \\
+% \verb?\setfloatlocations{table}{htbp}?
+% \changes{v1.61803}{2008/01/30}{Added \cs{setfloatlocations} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\setfloatlocations}[2]{\@namedef{fps@#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \changes{v3.6h}{2011/02/01}{Added \cs{setfloatadjustment}}
+% \begin{macro}{\setfloatadjustment}
+% \cs{setfloatadjustment}\marg{float}\marg{code} can be used to
+% globally add internal adjustments to all floats of a certain
+% type. For example to typeset the contents of all tables in
+% \cs{small} use \verb|\setfloatadjustment{table}{\small}|.
+% \begin{macrocode}
+\newcommand*\setfloatadjustment[2]{\@namedef{#1adjustment}{#2}}
+
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% To define subcaptions for use in a new float environment, say \texttt{fenv}, the
+% following macros must be defined~\cite{SUBFIGURE}:
+% \begin{itemize}
+% \item A new counter \texttt{subfenv} for subcaption numbering.
+% \item A new counter \texttt{extdepth}, where \texttt{ext} is the file extension
+% for the contents list of \texttt{fenv}, for setting the contents depth.
+% \item \cs{thesubfenv} for the formatting of the subcaption number.
+% \item \cs{@thesubfenv} for typesetting the number.
+% \item \cs{@@thesubfenv} for alternative label reference.
+% \item \cs{p@subfenv} for prepending to the subcaption number when it is referenced.
+% \item \cs{ext@subfenv} the file extension for the contents list.
+% \item \cs{l@subfenv} for formatting the contents list entry.
+% \item \cs{@makesubfloatcaption} for typesetting the subcaption.
+% \item \cs{toclevel@subfenv} for hyperref bookmarks
+% \end{itemize}
+%
+% \begin{macro}{\newsubfloat}
+% \cs{newsubfloat}\marg{fenv} creates the commands for a new
+% subfloat for \meta{fenv} (aka \texttt{X}).
+% \begin{macrocode}
+\newcommand{\newsubfloat}[1]{%
+% \end{macrocode}
+% Call \verb?\newlistentry[X]{subX}{extX}{1}? to get most of the work done.
+% \begin{macrocode}
+ \newlistentry[#1]{sub#1}{\@nameuse{ext@#1}}{1}
+% \end{macrocode}
+%
+% \begin{macro}{\ext@subX}
+% \begin{macro}{\thesubX}
+% \begin{macro}{\@thesubX}
+% \begin{macro}{\@@thesubX}
+% \begin{macro}{\p@subX}
+% \begin{macro}{\toclevel@subX}
+% And now for the rest of the commands for subcaptions.
+% \changes{v1.1}{2002/03/10}{Added \cs{@namedef} of \cs{@@thesubenv}
+% to \cs{newsubfloat}}
+% \changes{v1.1}{2002/03/10}{Added \cs{@namedef} of \cs{toclevel@subenv}
+% to \cs{newsubfloat}}
+% \begin{macrocode}
+ \@namedef{ext@sub#1}{\csname ext@#1\endcsname}
+ \@namedef{thesub#1}{(\alph{sub#1})}
+ \@namedef{@thesub#1}{\@nameuse{thesub#1}%
+ \if@tightsubcap\hskip\subfloatlabelskip\else\space\fi}
+ \@namedef{@@thesub#1}{\@nameuse{thesub#1}}
+ \@namedef{p@sub#1}{\csname the#1\endcsname}
+ \@namedef{toclevel@sub#1}{1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% By permission of Steven Douglas Cochran the class provides similar
+% functionality as the \Lpack{subfigure} package~\cite{SUBFIGURE}.
+% This requires some changes to be made to \cs{@float} and \cs{end@float}.
+%
+% \begin{macro}{\ifdonemaincaption}
+% This is set TRUE after the \cs{(cont)caption} has been called in a float.
+% \changes{v1.1}{2002/03/10}{Changed \cs{if@contmaincaption} to
+% \cs{ifdonemaincaption}}
+% \begin{macrocode}
+\newif\ifdonemaincaption
+ \donemaincaptionfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@float}
+% \begin{macro}{\@dbfloat}
+% \begin{macro}{\@memresetsubcounter}
+% The kernel \cs{@float} and \cs{@dblfloat} macros are redefined to
+% set \cs{ifdonemaincaption} to FALSE, and also to zero the subfloat
+% counter, if it is defined. Ignasi Furi\`{o}
+% reported\footnote{Private email from \texttt{ignasi.furio@uib.es},
+% 2003/10/17} that floats embedded in text created an extra
+% space. This was caused by a missing \verb?%?.
+% \changes{v1.4}{2003/11/22}{Deleted spaces from \cs{@float} and
+% \cs{@dblfloat} (from patch v1.9)}
+% Axel Sommerfeldt\footnote{Private email, from axel.sommerfeldt@f-m.fm,
+% 2013/05/10} asked for the subcounter reset to be factored out into
+% a macro and provided the code.
+% \begin{macrocode}
+\let\@memoldfloat\@float
+\renewcommand{\@float}[1]{\donemaincaptionfalse
+ \@memresetsubcounter{#1}%
+ \@memoldfloat{#1}}
+\let\@memolddblfloat\@dblfloat
+\renewcommand{\@dblfloat}[1]{\donemaincaptionfalse
+ \@memresetsubcounter{#1}%
+ \@memolddblfloat{#1}}
+\newcommand{\@memresetsubcounter}[1]{%
+ \@ifundefined{c@sub#1}{}{\csname c@sub#1\endcsname = 0\relax}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\end@float}
+% \begin{macro}{\end@dblfloat}
+% The kernel \cs{end@float} and \cs{end@dblfloat} macros are redefined to
+% dump out any subcaptions that have not yet been processed.
+% \begin{macrocode}
+\let\@memoldefloat\end@float
+\def\end@float{%
+ \@memlistsubcaptions{\@captype}\@memoldefloat}
+\let\@memoldedblfloat\end@dblfloat
+\def\end@dblfloat{%
+ \@memlistsubcaptions{\@captype}\@memoldedblfloat}
+
+% \end{macrocode}
+% Unfortunately the \Lpack{fixltx2e} package, version 1.1h (current as
+% of 2005/09/03) makes assumptions about \cs{end@float} which do not
+% hold for memoir. The code has to be reverted back to that in version
+% 1.0b of \Lpack{fixltx2e}.
+% \changes{v1.618}{2005/09/03}{Dealt with incompatibilities between
+% fixltx2e and memoir's \cs{end@dblfloat} (mempatch v3.7)}
+%
+% \changes{v3.7c}{2015/03/05}{Note quite sure why this fix is needed,
+% so we add a trick (\cs{MEMOIROVERRIDE}) so that it can be deleted by
+% defining a macro before \cs{documentclass}, that makes it easier to
+% test}
+%
+% Update 2015: The problematic code from \Lpack{fixltx2e} is no
+% longer present from version 1.1s and on. This version is to be
+% build into the LaTeX2e kernel for the TeX Live 2015 release. We
+% change the code reversion so it only happens if older \Lpack{fixltx2e}
+% versions are being used.
+% \changes{v3.7d}{2015/03/17}{Adding check for older \Lpack{fixltx2e}
+% and removing \cs{MEMOIROVERRIDE}}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{fixltx2e}{%
+ \@ifpackagelater{fixltx2e}{2014/01/01}{}{% package older than 2014/01/01
+ \def\end@dblfloat{%
+ \if@twocolumn
+ \@endfloatbox
+ \ifnum\@floatpenalty<\z@
+ \@largefloatcheck
+ \global\dp\@currbox1sp %
+ \@cons\@deferlist\@currbox
+ \fi
+ \ifnum\@floatpenalty=-\@Mii \@Esphack\fi
+ \else
+ \end@float
+ \fi}%
+ }
+ }{}
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.6h}{2011/02/01}{Added \cs{FloatBlock}}
+% \subsubsection{Float blockage}
+%
+% This is basically a slightly modified copy of \cs{FloatBarrier} from
+% the \Lpack{placeins} package by Donald Arseneau, renamed such that
+% both can be used in the same document. We could have emulated the
+% \Lpack{placeins} package, but people might use it with options, so,
+% since the code is so short we just copy it. Kudos to Donald Arseneau.
+% For more defaults see
+% \cite{PLACEINS}.
+% \begin{macro}{\FloatBlock}
+% \begin{macro}{\FloatBlockAllowAbove}
+% \begin{macro}{\FloatBlockAllowBelow}
+% The two \cs{XAllowY} macros is our way of supporting the
+% \Lpack{placeins} package options.
+% \begin{macrocode}
+\def\mem@fb@botlist{\@botlist}
+\def\mem@fb@topblock{\suppressfloats[t]}
+% \end{macrocode}
+% \changes{v3.7d}{2015/03/12}{\cs{\@dbldeferlist} may be removed in a
+% comming LaTeX kernel update}
+% \begin{macrocode}
+\def\FloatBlock{\par\begingroup \let\@elt\relax
+ \edef\@tempa{\mem@fb@botlist\@deferlist\@dbldeferlist}%
+ \ifx\@tempa\@empty
+ \else
+ \ifx\@fltovf\relax % my indicator of recursion
+ \if@firstcolumn
+ \clearpage
+ \else
+ \null\newpage\FloatBlock
+ \fi
+ \else
+ \newpage \let\@fltovf\relax
+ \FloatBlock % recurse once only
+ \fi\fi \endgroup
+ \mem@fb@topblock}
+\newcommand*\FloatBlockAllowAbove{\def\mem@fb@topblock{}}
+\newcommand*\FloatBlockAllowBelow{\def\mem@fb@botlist{}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\setFloatBlockFor}
+% This can be used to add \cs{FloatBLock} into various sectional
+% macros. Supported: \cs{chapter} (when in article mode) and all
+% sectional macros made using \cs{@startsection}.
+% \begin{macrocode}
+\newcommand\setFloatBlockFor[1]{%
+ \@namedef{#1block}{\FloatBlock}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsubsection{Margin floats}
+%
+% The next two constructions are inspired by \texttt{tufte-common.def}
+% by Bil Kleb, Bill Wood, and Kevin Godby and provide a manner to
+% insert figures or tables into the margin. Note that the
+% \cs{setfloatadjustment} also applies here.
+% \begin{macro}{\mem@margin@floatbox}
+% Box to save the contents of a margin float in.
+% \begin{macrocode}
+\newsavebox{\mem@margin@floatbox}
+% \end{macrocode}
+% \end{macro}
+% % \begin{environment}{mem@margin@float}
+% \begin{environment}{marginfigure}
+% \begin{environment}{margintable}
+% \begin{macro}{\marginfloatmarginmacro}
+% Since the two environments only differ in `name' a constructor is used.
+% Since these margin floats are wrapped inside another type of float
+% (\cs{marginpar}) they may cause problems when used combined with
+% regular floats (the float order may be wrong). For that reason the
+% margin float throws a \cs{FloatBlock} before issuing the \cs{marginpar}.
+% \begin{macrocode}
+\newcommand\marginfloatmarginmacro{\marginpar}
+\newenvironment{mem@margin@float}[2][-1.2ex]%
+ {\FloatBlock%
+ \begin{lrbox}{\mem@margin@floatbox}%
+ \begin{minipage}{\marginparwidth}%
+ \def\@captype{#2}%
+ \hbox{}\vspace*{#1}%
+ \@nameuse{margin#2adjustment}%
+ \@nameuse{margin#2captionadjustment}%
+ \noindent%
+ }
+ {\end{minipage}%
+ \end{lrbox}%
+ \marginfloatmarginmacro{\usebox{\mem@margin@floatbox}}%
+ }
+% \end{macrocode}
+% The two environment is then just two applications of the
+% constructor. The option can be used to move the margins float up and down.
+% \begin{macrocode}
+\newenvironment{marginfigure}[1][-1.2ex]{%
+ \begin{mem@margin@float}[#1]{figure}}
+ {\end{mem@margin@float}}
+\newenvironment{margintable}[1][-1.2ex]{%
+ \begin{mem@margin@float}[#1]{table}}
+ {\end{mem@margin@float}}
+\setfloatadjustment{marginfigure}{\centering}
+\setfloatadjustment{margintable}{\centering}
+
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \begin{macro}{\setmarginfloatcaptionadjustment}
+% Because of the very narrow margin area, it may be fruitful to
+% reconfigure the caption style when used in a margin float. This can
+% be done globally for all captions (e.g. if all floats are margin
+% floats, or just for margin floats.
+% \begin{macrocode}
+\newcommand*\setmarginfloatcaptionadjustment[2]{%
+ \@namedef{margin#1captionadjustment}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \changes{v3.6h}{2011/02/06}{Added these two macros}
+% \begin{macro}{\setmpjustification}
+% \begin{macro}{\mpjustification}
+% Can be just to use and configure a specialized justification. It
+% follows the \verb?\marginpar? placement, and make use of the first
+% argument when at the left of the text block and the other when at
+% the right. It makes use of an internal setting from within
+% \verb?\marginparmargin?, thus that need to have been executed.
+% \begin{macrocode}
+\newcommand\setmpjustification[2]{%
+ \@namedef{mem@mp@justification}{%
+ \ifm@msetmp\else\@memerror{In order to use
+ \string\marginCmdAdjust,^^J%
+ please make sure to specify into which margin the^^J%
+ \string\marginpar\space should go, using \string\marginparmargin}{}\fi
+ \m@mwhich@margin{\m@mmpar@margin}%
+ \ifmemtortm #2 \else #1\fi}%
+}
+% \end{macrocode}
+% Default value
+% \begin{macrocode}
+\newcommand\mpjustification{%
+ \@nameuse{mem@mp@justification}}
+\setmpjustification{\raggedleft}{\raggedright}
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Captions}
+%
+% The caption styling
+% is accomplished by redefining the \cs{@makecaption}
+% command. First, though, define and initialise the user-level commands.
+%
+% \begin{macro}{\if@contcw}
+% \begin{macro}{\if@conthang}
+% \begin{macro}{\if@contindent}
+% For use when checking caption width and captioning styles styles.
+% \begin{macrocode}
+\newif\if@contcw
+\newif\if@conthang
+\newif\if@contindent
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\captiondelim}
+% \begin{macro}{\@contdelim}
+% For the caption delimiter.
+% \begin{macrocode}
+\newcommand{\captiondelim}[1]{\def\@contdelim{#1}}
+\captiondelim{: }
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\captionnamefont}
+% \begin{macro}{\@contnfont}
+% The font for the caption name.
+% \begin{macrocode}
+\newcommand{\captionnamefont}[1]{\def\@contnfont{#1}}
+\captionnamefont{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\captiontitlefont}
+% \begin{macro}{\@conttfont}
+% The font for the caption title.
+% \begin{macrocode}
+\newcommand{\captiontitlefont}[1]{\def\@conttfont{#1}}
+\captiontitlefont{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\captionstyle}
+% \begin{macro}{\@contcstyle}
+% The paragraphing style for the caption.
+% \begin{macrocode}
+\newcommand*{\captionstyle}[1]{\def\@contcstyle{#1}}
+\captionstyle{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\captionstyle}
+% \begin{macro}{\@memcshort}
+% \begin{macro}{\@memcnom}
+% \begin{macro}{\@contcshortstyle}
+% \begin{macro}{\@contcstyle}
+% The paragraphing style for the caption.
+%
+% I had email from J{\o}rgen Larsen (\url{jl@dirac.ruc.dk}), 2003/04/09,
+% asking for separate controls for the short and long captions. \\
+% \cs{captionstyle}\oarg{short}\marg{normal}.
+% \changes{v1.4}{2003/11/22}{Extended \cs{captionstyle} (from patch v1.5)}
+% \changes{v3.6h}{2011/01/16}{Removed sporadic spaces}
+% \begin{macrocode}
+\renewcommand{\captionstyle}{%
+ \@ifnextchar[{\@memcshort}{\@memcnorm}}
+\def\@memcshort[#1]#2{%
+ \def\@contcshortstyle{#1}%
+ \def\@contcstyle{#2}}
+\def\@memcnorm#1{%
+ \def\@contcshortstyle{#1}%
+ \def\@contcstyle{#1}}
+\captionstyle{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@contcwidth}
+% \begin{macro}{\captionwidth}
+% \begin{macro}{\changecaptionwidth}
+% \begin{macro}{\normalcaptionwidth}
+% The macros for dealing with the caption width.
+% \begin{macrocode}
+\newlength{\@contcwidth}
+\newcommand{\captionwidth}[1]{\setlength{\@contcwidth}{#1}}
+\captionwidth{\linewidth}
+\newcommand{\changecaptionwidth}{\@contcwtrue}
+\newcommand{\normalcaptionwidth}{\@contcwfalse}
+\normalcaptionwidth
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@contindw}
+% \begin{macro}{\hangcaption}
+% \begin{macro}{\indentcaption}
+% \begin{macro}{\normalcaption}
+% The macros for hanging and indented captions.
+% \begin{macrocode}
+\newlength{\@contindw}
+\newcommand{\hangcaption}{\@conthangtrue\@contindentfalse}
+\newcommand{\indentcaption}[1]{\setlength{\@contindw}{#1}%
+ \@conthangfalse\@contindenttrue}
+\newcommand{\normalcaption}{\@conthangfalse\@contindentfalse}
+\normalcaption
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\precaption}
+% \begin{macro}{\@contpre}
+% \begin{macro}{\postcaption}
+% \begin{macro}{\@contpost}
+% \begin{macro}{\midbicaption}
+% \begin{macro}{\@contmidbi}
+% The macros for the pre- and post-caption text/commands, and
+% for the mid-caption command for bilingual captions.
+% \begin{macrocode}
+\newcommand{\precaption}[1]{\def\@contpre{#1}}
+\precaption{}
+\newcommand{\postcaption}[1]{\def\@contpost{#1}}
+\postcaption{}
+\newcommand{\midbicaption}[1]{\def\@contmidbi{#1}}
+\midbicaption{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\captiontitlefinal}
+% \cs{captiontitlefinal}\marg{stuff} will put \meta{stuff} immediately
+% at the end of a \cs{caption}'s title text but it will not appear
+% in the LoF/LoT/etc. For example \\
+% \verb?\captiontitlefinal{.}? \\
+% The code was supplied by Frederic Connes.
+% \changes{v1.61803}{2008/01/30}{Added \cs{captiontitlefinal} (mempatch v4.4)}
+% \begin{macrocode}
+\newcommand*{\captiontitlefinal}[1]{\def\@contfinal{#1}}
+ \captiontitlefinal{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\abovecaptionskip}
+% \begin{macro}{\belowcaptionskip}
+% Vertical space above and below a caption. Make them sum to an
+% integral number of lines.
+% \begin{macrocode}
+\newlength{\abovecaptionskip}
+ \setlength{\abovecaptionskip}{0.5\onelineskip}
+\newlength{\belowcaptionskip}
+ \setlength{\belowcaptionskip}{0.5\onelineskip}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\caption}
+% For subfloat support, the (kernel) \cs{caption} macro needs to note that it
+% has been called.
+% \begin{macrocode}
+\let\@memoldcaption\caption
+\def\caption{\donemaincaptiontrue\@memoldcaption}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memcaptioninfo}
+% \verb?\memcaptioninfo{type}{\thetypenum}{short}{long}?
+% \changes{v1.618}{2005/09/10}{Added \cs{memcaptioninfo}}
+% \begin{macrocode}
+\newcommand{\memcaptioninfo}[4]{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@caption}
+% For title referencing support, the (kernel) \cs{@caption} macro needs
+% to store the title.
+% \changes{v1.618}{2005/09/03}{Added braces around second argument of \cs{@memold@caption} (per Dan Luecking, mempatch v3.0)}
+% \begin{macrocode}
+\let\@memold@caption\@caption
+\long\def\@caption#1[#2]#3{%
+ \M@gettitle{#2}%
+ \memcaptioninfo{#1}{\csname the#1\endcsname}{#2}{#3}%
+ \@memold@caption{#1}[{#2}]{#3}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecaption}
+% This is a reimplementation of the kernel \cs{@makecaption} command.
+% As well as including the caption typesetting commands it enables
+% captions that include forced newlines (e.g., by \verb?\\?).
+%
+% The first part is due to
+% Donald Arseneau\footnote{Email: \texttt{asnd@triumf.ca}} from postings
+% to the \ctt{} newsgroup and Email discussions. The \cs{topskip} strut is
+% used whenever the caption is the first part of the float. This means,
+% among other things, that if a caption comes at the
+% top of a page, then the first line of the caption will be aligned with
+% the normal first line of a page. The \cs{abovecaptionskip} is only used
+% when there is something above the caption in the current float.
+% \changes{v0.31}{2001/07/24}{Changed \cs{@tempa} to \cs{@memtempa} in \cs{@makecaption}}
+% \changes{v1.0a}{2002/02/12}{Added extra centering code in \cs{@makecaption}}
+% \changes{v1.4}{2003/11/22}{Added separate short/long styles in \cs{@makecaption}
+% (from patch v1.5)}
+% \changes{v1.61803}{2008/01/30}{Added \cs{@contfinal} to \cs{@makecaption}
+% (mempatch v4.4)}
+%
+% Axel Sommerfelt\footnote{Private email discussion} suggested to
+% split \cs{@makecaption} into two macros, such that the caption
+% formatting and the space above and below are separate. This enables
+% us to use the formatting macro (\cs{@@makecaption}) to format, say,
+% \Lpack{longtable} captions.
+% \changes{v3.6k}{2013/05/13}{Split \cs{@makecaption} into
+% \cs{@makecaption} and \cs{@@makecaption}}
+% \begin{macrocode}
+\long\def\@makecaption#1#2{\let\@memtempa\relax
+ \ifdim\prevdepth>-99\p@ \vskip\abovecaptionskip
+ \else \def\@memtempa{\vbox to\topskip{}}\fi
+% \end{macrocode}
+% Inserting \cs{@@makecaption} to format the actual caption.
+% \begin{macrocode}
+ \@@makecaption{#1}{#2}%
+% \end{macrocode}
+% Then add the below caption spacing.
+% \begin{macrocode}
+ \vskip\belowcaptionskip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@makecaption}
+% Next the rest of the caption code as \cs{@@makecaption}.
+% \begin{macrocode}
+\long\def\@@makecaption#1#2{%
+% \end{macrocode}
+% \begin{macro}{\@contfnote}
+% \begin{macro}{\@contfmark}
+% The caption title will be typeset twice, firstly to measure its width
+% and secondly to actually typeset it. To avoid problems caused by
+% a footnote in the caption getting processed twice, we temporarily
+% disable the expected relevant commands.
+% \changes{v3.6h}{2011/01/20}{Provided the same for \cs{pagentote}}
+% \begin{macrocode}
+ \let\@contfnote\footnote \renewcommand{\footnote}[2][]{}
+ \let\@contfmark\footnotemark \renewcommand{\footnotemark}[1][]{}
+ \let\@contpnote\pagenote\renewcommand\pagenote[2][]{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% Now measure the width of the total caption, not forgetting to take account
+% of the font specifications, and then restore the footnoting.
+% \changes{v3.6k}{2013/05/13}{Font grouping, suggested by Axel Sommerfelt}
+% \begin{macrocode}
+ \sbox\@tempboxa{{\@contnfont #1\@contdelim}\@conttfont #2\@contfinal}
+ \let\footnote\@contfnote
+ \let\footnotemark\@contfmark
+ \let\pagenote\@contpnote
+% \end{macrocode}
+% If the caption is less than one
+% line, then the whole caption needs to be centered on the page (otherwise
+% the short caption may be typeset flushleft).
+% \begin{macrocode}
+ \ifdim\wd\@tempboxa<\linewidth \centering \fi
+ \if@contcw
+% \end{macrocode}
+% For typesetting at anything other than the normal width, put the caption
+% into a \cs{parbox} of the specified width. This must be centered.
+% \changes{v3.6h}{2010/12/06}{Align inner parbox at top
+% line. Vertically centered parbox cause different spacing when
+% \cs{changecaptionwidth} compared when it is not used.}
+% \begin{macrocode}
+ \centering
+ \parbox[t]{\@contcwidth}{%
+% \end{macrocode}
+% Henrik Holm\footnote{Email from \texttt{henrik@tele.ntnu.no} on
+% 2002/02/10.} proposed adding the next line to center short, narrow captions.
+% \begin{macrocode}
+ \ifdim\wd\@tempboxa<\@contcwidth \centering \fi
+ \fi
+% \end{macrocode}
+% Hanging and indenting doesn't apply to short captions, so do these
+% now.
+% \changes{v1.6180339f}{2009/06/25}{Short captions no longer hang or indent}
+% \begin{macrocode}
+ \ifdim\wd\@tempboxa<\linewidth
+ \@contpre
+ {\@contnfont #1\@contdelim}\@memtempa
+ {\@contcshortstyle \@conttfont #2\@contfinal\par}
+ \else
+ \if@conthang
+% \end{macrocode}
+% For a hanging caption we have to measure the width of the caption name,
+% then typeset the whole caption in a hanging paragraph.
+% \changes{v1.1}{2002/03/10}{Changed code for hangcaption in \cs{@makecaption}}
+% \begin{macrocode}
+ \sbox\@tempboxa{\@contnfont #1\@contdelim}
+ \@contpre%
+ {\@contcstyle\hangindent=\wd\@tempboxa
+ \noindent\box\@tempboxa\@memtempa \@conttfont #2\@contfinal\par}
+ \else
+ \if@contindent
+% \end{macrocode}
+% An indented caption is similar, except the amount of indentation is
+% kept in \cs{@contindw}.
+% \begin{macrocode}
+ \@contpre%
+ {\@contnfont #1\@contdelim}\@memtempa
+ {\@contcstyle\hangindent=\@contindw
+ \hangafter=\@ne\@conttfont #2\@contfinal\par}% <- v1.4
+ \else
+% \end{macrocode}
+% For the normal style, just typeset the caption.
+% \begin{macrocode}
+ \@contpre%
+ {\@contnfont #1\@contdelim}\@memtempa
+ {\@contcstyle \@conttfont #2\@contfinal\par}
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% Finish off the typesetting by processing the post-text, and if not using
+% the normal width then close off the \cs{parbox}, and lastly put in some
+% vertical space.
+% \changes{v3.6k}{2013/05/13}{Removed the below vertical skip}
+% \begin{macrocode}
+ \@contpost
+ \if@contcw
+ \par
+ } % end of the \parbox
+ \fi
+ }
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Continuation captions and legends}
+%
+% \begin{macro}{\contcaption}
+% \cs{contcaption}\marg{text} is a user-level command.
+% It is a simplified
+% version of the normal \cs{caption} command as it doesn't have to deal
+% with numbering or list of \dots entries.
+%
+% However,
+% Brent Lievers\footnote{ (\texttt{lieversb@post.queensu.ca})
+% in \ctt{} thread \textit{Figures}, 2003/11/14.} requested that \cs{label}
+% should pick up the correct caption number after a \cs{contcaption}.
+% \changes{v1.4}{2003/11/22}{Extended \cs{contcaption} (from patch v1.9)}
+% \begin{macrocode}
+\newcommand{\contcaption}{%
+ \addtocounter{\@captype}{\m@ne}\refstepcounter{\@captype}%
+ \@contcaption\@captype}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@contcaption}
+% \begin{macro}{\@contcaption}
+% \cs{@contcaption} is the workhorse for the \cs{contcaption} command. In turn,
+% it uses the \cs{@makecaption} command (defined in the usual classes)
+% to do most of its work. It
+% uses the number of the previous \cs{caption} command in the same
+% type of float and its implementation includes much of the code
+% used in the \LaTeX{} \cs{@caption} command.
+%
+% First specify \cs{@@contcaption}\marg{type}\marg{title}
+% to save some repetitive code.
+% \begin{macrocode}
+\long\def\@@contcaption#1#2{%
+ \par
+ \begingroup
+ \@parboxrestore
+ \if@minipage
+ \@setminipage
+ \fi
+ \normalsize
+ \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #2}\par
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Now for \cs{@contcaption}\marg{type}\marg{title}.
+% It has to flush out any subcaptions at the
+% appropriate time, as well as typesetting the caption.
+% \begin{macrocode}
+\long\def\@contcaption#1#2{%
+ \if@contbotsub
+ \@memlistsubcaptions{#1}%
+ \@@contcaption{#1}{#2}%
+ \else
+ \@@contcaption{#1}{#2}%
+ \@memlistsubcaptions{#1}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\memlegendinfo}
+% \begin{macro}{\legend}
+% The macro \cs{legend}\marg{text}is intended
+% to be used in a float environment for an `anonymous' caption, but can be
+% used anywhere.
+%
+% The implementation is similar to the \cs{caption} command but we have
+% to eliminate printing of a delimeter.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{legend}}
+% \changes{v1.618}{2005/09/10}{Added \cs{memlegendinfo}}
+% \begin{macrocode}
+\newcommand{\memlegendinfo}[1]{}
+\newcommand{\legend}[1]{%
+ \M@gettitle{#1}%
+ \memlegendinfo{#1}%
+ \par
+ \begingroup
+ \@parboxrestore
+ \if@minipage
+ \@setminipage
+ \fi
+ \normalsize
+ \captiondelim{\mbox{}}
+ \@makecaption{}{\ignorespaces #1}\par
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\namedlegend}
+% \begin{macro}{\memnamedlegendinfo}
+% \cs{namedlegend}\oarg{short-title}\marg{long-title} is like the
+% \cs{caption} command except that it does not number the caption.
+%
+% \cs{memnamedlegendinfo}\marg{type}\marg{short-title}\marg{long-title}
+% \changes{v1.618}{2005/09/10}{Added \cs{memnamedlegendinfo}}
+% \begin{macrocode}
+\newcommand{\namedlegend}{\@dblarg{\@legend\@captype}}
+\newcommand{\memnamedlegendinfo}[3]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@legend}
+% \cs{@legend}\marg{type}\oarg{short-title}\marg{long-title}
+% is the workhorse for the \cs{namedlegend} command. In turn, it calls
+% \cs{@makelegend}. It requires two commands to have been defined, namely
+% \cs{flegtoctype} and \cs{flegtype}. The command \cs{flegtoctype}\marg{text}
+% is responsible for writing a title text to the appropriate listof file.
+% \cs{flegtype} is responsible for typeseting the name of the legend.
+% \changes{v1.4}{2003/11/16}{Added \cs{M@gettitle} to \cs{@legend}}
+% \begin{macrocode}
+\long\def\@legend#1[#2]#3{%
+ \M@gettitle{#2}%
+ \memnamedlegendinfo{#1}{#2}{#3}%
+ \par
+ \csname flegtoc#1\endcsname{#2}%
+ \begingroup
+ \@parboxrestore
+ \if@minipage
+ \@setminipage
+ \fi
+ \normalsize
+ \@makecaption{\csname fleg#1\endcsname}{\ignorespaces #3}\par
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Non-float captions}
+%
+% \begin{macro}{\newfixedcaption}
+% \begin{macro}{\renewfixedcaption}
+% \begin{macro}{\providefixedcaption}
+% These commands are defined in terms of their \verb?\...command? counterparts.\\
+% Call as \verb?\...fixedcaption?\oarg{capcommand}\marg{command}\marg{env}
+% \begin{macrocode}
+\newcommand{\newfixedcaption}[3][\caption]{%
+ \newcommand{#2}{\def\@captype{#3}#1}}
+\newcommand{\renewfixedcaption}[3][\caption]{%
+ \renewcommand{#2}{\def\@captype{#3}#1}}
+\newcommand{\providefixedcaption}[3][\caption]{%
+ \providecommand{#2}{\def\@captype{#3}#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Bilingual captions}
+%
+% The bilingual caption commands all use internal grouping so
+% that any changes are kept local. This has the unfortunate side-effect
+% that any \cs{label} command must be within the grouping otherwise the
+% wrong number is picked up. To make the coding, if not necessarily the
+% use, of the commands simpler, I have not used the traditional style
+% of square brackets for optional caption text arguments. Instead, empty
+% `required' arguments are used as the implementation means.
+%
+% \begin{macro}{\membitwonumcaptioninfo}
+% \begin{macro}{\membionenumcaptioninfo}
+% \begin{macro}{\membicaptioninfo}
+% \verb?\membitwonumcaptioninfo{type}{\thetypenum}?\marg{short1}\marg{long1}\\
+% \hspace*{2in} \marg{name2}\marg{short2}\marg{long2} \\
+% \verb?\membionenumcaptioninfo{type}{\thetypenum}?\marg{short1}\marg{long1}\\
+% \hspace*{2in} \marg{name2}\marg{short2}\marg{long2} \\
+% \verb?\membicaptioninfo{type}{\thetypenum}?\marg{short1}\marg{long1}\\
+% \hspace{2in} \marg{name2}\marg{long2} \\
+% \changes{v1.618}{2005/09/10}{Added \cs{membitwonumcaptioninfo},
+% \cs{membitwonumcaptioninfo} and \cs{membicaptioninfo}}
+% \begin{macrocode}
+\newcommand{\membitwonumcaptioninfo}[7]{}
+\newcommand{\membionenumcaptioninfo}[7]{}
+\newcommand{\membicaptioninfo}[6]{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bitwonumcaption}
+% The 6 arguments are: optional label, short and long in language 1,
+% name in
+% language 2, and short and long in language 2. Both texts are put
+% into the List of as numbered entries.
+% \begin{macrocode}
+\newcommand{\bitwonumcaption}[6][\@empty]{%
+ \begingroup
+ \let\memcaptioninfo\@gobblefour
+% \end{macrocode}
+% Check if the first language argument is vacuous, then call
+% the normal \cs{caption} for language 1.
+% \begin{macrocode}
+ \@ifmtarg{#2}{\def\m@mscapi{#3}\caption{#3}}%
+ {\def\m@mscapi{#2}\caption[#2]{#3}}%
+% \end{macrocode}
+% Do the optional labeling.
+% \begin{macrocode}
+ \ifx \@empty #1\else
+ \label{#1}%
+ \fi
+% \end{macrocode}
+% Remove any extra spacing between the captions, and set the
+% NAME for the second caption. Use a command to transfer
+% the NAME to the renewal code to avoid circularity if
+% for example, we are trying to redefine \cs{tablename} as
+% \cs{tablename}. Decrement the caption counter.
+% \begin{macrocode}
+ \setlength{\abovecaptionskip}{0pt}%
+ \setlength{\belowcaptionskip}{0pt}%
+ \edef\@memtempc{#4}%
+ \expandafter\renewcommand\csname \@captype name\endcsname{\@memtempc}%
+ \addtocounter{\@captype}{-1}%
+% \end{macrocode}
+% Now repeat for the second language caption.
+% \begin{macrocode}
+ \@contmidbi
+ \@ifmtarg{#5}{\def\m@mscapii{#6}\caption{#6}}%
+ {\def\m@mscapii{#5}\caption[#5]{#6}}%
+ \membitwonumcaptioninfo{\@captype}{\@nameuse{the\@captype}}%
+ {\m@mscapi}{#3}{#4}{\m@mscapii}{#6}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bionenumcaption}
+% The 6 arguments are: optional labelling,
+% short and long in language 1, name in
+% language 2, and short and long in language 2. Both texts are put
+% into the List of, but only the first is numbered.
+% \begin{macrocode}
+\newcommand{\bionenumcaption}[6][\@empty]{%
+ \begingroup
+ \let\memcaptioninfo\@gobblefour
+% \end{macrocode}
+% Check if the first language argument is vacuous, then call
+% the normal \cs{caption} for language 1.
+% \begin{macrocode}
+ \@ifmtarg{#2}{\def\m@mscapi{#3}\caption{#3}}%
+ {\def\m@mscapi{#2}\caption[#2]{#3}}%
+% \end{macrocode}
+% Do the optional labeling.
+% \begin{macrocode}
+ \ifx \@empty #1\else
+ \label{#1}%
+ \fi
+% \end{macrocode}
+% Do the between captions code.
+% \begin{macrocode}
+ \setlength{\abovecaptionskip}{0pt}%
+ \setlength{\belowcaptionskip}{0pt}%
+ \edef\@memtempc{#4}%
+ \expandafter\renewcommand\csname \@captype name\endcsname{\@memtempc}
+% \end{macrocode}
+% Use a continuation caption for the second language, not forgetting
+% to add the appropriate unnumbered text to the List.
+% \begin{macrocode}
+ \@contmidbi
+ \contcaption{#6}%
+ \@ifmtarg{#5}{%
+ \def\m@mscapii{#6}%
+ \addcontentsline{\csname ext@\@captype\endcsname}{\@captype}%
+ {\protect\numberline{}{\ignorespaces #6}}}{%
+ \def\m@mscapii{#5}%
+ \addcontentsline{\csname ext@\@captype\endcsname}{\@captype}%
+ {\protect\numberline{}{\ignorespaces #5}}}%
+ \membionenumcaptioninfo{\@captype}{\@nameuse{the\@captype}}%
+ {\m@mscapi}{#3}{#4}{\m@mscapii}{#6}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bicaption}
+% The 5 arguments are: optional labelling,
+% short and long in language 1, name in
+% language 2, and long in language 2.
+% Only the first text is put into the List.
+% \begin{macrocode}
+\newcommand{\bicaption}[5][\@empty]{%
+ \begingroup
+ \let\memcaptioninfo\@gobblefour
+% \end{macrocode}
+% Check if the first language argument is vacuous, then call
+% the normal \cs{caption} for language 1.
+% \begin{macrocode}
+ \@ifmtarg{#2}{\def\m@mscapi{#3}\caption{#3}}%
+ {\def\m@mscapi{#2}\caption[#2]{#3}}%
+% \end{macrocode}
+% Do the optional labeling.
+% \begin{macrocode}
+ \ifx \@empty #1\else
+ \label{#1}%
+ \fi
+% \end{macrocode}
+% Do the between captions code and
+% finally just use \cs{contcaption} for the
+% second language.
+% \begin{macrocode}
+ \setlength{\abovecaptionskip}{0pt}%
+ \setlength{\belowcaptionskip}{0pt}%
+ \edef\@memtempc{#4}
+ \expandafter\renewcommand\csname \@captype name\endcsname{\@memtempc}%
+ \@contmidbi
+ \contcaption{#5}%
+ \membicaptioninfo{\@captype}{\@nameuse{the\@captype}}%
+ {\m@mscapi}{#3}{#4}{#5}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bicontcaption}
+% The 3 arguments are long in language 1, name in
+% language 2, and long in language 2.
+% \begin{macrocode}
+\newcommand{\bicontcaption}[3]{%
+ \begingroup
+% \end{macrocode}
+% Call \cs{contcaption} for language 1.
+% \begin{macrocode}
+ \contcaption{#1}%
+% \end{macrocode}
+% Do the between captions code and use \cs{contcaption} for the second
+% language.
+% \begin{macrocode}
+ \setlength{\abovecaptionskip}{0pt}%
+ \setlength{\belowcaptionskip}{0pt}%
+ \edef\@memtempc{#2}%
+ \expandafter\renewcommand\csname \@captype name\endcsname{\@memtempc}%
+ \@contmidbi
+ \contcaption{#3}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Support for the \Lopt{subfigure} package functionality}
+%
+% Much of the code in this section is based on the \Lpack{subfigure}
+% package code, by kind permission of its author, Steven Douglas Cochran.
+% To try and avoid clashes with the real \Lpack{subfigure} code I have
+% used different macro names, especially when I have copied the code.
+%
+% \begin{macro}{\subcaptionstyle}
+% \begin{macro}{\@contsubcstyle}
+% The paragraphing style for subcaptions.
+% \begin{macrocode}
+\newcommand{\subcaptionstyle}[1]{\def\@contsubcstyle{#1}}
+\subcaptionstyle{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@shortsubcap}
+% \begin{macro}{\if@hangsubcap}
+% \begin{macro}{\shortsubcaption}
+% \begin{macro}{\hangsubcaption}
+% \begin{macro}{\normalsubcaption}
+% For dealing with short and hanging subcaptions.
+% Analagous to the \Lpack{subfigure} \texttt{nooneline} and \texttt{hang} options.
+% The default is normal subcaptions.
+% \begin{macrocode}
+\newif\if@shortsubcap
+\newif\if@hangsubcap
+\newcommand*{\shortsubcaption}{\@shortsubcaptrue}
+\newcommand*{\hangsubcaption}{\@hangsubcaptrue}
+\newcommand*{\normalsubcaption}{\@shortsubcapfalse\@hangsubcapfalse}
+\normalsubcaption
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\subfloattopskip}
+% \begin{macro}{\subfloatcapskip}
+% \begin{macro}{\subfloatcaptopadj}
+% \begin{macro}{\subfloatbottomskip}
+% \begin{macro}{\subfloatlabelskip}
+% \begin{macro}{\subfloatcapmargin}
+% These \cs{subfloat...} lengths are analagous to the \Lpack{subfigure}
+% \cs{subfig...} lengths.
+% \begin{macrocode}
+\newskip\subfloattopskip
+\newskip\subfloatcapskip
+\newskip\subfloatcaptopadj
+\newskip\subfloatbottomskip
+\newskip\subfloatlabelskip
+\newdimen\subfloatcapmargin
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@tightsubcap}
+% \begin{macro}{\loosesubcaptions}
+% \begin{macro}{\tightsubcaptions}
+% Unlike the \Lpack{subfigure} package the class provides no options for
+% subcaptions. These macros provide the \Lpack{subfigure} loose/tight
+% option functions. Set the default to tight.
+% \begin{macrocode}
+\newif\if@tightsubcap
+\newcommand{\loosesubcaptions}{%
+ \subfloattopskip = 10\p@
+ \subfloatcapskip = 10\p@
+ \subfloatcaptopadj = \z@
+ \subfloatbottomskip = 10\p@
+ \subfloatlabelskip = 0.33em
+ \subfloatcapmargin = 10\p@
+ \@tightsubcapfalse
+}
+
+\newcommand{\tightsubcaptions}{%
+ \subfloattopskip = 5\p@
+ \subfloatcapskip = \z@
+ \subfloatcaptopadj = 3\p@
+ \subfloatbottomskip = 5\p@
+ \subfloatlabelskip = 0.33em \@plus 0.07em \@minus 0.03em
+ \subfloatcapmargin = \z@
+ \@tightsubcaptrue
+}
+\tightsubcaptions
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\subcaptionsize}
+% \begin{macro}{\@subcapsize}
+% \begin{macro}{\subcaptionlabelfont}
+% \begin{macro}{\@subcaplabelfont}
+% \begin{macro}{\subcaptionfont}
+% \begin{macro}{\@subcapfont}
+% These macros set the size and fonts for the subcaptions. Set the defaults
+% to \cs{footnotesize}, and the normal roman font.
+% \begin{macrocode}
+\newcommand*{\subcaptionsize}[1]{\def\@subcapsize{#1}}
+\newcommand*{\subcaptionlabelfont}[1]{\def\@subcaplabelfont{#1}}
+\newcommand*{\subcaptionfont}[1]{\def\@subcapfont{#1}}
+\subcaptionsize{\footnotesize}
+\subcaptionlabelfont{\normalfont}
+\subcaptionfont{\normalfont}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@contkeep}
+% \begin{macro}{\@contset}
+% \begin{macro}{\subconcluded}
+% \cs{@contkeep} stores
+% the current subfloat number in counter \verb?@contsubnum? and
+% \cs{@contset} sets the subfloat number to the value of \verb?@contsubnum?.
+% \cs{subconcluded} sets the subfloat number to zero.
+% \begin{macrocode}
+ \newcounter{@contsubnum}
+ \newcommand{\@contkeep}{%
+ \setcounter{@contsubnum}{\value{sub\@captype}}}
+ \newcommand{\@contset}{%
+ \setcounter{sub\@captype}{\value{@contsubnum}}}
+ \newcommand{\subconcluded}{%
+ \setcounter{sub\@captype}{0}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\if@contbotsub}
+% A flag indicating whether the subcaption is to be at the bottom or
+% top of the subfloat; TRUE for the subcaption at the bottom.
+% \begin{macrocode}
+\newif\if@contbotsub
+ \@contbotsubtrue
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subcaption}
+% \cs{subcaption}\oarg{list-entry}\marg{caption} is a generic
+% subcaption. There is no \Lpack{subfigure} equivalent.
+% \begin{macrocode}
+\newcommand{\subcaption}{%
+ \bgroup
+ \let\label=\memsub@label
+ \ifdonemaincaption\else
+ \advance\csname c@\@captype\endcsname\@ne
+ \fi
+ \refstepcounter{sub\@captype}\@contkeep
+ \@ifnextchar [%
+ {\@memsubcap{sub\@captype}}%
+ {\@memsubcap{sub\@captype}[\@empty]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memsubcap}
+% This handles the optional argument to \cs{subcaption}. It sets \cs{@tempdima}
+% to \cs{hsize} as later on \cs{@makesubfloatcaption} uses this.
+% \changes{v1.1a}{2002/04/28}{Added \cs{@tempdima} to \cs{@memsubcap}}
+% \begin{macrocode}
+\long\def\@memsubcap#1[#2]#3{%
+ \@tempdima=\hsize
+ \vskip\subfloatcapskip
+ \ifx \@empty #2
+ \@memsubcaption{#1}{#3}{#3}%
+ \else
+ \@memsubcaption{#1}{#2}{#3}%
+ \fi
+ \vskip\subfloatcapskip
+ \egroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@memsubcaption}
+% \cs{@memsubcaption}\marg{type}\marg{list-entry}\marg{caption}
+% typesets a subcaption. This is a copy of the \Lpack{subfigure}
+% \cs{@subcaption} macro.
+% \begin{macrocode}
+\newcommand{\@memsubcaption}[3]{%
+ \ifx \relax#2\relax \else
+ \bgroup
+ \let\label\@gobble
+ \let\protect\string
+ \def\@memsubcaplabel{\@nameuse{@@the#1}}%
+ \xdef\@memsubfigcaptionlist{%
+ \@memsubfigcaptionlist,%
+ {\protect\numberline{\@memsubcaplabel}\noexpand{\ignorespaces #2}}}%
+ \egroup
+ \fi
+ \@makesubfloatcaption{\@nameuse{@the#1}}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\contsubcaption}
+% \cs{contsubcaption}\oarg{caption} is the continued version of
+% \cs{subcaption}.
+% \begin{macrocode}
+\newcommand{\contsubcaption}{%
+ \bgroup
+ \let\label=\memsub@label
+ \@contset
+ \refstepcounter{sub\@captype}\@contkeep
+ \@ifnextchar [%
+ {\@memsubcap{sub\@captype}}%
+ {\@memsubcap{sub\@captype}[\@empty]}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{subfloat}
+% The \Lpack{subfigure} documentation suggests a way of defining a \Lenv{subfloat}
+% environment. This is a trivial implementation because the \cs{subcaption}
+% and \cs{contsubcaption} commands are provided by the class, and can be used
+% within a \Lenv{subfloat}.
+% \begin{macrocode}
+\newenvironment{subfloat}{}{}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+% \begin{macro}{\subbottom}
+% \begin{macro}{\@memsubbody}
+% \cs{subbottom}\oarg{list-entry}\oarg{subcaption}\marg{text}
+% typesets a subcaption below the \meta{text}. Most of the work is
+% performed by the \cs{@memsubbody} macro.
+% \begin{macrocode}
+\newcommand{\subbottom}{%
+ \@contbotsubtrue
+ \@memsubbody}
+
+\newcommand{\@memsubbody}{%
+ \bgroup
+ \let\label=\memsub@label
+ \ifdonemaincaption\else
+ \advance\csname c@\@captype\endcsname\@ne
+ \fi
+ \refstepcounter{sub\@captype}\@contkeep%
+ \leavevmode
+ \@ifnextchar [%
+ {\@memsubfig}%
+ {\@memsubfig[\@empty]}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\contsubbottom}
+% \begin{macro}{\@memcontsubbody}
+% These are the continued versions of \cs{subbottom} and \cs{@memsubbody}.
+% \begin{macrocode}
+\newcommand{\contsubbottom}{%
+ \@contbotsubtrue
+ \@memcontsubbody}
+
+\newcommand{\@memcontsubbody}{%
+ \bgroup
+ \let\label=\memsub@label
+ \@contset
+ \refstepcounter{sub\@captype}\@contkeep%
+ \leavevmode
+ \@ifnextchar [%
+ {\@memsubfig}%
+ {\@memsubfig[\@empty]}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\subtop}
+% \begin{macro}{\contsubtop}
+% These are similar to \cs{subbottom} and \cs{contsubbottom} except that they
+% put the subcaption on top of the \meta{text}.
+% \begin{macrocode}
+\newcommand{\subtop}{%
+ \@contbotsubfalse
+ \@memsubbody}
+
+\newcommand{\contsubtop}{%
+ \@contbotsubfalse
+ \@memcontsubbody}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.1a}{2002/04/28}{Deleted \cs{@contsubfloat} as it was not used}
+%
+% \begin{macro}{\@memsubfig}
+% This is a revised version of the \Lpack{subfigure} \cs{@subfigure} command
+% --- just the called macro names are changed.
+% \begin{macrocode}
+\def\@memsubfig[#1]{%
+ \@ifnextchar [%
+ {\@memsubfloat{sub\@captype}[#1]}%
+ {\@memsubfloat{sub\@captype}[\@empty #1][#1]}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@memsubfloat}
+% This is a modified version of the \Lpack{subfigure} \cs{@subfloat}
+% command Essentially the \verb?\csname if#1topcap\endcsname? constructs are
+% replaced by \cs{if@contbotsub}.
+% \changes{v3.6k}{2011/05/16}{This ought to be long}
+% \begin{macrocode}
+\long\def\@memsubfloat#1[#2][#3]#4{%
+ \@tempcnta=\@ne
+ \if@tightsubcap
+ \if@minipage
+ \@tempcnta=\z@
+ \else
+ \ifdim\lastskip=\z@
+ \@tempcnta=\@ne
+ \else
+ \@tempcnta=\tw@
+ \fi
+ \fi
+ \fi
+ \if@contbotsub
+ \def\subfig@top{\subfloattopskip}%
+ \def\subfig@bottom{\subfloatbottomskip}%
+ \else
+ \def\subfig@top{\subfloatbottomskip}%
+ \def\subfig@bottom{\subfloattopskip}%
+ \fi
+ \setbox\@tempboxa \hbox{#4}%
+ \@tempdima=\wd\@tempboxa
+ \vtop\bgroup
+ \vbox\bgroup
+ \ifcase\@tempcnta
+ \@minipagefalse
+ \or
+ \vspace{\subfig@top}
+ \or
+ \ifdim \lastskip=\z@ \else
+ \@tempskipb\subfig@top\@xaddvskip
+ \fi
+ \fi
+ \if@contbotsub
+ \box\@tempboxa\egroup
+ \ifx \@empty#3\relax \else
+ \vskip\subfloatcapskip
+ \@memsubcaption{#1}{#2}{#3}%
+ \fi
+ \else
+ \ifx \@empty#3\relax \else
+ \@memsubcaption{#1}{#2}{#3}%
+ \vskip\subfloatcapskip
+ \vskip\subfloatcaptopadj
+ \fi\egroup
+ \box\@tempboxa
+ \fi
+ \vspace{\subfig@bottom}
+ \egroup
+\egroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% The following series of macros, from \Lpack{subfigure}, control the
+% typesetting of the subcaptions.
+%
+% \begin{macro}{\@memsubfigcaptionlist}
+% A copy of \cs{@subfigcaptionlist}.
+% \begin{macrocode}
+\newcommand*{\@memsubfigcaptionlist}{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\memlistsubcaptions}
+% A copy of \cs{listsubcaptions}.
+% \begin{macrocode}
+\newcommand*{\memlistsubcaptions}{%
+ \@ifstar
+ {\gdef\@memsubfigcaptionlist{}}%
+ {\@memlistsubcaptions{\@captype}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@memlistsubcaptions}
+% A copy of \cs{@listsubcaptions}.
+% \begin{macrocode}
+\newcommand*{\@memlistsubcaptions}[1]{%
+ \@ifundefined{@captype}{}{%
+ \@ifundefined{ext@sub#1}{}{%
+ \@for \@tempa:=\@memsubfigcaptionlist \do {%
+ \ifx \@empty\@tempa\relax \else
+ \addcontentsline{\@nameuse{ext@sub#1}}{sub#1}{\@tempa}%
+ \fi}}}%
+ \gdef\@memsubfigcaptionlist{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makesubfloatcaption}
+% This is a copy of \cs{@makesubfigurecaption}.
+% \changes{v3.6k}{2011/07/21}{Added a \cs{unskip} to remove a space if
+% the text is empty}
+% \begin{macrocode}
+\newcommand{\@makesubfloatcaption}[2]{%
+ \setbox\@tempboxa\hbox{%
+ \@subcapsize
+ {\@subcaplabelfont #1}{\@subcapfont\ignorespaces #2}\unskip}%
+ \@tempdimb=-\subfloatcapmargin
+ \multiply\@tempdimb\tw@
+ \advance\@tempdimb\@tempdima
+ \hb@xt@\@tempdima{%
+ \hss
+ \ifdim \wd\@tempboxa >\@tempdimb
+ \memsubfig@caption{#1}{#2}%
+ \else
+ \if@shortsubcap
+ \memsubfig@caption{#1}{#2}%
+ \else
+ \box\@tempboxa
+ \fi
+ \fi
+ \hss}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memsubfig@caption}
+% This is a copy of \cs{subfig@caption}.
+% \changes{v3.6k}{2011/07/21}{Added a \cs{unskip} to remove a space if
+% the text is empty}
+% \begin{macrocode}
+\newcommand{\memsubfig@caption}[2]{%
+ \if@hangsubcap
+ \sbox{\@tempboxa}{\@subcapsize\@subcaplabelfont #1}%
+ \addtolength{\@tempdimb}{-\wd\@tempboxa}%
+ \usebox{\@tempboxa}%
+ \memsubfig@captionpar{\@tempdimb}{%
+ {\@subcapfont\ignorespaces #2}\unskip}%
+ \else
+ \memsubfig@captionpar{\@tempdimb}{{\@subcaplabelfont #1}%
+ {\@subcapfont\ignorespaces #2}\unskip}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memsubfig@captionpar}
+% This replaces \cs{subfig@captionpar}.
+% \begin{macrocode}
+\newcommand{\memsubfig@captionpar}[2]{%
+ \parbox[t]{#1}{\@subcapsize\@contsubcstyle #2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memsub@label}
+% These are copies of \cs{sub@label} and \cs{subref}.
+% \begin{macrocode}
+\newcommand{\memsub@label}{%
+ \@ifnextchar (%
+ {\sf@memsub@label}%
+ {\sf@memsub@label(Sub\@captype\space
+ \@nameuse{p@sub\@captype}%
+ \@nameuse{thesub\@captype})}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sf@memsub@label}
+% This is a copy of \cs{sf@sub@label}.
+% \begin{macrocode}
+\def\sf@memsub@label(#1)#2{%
+ \protected@edef\mem@currentlabelname{#1}%
+ \sf@@memsub@label{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sf@@memsub@label}
+% This is an expanded copy of \cs{sf@@sub@label} processed after any packages may
+% have been loaded.
+% An added complexity here is when \Lpack{showkeys} is used. It
+% redefines \cs{label} to write it in the margins. But the
+% \cs{sf@@memsub@label} writes the label to aux directly. So in order
+% to support \Lpack{showkeys}, we add a hook, and define this hook if
+% \Lpack{showkeys} is loaded.
+% \changes{v3.7g}{2018/02/28}{Added hook into \cs{sf@@memsub@label},
+% issue reported via \texttt{https://tex.stackexchange.com/q/374301/3929}}
+% \begin{macrocode}
+\newcommand\sf@@memsub@label@hook[1]{}
+
+\AtBeginDocument{%
+ \@ifpackageloaded{nameref}{%
+% \end{macrocode}
+% The \Lpack{nameref} package is loaded.
+% \begin{macrocode}
+ \newcommand*{\sf@@memsub@label}[1]{%
+ \@bsphack
+ \sf@@memsub@label@hook{#1}%
+ \protected@write\@auxout{}{%
+ \string\newlabel{#1}%
+ {{\@nameuse{p@sub\@captype}\@nameuse{@@thesub\@captype}}%
+ {\thepage}%
+ {\mem@currentlabelname\relax}%
+ {\@currentHref}{}}}%
+ \protected@write\@auxout{}{%
+ \string\newlabel{sub@#1}%
+ {{\@nameuse{@@thesub\@captype}}%
+ {\thepage}%
+ {\mem@currentlabelname\relax}%
+ {\@currentHref}{}}}%
+ \@esphack}
+ }{% no nameref
+ \@ifpackageloaded{hyperref}{%
+% \end{macrocode}
+% The \Lpack{hyperref} package is loaded, but not \Lpack{nameref}.
+% \begin{macrocode}
+ \newcommand*{\sf@@memsub@label}[1]{%
+ \@bsphack
+ \sf@@memsub@label@hook{#1}%
+ \protected@write\@auxout{}{%
+ \string\newlabel{#1}%
+ {{\@nameuse{p@sub\@captype}\@nameuse{@@thesub\@captype}}%
+ {\thepage}%
+ {\mem@currentlabelname\relax}%
+ {\@currentHref}{}}}%
+ \protected@write\@auxout{}{%
+ \string\newlabel{sub@#1}%
+ {{\@nameuse{@@thesub\@captype}}%
+ {\thepage}%
+ {\mem@currentlabelname\relax}%
+ {\@currentHref}{}}}%
+ \@esphack}
+ }{% no hyperref
+% \end{macrocode}
+% Neither the \Lpack{hyperref} nor the \Lpack{nameref}
+% package is loaded.
+% \begin{macrocode}
+ \let\@memoldlabel\label
+ \newcommand*{\sf@@memsub@label}[1]{%
+ \@bsphack
+ \sf@@memsub@label@hook{#1}%
+ \@memoldlabel{#1}%
+ \protected@write\@auxout{}{%
+ \string\newlabel{sub@#1}%
+ {{\@nameuse{@@thesub\@captype}}%
+ {\thepage}}}%
+ \@esphack}
+ }{}%
+ }% end no nameref
+% \end{macrocode}
+% Next add the hook redefinition if \Lpack{showkeys} is loaded. Please
+% note that the placement of the \Lpack{showkeys} label, might be a
+% little strange.
+% \changes{v3.7g}{2018/02/28}{added}
+% \begin{macrocode}
+ \@ifpackageloaded{showkeys}{%
+ \renewcommand\sf@@memsub@label@hook[1]{%
+ \SK@\SK@@label{#1}%
+ }
+ }{}
+} % end AtBeginDocument
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subcaptionref}
+% This is a copy of the \cs{subref} macro.
+% \begin{macrocode}
+\DeclareRobustCommand{\subcaptionref}{%
+ \@ifstar{\ssc@ref}{\sc@ref}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ssc@ref}
+% \begin{macro}{\sc@ref}
+% The implementation of the starred and unstarred forms of \cs{subcaptionref}.
+% \begin{macrocode}
+\newcommand*{\ssc@ref}[1]{\ref{sub@#1}}
+\newcommand*{\sc@ref}[1]{{\@subcaplabelfont\ref{sub@#1}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Side captions}
+% \changes{v1.61803}{2008/01/30}{Added all the code for side captions
+% (mempatch v4.1)}
+%
+% \begin{macro}{\m@mscap@capbox}
+% \begin{macro}{\m@mscap@fbox}
+% We need two save boxes, one to hold the caption and the other
+% for the float material.
+% \begin{macrocode}
+\newsavebox{\m@mscap@capbox}
+\newsavebox{\m@mscap@fbox}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecapsep}
+% \begin{macro}{\sidecapwidth}
+% \cs{sidecapsep} is the space between the text and the caption, which
+% is set in a box \cs{sidecapwidth} wide. These are initialized to
+% the \cs{marginpar...} values.
+% \begin{macrocode}
+\newdimen\sidecapsep
+ \sidecapsep=\marginparsep
+\newdimen\sidecapwidth
+ \sidecapwidth=\marginparwidth
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setsidecaps}
+% \cs{setsidecaps}\marg{sep}\marg{width} sets the \cs{sidecapsep} and
+% \cs{sidecapwidth} (Ivars Finvers noted that the initial values don't change
+% if the \cs{marginpar...} values change, such as at \cs{checkandfixthelayout}).
+% \changes{v1.61803}{2008/01/30}{Added \cs{setsidecaps} (mempatch v4.6)}
+% \begin{macrocode}
+\newcommand*{\setsidecaps}[2]{%
+ \setlength{\sidecapsep}{#1}\@memznegtest{\sidecapsep}%
+ \setlength{\sidecapwidth}{#2}\@memznegtest{\sidecapwidth}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@m@tempdima}
+% \begin{macro}{\m@mscapraise}
+% Lengths for internal use. \cs{m@m@tempdima} is meant for general
+% temporary use.
+% \begin{macrocode}
+\newdimen\m@m@tempdima
+\newdimen\m@mscapraise
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecapraise}
+% Length to make (small) adjustments to the position of the caption wrt the float.
+% \begin{macrocode}
+\newdimen\sidecapraise
+ \sidecapraise \z@
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsidecappos}
+% \begin{macro}{\m@mscappos}
+% \cs{setsidecappos}\marg{pos}, where \meta{pos} is one of \texttt{t},
+% \texttt{c}, or \texttt{b}, sets the vertical position of the caption
+% in relation to the float and the result is saved as \cs{m@mscappos}.
+% The default is \texttt{c}.
+% \begin{macrocode}
+\newcommand*{\setsidecappos}[1]{%
+ \def\m@mscappos{#1}\def\@tempb{t}%
+ \ifx\@tempb\m@mscappos
+ \else
+ \def\@tempb{b}%
+ \ifx\@tempb\m@mscappos
+ \else
+ \def\@tempb{c}%
+ \ifx\@tempb\m@mscappos
+ \else
+ \@memerror{Argument to \string\setsidecappos\space is not t or c or b.
+ \MessageBreak Set to c}{\@ehc}%
+ \def\m@mscappos{c}%
+ \fi
+ \fi
+ \fi}
+\setsidecappos{c}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecapmargin}
+% \begin{macro}{\m@mscapmarg}
+% \cs{sidecapmargin}\marg{margin}, where \meta{marg} is one of
+% \texttt{left}, \texttt{right}, \texttt{inner}, or \texttt{outer},
+% controls the margin where the caption will be put. The result
+% is saved as \cs{m@mscapmarg} as a number. The default
+% is \texttt{left}.
+% \begin{macrocode}
+\newcommand{\sidecapmargin}[1]{%
+ \def\@tempa{#1}\def\@tempb{left}%
+ \ifx\@tempb\@tempa
+ \def\m@mscapmarg{0}% left
+ \else
+ \def\@tempb{right}%
+ \ifx\@tempb\@tempa
+ \def\m@mscapmarg{1}% right
+ \else
+ \def\@tempb{outer}%
+ \ifx\@tempb\@tempa
+ \def\m@mscapmarg{2}% outer
+ \else
+ \def\@tempb{inner}%
+ \ifx\@tempb\@tempa
+ \def\m@mscapmarg{3}% inner
+ \else
+ \@memerror{Unrecognized argument for \string\sidecapmargin}%
+ {\@ehc}%
+ \def\m@mscapmarg{-1}% error
+ \fi
+ \fi
+ \fi
+ \fi}
+\sidecapmargin{left}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifscapmargleft}
+% \begin{macro}{\scapmarglefttrue}
+% \begin{macro}{\scapmargleftfalse}
+% \cs{ifscapmargleft} is TRUE the caption should be in the left hand margin,
+% otherwise in the right hand margin.
+% \begin{macrocode}
+\newif\ifscapmargleft
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecapfloatwidth}
+% \begin{macro}{\m@mscapmainwidth}
+% \cs{sidecapfloatwidth} is the width of the box holding the float.
+% Note that this is a macro,
+% not a length, so must be changed using \cs{renewcommand*}.
+% The default is \cs{linewidth}. Later, \cs{m@mscapmainwidth} will be set
+% to the current length specification from \cs{sidecapfloatwidth}.
+% \begin{macrocode}
+\def\sidecapfloatwidth{\linewidth}
+\newdimen\m@mscapmainwidth
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mscaplkern}
+% \begin{macro}{\setm@mscaplkern}
+% \cs{setm@mscaplkern} is a utility macro to calculate the kern
+% (\cs{m@mscaplkern}) required when the caption is in the left margin.
+% \begin{macrocode}
+\newdimen\m@mscaplkern
+\newcommand*{\setm@mscaplkern}{%
+ \m@mscaplkern=\sidecapwidth
+ \advance\m@mscaplkern \sidecapsep
+ \advance\m@mscaplkern \m@mscapmainwidth}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecapstyle}
+% \cs{sidecapstyle} is called just before the caption is set. It can
+% be redefined to set different caption style parameters. The default
+% is raggedleft for left margin captions and raggedright for right
+% margin captions.
+% \begin{macrocode}
+\newcommand*{\sidecapstyle}{%
+%%% \captionnamefont{\bfseries}%
+ \ifscapmargleft
+ \captionstyle{\raggedleft}%
+ \else
+ \captionstyle{\raggedright}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidecaption}
+% The whole shebang is in the \texttt{sidecaption} environment but
+% it is more convenient to specify this via macros rather than
+% directly as an environment.
+%
+% \cs{sidecaption}\oarg{fortoc}\marg{title}\oarg{label} is what it
+% looks like to the user, but internally further macros handle
+% all the arguments.
+% \begin{macrocode}
+\newcommand*{\sidecaption}{%
+ \@ifnextchar [{\@sidecaption}{\@sidecaption[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@sidecaption}
+% \cs{@sidecaption}\oarg{fortoc}\marg{title} grabs the first
+% two arguments.
+% \begin{macrocode}
+\def\@sidecaption[#1]#2{%
+ \@ifnextchar [{\@@sidecaption{#1}{#2}}{\@@sidecaption{#1}{#2}[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mem@scap@beforehook}
+% \begin{macro}{\@mem@scap@afterhook}
+% Two hooks into the 'scap' internals. By default they do nothing, but
+% can be used make say sidecaption align towards the spine in twosided
+% documents. This is done by redefining \emph{before} to
+% \verb+\checkoddpage\ifoddpage\else\raggedleft\fi+ and redefining
+% \emph{after} to \verb+\par+. Note that since 'sidecontcaption',
+% 'sidenamedlegend' and 'sidelegend' all share the same basic
+% internals redefining the two hooks will affect those as well. The
+% user might want to create their own special environment, say, like this:
+% \begin{verbatim}
+% \makeatletter
+% \newenvironment{sidecaption*}{
+% \renewcommand\@mem@scap@beforehook{\checkoddpage\ifoddpage\else\raggedleft\fi}
+% \renewcommand\@mem@scap@afterhook{\par}
+% \begin{sidecaption}}
+% {\end{sidecaption}}
+% \makeatother
+% \end{verbatim}
+% \changes{v1.6180339c}{2009/01/21}{Added 'before' and 'after' hooks
+% to shared sidecaption internals}
+% \begin{macrocode}
+\newcommand\@mem@scap@beforehook{}
+\newcommand\@mem@scap@afterhook{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@sidecaption}
+% \cs{@@sidecaption}\marg{fortoc}\marg{title}\oarg{label} is the
+% last macro in the chain and handles all three arguments.
+% This does all the work for \verb?\begin{sidecaption}?
+% \begin{macro}{\m@mscap@fortoc}
+% \begin{macro}{\m@mscap@forcap}
+% \begin{macro}{\m@mscaplabel}
+% First, save all the arguments as macros.
+% \begin{macrocode}
+\def\@@sidecaption#1#2[#3]{%
+ \ifx\@empty#1\@empty
+ \def\m@mscap@fortoc{#2}%
+ \else
+ \def\m@mscap@fortoc{#1}%
+ \fi
+ \def\m@mscap@forcap{#2}%
+ \ifx\@empty#3\@empty
+ \def\m@mscaplabel{}%
+ \else
+ \def\m@mscaplabel{\@bsphack\label{#3}\@esphack}%
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% Set the float width, calculate the left margin kern, and start
+% a \texttt{minipage} to hold the float, saving it in box
+% \cs{m@mscap@fbox}.
+% \begin{macrocode}
+ \m@mscapstart@fbox}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mscapstart@fbox}
+% \begin{macro}{\m@mscapend@fbox}
+% \cs{m@mscapstart@fbox} is the macro that actually sets the float width,
+% calculates the left margin kern, and starts the float's \texttt{minipage}.
+% The macro \cs{m@mscapend@fbox} ends the box.
+% \begin{macrocode}
+\newcommand*{\m@mscapstart@fbox}{%
+% \end{macrocode}
+% \changes{v1.6180339c}{2009/01/21}{Added \cs{@mem@scap@beforehook}}
+% \begin{macrocode}
+ \@mem@scap@beforehook%
+ \setlength{\m@mscapmainwidth}{\sidecapfloatwidth}%
+ \setm@mscaplkern
+ \begin{lrbox}{\m@mscap@fbox}%
+ \begin{minipage}[c]{\m@mscapmainwidth}}
+\newcommand*{\m@mscapend@fbox}{%
+ \end{minipage}%
+ \end{lrbox}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\endsidecaption}
+% \cs{endsidecaption} does the work for \verb?\end{sidecaption}?.
+%
+% Finish the float minipage, then increment the caption counter and
+% call \cs{label} via \cs{m@mscaplabel}.
+% \begin{macrocode}
+\def\endsidecaption{%
+ \m@mscapend@fbox
+ \refstepcounter\@captype
+ \m@mscaplabel
+% \end{macrocode}
+% \changes{v3.6k}{2012/08/19}{We need to move \cs{m@mscapcheckside}
+% here or the \cs{sidecapstyle} inside the box, will never work correctly.}
+% \begin{macrocode}
+ \m@mscapcheckside %<--- added 2012/08/19
+% \end{macrocode}
+% Set the caption inside a minipage, saving it in box \cs{m@mscap@capbox}.
+% \begin{macrocode}
+ \begin{lrbox}{\m@mscap@capbox}%
+ \begin{minipage}[c]{\sidecapwidth}%
+ \sidecapstyle
+ \@caption\@captype[\m@mscap@fortoc]{\m@mscap@forcap}
+ \end{minipage}%
+ \end{lrbox}%
+% \end{macrocode}
+% Output the float and caption.
+% \begin{macrocode}
+ \m@mscapopboxes}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mscapopboxes}
+% Having determined how high the caption box must be raised with
+% respect to the float box, output the boxes.
+% \begin{macrocode}
+\newcommand*{\m@mscapopboxes}{%
+ \m@mcalcscapraise
+% \end{macrocode}
+% Set the float (from box \cs{m@mscap@fbox}) then the caption (from
+% box \cs{m@mscap@capbox}) kerning it to the left or right as
+% appropriate.
+% \changes{v3.6k}{2012/08/19}{Moved \cs{m@mscapcheckside} into
+% \cs{endsidecaption}, otherwise \cs{sidecapstyle} never see the side check}
+% \begin{macrocode}
+ \usebox{\m@mscap@fbox}%\m@mscapcheckside
+ \ifscapmargleft%
+ \rlap{\kern-\m@mscaplkern
+ \raisebox{\m@mscapraise}{\usebox{\m@mscap@capbox}}}%
+ \else%
+ \rlap{\kern\sidecapsep
+ \raisebox{\m@mscapraise}{\usebox{\m@mscap@capbox}}}%
+ \fi
+% \end{macrocode}
+% Finally, make \cs{m@mscapthisside} a no-op.
+% \begin{macrocode}
+ \gdef\m@mscapthisside{}%
+% \end{macrocode}
+% \changes{v1.6180339c}{2009/01/21}{Added \cs{@mem@scap@afterhook}}
+% \begin{macrocode}
+ \@mem@scap@afterhook%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mcalcscapraise}
+% Calculate the amount the caption might have to be raised wrt the
+% float. This depends on the position: \\
+% \texttt{t:} raise by the difference in heights \\
+% \texttt{c:} shouldn't have to do anything as the minipages are meant
+% to center aligned \\
+% \texttt{b:} lower by the difference in depths \\
+%
+% However, experiments showed that a little bit of tweaking might
+% help. The final adjustment, \cs{sidecapraise} is controlled by
+% the user.
+% \begin{macrocode}
+\newcommand*{\m@mcalcscapraise}{%
+ \def\@tempb{t}%
+ \ifx\m@mscappos\@tempb
+ \settoheight{\m@m@tempdima}{\strut\usebox{\m@mscap@capbox}}%
+ \settoheight{\m@mscapraise}{\usebox{\m@mscap@fbox}}%
+ \advance\m@mscapraise -\m@m@tempdima
+ \advance\m@mscapraise 0.5ex
+ \else
+ \def\@tempb{b}%
+ \ifx\m@mscappos\@tempb
+ \settodepth{\m@m@tempdima}{\usebox{\m@mscap@fbox}}%
+ \settodepth{\m@mscapraise}{\strut\usebox{\m@mscap@capbox}}%
+ \advance\m@mscapraise -\m@m@tempdima
+ \else
+ \m@mscapraise=\z@
+ \advance\m@mscapraise 0.25ex
+ \fi
+ \fi
+ \advance\m@mscapraise \sidecapraise}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mscapcheckside}
+% This macro determines whether the caption should be set in the
+% left or right margin. In twocolumn documents the caption for a single
+% column float is always set in the adjacent margin. Starred floats
+% are treated as regular floats as in a onecolumn document.
+% \begin{macrocode}
+\newcommand*{\m@mscapcheckside}{%
+ \if@twocolumn
+ \ifdim\hsize=\textwidth% float*
+ \m@mscapcheckregside
+ \else
+ \if@firstcolumn
+ \scapmarglefttrue
+ \else
+ \scapmargleftfalse
+ \fi
+ \fi
+ \else
+ \m@mscapcheckregside
+ \fi
+% \end{macrocode}
+% Finally apply any user's override.
+% \begin{macrocode}
+ \m@mscapthisside}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mscapcheckregside}
+% This performs the margin calculation for onecolumn documents.
+% \begin{macrocode}
+\newcommand*{\m@mscapcheckregside}{%
+ \if@twoside
+ \checkoddpage
+ \ifnum\m@mscapmarg<\@ne% % left
+ \scapmarglefttrue
+ \else
+ \ifnum\m@mscapmarg=\@ne% % right
+ \scapmargleftfalse
+ \else
+ \ifnum\m@mscapmarg=\tw@% % outer
+ \scapmarglefttrue
+ \ifoddpage
+ \scapmargleftfalse
+ \fi
+ \else% % inner
+ \scapmargleftfalse
+ \ifoddpage
+ \scapmarglefttrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \else% oneside
+% \end{macrocode}
+% In oneside documents, inner and outer is the same as left and right.
+% \changes{v3.7f}{2015/08/10}{Side caption placement bugfix for
+% onesided docs. Related to \protect\url{http://tex.stackexchange.com/q/259324/3929}.
+% }
+% \begin{macrocode}
+ % \scapmarglefttrue% 0 and 3
+ % \ifnum\m@mscapmarg>\@ne
+ % \ifnum\m@mscapmarg<\thr@@
+ % \scapmargleftfalse
+ % \fi
+ % \fi
+ \ifcase\m@mscapmarg\relax% 0
+ \scapmarglefttrue%
+ \or% 1
+ \scapmargleftfalse%
+ \or% 2
+ \scapmargleftfalse%
+ \or% 3
+ \scapmarglefttrue%
+ \fi%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\overridescapmargin}
+% \begin{macro}{\m@mscapthisside}
+% User macro to override the calculated caption margin. Call as either:\\
+% \verb?\overridescapmargin{left}? or \verb?\overridescapmargin{right}? \\
+% \begin{macrocode}
+\newcommand*{\overridescapmargin}[1]{%
+ \def\@tempb{#1}\def\@tempa{left}%
+ \ifx\@tempa\@tempb
+ \def\m@mscapthisside{\scapmarglefttrue}%
+ \else
+ \def\@tempa{right}%
+ \ifx\@tempa\@tempb
+ \def\m@mscapthisside{\scapmargleftfalse}%
+ \else
+ \@memerror{Argument to \string\overridescapmargin\space neither
+ left nor right}{\@ehc}%
+ \def\m@mscapthisside{}%
+ \fi
+ \fi}
+\newcommand*{\m@mscapthisside}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now for the other kinds of captions.
+%
+% \begin{macro}{\sidecontcaption}
+% \cs{sidecontcaption}\marg{title}\oarg{label} is for
+% a continuation sidecaption.
+% \begin{macrocode}
+\newcommand*{\sidecontcaption}{%
+ \@sidecontcaption}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@sidecontcaption}
+% \cs{@sidecontcaption}\marg{title} grabs the first
+% argument.
+% \begin{macrocode}
+\def\@sidecontcaption#1{%
+ \@ifnextchar [{\@@sidecontcaption{#1}}{\@@sidecontcaption{#1}[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@sidecontcaption}
+% \cs{@@sidecontcaption}\marg{title}\oarg{label} is the
+% last macro in the chain and handles all two arguments.
+% This does all the work for \verb?\begin{sidecontcaption}?
+% \begin{macrocode}
+\def\@@sidecontcaption#1[#2]{%
+ \def\m@mscap@forcap{#1}%
+ \ifx\@empty#2\@empty
+ \def\m@mscaplabel{}%
+ \else
+ \def\m@mscaplabel{\@bsphack\label{#2}\@esphack}%
+ \fi
+ \m@mscapstart@fbox}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endsidecontcaption}
+% \cs{endsidecontcaption} does the work for \verb?\end{sidecontcaption}?.
+%
+% \begin{macrocode}
+\def\endsidecontcaption{%
+ \m@mscapend@fbox
+ \addtocounter{\@captype}{\m@ne}\refstepcounter\@captype
+ \m@mscaplabel
+% \end{macrocode}
+% \changes{v3.7b}{2013/05/30}{Forgot the side check}
+% \begin{macrocode}
+ \m@mscapcheckside %<--- added 2013/05/30
+ \begin{lrbox}{\m@mscap@capbox}%
+ \begin{minipage}[c]{\sidecapwidth}%
+ \sidecapstyle
+ \@contcaption\@captype{\m@mscap@forcap}
+ \end{minipage}%
+ \end{lrbox}%
+ \m@mscapopboxes}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\sidenamedlegend}
+% \begin{macro}{\@sidenamedlegend}
+% \cs{sidenamedlegend}\oarg{fortoc}\marg{title} is for
+% a namedlegend sidecaption.
+% \begin{macrocode}
+\newcommand*{\sidenamedlegend}{%
+ \@ifnextchar [{\@sidenamedlegend}{\@sidenamedlegend[]}}
+\def\@sidenamedlegend[#1]#2{%
+ \@@sidenamedlegend{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@sidenamedlegend}
+% \cs{@@sidenamedlegend}\marg{fortoc}\marg{title} is the
+% last macro in the chain and handles all arguments.
+% This does all the work for \verb?\begin{sidenamedlegend}?
+% \begin{macrocode}
+\def\@@sidenamedlegend#1#2{%
+ \ifx\@empty#1\@empty
+ \def\m@mscap@fortoc{#2}%
+ \else
+ \def\m@mscap@fortoc{#1}%
+ \fi
+ \def\m@mscap@forcap{#2}%
+ \def\m@mscaplabel{}%
+ \m@mscapstart@fbox}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endsidenamedlegend}
+% \cs{endsidenamedlegend} does the work for \verb?\end{sidenamedlegend}?.
+% \begin{macrocode}
+\def\endsidenamedlegend{%
+ \m@mscapend@fbox
+ \begin{lrbox}{\m@mscap@capbox}%
+ \begin{minipage}[c]{\sidecapwidth}%
+ \sidecapstyle
+ \@legend\@captype[\m@mscap@fortoc]{\m@mscap@forcap}
+ \end{minipage}%
+ \end{lrbox}%
+ \m@mscapopboxes}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\sidelegend}
+% \cs{sidelegend}\marg{title} is for
+% a legend sidecaption.
+% \begin{macrocode}
+\newcommand*{\sidelegend}{%
+ \@@sidelegend}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@sidelegend}
+% \cs{@@sidelegend}\marg{title} is the
+% last macro in the chain and handles all arguments.
+% This does all the work for \verb?\begin{sidelegend}?
+% \begin{macrocode}
+\def\@@sidelegend#1{%
+ \def\m@mscap@forcap{#1}%
+ \m@mscapstart@fbox}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endsidelegend}
+% \cs{endsidelegend} does the work for \verb?\end{sidelegend}?.
+% \begin{macrocode}
+\def\endsidelegend{%
+ \m@mscapend@fbox
+ \begin{lrbox}{\m@mscap@capbox}%
+ \begin{minipage}[c]{\sidecapwidth}%
+ \sidecapstyle
+ \legend{\m@mscap@forcap}
+ \end{minipage}%
+ \end{lrbox}%
+ \m@mscapopboxes}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.6k}{2013/015/13}{Added \Lpack{longtable} caption
+% support}
+%
+% \subsubsection{Handling \Lpack{longtable} captions}
+%
+% In \Lpack{longtable} the caption ends up as a special row in the
+% table. In order to use our caption formatting we need to redefine
+% \cs{LT@makecaption} to use our formatting macro plus
+% \cs{belowcaptionskip}. It needs to be
+% done after \Lpack{longtable} is loaded, and \emph{not} if the
+% \Lpack{ltcaption} package is loaded. The later is used by the
+% \Lpack{caption} package to aid caption formatting i
+% \Lpack{longtable}. Special thanks to Axel Sommerfelt.
+% \begin{macro}{\LT@makecaption}
+% \begin{macrocode}
+\AtBeginDocument{
+ \@ifpackageloaded{longtable}{
+ \@ifpackageloaded{ltcaption}{}{%
+ \def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+ \let\@memtempa\relax%
+ % starred form -> #1 = \@gobble
+ \ifx#1\@gobble%
+ \let\@contnfont\@empty%
+ \let\@contdelim\@empty%
+ \@@makecaption{}{#3}%
+ \else%
+ \@@makecaption{#2}{#3}%
+ \fi%
+ \endgraf\vskip\belowcaptionskip}%
+ \hss}}}
+ }
+ }{}
+}
+% \end{macrocode}
+% At a later point, we will supplement with a \cs{legend} for
+% \Lpack{longtable} as well.
+% \end{macro}
+%
+% \section{Epigraphs}
+%
+% This code comes from the \Lpack{epigraph} package~\cite{EPIGRAPH}.
+%
+% \begin{macro}{\beforeepigraphskip}
+% \begin{macro}{\afterepigraphskip}
+% \begin{macro}{\epigraphwidth}
+% \begin{macro}{\epigraphrule}
+% The several length commands, which can be changed by the user with
+% \cs{setlength}.
+% \begin{macrocode}
+\newlength{\beforeepigraphskip}
+ \setlength{\beforeepigraphskip}{.5\baselineskip}
+\newlength{\afterepigraphskip}
+ \setlength{\afterepigraphskip}{.5\baselineskip}
+\newlength{\epigraphwidth}
+ \setlength{\epigraphwidth}{.4\textwidth}
+\newlength{\epigraphrule}
+ \setlength{\epigraphrule}{.4\p@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\epigraphsize}
+% The size of the font to be used.
+% \begin{macrocode}
+\newcommand{\epigraphsize}{\small}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\epigraphflush}
+% \begin{macro}{\textflush}
+% \begin{macro}{\sourceflush}
+% The three commands to position epigraphs in the textblock and to position
+% the components of the epigraph.
+% \begin{macrocode}
+\newcommand{\epigraphflush}{flushright}
+\newcommand{\textflush}{flushleft}
+\newcommand{\sourceflush}{flushright}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\epigraphfontsize}
+% \begin{macro}{\epigraphposition}
+% \begin{macro}{\epigraphtextposition}
+% \begin{macro}{\epigraphsourceposition}
+% These are declarative forms of the above. It's a bit late now, but
+% the previous macros should have been internal.
+% \changes{v1.2}{2002/08/10}{Added some declarations for epigraphs.}
+% \begin{macrocode}
+\newcommand{\epigraphfontsize}[1]{\def\epigraphsize{#1}}
+\newcommand{\epigraphposition}[1]{\long\def\epigraphflush{#1}}
+\newcommand{\epigraphtextposition}[1]{\def\textflush{#1}}
+\newcommand{\epigraphsourceposition}[1]{\def\sourceflush{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@epirule}
+% The internal command to draw a rule between text and source.
+% \begin{macrocode}
+\newcommand{\@epirule}{\rule[.5ex]{\epigraphwidth}{\epigraphrule}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@epitext}
+% The internal command to typeset the \meta{text}. Put it into a minipage of the
+% right size and typeset per \cs{textflush}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{par} to \cs{@epitext} and
+% \cs{@episource} (mempatch v4.7)}
+% \begin{macrocode}
+\newcommand{\@epitext}[1]{%
+ \begin{minipage}{\epigraphwidth}\begin{\textflush} #1\par
+% \end{macrocode}
+% Draw a rule if it will be visible, otherwise add some extra vertical space.
+% \begin{macrocode}
+ \ifdim\epigraphrule>\z@ \@epirule \else \vspace*{1ex} \fi
+ \end{\textflush}\end{minipage}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@episource}
+% The internal command for typesetting the \meta{source}, which is put
+% into a minipage and typeset according to \cs{sourceflush}.
+% \begin{macrocode}
+\newcommand{\@episource}[1]{%
+ \begin{minipage}{\epigraphwidth}
+ \begin{\sourceflush} #1\par
+ \end{\sourceflush}\end{minipage}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\epigraph}
+% Having got the preliminaries out of the way, here's the user command
+% for a single epigraph. This is set in a minipage to prevent breaking
+% across a page. Position it according to \cs{epigraphflush}.
+% \begin{macrocode}
+\newcommand{\epigraph}[2]{\vspace{\beforeepigraphskip}
+ {\epigraphsize\begin{\epigraphflush}\begin{minipage}{\epigraphwidth}
+ \@epitext{#1}\\ \@episource{#2}
+ \end{minipage}\end{\epigraphflush}
+ \vspace{\afterepigraphskip}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\qitem}
+% \begin{macro}{\qitemlabel}
+% \cs{qitem} is the epigraph list version of \cs{item}.
+% Set everything inside a minipage.
+% \begin{macrocode}
+\newcommand{\qitem}[2]{{%
+ \raggedright\item \begin{minipage}{\epigraphwidth}
+ \@epitext{#1}\\ \@episource{#2}
+ \end{minipage}}}
+% \end{macrocode}
+% \cs{qitemlabel} is needed for a list as well. It is not going to
+% typeset anything.
+% \begin{macrocode}
+\newcommand{\qitemlabel}[1]{\hfill}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{environment}{epigraphs}
+% Now for the epigraph list. This is defined in terms of a \Lenv{list}
+% environment.
+% \begin{macrocode}
+\newenvironment{epigraphs}{%
+% \end{macrocode}
+% Do the vertical space, set the font size, position according to
+% \cs{epigraphflush}, and put everything into a minipage.
+% \begin{macrocode}
+ \vspace{\beforeepigraphskip}\begin{\epigraphflush}
+ \epigraphsize
+ \begin{minipage}{\epigraphwidth}
+ \list{}%
+% \end{macrocode}
+% Make the list just fit the minipage (i.e., no indents).
+% \begin{macrocode}
+ {\itemindent\z@ \labelwidth\z@ \labelsep\z@
+ \leftmargin\z@ \rightmargin\z@
+ \let\makelabel\qitemlabel}}%
+ {\endlist\end{minipage}\end{\epigraphflush}
+ \vspace{\afterepigraphskip}}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Epigraphs before a chapter title}
+%
+%
+% \begin{macro}{\@epichapapp}
+% \begin{macro}{\dropchapter}
+% \begin{macro}{\undodrop}
+% Commands to drop and restore positions of chapter titles. Dropping is
+% accomplished by inserting vertical space before the \cs{@chapapp} command.
+% \begin{macrocode}
+\newcommand{\dropchapter}[1]{%
+ \let\@epichapapp\@chapapp
+ \renewcommand{\@chapapp}{\vspace*{#1}\@epichapapp}}
+\newcommand{\undodrop}{\let\@chapapp\@epichapapp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Placing an epigraph before a chapter title uses the scheme outlined
+% by Piet van Oostrum~\cite{FANCYHDR}. This is to put a zero sized
+% picture into the page header.
+%
+% \begin{macro}{\if@epirhs}
+% \begin{macro}{\if@epicenter}
+% Two booleans for testing whether an epigraph is to be at the RH margin,
+% centered, or at the LH margin. The default is RH margin.
+% \begin{macrocode}
+\newif\if@epirhs \@epirhstrue
+\newif\if@epicenter \@epicentertrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@epipos}
+% This routine sets the \cs{if@epi...} booleans according to the value of
+% \cs{epigraphflush}. If \cs{epigraphflush} is neither \texttt{center} nor
+% \texttt{flushleft}
+% then it defaults to \texttt{flushright}. We have to use this to be upward
+% compatible with \cs{epigraphflush} being set by the user with \cs{renewcommand}.
+% \begin{macrocode}
+\newcommand{\@epipos}{
+ \long\def\@ept{flushleft}
+ \ifx\epigraphflush\@ept
+ \@epirhsfalse \@epicenterfalse
+ \else
+ \long\def\@ept{center}
+ \ifx\epigraphflush\@ept
+ \@epirhsfalse \@epicentertrue
+ \else
+ \@epirhstrue \@epicenterfalse
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\epigraphhead}
+% \cs{epigraphhead}\oarg{distance}\marg{text} puts \meta{text} at
+% \meta{distance} (a number, not a length) below the header at the
+% page position specified by \cs{epigraphflush}.
+% \begin{macrocode}
+\newcommand{\epigraphhead}[2][95]{%
+% \end{macrocode}
+% We have to use \cs{def} instead of the normal \LaTeX{} definition commands
+% as we will keep on
+% (re)defining things. For reasons that are not fully clear to me \LaTeX{}
+% doesn't seem to like me using a \cs{savebox} for storing the epigraph text,
+% so I'll use a command instead.
+% \begin{macrocode}
+ \def\@epitemp{\begin{minipage}{\epigraphwidth}#2\end{minipage}}
+% \end{macrocode}
+% Define an \texttt{epigraph} page style.
+% \begin{macrocode}
+ \def\ps@epigraph{\let\@mkboth\@gobbletwo
+% \end{macrocode}
+% There are three possible definitions for \cs{@oddhead} depending on the
+% value of \cs{epigraphflush}. We call \cs{@epipos} to decide which one to do.
+% \begin{macrocode}
+ \@epipos
+ \if@epirhs
+ \def\@oddhead{\hfil\begin{picture}(0,0)
+ \put(0,-#1){\makebox(0,0)[r]{\@epitemp}}
+ \end{picture}}
+ \else
+ \if@epicenter
+ \def\@oddhead{\hfil\begin{picture}(0,0)
+ \put(0,-#1){\makebox(0,0)[b]{\@epitemp}}
+ \end{picture}\hfil}
+ \else
+ \def\@oddhead{\begin{picture}(0,0)
+ \put(0,-#1){\makebox(0,0)[l]{\@epitemp}}
+ \end{picture}\hfil}
+ \fi
+ \fi
+ \let\@evenhead\@oddhead
+ \def\@oddfoot{\reset@font\hfil\thepage\hfil}
+ \let\@evenfoot\@oddfoot}
+% \end{macrocode}
+% Make \texttt{epigraph} be the page style for this page.
+% \begin{macrocode}
+ \thispagestyle{epigraph}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The above produces a \texttt{plain} pagestyle with the epigraph. Life is
+% more complex if someone wants a fancy style with the epigraph. They
+% will have to do some work, though.
+%
+% \begin{macro}{\the@epigraph}
+% \begin{macro}{\@epidrop}
+% \begin{macro}{\epigraphforheader}
+% \cs{the@pigraph} is a macro to store the contents of an epigraph, and \cs{@pidrop}
+% stores the \meta{distance} number.
+% \cs{epigraphforheader}\oarg{distance}\marg{text} defines the internal macros
+% appropriately.
+% \changes{v1.2}{2002/08/10}{Added \cs{the@epigraph}, \cs{@epidrop}}
+% \changes{v1.2}{2002/08/10}{Added \cs{epigraphforheader}}
+% \begin{macrocode}
+\newcommand{\the@epigraph}{}
+\newcommand{\@epidrop}{95}
+\newcommand{\epigraphforheader}[2][95]{%
+ \def\@epidrop{#1}\long\def\the@epigraph{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\epigraphpicture}
+% \cs{epigraphpicture} puts \cs{the@epigraph} into a zero-sized picture at location
+% \verb?(0,-\@epidrop)?. This can then be used as part of a fancy chapter header.
+% The coding is similar to \cs{epigraphhead}.
+% \changes{v1.2}{2002/08/10}{Added \cs{epigraphpicture}}
+% \begin{macrocode}
+\newcommand{\epigraphpicture}{%
+ \def\@epitemp{%
+ \begin{minipage}{\epigraphwidth}\the@epigraph\end{minipage}}%
+ \@epipos
+ \if@epirhs
+ \begin{picture}(0,0)%
+ \put(0,-\@epidrop){\makebox(0,0)[r]{\@epitemp}}%
+ \end{picture}%
+ \else
+ \if@epicenter
+ \begin{picture}(0,0)%
+ \put(0,-\@epidrop){\makebox(0,0)[b]{\@epitemp}}%
+ \end{picture}%
+ \else
+ \begin{picture}(0,0)%
+ \put(0,-\@epidrop){\makebox(0,0)[l]{\@epitemp}}%
+ \end{picture}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \section{The deprecated font commands}
+%
+% The class does not support the old font changing commands unless the
+% \Lopt{oldfontcommands} option is used.
+%
+% \begin{macro}{\@memoldfonterr}
+% \begin{macro}{\@memoldfontwarn}
+% Macros for old font class error and warning. E.g., \\
+% \verb?\@memoldfonterr{\tt}{\ttfamily}{\texttt}?
+% \changes{v1.4}{2003/02/27}{Added \cs{@memoldfonterr} and \cs{@memoldfontwarn}}
+% \changes{v1.618}{2005/09/03}{Fiddled with the braces in \cs{@memoldfontwarn} (mempatch v3.0)}
+% \begin{macrocode}
+\newcommand*{\@memoldfonterr}[3]{%
+ \@memerror{Font command \protect#1\space is not supported}{%
+ Use \protect#2, or \protect#3{...}, or the oldfontcommands option}}
+\newcommand*{\@memoldfontwarn}[3]{%
+ \@memwarn{The \protect#1\space font command is deprecated.
+ \MessageBreak Use \protect#2{...} or {\protect#3... } instead}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Just give a single warning when an old font command is used following the
+% \Lopt{oldfontcommands} option.
+% \changes{v1.4}{2003/11/22}{Just issue a single warning for an old font
+% (from patch v1.9)}
+%
+% \begin{macro}{\@mem@rmwarn}
+% \begin{macro}{\rm}
+% The old command for roman font.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{rm}}
+% \changes{v1.4}{2003/02/27}{More efficient coding of all the old font commands}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@rmwarn{\@memoldfontwarn{\rm}{\textrm}{\rmfamily}}
+ \DeclareOldFontCommand{\rm}{\@mem@rmwarn\gdef\@mem@rmwarn{}%
+ \normalfont\rmfamily}{\mathrm}
+\else
+ \def\rm{\@memoldfonterr{\rm}{\textrm}{\rmfamily}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@sfwarn}
+% \begin{macro}{\sf}
+% The old sans font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{sf}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@sfwarn{\@memoldfontwarn{\sf}{\textsf}{\sffamily}}
+ \DeclareOldFontCommand{\sf}{\@mem@sfwarn\gdef\@mem@sfwarn{}%
+ \normalfont\sffamily}{\mathsf}
+\else
+ \def\sf{\@memoldfonterr{\sf}{\textsf}{\sffamily}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@ttwarn}
+% \begin{macro}{\tt}
+% The old typewriter font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{tt}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@ttwarn{\@memoldfontwarn{\tt}{\texttt}{\ttfamily}}
+ \DeclareOldFontCommand{\tt}{\@mem@ttwarn\gdef\@mem@ttwarn{}%
+ \normalfont\ttfamily}{\mathtt}
+\else
+ \def\tt{\@memoldfonterr{\tt}{\texttt}{\ttfamily}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@bfwarn}
+% \begin{macro}{\bf}
+% The old bold font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{bf}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@bfwarn{\@memoldfontwarn{\bf}{\textbf}{\bfseries}}
+ \DeclareOldFontCommand{\bf}{\@mem@bfwarn\gdef\@mem@bfwarn{}%
+ \normalfont\bfseries}{\mathbf}
+\else
+ \def\bf{\@memoldfonterr{\bf}{\textbf}{\bfseries}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@itwarn}
+% \begin{macro}{\it}
+% The old italic font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{it}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@itwarn{\@memoldfontwarn{\it}{\textit}{\itshape}}
+ \DeclareOldFontCommand{\it}{\@mem@itwarn\gdef\@mem@itwarn{}%
+ \normalfont\itshape}{\mathit}
+\else
+ \def\it{\@memoldfonterr{\it}{\textit}{\itshape}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@slwarn}
+% \begin{macro}{\sl}
+% The old slanted font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{sl}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@slwarn{\@memoldfontwarn{\sl}{\textsl}{\slshape}}
+ \DeclareOldFontCommand{\sl}{\@mem@slwarn\gdef\@mem@slwarn{}%
+ \normalfont\slshape}{\@nomath\sl}
+\else
+ \def\sl{\@memoldfonterr{\sl}{\textsl}{\slshape}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@scwarn}
+% \begin{macro}{\sc}
+% The old small caps font command.
+% \changes{v1.0a}{2002/01/29}{Changed definition of \cs{sc}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@scwarn{\@memoldfontwarn{\sc}{\textsc}{\scshape}}
+ \DeclareOldFontCommand{\sc}{\@mem@scwarn\gdef\@mem@scwarn{}%
+ \normalfont\scshape}{\@nomath\sc}
+\else
+ \def\sc{\@memoldfonterr{\sc}{\textsc}{\scshape}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@calwarn}
+% \begin{macro}{\cal}
+% The old calligraphic font command.
+% \changes{v1.0a}{2002/01/29}{Added definition of \cs{cal}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@calwarn{%
+ \@memwarn{The \protect\cal\space font command is deprecated.
+ \MessageBreak Try to use \protect\mathcal\space instead}}
+ \DeclareRobustCommand*\cal{\@mem@calwarn\gdef\@mem@calwarn{}%
+ \@fontswitch\relax\mathcal}
+\else
+ \def\cal{%
+ \@memerror{Font command \protect\cal\space is not supported}{%
+ Use \protect\mathcal, or the oldfontcommands option}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mem@mitwarn}
+% \begin{macro}{\mit}
+% The old math italic font command.
+% \changes{v1.0a}{2002/01/29}{Added definition of \cs{mit}}
+% \begin{macrocode}
+\if@memoldfont
+ \def\@mem@mitwarn{%
+ \@memwarn{The \protect\mit\space font command is deprecated.
+ \MessageBreak Try to use \protect\mathnormal\space instead}}
+ \DeclareRobustCommand*\mit{\@mem@mitwarn\gdef\@mem@mitwarn{}%
+ \@fontswitch\relax\mathnormal}
+\else
+ \def\mit{%
+ \@memerror{Font command \protect\mit\space is not supported}{%
+ Use \protect\mathnormal, or the oldfontcommands option}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\em}
+% \begin{macro}{\eminnershape}
+% \begin{macro}{\emph}
+% The old emphasis font command (the original \cs{em} is defined in the
+% kernel file \file{ltfssini.dtx}, coded here as \cs{@m@m@m}).
+% \changes{v0.2}{2001/06/03}{Redid coding for \cs{emph} and \cs{em}}
+% \changes{v1.618}{2005/09/03}{Dont' deprecate \cs{em} and deleted \cs{@mem@emwarn} (mempatch v3.0)}
+% \changes{v1.618}{2005/09/03}{Completely redid \cs{em} and \cs{emph}, matching latest fixltx2e package (mempatch v3.3)}
+% \begin{macrocode}
+\DeclareRobustCommand{\em}{%
+ \@nomath\em
+ \ifdim\fontdimen\@ne\font > \z@
+ \eminnershape
+ \else
+ \itshape
+ \fi}
+\providecommand{\eminnershape}{\upshape}
+\DeclareTextFontCommand{\emph}{\em}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \section{Cross Referencing} \label{sec:xref}
+%
+% \subsection{Label referencing}
+%
+% \begin{macro}{\fref}
+% \begin{macro}{\tref}
+% \begin{macro}{\pref}
+% These are named references to labeled figures, tables and pages.
+% I find these
+% useful to ensure consistency throughout the document --- I don't have
+% to remember whether it is `see Figure ...' or `figure' or `Fig.' or \ldots.
+% \begin{macrocode}
+\newcommand*{\fref}[1]{\figurerefname~\ref{#1}}
+\newcommand*{\tref}[1]{\tablerefname~\ref{#1}}
+\newcommand*{\pref}[1]{\pagerefname~\pageref{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Aref}
+% \begin{macro}{\Bref}
+% \begin{macro}{\Pref}
+% \begin{macro}{\Cref}
+% \begin{macro}{\Sref}
+% These are named references to labeled Part, Chapter and Sectional
+% divisions.
+% \changes{v1.2}{2002/07/27}{Added \cs{Pref}, \cs{Cref} and \cs{Sref}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{Bref} (mempatch v4.9+)}
+% \changes{v1.61803}{2008/05/17}{Added \cs{Aref}}
+% \begin{macrocode}
+\newcommand*{\Aref}[1]{\appendixrefname\ref{#1}}
+\newcommand*{\Bref}[1]{\bookrefname\ref{#1}}
+\newcommand*{\Pref}[1]{\partrefname\ref{#1}}
+\newcommand*{\Cref}[1]{\chapterrefname\ref{#1}}
+\newcommand*{\Sref}[1]{\sectionrefname\ref{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Title referencing}
+%
+% This is based on DA's \Lpack{titleref} package~\cite{TITLEREF}.
+% The following
+% remarks are taken from that package.
+%
+%
+% Titles for numbered sectioning units and for floats with captions are
+% the same as the respective TOC, LOF, or LOT entry (even when no TOC is
+% printed). When a short title is provided (\verb?\section[short]{long}?)
+% it will be used for the \cs{titleref}. This is especially useful for
+% figure captions. Unnumbered sections take their title reference from
+% the printed title. Beware! This turns the title into a moving argument
+% when it normally is not, and will cause weird errors if there are
+% `fragile' commands present.
+%
+% Enumerated lists do not have titles and simply inherit the title of
+% their section.
+%
+% The format of the title reference is controlled by the command
+% \cs{theTitleReference}, which can be redefined with \cs{renewcommand}.
+% It takes two parameters: the number and the title. The number is
+% just the regular \cs{ref} and it is WRONG in unnumbered sections.
+% Beware! The default definition is the unadorned title. You could
+% do, for example, \\
+% \verb?\renewcommand{\theTitleReference}[2]{#1\ \emph{#2}}?.
+%
+% The title of the current section is also available without \cs{label}:
+% Use the command \cs{currenttitle} to generate a \cs{titleref} to the current
+% section. If you have redefined \cs{theTitleReference} to print the number
+% with the title, be aware that the two may not correspond: In a numbered
+% list the number will show the current item but the title will show the
+% current section, but in an unnumbered section the number will show
+% some previous section number.
+%
+% The big problem with the \verb?[usetoc]? method is that \cs{titleref} will
+% not refer to a \cs{label} which was given in the title or caption itself;
+% the label must be placed after the sectioning command or the caption.
+% If you make a title-reference to a label given in a title, you will get
+% a warning message.
+%
+% \changes{v1.4}{2003/11/16}{Added title referencing (from patch v1.4)}
+%
+% \begin{macro}{\ifheadnameref}
+% \begin{macro}{\headnameref}
+% \begin{macro}{\tocnameref}
+% \cs{ifheadnameref}: FALSE use ToC entry, TRUE use header entry
+% \changes{v1.61803}{2008/01/30}{Added \cs{headnameref} and \cs{tocnameref}}
+% \begin{macrocode}
+\newif\ifheadnameref
+\newcommand*{\headnameref}{\headnamereftrue}
+\newcommand*{\tocnameref}{\headnamereffalse}
+ \tocnameref
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\theTitleReference}
+% \cs{theTitleReference}\marg{num}\marg{title} is the style for typesetting
+% a referenced (number and) title.
+% \begin{macrocode}
+\newcommand{\theTitleReference}[2]{#2}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\label}
+% This redefinition of \cs{label} is intended to work with other redirections
+% of \cs{label}, if they record extra information in a similar way.
+% \begin{macrocode}
+\let\@mem@old@label\label
+\def\label#1{\@bsphack\begingroup
+ \protected@edef\@currentlabel{\protect\M@TitleReference
+ {\@currentlabel}{\M@currentTitle}}%
+ \@mem@old@label{#1}%
+ \endgroup \@esphack}%
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mem@@gettitle}
+% \cs{@mem@@gettitle}\marg{title} grabs a title text.
+% \begin{macrocode}
+\def\@mem@@gettitle#1{\begingroup \let\protect\@unexpandable@protect
+ \let\label\@mem@nestwarn
+ \let\index\@gobble \let\glossary\@gobble
+ \let\markboth\@gobbletwo \let\@mkboth\@gobbletwo
+ \let\markright\@gobble
+ \edef\@tempa{\noexpand\def\noexpand\M@currentTitle{#1}}%
+ \expandafter\endgroup\@tempa}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mem@nestwarn}
+% \begin{macro}{\M@TitleReference}
+% \begin{macrocode}
+\let\@mem@nestwarn\@gobble
+\let\M@TitleReference\@firstoftwo
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\titleref}
+% \begin{macro}{\currenttitle}
+% \begin{macro}{\@mem@titleref}
+% \begin{macro}{\@mem@titlerefnolink}
+% \cs{titleref}\marg{key} prints the title corresponding to
+% \verb?\label{key}?. \cs{currenttitle} prints the latest title.
+% \cs{titleref} extended to support a starred version that will not
+% provide hyperlinks when using \Lpack{hyperref}. The
+% \Lpack{hyperref} definition of \cs{@mem@titlerefnolink} is found
+% in \Lpack{memhfixc}.
+% \changes{v1.6180339c}{2009/01/18}{Extended \cs{titleref}, suggestion
+% on ctt by martin@helios.de}
+% \begin{macrocode}
+\newcommand*\@mem@titleref[1]{\begingroup
+ \let\numberline\@gobble
+ \let\M@TitleReference\@mem@theTR % interrupt recursion of \ref
+ \ref{#1}\endgroup}
+\let\@mem@titlerefnolink\@mem@titleref
+
+\DeclareRobustCommand\titleref{\@ifstar{\@mem@titlerefnolink}{\@mem@titleref}}
+
+\DeclareRobustCommand{\currenttitle}{\begingroup
+ \let\numberline\@gobble
+ \theTitleReference\@currentlabel\M@currentTitle\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{verbatim}
+% % \DeclareRobustCommand\@mem@nestwarn[1]{\@memwarn%
+% % {Label \string"#1\string" was put in a title,\MessageBreak
+% % so the \noexpand\titleref is incorrect}}
+% \end{verbatim}
+%
+% \begin{macro}{\M@currentTitle}
+% \begin{macrocode}
+\let\M@currentTitle\@empty
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mem@theTR}
+% proper definition:
+% \begin{macrocode}
+\def\@mem@theTR{\let\M@TitleReference\@firstoftwo \theTitleReference}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\namerefon}
+% \begin{macro}{\namerefoff}
+% Named references has turned some arguments (e.g., \verb?\legend{text}?) into
+% moving ones (Sven.Hartrumpf@FernUni-Hagen.de reported a problem but
+% not a cause, March 2003). Not everyone needs named references.
+% \begin{macrocode}
+\newcommand*{\namerefon}{\let\M@gettitle\@mem@@gettitle}
+\newcommand*{\namerefoff}{\let\M@gettitle\@gobble}
+ \namerefon
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \section{Table of Contents, etc.}
+%
+% A \cs{section} command writes a
+% \verb?\contentsline{section}?\marg{title}\marg{page} command
+% on the \file{.toc} file, where \meta{title} contains the
+% contents of the entry and \meta{page} is the page number. If
+% sections are being numbered, then \meta{title} will be of the
+% form \cs{numberline}\marg{num}\marg{heading} where
+% \meta{num} is the number produced by \cs{thesection}. Other
+% sectioning commands work similarly.
+%
+% A \cs{caption} command in a `figure' environment writes \\
+% \verb?\contentsline{figure}{?\cs{numberline}\marg{num}\marg{caption}\verb?}?\marg{page} \\
+% on the \file{.lof} file, where \meta{num} is the number produced
+% by \cs{thefigure} and \meta{caption} is the figure caption. It
+% works similarly for a `table' environment.
+%
+% The command \cs{contentsline}\marg{name} expands to
+% \cs{l@}\meta{name}. So, to specify the table of contents, we must
+% define \cs{l@chapter}, \cs{l@section}, \cs{l@subsection}, \ldots ; to
+% specify the list of figures, we must define \cs{l@figure}; and so
+% on. Most of these can be defined with the \cs{@dottedtocline}
+% command, which works as follows. \\
+% \cs{@dottedtocline}\marg{level}\marg{indent}\marg{numwidth}\marg{title}\marg{page}
+%
+% \begin{description}
+% \item[\meta{level}] An entry is produced only if\meta{level}
+% $<=$ value of the \Lcount{tocdepth} counter. Note,
+% \cs{chapter} is level 0, \cs{section} is level 1, etc.
+% \item[\meta{indent}] The indentation from the outer left margin
+% of the start of the contents line.
+% \item[\meta{numwidth}] The width of a box in which the section
+% number is to go, if \meta{title} includes a \cs{numberline}
+% command.
+% \end{description}
+%
+% \begin{macro}{\@pnumwidth}
+% \begin{macro}{\@tocrmarg}
+% \begin{macro}{\@dotsep}
+% This command uses the following three parameters, which are set
+% with a \cs{newcommand} (so em's can be used to make them depend upon
+% the font).
+% \begin{description}
+% \item[\texttt{\bslash @pnumwidth}] The width of a box in which the
+% page number is put.
+% \item[\texttt{\bslash @tocrmarg}] The right margin for multiple
+% line entries. One wants \cs{@tocrmarg} $\ge$ \cs{@pnumwidth}
+% \item[\texttt{\bslash @dotsep}] Separation between dots, in mu
+% units. Should be defined as a number like 2 or 1.7
+% \end{description}
+%
+% \begin{macrocode}
+\newcommand{\@pnumwidth}{1.55em}
+\newcommand{\@tocrmarg} {2.55em}
+\newcommand{\@dotsep}{4.5}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tocentryskip}
+% \begin{macro}{\tocbaseline}
+% \begin{macro}{\tocskip}
+% We define two lengths and a utility command.
+% \begin{macrocode}
+\newlength{\tocentryskip} \setlength{\tocentryskip}{1em}
+\newlength{\tocbaseline} \setlength{\tocbaseline}{20pt}
+\newcommand{\tocskip}[1]{%
+ \addtocontents{toc}{\protect\vspace{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{New List of \ldots}
+%
+% It is apparent that users want to do at least two things that are not
+% readily provided by the standard classes: (a) change the appearance
+% of the Table of Contents, etc., headings, and (b) create new List of\ldots.
+% This class provides a means of creating new Lists whose headings are
+% parameterized, thereby killing two birds with one stone.
+%
+% In the standard classes the tables of contents, figures etc. are always
+% set in single-column style. In this class you can choose one- or two-column
+% ToCs, etc.
+% The titles are added to the ToC, unless the starred versions of the
+% commands are used.
+% \changes{v1.6180339f}{2009/03/16}{Enabled two-column ToC, etc}
+%
+% \begin{macro}{\ensureonecol}
+% \begin{macro}{\restorefromonecol}
+% These two
+% macros cooperate to switch from two-columns to one column, and back again.
+% \changes{v1.0a}{2002/01/24}{Deleted \cs{ensuretwocol} and
+% \cs{restorefromtwocol} as they were unused. BUT later reinstated them.}
+% \begin{macro}{\onecoltocetc}
+% \begin{macro}{\twocoltocetc}
+% \begin{macro}{\doccoltocetc}
+% These macros define \cs{ensureonecol} and \cs{restorefromonecol} such that
+% \begin{itemize}
+% \item \cs{onecoltocetc} ToCs, etc., will be set in one column (the default)
+% \item \cs{twocoltocetc} ToCs, etc., will be set in two columns
+% \item \cs{doccoltocetc} ToCs, etc., will be set in column(s) corresponding
+% to the document's (onecolumn/twocolumn) option.
+% \end{itemize}
+% \changes{v1.6180339f}{2009/03/16}{Added \cs{onecoltocetc}, \cs{twocoltocetc}
+% and \cs{doccoltocetc}}
+% \begin{macrocode}
+\newcommand*{\onecoltocetc}{%
+ \def\ensureonecol{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi}%
+ \def\restorefromonecol{\if@restonecol\twocolumn\fi}}
+\newcommand*{\twocoltocetc}{%
+ \def\ensureonecol{%
+ \if@twocolumn
+ \@restonecoltrue
+ \else
+ \@restonecolfalse\twocolumn
+ \fi}%
+ \def\restorefromonecol{\if@restonecol\else\onecolumn\fi}}
+\newcommand*{\doccoltocetc}{%
+ \let\ensureonecol\relax
+ \let\restorefromonecol\relax}
+% \end{macrocode}
+% Set the default
+% \begin{macrocode}
+\onecoltocetc
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\cftparskip}
+% The \cs{parskip} local to the ToC, etc, is set to the length \cs{cftparskip}.
+% \begin{macrocode}
+\newlength{\cftparskip}
+\setlength{\cftparskip}{0pt}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newlistof}
+% \cs{newlistof}\marg{listofcmmd}\marg{ext}\marg{listofname}
+% creates the command \cs{listofcmmd} to typeset a new List of, where the
+% external file has the extension \file{.ext} and the heading title is
+% \meta{listofname}. The code for this is a heavily modified part
+% of the \Lpack{tocloft} package.
+%
+% \begin{macrocode}
+\newcommand{\newlistof}[3]{%
+% \end{macrocode}
+%
+% In the following, \texttt{X} stands for the value of \meta{listofcmmd} and
+% \texttt{Z} stands for the value of \meta{ext}.
+%
+% \begin{macro}{\ext@Z}
+% \begin{macro}{\Zdepth}
+% The file extension and listing depth, which is set to level~1.
+% \begin{macrocode}
+ \@namedef{ext@#2}{#2}
+ \@ifundefined{c@#2depth}{\newcounter{#2depth}}{}
+ \setcounter{#2depth}{1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Zmark}
+% The heading marks for the listing.
+% \changes{v1.1}{2002/03/10}{Changed \cs{@mkboth} to \cs{markboth} in \cs{Zmark}}
+% \begin{macrocode}
+ \@namedef{#2mark}{\markboth{#3}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\X}
+% Typeset the listing title and entries,
+% with both a normal and starred version.
+% \changes{v1.61803398}{2009/08/08}{changed such that it only use one
+% internal macro}
+% \changes{v1.61803398}{2009/08/09}{chose a better name for the
+% internal macro}
+% \begin{macrocode}
+ \@namedef{#1}{\@ifstar{\@nameuse{mem@#1}{01}}{\@nameuse{mem@#1}{00}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@X}
+% \begin{macro}{\cftZbeforelisthook}
+% \begin{macro}{\cftZafterlisthook}
+% \changes{v1.61803398}{2009/08/08}{introduced \cs{mem@X} to replace
+% \cs{@starZ} and \cs{@plainZ}}
+% In earlier version of the class, we used two macros \cs{@starZ}
+% and \cs{@plainZ}, to reduce code we now only use one, the argument
+% of it takes care of differentiating between the stuff that are
+% different. Two hooks is added just before and after importing the
+% list file contents.
+% \changes{v1.61803398d}{2010/02/14}{added the before and after hooks}
+% \begin{macrocode}
+ \@namedef{cft#2beforelisthook}{}%
+ \@namedef{cft#2afterlisthook}{}%
+ \@namedef{mem@#1}##1{%
+ \ensureonecol
+ \par
+ \begingroup
+ \@nameuse{@#2maketitle}
+ \if##1
+ \ifmem@em@starred@listof\else
+ \phantomsection
+ \addcontentsline{toc}{chapter}{#3}
+ \fi
+ \fi
+ \parskip\cftparskip
+ \@nameuse{cft#2beforelisthook}%
+ \@starttoc{#2}%
+ \@nameuse{cft#2afterlisthook}%
+ \endgroup
+ \restorefromonecol}
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@Zmaketitle}
+% This macro typesets the title.
+% \changes{v1.3}{2002/10/10}{Added \cs{printZnonum} to \cs{@Zmaketitle}}
+% \changes{v1.61803}{2008/01/30}{Slight changes to \cs{@Zmaketitle}
+% (mempatch v4.6)}
+% \changes{v3.6j}{2011/03/01}{Made sure \cs{parskip} is zero in the
+% title, otherwise a non-zero \cs{parskip} might cause it to be placed
+% incorrectly}
+% \begin{macrocode}
+ \@namedef{@#2maketitle}{%
+ \@nameuse{#2headstart}
+ {\parindent\z@
+ \parskip\z@
+%%%% \parskip\cftparskip
+ \interlinepenalty\@M
+% \end{macrocode}
+% \changes{v1.3}{2002/11/14}{Added printZnonum to \cs{newlistof}}
+% \begin{macrocode}
+ \@nameuse{print#2nonum}%
+ \@nameuse{print#2title}{#3}%
+ \@nameuse{#2mark}%
+ \thispagestyle{chapter}%
+ \@nameuse{after#2title}
+ }
+ \@afterheading}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Zheadstart}
+% \begin{macro}{\afterZtitle}
+% The macros \cs{Zheadstart} and \cs{afterZtitle}
+% control what goes before and after the title. They
+% default to the corresponding macros for chapters.
+% \begin{macrocode}
+ \@namedef{#2headstart}{\chapterheadstart}
+ \@namedef{after#2title}{\afterchaptertitle}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printZnonum}
+% This typesets something before the title and defaults
+% to \cs{printchapternonum}.
+% \changes{v1.3}{2002/10/10}{Added \cs{printZnonum} macro}
+% \begin{macrocode}
+ \@namedef{print#2nonum}{\printchapternonum}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\printZtitle}
+% The title is typeset by the macro \cs{printZtitle}\marg{title}
+% which defaults to \cs{printchaptertitle}.
+% \begin{macrocode}
+ \@namedef{print#2title}##1{\printchaptertitle{##1}}
+% \end{macrocode}
+% \end{macro}
+%
+% This is the end of the definition of \cs{newlistof}.
+% \begin{macrocode}
+} % end \newlistof
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifmem@em@starred@listof}
+% \begin{macro}{\KeepFromToc}
+% The class handles the created `new lists' a little different than
+% other classes. We automatically add it to the main table of
+% contents. This us usually what one wants. If not, one can always
+% use the starred version. But in some cases other packages will use
+% \cs{tableofcontents} to typeset their own `list of\dots', in which
+% case it becomes a little hard to add a star. Therefore we add a
+% switch that can be used to emulate the starred list of. After the
+% macro \cs{KeepFromToc} the memoir created (non-starred) `list of'
+% will behave as their starred counterpart.
+% \changes{v1.61803398}{2009/08/08}{LM: added \cs{KeepFromToc}}
+% \begin{macrocode}
+\newif\ifmem@em@starred@listof
+\newcommand\KeepFromToc{\mem@em@starred@listoftrue}
+% \end{macrocode}
+% Tip: use \cs{KeepFromToc} as an environment, i.e.
+% \begin{verbatim}
+% \begin{KeepFromToc}
+% \listoffigures
+% \end{KeepFromToc}
+% \end{verbatim}
+% to locally remove a list from the TOC.
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@starttoc}
+% A list of macro calls \cs{@starttoc} to read the appropriate file. I have
+% changed the kernel definition to allow a file to be read multiple times
+% by delaying killing the file until the end of the document.
+% \changes{v1.3}{2002/11/14}{Changed \cs{@starttoc}}
+% \changes{v1.61803398d}{2009/11/23}{Removed infelicity in \cs{@starttoc}}
+% \begin{macrocode}
+\renewcommand{\@starttoc}[1]{%
+ \begingroup\makeatletter
+ \@input{\jobname.#1}%
+ \if@filesw
+ \AtEndDocument{%
+% \end{macrocode}
+% If a ToC, or other ListOf, is called more than once then we have to stop
+% opening yet another, redundant, output file. The check against \cs{relax}
+% seems to meet the requirement.
+% \begin{macrocode}
+ \expandafter\ifx\csname tf@#1\endcsname\relax
+ \expandafter\newwrite\csname tf@#1\endcsname
+ \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
+ \fi
+ }%
+ \fi
+ \@nobreakfalse
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Table of Contents}
+%
+% \begin{macro}{\tableofcontents}
+% \begin{macro}{\tableofcontents*}
+% These macros request that \LaTeX{} produces a table of
+% contents. The ToC heading is added to the ToC unless the starred
+% version is used.
+%
+% \begin{macrocode}
+\newlistof{tableofcontents}{toc}{\contentsname}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% The List of Figures and List of Tables are defined later.
+%
+%
+%
+% \subsection{List entries}
+%
+% Each command in the body of the text that makes an entry in the ToC,
+% or LoF or LoT needs an addtional macro to format the entry, as described
+% above. Users often want to change the formatting of the entries but
+% it is not immediately obvious how to do that.
+%
+% I have borrowed and modified more of the code from the \Lpack{tocloft}
+% package to enable easy creation and modification the formatting of the
+% entries.
+%
+%
+% \begin{macro}{\setpnumwidth}
+% \begin{macro}{\setrmarg}
+% User commands for setting \cs{@pnumwidth} and \cs{@tocrmarg}.
+% \begin{macrocode}
+\newcommand*{\setpnumwidth}[1]{\renewcommand{\@pnumwidth}{#1}}
+\newcommand*{\setrmarg}[1]{\renewcommand{\@tocrmarg}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftdot}
+% \begin{macro}{\cftdotfill}
+% In the default ToC, a dotted line can be used to provide a leader between
+% a title and the page number. The definition of this leader is buried
+% in the \cs{@dottedtocline} command. The \cs{cftdotfill}\marg{sep}
+% command provides a parameterised version of the leader code, where
+% \meta{sep} is the separation between the dots in mu units.
+% The symbol used for the `dots' in the leader is given by the value
+% of \cs{cftdot}.
+% \begin{macrocode}
+\providecommand{\cftdot}{.}
+\providecommand{\cftdotfill}[1]{%
+ \leaders\hbox{$\m@th\mkern #1 mu\hbox{\cftdot}\mkern #1 mu$}\hfill}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftdotsep}
+% \begin{macro}{\cftnodots}
+% \cs{cftdotsep} holds the default dot separation.
+% If the kerns in \cs{cftdotfill} are large enough, then no dots will
+% be printed. \cs{cftnodots} should be `large enough'.
+% \changes{v1.2}{2002/07/07}{Changed \cs{cftnodots} from 10,000 to 2,000 for
+% 17pt option and pdflatex}
+% \begin{macrocode}
+\providecommand{\cftdotsep}{4.5}
+\newcommand{\cftnodots}{2000}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now for the trickier bits regarding the typesetting of the ToC
+% entries.
+%
+% A \file{.toc} (also \file{.lof} and \file{.lot}) file consists
+% of a list of \\
+% \cs{contentsline}\marg{kind}\marg{title}\marg{page} \\
+% commands, where \meta{kind} is the kind of heading (e.g., \texttt{part} or
+% \texttt{section} or \texttt{figure}), \meta{title} is the title text
+% (including the number),
+% and \meta{page} is the page number. The entries are inserted into the
+% file by calling the \\
+% \cs{addcontentsline}\marg{file}\marg{kind}\marg{title} \\
+% command, where \meta{file} is the file extension (e.g., \texttt{toc}, \texttt{lot})
+% and the other arguments are the same as for the \cs{contentsline}
+% command. (Arbitrary stuff may also be put into the file via the
+% \cs{addtocontents}\marg{file}\marg{text} command).
+% The typesetting of the \cs{contentsline} entries is performed by
+% commands of the form \cs{l@kind}. The sectioning and captioning commands
+% call \cs{addcontentsline} to insert their titles into the \file{.toc}
+% etc., files.
+%
+% For the purposes at hand it is generally impossible to treat
+% the typesetting
+% of a title and its number separately, as both are bundled into the
+% \meta{title} argument within \cs{contentsline}. They could be handled
+% separately if the \cs{contentsline} command was suitably modified. If
+% this was done, then the \cs{addtocontentsline} command would also need
+% to be changed which would then require the sectioning and captioning
+% commands to be modified as well. This is certainly possible, but would
+% cause problems if any other package also modified the sectioning or
+% captioning commands, and there are several packages which do this.
+%
+% I provide modified versions of the \cs{l@kind} commands.
+% Essentially, my new definitions
+% consist of inlined versions of the code for \cs{@dottedtocline}.
+%
+%
+% \begin{macro}{\cftparfillskip}
+% The \cs{l@kind} commands modify (locally) the value of \cs{parfillskip}.
+% \cs{cftparfillskip} is a copy of the default \theTeXbook{}
+% \cs{parfillskip} definition.
+% \begin{macrocode}
+\newcommand*{\cftparfillskip}{\parfillskip=0pt plus1fil}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@cftn@me}
+% Lars Madsen suggested that macros like \cs{cftfigurename} be added
+% to entries in the LoF, and so on.
+% \changes{v1.61803}{2008/01/30}{Added \cs{@cftn@me} (Lars Madsen mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\@cftn@me}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@cft@hb@xt@}
+% \begin{macro}{\numberlinebox}
+% \begin{macro}{\partnumberlinebox}
+% \begin{macro}{\chapternumberlinebox}
+% \begin{macro}{\booknumberlinebox}
+% \changes{v3.6k}{2012/07/22}{Added four \cs{Xnumberlinebox} macros}
+% Each of the four \cs{Xnumberline} macros (part, chapter, book and
+% regular) typeset their contents inside a box of a certain width. In
+% order to make this a little more flexible we provide a default box
+% macro. Note that the box left aligned by default. The default
+% \cs{Xnumberlinebox} macros are then let equal to this default.
+% \begin{macrocode}
+\newcommand\mem@cft@hb@xt@[2]{\hb@xt@#1{#2\hfil}}
+\let\numberlinebox\mem@cft@hb@xt@
+\let\partnumberlinebox\mem@cft@hb@xt@
+\let\chapternumberlinebox\mem@cft@hb@xt@
+\let\booknumberlinebox\mem@cft@hb@xt@
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\numberline}
+% \begin{macro}{\numberlinehook}
+% The purpose of the \cs{numberline}\marg{secnum} command is to typeset
+% \meta{secnum} left justified in a box of width \cs{@tempdima}. I redefine
+% it to add three additional parameters, namely \cs{@cftbsnum},
+% \cs{@cftasnum} and \cs{@cftasnumb}
+% (see \file{ltsect.dtx} for the original
+% definition).
+% \changes{v1.61803398d}{2010/02/13}{added \cs{numberlinehook}}
+% We also add a hook, that initially does nothing, but
+% might be redefined to record say withs of \meta{secnum}s. In order
+% to tell the owner of the \cs{numberline}'s apart, check the value of
+% \cs{cftwhatismyname}.
+% \changes{v3.6k}{2012/07/22}{Factored out the box part into a
+% separate macro}
+% \begin{macrocode}
+\newcommand*\numberlinehook[1]{}
+\renewcommand*{\numberline}[1]{%
+ \numberlinehook{#1}%
+ %\hb@xt@\@tempdima{\@cftn@me\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}
+ \numberlinebox\@tempdima{\@cftn@me\@cftbsnum #1\@cftasnum}\@cftasnumb}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@cftbsnum}
+% \begin{macro}{\@cftasnum}
+% \begin{macro}{\@cftasnumb}
+% \begin{macrocode}
+\newcommand{\@cftbsnum}{}
+\newcommand{\@cftasnum}{}
+\newcommand{\@cftasnumb}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\newlistentry}
+% \cs{newlistentry}\oarg{within}\marg{counter}\marg{ext}\marg{level-1}
+% creates a set of commands for typesetting a new kind of entry in a List of.
+% \meta{counter} is the name of the counter for the entry and must be
+% the same as the name
+% of the entry (e.g., \texttt{subsection}). The optional \meta{within} is the
+% name of a counter within which \texttt{counter} is defined. The file extension
+% for the List of is \meta{ext} and \meta{level-1} is one less than the
+% level of the entry in the List of.
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftXname} to \cs{newlistentry}
+% (mempatch v4.5)}
+% \changes{v1.61803398}{2009/07/17}{Added bidi support to \cs{newlistentry}}
+% \begin{macrocode}
+\newcommand{\newlistentry}[4][\@empty]{%
+% \end{macrocode}
+%
+% In the following, \texttt{X} is used as the value of \meta{counter} and
+% \texttt{Z} as the value of \meta{ext}.
+%
+% \begin{macro}{\c@X}
+% \begin{macro}{\theX}
+% Check if \meta{within} and \meta{counter} have been defined. It is
+% an error if \meta{within} has not been defined. \meta{counter}
+% will be created if it has not been previously defined.
+% Set the default counter values.
+% \begin{macrocode}
+ \@ifundefined{c@#2}{% check & set the counter
+ \ifx \@empty#1\relax
+ \newcounter{#2}
+ \else
+ \newcounter{#2}[#1]%
+ \expandafter\edef\csname the#2\endcsname{%
+ \expandafter\noexpand\csname the#1\endcsname.\noexpand\arabic{#2}}
+ \fi}{}
+ \setcounter{#2}{0}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% That finishes off the error checking. No matter what the result, the
+% rest of the new commands are defined.
+%
+% \begin{macro}{\l@X}
+% \cs{l@X}\marg{title}\marg{page} typesets the entry.
+% \begin{macrocode}
+ \@namedef{l@#2}##1##2{%
+% \end{macrocode}
+% Only typeset if the \cs{Zdepth} is greater than \meta{level-1}.
+% \begin{macrocode}
+ \ifnum \@nameuse{c@#3depth} > #4\relax
+% \end{macrocode}
+% Add some vertical space.
+% \begin{macrocode}
+ \vskip \@nameuse{cftbefore#2skip}
+% \end{macrocode}
+% Start a group to keep paragraphing changes local. Set the \cs{leftskip}
+% to the entry's indentation.
+% \begin{macro}{\cftwhatismyname}
+% \changes{v1.61803398d}{2010/02/13}{added \cs{cftwhatismyname}}
+% \cs{cftwhatismyname} locally stores the type of toc entry. Useful
+% for hooks into general macros like \verb?\numberline?.
+% \begin{macrocode}
+ {%\leftskip \@nameuse{cft#2indent}\relax
+ \newcommand*\cftwhatismyname{#2}%
+ \memRTLleftskip \@nameuse{cft#2indent}\relax
+% \end{macrocode}
+% \end{macro}
+% Set the \cs{rightskip} to \cs{@tocrmarg} to leave room for the page number.
+% \begin{macrocode}
+%%% \rightskip \@tocrmarg
+ \memRTLrightskip \@tocrmarg
+% \end{macrocode}
+% Ensure that the last line of an entry will be filled. Setting \cs{parfillskip}
+% to a negative value prevents `overfull box' messages.
+% \begin{macrocode}
+%%% \parfillskip -\rightskip
+ \parfillskip -\memRTLrightskip
+% \end{macrocode}
+% Set the paragraph's indentation to the entry's indentation.
+% \begin{macrocode}
+ \parindent \@nameuse{cft#2indent}\relax\@afterindenttrue
+% \end{macrocode}
+% Try and prevent breaks between lines in a multiline entry.
+% \begin{macrocode}
+ \interlinepenalty\@M
+% \end{macrocode}
+% Make sure we have left vertical mode.
+% \begin{macrocode}
+ \leavevmode
+% \end{macrocode}
+% Our version of \cs{numberline} expects that the width of the number box
+% is in \cs{@tempdima}, and that the three macros \cs{@cftbsnum},
+% \cs{@cftaqsnum}, and \cs{@cftasnumb} are defined. We set all these to
+% the values for this entry.
+% \changes{v3.6k}{2012/07/30}{Added brace pair around
+% \cs{nameuse\{cft#2name\}}, then
+% \cs{cftXfont} can end with say \cs{MakeUppercase}}
+% \begin{macrocode}
+ \settowidth{\@tempdima}{\@nameuse{cft#2font}{\@nameuse{cft#2name}}}%
+ \addtolength{\@tempdima}{\@nameuse{cft#2numwidth}}%
+ \expandafter\let\expandafter\@cftbsnum\csname cft#2presnum\endcsname
+ \expandafter\let\expandafter\@cftasnum\csname cft#2aftersnum\endcsname
+ \expandafter\let\expandafter\@cftasnumb\csname cft#2aftersnumb\endcsname
+ \expandafter\let\expandafter\@cftn@me\csname cft#2name\endcsname
+% \end{macrocode}
+% Arrange that the (entry number and) first line of the title is set at
+% the current indent, and that any subsequent lines will be further
+% indented.
+% \begin{macrocode}
+%%% \advance\leftskip\@tempdima \null\nobreak\hskip -\leftskip
+ \advance\memRTLleftskip\@tempdima \null\nobreak\hskip -\memRTLleftskip
+% \end{macrocode}
+% Print the (number and) title, prohibiting any breaking.
+% \changes{v3.6k}{2012/07/29}{Added brace pair around \#\#1, then
+% \cs{cftXfont} can end with say \cs{MakeUppercase}}
+% \begin{macrocode}
+ {\@nameuse{cft#2font}{##1}}\nobreak
+% \end{macrocode}
+% Print the leader and the page number, and then close the group.
+% \begin{macrocode}
+ \@nameuse{cft#2fillnum}{##2}}
+ \fi
+ }% end of \l@#2
+
+% \end{macrocode}
+% \end{macro}
+%
+% Now define all the layout commands used by \cs{l@X}. The default
+% values of these print the entry in a normal font with a dotted
+% line between the title and the page number.
+% \begin{macro}{\cftbeforeXskip}
+% The skip before the title.
+% \begin{macrocode}
+ \expandafter\newlength\csname cftbefore#2skip\endcsname
+ \setlength{\@nameuse{cftbefore#2skip}}{\z@ \@plus .2\p@}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\cftXindent}
+% \begin{macro}{\cftXnumwidth}
+% The indent and width for the number.
+% \begin{macrocode}
+ \expandafter\newlength\csname cft#2indent\endcsname
+ \expandafter\newlength\csname cft#2numwidth\endcsname
+% \end{macrocode}
+% Set the default values for the indent and numwidth depending on
+% the entry's level. A level of 1 corresponds to a figure entry
+% (no indent, and space for a number like N.N).
+% \begin{macrocode}
+ \ifcase #4\relax % 0 (level 1)
+ \setlength{\@nameuse{cft#2indent}}{0em}
+ \setlength{\@nameuse{cft#2numwidth}}{2.3em}
+ \or % 1 (level 2)
+ \setlength{\@nameuse{cft#2indent}}{2.3em}
+ \setlength{\@nameuse{cft#2numwidth}}{3.2em}
+ \or % 2 (level 3)
+ \setlength{\@nameuse{cft#2indent}}{5.5em}
+ \setlength{\@nameuse{cft#2numwidth}}{4.1em}
+ \or % 3 (level 4)
+ \setlength{\@nameuse{cft#2indent}}{8.5em}
+ \setlength{\@nameuse{cft#2numwidth}}{5.0em}
+ \else % anything else
+ \setlength{\@nameuse{cft#2indent}}{10.5em}
+ \setlength{\@nameuse{cft#2numwidth}}{6.0em}
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\cftXfont}
+% \begin{macro}{\cftXname}
+% \begin{macro}{\cftXpresnum}
+% \begin{macro}{\cftXaftersnum}
+% \begin{macro}{\cftXaftersnumb}
+% \begin{macro}{\cftXdotsep}
+% \begin{macro}{\cftXleader}
+% \begin{macro}{\cftXpagefont}
+% \begin{macro}{\cftXafterpnum}
+% And the remaining commands; the only ones that are not null are for the
+% dotsep, the font and the leader
+% \begin{macrocode}
+ \@namedef{cft#2font}{\normalfont}
+ \@namedef{cft#2name}{}
+ \@namedef{cft#2presnum}{}
+ \@namedef{cft#2aftersnum}{}
+ \@namedef{cft#2aftersnumb}{}
+ \@namedef{cft#2dotsep}{\cftdotsep}
+ \@namedef{cft#2leader}{\normalfont\cftdotfill{\@nameuse{cft#2dotsep}}}
+ \@namedef{cft#2pagefont}{\normalfont}
+ \@namedef{cft#2afterpnum}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\toclevel@X}
+% The hyperref package needs a command \cs{toclevel@X}, holding
+% the \meta{level-1} value.
+% \begin{macrocode}
+ \@namedef{toclevel@#2}{#4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftXformatpnum}
+% \begin{macro}{\cftXformatpnumhook}
+% \begin{macro}{\cftXfillnum}
+% Typeset the leader and page number. We add a hook into the formating
+% of the page number. This might later be used to record the widths of
+% the numbers used. It will be given the page number as its
+% argument. Does nothing by default.
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftXformatpnum} (Dan Leucking
+% mempatch v4.9)}
+% \changes{v1.61803398d}{2010/02/13}{added hook into page number formatter}
+% \begin{macrocode}
+ \@namedef{cft#2formatpnumhook}##1{}
+ \@namedef{cft#2formatpnum}##1{%
+ \@nameuse{cft#2formatpnumhook}{##1}%
+ \hb@xt@\@pnumwidth{\hfil\@nameuse{cft#2pagefont}##1}}
+ \@namedef{cft#2fillnum}##1{%
+ {\@nameuse{cft#2leader}}\nobreak
+%%% \hb@xt@\@pnumwidth{%
+%%% \hfil\@nameuse{cft#2pagefont}##1}
+ \@nameuse{cft#2formatpnum}{##1}%
+ \@nameuse{cft#2afterpnum}\par}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% This ends the definition of \cs{newlistentry}.
+% \begin{macrocode}
+} % end \newlistentry
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\cftsetindents}
+% \cs{cftsetindents}\marg{entry}\marg{indent}\marg{numwidth} sets
+% the \textit{indent} and \textit{numwidth} for entry \meta{entry}.
+% \begin{macrocode}
+\newcommand*{\cftsetindents}[3]{%
+ \setlength{\@nameuse{cft#1indent}}{#2}
+ \setlength{\@nameuse{cft#1numwidth}}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftbookname}
+% If you want a book entry in the ToC like: \\
+% BOOK I Title ... \\
+% then \verb?\renewcommand*{\cftbookname}{BOOK~}? \\
+% \begin{macrocode}
+\newcommand*{\cftbookname}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftbookbreak}
+% \begin{macro}{\l@book}
+% \begin{macro}{\booknumberline}
+% \begin{macro}{\booknumberlinehook}
+% Now for the ToC entry.
+% \changes{v1.61803}{2008/01/30}{Added \cs{l@book} and supports (mempatch v4.4)}
+% \changes{v1.6180339}{2008/07/23}{Deleted \cs{space} from \cs{booknumberline}
+% and \cs{partnumberline}
+% (per Lars Henrik Gam Madsen mempatch v5.1)}
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{l@book}}
+% \changes{v1.61803398d}{2010/02/13}{added hook into the book numberline}
+% \changes{v3.6k}{2012/07/22}{Factored the general box out of \cs{booknumberline}}
+% \begin{macrocode}
+\newcommand*{\cftbookbreak}{\addpenalty{-\@highpenalty}%
+ \addvspace{\cftbeforebookskip}}
+\newcommand*{\l@book}[2]{%
+ \ifnum\c@tocdepth >-3\relax
+ \cftbookbreak
+ \begingroup
+ {%\leftskip \cftbookindent\relax
+ \memRTLleftskip \cftbookindent\relax
+%%% \rightskip \@tocrmarg
+ \memRTLrightskip \@tocrmarg
+%%% \parfillskip -\rightskip
+ \parfillskip -\memRTLrightskip
+ \parindent \cftbookindent\relax\@afterindenttrue
+ \interlinepenalty\@M
+ \leavevmode
+ \settowidth{\@tempdima}{\cftbookfont\cftbookname}%
+ \addtolength{\@tempdima}{\cftbooknumwidth}%
+ \let\@cftbsnum \cftbookpresnum
+ \let\@cftasnum \cftbookaftersnum
+ \let\@cftasnumb \cftbookaftersnumb
+%%% \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+ \advance\memRTLleftskip \@tempdima \null\nobreak\hskip -\memRTLleftskip
+% \end{macrocode}
+% \changes{v3.6k}{2012/07/29}{Added brace pair around \#1, then
+% \cs{cftbookfont} can end with say \cs{MakeUppercase}}
+% \begin{macrocode}
+ {\cftbookfont {#1}}%
+ \cftbookfillnum{#2}}
+ \nobreak
+ \global\@nobreaktrue
+ \everypar{\global\@nobreakfalse\everypar{}}%
+ \endgroup
+ \fi}
+\newcommand*\booknumberlinehook[1]{}
+\newcommand{\booknumberline}[1]{%
+ \booknumberlinehook{#1}%
+ % \hb@xt@\@tempdima{%
+ % \cftbookname\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}%%\space}
+ \booknumberlinebox\@tempdima{%
+ \cftbookname\@cftbsnum #1\@cftasnum}\@cftasnumb}%%\space}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftbeforebookskip}
+% \begin{macro}{\cftbookindent}
+% \begin{macro}{\cftbooknumwidth}
+% \begin{macro}{\cftbookfont}
+% \begin{macro}{\cftbookpresnum}
+% \begin{macro}{\cftbookaftersnum}
+% \begin{macro}{\cftbookaftersnumb}
+% \begin{macro}{\cftbookleader}
+% \begin{macro}{\cftbookdotsep}
+% \begin{macro}{\cftbookpagefont}
+% \begin{macro}{\cftbookafterpnum}
+% \begin{macro}{\cftbookfillnum}
+% \begin{macro}{\cftbookformatpnum}
+% \begin{macro}{\cftbookformatpnumhook}
+% \changes{v1.61803398d}{2010/02/13}{added hook into \cs{cftbookformatpnum}}
+% \begin{macrocode}
+\newlength{\cftbeforebookskip}
+ \setlength{\cftbeforebookskip}{2.25em \@plus\p@}
+\newdimen\cftbookindent
+ \setlength{\cftbookindent}{0em}
+\newdimen\cftbooknumwidth
+ \setlength{\cftbooknumwidth}{1.5em}
+\newcommand*{\cftbookfont}{\large\bfseries}
+\newcommand*{\cftbookpresnum}{}
+\newcommand*{\cftbookaftersnum}{}
+\newcommand*{\cftbookaftersnumb}{}
+\newcommand*{\cftbookleader}{%
+ \large\bfseries\cftdotfill{\cftbookdotsep}}
+\newcommand*{\cftbookdotsep}{\cftnodots}
+\newcommand*{\cftbookpagefont}{\large\bfseries}
+\newcommand{\cftbookafterpnum}{}
+\newcommand{\cftbookfillnum}[1]{%
+ {\cftbookleader}%
+%%%% {\hb@xt@\@pnumwidth{\hss {\cftbookpagefont #1}}}%
+ \cftbookformatpnum{#1}%
+ \cftbookafterpnum\par}
+\newcommand{\cftbookformatpnumhook}[1]{}
+\newcommand{\cftbookformatpnum}[1]{%
+ \cftbookformatpnumhook{#1}%
+ \hb@xt@\@pnumwidth{\hss {\cftbookpagefont #1}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\cftpartname}
+% If you want a part entry in the ToC like: \\
+% PART I Title ... \\
+% then \verb?\renewcommand*{\cftpartname}{PART~}? \\
+% \changes{v1.618}{2005/09/03}{Added \cs{cftpartname}, courtesy Danie Els (mempatch v3.12)}
+% \begin{macrocode}
+\newcommand*{\cftpartname}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftpartbreak}
+% \begin{macro}{\l@part}
+% Can't use \cs{newlistentry} for \cs{l@part} because of the initial penalty
+% and the final \cs{nobreak} code.
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftpartbreak}}
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{l@part}}
+% \begin{macrocode}
+\newcommand*{\cftpartbreak}{\addpenalty{-\@highpenalty}%
+ \addvspace{\cftbeforepartskip}}
+\newcommand*{\l@part}[2]{%
+ \ifnum \c@tocdepth >-2\relax
+ \cftpartbreak
+ \begingroup
+ {%\leftskip \cftpartindent\relax
+ \memRTLleftskip \cftpartindent\relax
+%%% \rightskip \@tocrmarg
+ \memRTLrightskip \@tocrmarg
+%%% \parfillskip -\rightskip
+ \parfillskip -\memRTLrightskip
+ \parindent \cftpartindent\relax\@afterindenttrue
+ \interlinepenalty\@M
+ \leavevmode
+ \settowidth{\@tempdima}{\cftpartfont\cftpartname}%
+ \addtolength{\@tempdima}{\cftpartnumwidth}%
+ \let\@cftbsnum \cftpartpresnum
+ \let\@cftasnum \cftpartaftersnum
+ \let\@cftasnumb \cftpartaftersnumb
+%%% \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+ \advance\memRTLleftskip \@tempdima \null\nobreak\hskip -\memRTLleftskip
+% \end{macrocode}
+% \changes{v3.6k}{2012/07/29}{Added brace pair around \#1, then
+% \cs{cftpartkfont} can end with say \cs{MakeUppercase}}
+% \begin{macrocode}
+ {\cftpartfont {#1}}%
+ \cftpartfillnum{#2}}
+ \nobreak
+ \global\@nobreaktrue
+ \everypar{\global\@nobreakfalse\everypar{}}%
+ \endgroup
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\toclevel@part}
+% Needed if the \Lpack{hyperref} package is used.
+% \changes{v1.61803}{2008/01/30}{Added \cs{toclevel@part} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\toclevel@part}{-1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\partnumberline}
+% \begin{macro}{\partnumberlinehook}
+% \cs{partnumberline} is a special version of \cs{numberline} output by \cs{part}.
+% Its default definition is identical to \cs{numberline}.
+% \changes{v1.3}{2002/11/14}{Added \cs{partnumberline}}
+% \changes{v1.61803}{2008/01/30}{Added a space after the number in
+% \cs{partnumberline} (mempatch v4.4)}
+% \changes{v1.61803398d}{2010/02/13}{added hook into part numberline}
+% \changes{v3.6k}{2012/07/22}{Factored out the box command}
+% \begin{macrocode}
+\newcommand*\partnumberlinehook[1]{}
+\newcommand{\partnumberline}[1]{%
+ \partnumberlinehook{#1}%
+ % \hb@xt@\@tempdima{%
+ % \cftpartname\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}%%\space}
+ \partnumberlinebox\@tempdima{%
+ \cftpartname\@cftbsnum #1\@cftasnum}\@cftasnumb}%%\space}
+
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftbeforepartskip}
+% \begin{macro}{\cftpartnumwidth}
+% \begin{macro}{\cftpartfont}
+% \begin{macro}{\cftpartpresnum}
+% \begin{macro}{\cftpartaftersnum}
+% \begin{macro}{\cftpartaftersnumb}
+% \begin{macro}{\cftpartleader}
+% \begin{macro}{\cftpartdotsep}
+% \begin{macro}{\cftpartpagefont}
+% \begin{macro}{\cftpartafterpnum}
+% \begin{macro}{\cftpartindent}
+% \begin{macro}{\cftpartformatpnum}
+% \begin{macro}{\cftpartformatpnumhook}
+% \begin{macro}{\cftpartfillnum}
+% These are the user commands to control the typesetting of Part entries.
+% They are initialised to give the standard appearance.
+% \changes{v1.3}{2002/10/10}{Changed \cs{cftpartnumwidth} to cater for
+% use of \cs{numberline} in the ToC}
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftpartformatpnum} (mempatch v4.9)}
+% \changes{v1.61803398d}{2010/02/13}{added hook into \cs{cftpartformatpnum}}
+% \begin{macrocode}
+ \newlength{\cftbeforepartskip}
+ \setlength{\cftbeforepartskip}{2.25em \@plus\p@}
+ \newlength{\cftpartindent}
+ \setlength{\cftpartindent}{0em}
+ \newlength{\cftpartnumwidth}
+ \setlength{\cftpartnumwidth}{1.5em}
+ \newcommand{\cftpartfont}{\large\bfseries}
+ \newcommand{\cftpartpresnum}{}
+ \newcommand{\cftpartaftersnum}{}
+ \newcommand{\cftpartaftersnumb}{}
+ \newcommand{\cftpartleader}{%
+ \large\bfseries\cftdotfill{\cftpartdotsep}}
+ \newcommand{\cftpartdotsep}{\cftnodots}
+ \newcommand{\cftpartpagefont}{\large\bfseries}
+ \newcommand{\cftpartafterpnum}{}
+ \newcommand{\cftpartformatpnumhook}[1]{}
+ \newcommand*{\cftpartformatpnum}[1]{%
+ \cftpartformatpnumhook{#1}%
+ \hb@xt@\@pnumwidth{\hss {\cftpartpagefont #1}}}
+ \newcommand{\cftpartfillnum}[1]{%
+ {\cftpartleader}%
+ {\cftpartformatpnum{#1}}%
+ \cftpartafterpnum\par}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\cftchaptername}
+% If you want a chapter entry in the ToC like: \\
+% Chapter 1. A title ... \\
+% then \verb?\renewcommand*{\cftchaptername}{\chaptername~}? \\
+% \verb?\renewcommand*{\cftchapteraftersnum}{.}? \\
+%
+% \changes{v1.618}{2005/09/03}{Added \cs{cftchaptername}, courtesy Danie Els (mempatch v3.12)}
+% \begin{macrocode}
+\newcommand*{\cftchaptername}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@chapapp}
+% Generic chapter/appendix ToC entry typesetting.
+% \changes{v1.618}{2005/09/03}{Added \cs{l@chapapp}, courtesy Danie Els (mempatch v3.12)}
+% \changes{v1.61803398}{2009/07/18}{ADded bidi support to \cs{l@chapapp}}
+% \begin{macrocode}
+\newcommand*{\l@chapapp}[3]{%
+ \ifnum \c@tocdepth >\m@ne
+ \cftchapterbreak
+ \vskip \cftbeforechapterskip
+ {%\leftskip \cftchapterindent\relax
+ \memRTLleftskip \cftchapterindent\relax
+%%% \rightskip \@tocrmarg
+ \memRTLrightskip \@tocrmarg
+%%% \parfillskip -\rightskip
+ \parfillskip -\memRTLrightskip
+ \parindent \cftchapterindent\relax
+ \@afterindenttrue
+ \interlinepenalty\@M
+ \leavevmode
+ \let\@cftbsnum \cftchapterpresnum
+ \let\@cftasnum \cftchapteraftersnum
+ \let\@cftasnumb \cftchapteraftersnumb
+ \def\@chapapp@head{#3}%
+ \settowidth{\@tempdima}{\cftchapterfont\@chapapp@head}%
+ \addtolength{\@tempdima}{\cftchapternumwidth}%
+%%% \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+ \advance\memRTLleftskip \@tempdima \null\nobreak\hskip -\memRTLleftskip
+% \end{macrocode}
+% \changes{v3.6k}{2012/07/29}{Added brace pair around \#1, then
+% \cs{cftchapterfont} can end with say \cs{MakeUppercase}}
+% \begin{macrocode}
+ {\cftchapterfont {#1}}\nobreak
+ \cftchapterfillnum{#2}}
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@chapter}
+% \cs{l@chapter}\marg{title}\marg{page} typesets the ToC entry for
+% a \texttt{chapter} heading. It is a parameterised copy of the default
+% \cs{l@chapter}
+% (see \file{classes.dtx} for the original definition). Can't use
+% \cs{newlistentry} for this because of the intial penalty.
+% \changes{v1.3}{2002/11/14}{Added \cs{cftchapterbreak} to \cs{l@chapter}}
+% \changes{v1.618}{2005/09/03}{Defined \cs{l@chapter} in terms of \cs{l@chapapp} (mempatch v3.12)}
+% \begin{macrocode}
+\newcommand*{\l@chapter}[2]{%
+ \l@chapapp{#1}{#2}{\cftchaptername}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\toclevel@chapter}
+% Needed if the \Lpack{hyperref} package is used.
+% \changes{v1.61803}{2008/01/30}{Added \cs{toclevel@chapter} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\toclevel@chapter}{0}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftappendixname}
+% If you want a appendixed chapter entry in the ToC like: \\
+% Appendix A A title ... \\
+% then \verb?\renewcommand*{\cftappendixname}{\appendixname~}? \\
+%
+% \changes{v1.618}{2005/09/03}{Added \cs{cftappendixname}, courtesy Danie Els (mempatch v3.12)}
+% \begin{macrocode}
+\newcommand*{\cftappendixname}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@appendix}
+% \begin{macro}{\toclevel@appendix}
+% Similar to \cs{l@chapter} but for an appendix.
+% \changes{v1.618}{2005/09/03}{Added \cs{l@apendix} (mempatch v3.12)}
+% \begin{macrocode}
+\newcommand*{\l@appendix}[2]{%
+ \l@chapapp{#1}{#2}{\cftappendixname}}
+\newcommand{\toclevel@appendix}{0}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\chapternumberline}
+% \begin{macro}{\chapternumberlinehook}
+% \cs{chapternumberline} is a special version of \cs{numberline} output by
+% \cs{chapter}.
+% It's default definition is identical to \cs{numberline}.
+% \changes{v1.3}{2002/11/14}{Added \cs{chapternumberline}}
+% \changes{v1.618}{2005/09/03}{Added \cs{@chapapp@head} to \cs{chapternumberline} (mempatch v3.12)}
+% \changes{v1.61803398d}{2010/02/13}{added hook into chapter numberline}
+% changes{v3.6k}{2012/07/22}{Factored out the box command}
+% \begin{macrocode}
+\newcommand*\chapternumberlinehook[1]{}
+\newcommand{\chapternumberline}[1]{%
+ \chapternumberlinehook{#1}%
+ % \hb@xt@\@tempdima{\@chapapp@head\@cftbsnum #1\@cftasnum\hfil}%
+ % \@cftasnumb}
+ \chapternumberlinebox\@tempdima{\@chapapp@head\@cftbsnum #1\@cftasnum}%
+ \@cftasnumb}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftbeforechapterskip}
+% \begin{macro}{\cftchapterindent}
+% \begin{macro}{\cftchapternumwidth}
+% \begin{macro}{\cftchapterfont}
+% \begin{macro}{\cftchapterpresnum}
+% \begin{macro}{\cftchapteraftersnum}
+% \begin{macro}{\cftchapteraftersnumb}
+% \begin{macro}{\cftchapterleader}
+% \begin{macro}{\cftchapterdotsep}
+% \begin{macro}{\cftchapterpagefont}
+% \begin{macro}{\cftchapterafterpnum}
+% \begin{macro}{\cftchapterformatpnum}
+% \begin{macro}{\cftchapterformatpnumhook}
+% \begin{macro}{\cftchapterfillnum}
+% These are the user commands to control the typesetting of Chapter entries.
+% They are initialised to give the standard appearance.
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftchapterformatpnum} (mempatch v4.9)}
+% \changes{v1.61803398d}{2010/02/13}{added hook into \cs{cftchapterformatpnum}}
+% \begin{macrocode}
+ \newlength{\cftbeforechapterskip}
+ \setlength{\cftbeforechapterskip}{1.0em \@plus\p@}
+ \newlength{\cftchapterindent}
+ \setlength{\cftchapterindent}{0em}
+ \newlength{\cftchapternumwidth}
+ \setlength{\cftchapternumwidth}{1.5em}
+ \newcommand{\cftchapterfont}{\bfseries}
+ \newcommand{\cftchapterpresnum}{}
+ \newcommand{\cftchapteraftersnum}{}
+ \newcommand{\cftchapteraftersnumb}{}
+ \newcommand{\cftchapterleader}{%
+ \bfseries\cftdotfill{\cftchapterdotsep}}
+ \newcommand{\cftchapterdotsep}{\cftnodots}
+ \newcommand{\cftchapterpagefont}{\bfseries}
+ \newcommand{\cftchapterafterpnum}{}
+ \newcommand{\cftchapterformatpnumhook}[1]{}
+ \newcommand*{\cftchapterformatpnum}[1]{%
+ \cftchapterformatpnumhook{#1}%
+ \hb@xt@\@pnumwidth{\hfil\cftchapterpagefont #1}}
+ \newcommand*{\cftchapterfillnum}[1]{%
+ {\cftchapterleader}\nobreak
+ \cftchapterformatpnum{#1}%
+ \cftchapterafterpnum\par}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cftchapterbreak}
+% Another parameter for \cs{l@chapter}.
+% \changes{v1.3}{2002/11/14}{Added \cs{cftchapterbreak}}
+% \begin{macrocode}
+ \newcommand{\cftchapterbreak}{\addpenalty{-\@highpenalty}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@section}
+% \begin{macro}{\l@subsection}
+% \begin{macro}{\l@subsubsection}
+% \begin{macro}{\l@paragraph}
+% \begin{macro}{\l@subparagraph}
+% \cs{l@section}\marg{title}\marg{page} typesets the ToC entry for
+% a \cs{section} heading. Similarly \cs{l@subsection} and \cs{l@subsubsection}
+% for \cs{subsection} and \cs{subsubsection} entries, and so on.
+% \changes{v1.4}{2003/11/22}{Used \cs{newlistentry} for pararaph and
+% subparagraph (from patch v1.7)}
+% \changes{v1.618}{2005/09/02}{Corrected (sub)paragraph ToC indents (mempatch v2.3)}
+% \begin{macrocode}
+\newlistentry[chapter]{section}{toc}{0}
+ \cftsetindents{section}{1.5em}{2.3em}
+\newlistentry[section]{subsection}{toc}{1}
+ \cftsetindents{subsection}{3.8em}{3.2em}
+\newlistentry[subsection]{subsubsection}{toc}{2}
+ \cftsetindents{subsubsection}{7.0em}{4.1em}
+\newlistentry[subsubsection]{paragraph}{toc}{3}
+ \cftsetindents{paragraph}{10.0em}{5.0em}
+\newlistentry[paragraph]{subparagraph}{toc}{4}
+ \cftsetindents{subparagraph}{12.0em}{6.0em}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% The typesetting for Figures and Tables is defined later.
+%
+%
+%
+% \subsection{Support for the \Lpack{subfigure} package}
+%
+% The code for supporting the \Lpack{subfigure} package is, in all
+% essentials, the same as that for the figure and table captions; only the
+% names are changed. However, the code need only be executed if the
+% \Lpack{subfigure} package is actually loaded.
+%
+% \begin{macro}{\@cftl@subfigtab}
+% This command redefines the \cs{l@subfigure} and \cs{l@subtable} commands.
+% \changes{v1.61803}{2008/01/30}{Made \cs{@cftl@subfigtab} a no-op (mempatch v4.6)}
+% \begin{macrocode}
+\newcommand*{\@cftl@subfigtab}{
+% \end{macrocode}
+% \begin{macro}{\l@subfigure}
+% \begin{macro}{\l@subtable}
+% \cs{l@subfigure}\marg{title}\marg{page} typesets the LoF entry for
+% a subfigure caption heading, and \cs{l@subtable} does the same for subtables.
+% \begin{macrocode}
+\newlistentry[figure]{subfigure}{lof}{1}
+ \cftsetindents{subfigure}{2.3em}{2.5em}
+\newlistentry[table]{subtable}{lot}{1}
+ \cftsetindents{subtable}{2.3em}{2.5em}}
+\renewcommand*{\@cftl@subfigtab}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% Call the \Lpack{subfigure} package setup code only if the
+% \Lopt{subfigure} package has been used.
+% \begin{macrocode}
+\AtBeginDocument{\@ifpackageloaded{subfigure}{\@cftl@subfigtab}{}}
+
+% \end{macrocode}
+%
+%
+% \subsection{Switching page numbering}
+%
+% It can, at times, be useful to be able to have ToC entries that have
+% no printed page numbers.
+%
+% \begin{macro}{\cftpagenumbersoff}
+% The user level command for switching off page numbers is
+% \cs{cftpagenumbersoff}\marg{entry} where \meta{entry} is the
+% name of the entry.
+% The macro redefines the \cs{cftXfillnum} command so that there is no leader
+% and the page number is ignored.
+% \begin{macrocode}
+\DeclareRobustCommand{\cftpagenumbersoff}[1]{%
+ \@namedef{cft#1fillnum}##1{%
+ \cftparfillskip\@nameuse{cft#1afterpnum}\par}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftpagenumberson}
+% \cs{cftpagenumberson}\marg{entry} is the user level command for
+% reversing the corresponding \cs{cftpagenumbersoff}.
+% The macro defines the \cs{cftXfillnum} command to correspond to
+% the default definition.
+% \changes{v1.61803}{2008/01/30}{Modified \cs{cftpagenumberson} to use \cs{cftXformatpnum}
+% (mempatch v4.9)}
+% \begin{macrocode}
+\DeclareRobustCommand{\cftpagenumberson}[1]{%
+ \@namedef{cft#1fillnum}##1{%
+ \@nameuse{cft#1leader}\nobreak
+ \@nameuse{cft#1formatpnum}{##1}%
+ \@nameuse{cft#1afterpnum}\par}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Chapter precis}
+%
+% \begin{macro}{\chapterprecis}
+% The command \cs{chapterprecis}\marg{text} typesets
+% \meta{text} at the point where it is called, and also adds \meta{text}
+% to the \file{.toc} file. It is expects to be called immediately after
+% a \cs{chapter} command.
+% \begin{macrocode}
+\newcommand{\chapterprecis}[1]{%
+ \chapterprecishere{#1}
+ \chapterprecistoc{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chapterprecishere}
+% \cs{chapterprecishere}\marg{text} typesets \meta{text}. It expects
+% to be called immediately after a \cs{chapter} command.
+% \changes{v1.3}{2002/11/14}{Parameterised \cs{chapterprecishere}}
+% \begin{macrocode}
+\newcommand{\chapterprecishere}[1]{%
+ \prechapterprecis #1\postchapterprecis}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prechapterprecis}
+% \begin{macro}{\prechapterprecisshift}
+% \begin{macro}{\precisfont}
+% \begin{macro}{\postchapterprecis}
+% The \cs{pre...} and \cs{post...} macros put code before and after
+% \cs{chapterprecishere} text. By
+% default \cs{prechapterprecis} adds some (negative) space (defined by
+% \cs{prechapterprecisshift} whose value depends on whether or not the
+% \Lopt{article} option is used, as discovered by Lars Madsen) and starts a
+% quote environment using the \cs{precisfont}. \cs{postchapterprecis} ends
+% the quote environment.
+% \changes{v1.3}{2002/11/14}{Added \cs{prechapterprecis} and
+% \cs{postchapterprecis}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{prechapterprecisshift} and
+% \cs{precisfont} (mempatch v4.9)}
+% \begin{macrocode}
+\newdimen\prechapterprecisshift
+\ifartopt
+ \prechapterprecisshift=0pt
+\else
+ \prechapterprecisshift=-2\baselineskip
+\fi
+\newcommand*{\precisfont}{\normalfont\itshape}
+\newcommand{\prechapterprecis}{%
+ \vspace*{\prechapterprecisshift}%
+ \begin{quote}\precisfont}
+% \end{macrocode}
+% \changes{v3.6k}{2013/04/24}{We are missing the after heading
+% stuff. Otherwise text will indent after \cs{chapterprecis}}
+% \begin{macrocode}
+\newcommand*{\postchapterprecis}{%
+ \end{quote}%
+ \par\m@mindentafterchapter%
+ \@afterheading}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\precistocfont}
+% Font for typesetting chapter precis in the ToC.
+% \changes{v1.3}{2002/11/14}{Added \cs{precistocfont}}
+% \begin{macrocode}
+\newcommand{\precistocfont}{\normalfont\itshape}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\precistocformat}
+% Macro for adding extra formatting to the precis toc text, formatting
+% that has nothiing to do with font. The default is \cs{noindent}.
+% \changes{v3.6d}{2010/06/09}{Added \cs{precistocformat}}
+% \begin{macrocode}
+\newcommand{\precistocformat}{\noindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chapterprecistoc}
+% \begin{macro}{\precistoctext}
+% \cs{chapterprecistoc}\marg{text} effectively adds \meta{text} to
+% the \file{.toc}
+% file. The \meta{text} will be typeset within the same margins as the
+% the title text of a \cs{chapter} heading, using the \cs{precistocfont} font.
+% \changes{v1.3}{2002/11/14}{Added \cs{precistoctext}}
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{precistoctext}}
+% \begin{macrocode}
+\newcommand{\chapterprecistoc}[1]{%
+ \addtocontents{toc}{\precistoctext{#1}}}
+\DeclareRobustCommand{\precistoctext}[1]{%
+% \end{macrocode}
+% Start a group to localize changes to the paragraphing. Set the
+% left margin to the chapter indent plus the chapter number width.
+% \changes{v1.6180339c}{2009/01/20}{Added a \cs{nopagebreak}, though
+% this only disencourage a page break}
+% \begin{macrocode}
+ {%\nopagebreak\leftskip \cftchapterindent\relax
+ \nopagebreak\memRTLleftskip \cftchapterindent\relax
+%%% \advance\leftskip \cftchapternumwidth\relax
+ \advance\memRTLleftskip \cftchapternumwidth\relax
+% \end{macrocode}
+% Set the right hand margin to \cs{@tocrmarg}.
+% \begin{macrocode}
+%%% \rightskip \@tocrmarg\relax
+ \memRTLrightskip \@tocrmarg\relax
+% \end{macrocode}
+% Typeset \meta{text} using an italic font, then ensure that the paragraph
+% is finished (to use the local skips). Finally close the group and we
+% are done.
+% \changes{v3.6d}{2010/06/09}{Added \cs{precistocformat}}
+% \begin{macrocode}
+ \precistocformat\precistocfont #1\par}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Adding things to the ToC}
+%
+% \begin{macro}{\cftlocalchange}
+% \cs{cftmakelocalchange}\marg{file}\marg{pnumwidth}\marg{tocrmarg}
+% makes an entry into \meta{file} to change the \cs{@pnumwidth} and
+% the \cs{@tocrmarg} values.
+% \begin{macrocode}
+\newcommand{\cftlocalchange}[3]{%
+ \addtocontents{#1}{\protect\setpnumwidth{#2} \protect\setrmarg{#3}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftaddtitleline}
+% \cs{cftaddtitleline}\marg{file}\marg{kind}\marg{title}\marg{page}
+% adds a \cs{contentsline} entry to \meta{file} with the given information.
+% \begin{macrocode}
+\newcommand{\cftaddtitleline}[4]{%
+ \addtocontents{#1}{\protect\contentsline{#2}{#3}{#4}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cftaddnumtitleline}
+% \cs{cftaddnumtitleline}\marg{file}\marg{kind}\marg{num}\marg{title}\marg{page}
+% adds a \cs{contentsline} entry to \meta{file} with the given information.
+% \begin{macrocode}
+\newcommand{\cftaddnumtitleline}[5]{%
+ \addtocontents{#1}%
+ {\protect\contentsline{#2}{\protect\numberline{#3}%
+ {\protect\ignorespaces #4}}{#5}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\cftinsertcode}
+% \begin{macro}{\cftinserthook}
+% \begin{macro}{\cftinsert}
+% This is a generalisation of a suggestion by Lars Madsen (private email,
+% 2007/12/14).
+%
+% \cs{cftinsertcode}\marg{id}\marg{code} creates a hook to be executed in
+% a `List of'. Since we use \cs{@nameuse} it does not matter if the hook
+% does not exist
+%
+% \cs{cftinserthook}\marg{list}\marg{id} inserts the hook \meta{id} into the
+% \meta{list} `List of' file (in the form of \cs{cftinsert}\marg{id}).
+%
+% Use like this:
+% \begin{verbatim}
+% \cftinsertcode{A}{%
+% \renewcommand*{\cftchapterfont}{\normalfont\scshape}
+% ...
+% }
+% \cftinsertcode{F}{...}
+% \cftinsertcode{G}{...}
+% ...
+% \frontmatter
+% \tableofcontents
+% \cftinserthook{lof}{G}
+% \listoffigures
+% \chapter{...}
+% ...
+% \mainmatter
+% \cftinserthook{lof}{F}
+% \cftinserthook{toc}{A}
+% \chapter{...}
+% ...
+% \end{verbatim}
+%
+% \changes{v1.61803}{2008/01/30}{Added \cs{cftinsert} and friends (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\cftinsert}[1]{\@nameuse{cftinsert#1}}
+\newcommand{\cftinsertcode}[2]{\@namedef{cftinsert#1}{#2}}
+\newcommand*{\cftinserthook}[2]{%
+ \addtocontents{#1}{\protect\cftinsert\protect{#2\protect}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{ToC and divisional numbering}
+%
+% Commands are provided, based on the \Lpack{tocvsec2} package, for changing
+% the section numbering level and the ToC entry level.
+%
+% \begin{macro}{\@setclcnt}
+% Helper macro to set a sectioning-related counter. Use as
+% \cs{@setclcnt}\marg{sec}\marg{counter} to set \Lcount{counter}
+% to the level of \meta{sec}.
+% \changes{v1.61803}{2008/01/30}{Added book to \cs{@setclcnt} and friends
+% (mempatch v4.4)}
+% \changes{v1.61803398}{2009/07/29}{PW: Replaced \cs{if@tempswa} with
+% \cs{@setclcntok} in \cs{@setclcnt} to avoid bad clashes with other uses}
+% \begin{macrocode}
+\newcommand*{\@setclcnt}[2]{%
+ \def\@setclcntok{0}% = false
+ \nametest{#1}{none}%
+ \ifsamename
+ \setcounter{#2}{-10}%
+ \def\@setclcntok{1}% = true
+ \fi
+ \nametest{#1}{book}%
+ \ifsamename
+ \setcounter{#2}{-2}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{part}%
+ \ifsamename
+ \setcounter{#2}{-1}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{chapter}%
+ \ifsamename
+ \setcounter{#2}{0}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{section}%
+ \ifsamename
+ \setcounter{#2}{1}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{subsection}%
+ \ifsamename
+ \setcounter{#2}{2}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{subsubsection}%
+ \ifsamename
+ \setcounter{#2}{3}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{paragraph}%
+ \ifsamename
+ \setcounter{#2}{4}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{subparagraph}%
+ \ifsamename
+ \setcounter{#2}{5}%
+ \def\@setclcntok{1}%
+ \fi
+ \nametest{#1}{all}%
+ \ifsamename
+ \setcounter{#2}{50}%
+ \def\@setclcntok{1}%
+ \fi
+%% \if@tempswa\else
+ \ifnum \@setclcntok = 0\relax
+ \@memerror{%
+ Unknown document division name (#1)
+ }{%
+ I'll ignore it.
+ Type \space <return> and I'll continue.\MessageBreak
+ If you haven't mistyped the name then use
+ \protect\setcounter\space instead.}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\settocdepth}
+% \cs{settocdepth}\marg{sec} is the user command for setting
+% \Lcount{tocdepth} in the \file{.toc} file to the value corresponding to
+% \meta{sec}.
+% \changes{v1.3}{2002/11/14}{Changed \cs{settocdepth} to use \cs{changetocdepth}}
+% \changes{v1.61803}{2008/01/30}{Added book to ToC depth setting (mempatch v4.4)}.
+% \changes{v1.61803398}{2009/07/29}{PW: Replaced \cs{if@tempswa} with
+% \cs{@chtocdok} in \cs{settocdepth} to avoid bad clashes with other uses}
+% \begin{macrocode}
+\newcommand*{\settocdepth}[1]{%
+ \def\@chtodok{0}% false
+ \nametest{#1}{none}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{-10}}%
+ \def\@chtodok{1}% true
+ \fi
+ \nametest{#1}{book}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{-2}}%
+ \def\@chtodok{1}%
+ \fi
+ \nametest{#1}{part}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{-1}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{chapter}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{0}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{section}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{1}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{subsection}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{2}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{subsubsection}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{3}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{paragraph}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{4}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{subparagraph}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{5}}%
+ \def\@chtocdok{1}%
+ \fi
+ \nametest{#1}{all}%
+ \ifsamename
+ \addtocontents{toc}{\changetocdepth{50}}%
+ \def\@chtocdok{1}%
+ \fi
+% \if@tempswa
+ \ifnum\@chtocdok=1\relax
+% \end{macrocode}
+% The next bit is from Heiko Oberdiek (CTT {\itshape Re: Memoir, \verb?\settocdepth?
+% and pdflatex \verb?=>? problem with PDF bookmarks}, 2006/07/21) as
+% \Lpack{hyperref} needs \verb?\tocdepth? set in the body not just in the ToC.
+% \begin{macrocode}
+ \@ifundefined{toclevel@#1}{%
+ \@memwarn{Unknown toclevel for #1}%
+ }{%
+ \setcounter{tocdepth}{\@nameuse{toclevel@#1}}%
+ }
+ \else
+ \@memerror{%
+ Unknown document division name (#1)
+ }{%
+ I'll ignore it.
+ Type \space <return> and I'll continue.}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\toclevel@none}
+% \begin{macro}{\toclevel@all}
+% Couple of extras for hypperef to cater for \texttt{all} and \texttt{none}
+% as `division levels'.
+% \changes{v1.61803}{2008/01/30}{Added \cs{toclevel@none} and \cs{toclevel@all}
+% (mempatch v4.4)}
+% \begin{macrocode}
+\newcommand*{\toclevel@none}{-10}
+\newcommand*{\toclevel@all}{50}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\changetocdepth}
+% Changes the \texttt{tocdepth} counter. Make it robust as it will be written
+% to the *.toc file.
+% \changes{v1.3}{2002/11/14}{Added \cs{changetocdepth}}
+% \begin{macrocode}
+\DeclareRobustCommand{\changetocdepth}[1]{\setcounter{tocdepth}{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maxtocdepth}
+% \cs{maxtocdepth}\marg{sec} can be used to initialise \Lcount{tocdepth}
+% to the value corresponding to \meta{sec}. This can only be used
+% between the end of the preamble and the \cs{tableofcontents} command.
+% \begin{macrocode}
+\newcommand{\maxtocdepth}[1]{%
+ \@setclcnt{#1}{tocdepth}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maxsecnumdepth}
+% \cs{maxsecnumdepth}\marg{sec} can be used to initialise
+% \Lcount{secnumdepth}
+% to the value corresponding to \meta{sec}.
+% \changes{v1.1}{2002/03/10}{Added maxsecnumdepth counter and modified \cs{maxsecnumdepth}}
+% \begin{macrocode}
+\newcounter{maxsecnumdepth}
+\newcommand{\maxsecnumdepth}[1]{%
+ \@setclcnt{#1}{secnumdepth}\@setclcnt{#1}{maxsecnumdepth}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsecnumdepth}
+% \cs{setsecnumdepth}\marg{sec} is the user command for setting
+% \Lcount{secnumdepth} to the value for \meta{sec}. In the preamble it sets
+% both the \Lcount{secnumdepth} and \Lcount{maxsecnumdepth} to \meta{sec}
+% while in the body it only sets \Lcount{secnumdepth}.
+% \changes{v1.61803}{2008/01/30}{Extended \cs{setsecnumdepth} to make it more
+% intuitive (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\setsecnumdepth}[1]{%
+ \ifx\@nodocument\relax% after the preamble
+ \@setclcnt{#1}{secnumdepth}%
+ \else
+ \@setclcnt{#1}{secnumdepth}%
+ \@setclcnt{#1}{maxsecnumdepth}%
+ \fi}
+\setsecnumdepth{section}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{Bibliography}
+%
+%
+% \begin{macro}{\bibindent}
+% The \Lopt{open} bibliography uses an indentation of \cs{bibindent}.
+% \begin{macrocode}
+\newdimen\bibindent
+ \setlength\bibindent{1.5em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibitemsep}
+% The vertical separation between items in the bibliography list.
+% \changes{v1.4}{2003/11/22}{Added \cs{bibitemsep} (from patch v1.7)}
+% \begin{macrocode}
+\newlength{\bibitemsep}
+ \setlength{\bibitemsep}{\itemsep}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\biblistextra}
+% A hook into the \texttt{bibitemlist}.
+% \changes{v1.4}{2003/11/22}{Added \cs{biblistextra} (from patch v1.7)}
+% \begin{macrocode}
+\newcommand{\biblistextra}{\itemsep=\bibitemsep}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{bibitemlist}
+% The \texttt{thebibliography} environment starts a new document division.
+% Internally it tweaks some typesetting aspects; principally it
+% uses \cs{sloppy} because good linebreaking is hard in a bibliography,
+% and \verb?\sfcode`\.=1000\relax? causes a full stop not to produce an
+% end-of-sentence space. The implementation of the environment is
+% based on the generic \texttt{list} environment, and uses the \cs{c@enumiv}
+% count for the labels. The following code is extracted from the
+% \Lpack{book} class, plus some additions.
+% \changes{v1.4}{2003/11/22}{Added \cs{biblistextra} to bibitemlist (from patch v1.7)}
+% \begin{macrocode}
+\newenvironment{bibitemlist}[1]{%
+ \typeout{bibitemlist}
+ \list{\@biblabel{\@arabic\c@enumiv}}%
+ {\settowidth\labelwidth{\@biblabel{#1}}%
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \@openbib@code
+ \usecounter{enumiv}%
+ \let\p@enumiv\@empty
+ \renewcommand\theenumiv{\@arabic\c@enumiv}%
+ \biblistextra}%
+ \sloppy
+ \clubpenalty4000
+ \@clubpenalty \clubpenalty
+ \widowpenalty4000%
+ \sfcode`\.\@m}%
+ {\def\@noitemerr
+ {\@latex@warning{Empty `thebibliography' environment}}%
+ \endlist}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\newblock}
+% The default is for \cs{newblock} to provide a small space.
+% \begin{macrocode}
+\newcommand{\newblock}{\hskip .11em\@plus.33em\@minus.07em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@openbib@code}
+% This a an empty hook. It will be modified if the \Lopt{openbib}
+% option is used.
+% \begin{macrocode}
+\let\@openbib@code\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setbiblabel}
+% \begin{macro}{\@biblabel}
+% This is the user command for setting the label for a \cs{bibitem}.
+% The following sets the default definition.
+% \begin{macrocode}
+\newcommand*{\setbiblabel}[1]{%
+ \renewcommand*{\@biblabel}[1]{#1}}
+\setbiblabel{[#1]\hfill}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@memb@bchap}
+% \begin{macro}{\@memb@bsec}
+% In a \ctt{} thread \textit{memoir, natbib, and chapterbib} in January 2003
+% there was a discussion on how to get all three to work together.
+% Donald Arseneau suggested that \cs{bibsection} be used as a `standard'
+% way of controlling the sectioning command of a bibliography. Here is
+% an implementation of that idea.
+%
+% \cs{@memb@bchap} is a copy of memoir's original code for the start
+% of the \texttt{thebibliography} environment which used a \cs{chapter*}
+% title. \cs{@memb@bsec} is the much simpler version for a \cs{section} title.
+% \changes{v1.4}{2003/02/27}{Added support code for implementing \cs{bibsection}
+% (patch 1.3)}
+% \changes{v3.7g}{2018/02/28}{Removeded \cs{phantomsection} before
+% \cs{addcontentsline} as it is no longer needed, and causes the
+% hyperlink target to the bibligraphy to be below the title, reported
+% via \texttt{https://tex.stackexchange.com/a/396303/3929}}
+% \begin{macrocode}
+\newcommand{\@memb@bchap}{%
+ \chapter*{\bibname}%
+ \bibmark
+ \ifnobibintoc\else
+ % \phantomsection
+ \addcontentsline{toc}{chapter}{\bibname}%
+ \fi
+ \prebibhook}
+\newcommand{\@memb@bsec}{\section{\bibname}\prebibhook}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibsection}
+% Normally treat the bibliography heading as a chapter.
+% \changes{v1.4}{2003/02/27}{Added \cs{bibsection} to replace memoir's
+% original code for the bibliography (patch 1.3)}
+% \begin{macrocode}
+\newcommand{\bibsection}{\@memb@bchap}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{thebibliography}
+% The definition of the \texttt{thebibliography} environment in this class is not
+% quite the same as in the standard classes!
+%
+% \changes{v0.2}{2001/06/03}{Deleted starred version of thebibliography}
+% \changes{v1.4}{2003/02/27}{Replaced initial code in the bibliography
+% environment by \cs{bibsection} (patch 1.3)}
+% \begin{macrocode}
+\newenvironment{thebibliography}[1]{%
+ \bibsection
+ \begin{bibitemlist}{#1}}{\end{bibitemlist}\postbibhook}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\ifnobibintoc}
+% \begin{macro}{\bibintoc}
+% \begin{macro}{\nobibintoc}
+% Flag to control whether or not to add the bibliography title to the ToC,
+% and declarations to set the flag.
+% Default is to put the title into the ToC.
+% \changes{v0.2}{2001/06/03}{Added \cs{ifnobibintoc}, etc.}
+% \begin{macrocode}
+\newif\ifnobibintoc
+\newcommand*{\bibintoc}{\nobibintocfalse}
+\newcommand*{\nobibintoc}{\nobibintoctrue}
+\bibintoc
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\prebibhook}
+% \begin{macro}{\postbibhook}
+% These two macros are called just before starting the bib items and just
+% after finishing them. By default they do nothing but can be changed
+% by the user to give, say, some introductory information.
+% \begin{macrocode}
+\newcommand{\prebibhook}{}
+\newcommand{\postbibhook}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@cite}
+% The output of the \cs{cite} command is produced by this macro. The default
+% is used. The \Lpack{cite} package is a good way of changing this.
+% \begin{macrocode}
+% \renewcommand*{\@cite}[1]{[#1]}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Use with the \Lpack{natbib} and \Lpack{chapterbib} packages}
+%
+% The \Lpack{natbib} package~\cite{NATBIB} uses its own definition for
+% the \texttt{thebibliography} environment, which knows nothing about adding
+% the Bibliography to the ToC. The following makes appropriate changes
+% to \Lpack{natbib} code to support the class.
+%
+% The \Lpack{chapterbib} package by Donald Arseneau also may make changes
+% to the \texttt{thebibliography} environment --- perhaps memoir's version
+% or natbib's version.
+%
+% As packages get loaded after classes, I have to try and patch any
+% non-memoir modifications at begin document time.
+% The fixes have to be firstly for \Lpack{natbib}
+% and only after those can \Lpack{chapterbib} be considered.
+%
+% \changes{v1.1}{2002/03/10}{Added internal support for the natbib package}
+% \changes{v1.4}{2003/02/27}{Changed code supporting natbib (patch 1.3)}
+% \changes{v1.4}{2003/02/27}{Added code supporting chapterbib (patch 1.3)}
+% \begin{macro}{\bibsection}
+% \begin{macro}{\endthebibliography}
+% Natbib provides \cs{bibsection} for titling the bibliography. I also have
+% to extend the end of the \texttt{thebibliography} environment to cater for
+% \cs{postbibhook}.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{natbib}{% natbib is loaded
+% \end{macrocode}
+% As \Lpack{natbib} is used, change \cs{endthebibliography} to the class
+% definition.
+% \begin{macrocode}
+ \addtodef{\endthebibliography}{}{\vskip-\lastskip\postbibhook}
+ \@ifpackagewith{natbib}{sectionbib}{% with sectionbib option
+% \end{macrocode}
+% \Lpack{natbib}'s \Lopt{sectionbib} option is used,
+% \begin{macrocode}
+ \renewcommand{\bibsection}{\@memb@bsec}}%
+% \end{macrocode}
+% The \Lopt{sectionbib} option is not used, so we have a chapter title.
+% \begin{macrocode}
+ {\renewcommand{\bibsection}{\@memb@bchap}}}%
+% \end{macrocode}
+% Finished with any \Lpack{natbib} related changes.
+% \begin{macrocode}
+ {}
+% \end{macrocode}
+%
+% Now deal with \Lpack{chapterbib} if necessary.
+% \begin{macrocode}
+ \@ifpackagewith{chapterbib}{sectionbib}{%
+% \end{macrocode}
+% \Lpack{chapterbib} is used with its \Lopt{sectionbib} option. This is the
+% only case to worry about. Kill \Lpack{chapterbib}'s \cs{sectionbib} macro
+% which it calls at begin document to do its patch, then make sure
+% the class definition is used.
+% \begin{macrocode}
+ \renewcommand{\sectionbib}[2]{}
+ \renewcommand{\bibsection}{\@memb@bsec}}{}
+% \end{macrocode}
+% And we've finished with this bunch of \cs{AtBeginDocument} code.
+% \begin{macrocode}
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \section{The index}
+%
+% I allow for a single column index as well as the default double column.
+%
+% \begin{macro}{\ifonecolindex}
+% TRUE for a one column index.
+% \changes{v1.3}{2002/10/10}{Added one column index}
+% \begin{macrocode}
+\newif\ifonecolindex
+ \onecolindexfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\onecolindex}
+% \begin{macro}{\twocolindex}
+% \changes{v1.61803}{2008/01/30}{Added \cs{onecolindex} and \cs{twocolindex}}
+% \begin{macrocode}
+\newcommand*{\onecolindex}{\onecolindextrue}
+\newcommand*{\twocolindex}{\onecolindexfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{theindex}
+% The environment \texttt{theindex} can be used for indices. It makes an
+% index with two columns, with each entry a separate paragraph. At
+% the user level the commands \cs{item}, \cs{subitem} and \cs{subsubitem}
+% are used to produce index entries of various levels. When a new
+% letter of the alphabet is encountered an amount of \cs{indexspace}
+% white space can be added.
+%
+%
+% \changes{v0.2}{2001/06/03}{Deleted starred version of theindex}
+% \changes{v0.2}{2001/06/03}{Changed Index pagestyle to chapter}
+% \changes{v1.618}{2005/09/03}{Make \cs{indexcolsep} work, courtesy of hazydirk (mempatch v3.11)}
+% \changes{v1.61803}{2008/01/30}{Added \cs{clearforchapter} to theindex
+% environment (Erik Quaeghebeur, mempatch v4.4)}
+% \changes{v1.61803}{2008/01/30}{Added an indextitlepagestyle (Lars Madsen
+% mempatch v4.6)}
+% \begin{macrocode}
+\newenvironment{theindex}{%
+ \clearforchapter
+ \if@twocolumn
+ \@restonecolfalse
+ \else
+ \@restonecoltrue
+ \fi
+ \ifonecolindex
+ \onecolumn
+ \chapter*{\indexname}
+ \preindexhook
+ \else
+ \setlength{\columnseprule}{\indexrule}%
+ \setlength{\columnsep}{\indexcolsep}%
+ \twocolumn[\@makeschapterhead{\indexname}
+ \preindexhook]%
+ \fi
+ \indexmark
+ \ifnoindexintoc\else
+ \phantomsection
+ \addcontentsline{toc}{chapter}{\indexname}%
+ \fi
+ \thispagestyle{indextitlepagestyle}\parindent\z@
+ \parskip\z@ \@plus .3\p@\relax
+ \let\item\@idxitem}%
+ {\if@restonecol\onecolumn\else\twocolumn\fi}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\ps@indextitlepagestyle}
+% \begin{macrocode}
+\aliaspagestyle{indextitlepagestyle}{chapter}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifnoindexintoc}
+% \begin{macro}{\indexintoc}
+% \begin{macro}{\noindexintoc}
+% Flag to control whether or not to add the index title to the ToC,
+% and declarations to set the flag.
+% Default is to put the title into the ToC.
+% \changes{v0.2}{2001/06/03}{Added \cs{ifnoindexintoc}, etc.}
+% \begin{macrocode}
+\newif\ifnoindexintoc
+\newcommand*{\indexintoc}{\noindexintocfalse}
+\newcommand*{\noindexintoc}{\noindexintoctrue}
+\indexintoc
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\indexcolsep}
+% \begin{macro}{\indexrule}
+% These two lengths control the column separation and the thickness
+% of the inter-column rule.
+% \changes{v0.2}{2001/06/03}{Added \cs{indexcolsep} and \cs{indexrule}}
+% \begin{macrocode}
+\newlength{\indexcolsep} \setlength{\indexcolsep}{35pt}
+\newlength{\indexrule} \setlength{\indexrule}{0pt}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\preindexhook}
+% A macro that is called between the index heading and the start of the
+% two columns. The user can modify it to add something.
+% \begin{macrocode}
+\newcommand{\preindexhook}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l@index}
+% Format the index entry in the table of contents.
+% \begin{macrocode}
+\newcommand{\l@index}{\@dottedtocline{1}{0em}{0pt}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@idxitem}
+% \begin{macro}{\subitem}
+% \begin{macro}{\subsubitem}
+% Thsee macros are used to format the entries in the index.
+% \begin{macrocode}
+\newcommand{\@idxitem} {\par\hangindent 40\p@}
+\newcommand{\subitem} {\par\hangindent 40\p@ \hspace*{20\p@}}
+\newcommand{\subsubitem}{\par\hangindent 40\p@ \hspace*{30\p@}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\indexspace}
+% The amount of white space that is inserted between `letter
+% blocks' in the index.
+% \begin{macrocode}
+\newcommand{\indexspace}{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makeindex}
+% \begin{macro}{\index}
+% \begin{macro}{\specialindex}
+% \begin{macro}{\makememindexhook}
+% This is a modified version of the kernel \cs{makeindex} to allow for
+% multiple indexes. It also defines \cs{index} (which is a modified version
+% of the standard \cs{index}) and \cs{specialindex}.
+%
+% \cs{makememindexhook} is a null op but can be redefined to add extra code
+% into \cs{makeindex}. For example, to incorporate \Lpack{ledmac}'s
+% \cs{edindex} into the scheme:
+% \begin{verbatim}
+% \renewcommand*{\makememindexhook}{%
+% \def\edindex{\@bsphack%
+% \@ifnextchar [{\l@d@index}{\l@d@index[\jobname]}}}
+% \end{verbatim}
+% \changes{v1.3}{2002/11/14}{Indexing macros completely redone and extended}
+% \changes{v1.61}{2004/03/12}{Added the \cs{makememindexhook} to \cs{makeindex}}
+% \changes{v1.618}{2005/09/02}{Modified \cs{makeindex} for \cs{nofiles}}
+% \begin{macrocode}
+\newcommand*{\makememindexhook}{}
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*{\makeindex}{}
+\renewcommand*{\makeindex}[1][\jobname]{%
+ \if@filesw
+ \def\index{\@bsphack%
+ \@ifnextchar [{\@index}{\@index[\jobname]}}
+ \def\specialindex{\@bsphack\@spindex}%
+ \makememindexhook
+ \expandafter\newwrite\csname #1@idxfile\endcsname
+ \expandafter\immediate\openout \csname #1@idxfile\endcsname #1.idx\relax
+ \typeout{Writing index file #1.idx }%
+ \fi}
+
+% \end{macrocode}
+% Initially define, but emasculate, \cs{index} and \cs{specialindex} which are
+% defined properly by the user calling \cs{makeindex}.
+% \begin{macrocode}
+\renewcommand{\index}[2][\jobname]{\@bsphack\@esphack}
+\newcommand{\specialindex}[3]{\@bsphack\@esphack}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printindex}
+% The command to read an \file{ind} file.
+% \begin{macrocode}
+\newcommand{\printindex}[1][\jobname]{\@input@{#1.ind}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifreportnoidxfile}
+% \begin{macro}{\reportnoidxfile}
+% \begin{macro}{\ignorenoidxfile}
+% \begin{macro}{\ifshowindexmark}
+% \begin{macro}{\showindexmarks}
+% \begin{macro}{\hideindexmarks}
+% Two booleans to control reporting on unknown \file{idx} files and
+% displaying indexed items in the margin.
+% \begin{macrocode}
+\newif\ifreportnoidxfile
+\newcommand*{\reportnoidxfile}{\reportnoidxfiletrue}
+\newcommand*{\ignorenoidxfile}{\reportnoidxfilefalse}
+ \ignorenoidxfile
+\newif\ifshowindexmark
+\newcommand*{\showindexmarks}{\showindexmarktrue}
+\newcommand*{\hideindexmarks}{\showindexmarkfalse}
+ \hideindexmarks
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@index}
+% \verb?\@index[file]? is first stage of \cs{index}, handling the \file{idx} file.
+% \begin{macrocode}
+\def\@index[#1]{%
+ \@ifundefined{#1@idxfile}%
+ {\ifreportnoidxfile
+ \@memwarn{Undefined index file #1}%
+ \fi
+ \begingroup
+ \@sanitize
+ \@nowrindex}%
+ {\def\@idxfile{#1}%
+ \begingroup
+ \@sanitize
+ \@wrindexm@m}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nowrindex}
+% Called when there is no \file{idx} file to throw away the indexed item.
+% \begin{macrocode}
+\newcommand{\@nowrindex}[1]{%
+ \ifshowindexmark\@showidx{#1}\fi\endgroup\@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@wrindexm@m}
+% \begin{macro}{\@@wrindexhyp}
+% The next stage in index processing is \verb?\@wrindexm@m{item}?,
+% which writes the \file{idx} file name
+% and indexed item to the \file{aux} file. The \cs{@@wrindexhyp} macro
+% provides hyperlinks in case the \Lpack{hyperref} package is used.
+% \begin{macrocode}
+\newcommand{\@wrindexm@m}[1]{\@@wrindexhyp#1||\\}
+\def\@@wrindexhyp#1|#2|#3\\{%
+ \ifshowindexmark\@showidx{#1}\fi
+ \ifx\\#2\\%
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|hyperpage}{\thepage}}%
+ \else
+ \def\Hy@temp@A{#2}%
+ \ifx\Hy@temp@A\HyInd@ParenLeft
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|#2hyperpage}{\thepage}}%
+ \else
+% \end{macrocode}
+% Add a corresponding test on \verb+|)+ to add \verb|hyperpage|. This
+% is needed by the \verb|xindy| indexing programme. The standard
+% \verb|makeindex| programme does not seem to mind.
+% \changes{v3.7g}{2018/04/04}{Added test for \texttt{|)} and adding
+% \texttt{hyperpage} accordingly.}
+% \begin{macrocode}
+ \ifx\Hy@temp@A\HyInd@ParenRight
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|#2hyperpage}{\thepage}}%
+ \else
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|#2}{\thepage}}%
+ \fi
+ \fi
+ \fi
+ \endgroup
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hyperpage}
+% \begin{macro}{\hyperlink}
+% These are defined in the \Lpack{hyperref} package but we need them.
+% Other hyperstuff is only used if the package itself is used.
+% \begin{macrocode}
+\newcommand{\hyperpage}[1]{#1}
+\newcommand{\hyperlink}[2]{#2}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@wrindexm@m}
+% The macro \verb?\@@wrindexm@m{file}{item}{page}? has been written into
+% the \file{aux} file. It is normally defined so that it calls
+% \verb?\@@@wrindexm@m{item}{page}? to finally write to the \file{idx} file.
+% \begin{macrocode}
+\newcommand{\@@wrindexm@m}[1]{\begingroup
+ \def\@idxfile{\@nameuse{#1@idxfile}}
+ \@sanitize
+ \@@@wrindexm@m}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@@wrindexm@m}
+% \cs{@@@wrindexm@m}\marg{item}\marg{page} writes the \cs{indexentry} to
+% the \file{idx} file. This file is read both at the beginning and end of
+% a document so \cs{@@@wrindexm@m} must be disabled for one of these reads
+% otherwise the index entries will be doubled up. Initially I disabled it
+% after the first read. It eventually dawned on me that this meant two
+% LaTeX runs to update the \file{idx}. Enabling it for the second read
+% means that the \file{idx} file is updated at the end of each run.
+% \changes{v1.618}{2005/09/02}{Made \cs{@@@wrindexm@m} obey \cs{nofiles}}
+% \changes{v1.618}{2005/09/25}{\cs{@@@wrindexm@m} now reads the aux
+% file at the end of the document}
+% \begin{macrocode}
+\newcommand{\@@@wrindexm@m}[2]{\endgroup}
+\AtBeginDocument{%
+ \def\@@@wrindexm@m#1#2{%
+ \if@filesw
+ \immediate\write \@idxfile{\string\indexentry{#1}{#2}}%
+ \fi
+ \endgroup}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@spindex}
+% Now do similar things for \cs{specialindex}.
+% \begin{macrocode}
+\newcommand{\@spindex}[2]{%
+ \@ifundefined{#1@idxfile}%
+ {\ifreportnoidxfile
+ \@memwarn{Undefined index file #1}%
+ \fi
+ \begingroup
+ \@sanitize
+ \@nowrindex}%
+ {\def\@idxfile{#1}%
+ \def\@sptheidx{#2}%
+ \begingroup
+ \@sanitize
+ \@wrspindex}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@wrspindex}
+% \begin{macro}{\@@wrspindexhyp}
+% \begin{macrocode}
+\newcommand{\@wrspindex}[1]{\@@wrspindexhyp#1||\\}
+\def\@@wrspindexhyp#1|#2|#3\\{%
+ \ifshowindexmark\@showidx{#1}\fi
+ \ifx\\#2\\%
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}%
+ {#1|hyperspindexpage(\thepage)}%
+ {\@nameuse{the\@sptheidx}}}%
+ \else
+ \def\Hy@temp@A{#2}%
+ \ifx\Hy@temp@A\HyInd@ParenLeft
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}%
+ {#1|#2hyperspindexpage(\thepage)}%
+ {\@nameuse{the\@sptheidx}}}%
+ \else
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|#2}%
+ {\@nameuse{the\@sptheidx}}}%
+ \fi
+ \fi
+ \endgroup
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hyperspindexpage}
+% \begin{macrocode}
+\def\hyperspindexpage(#1)#2{\hyperlink{page.#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifmemhyperindex}
+% \begin{macro}{\memhyperindextrue}
+% \begin{macro}{\memhyperindexfalse}
+% Flag to turn off \cs{hyperindexfalse} hyperrefing the index (apparently
+% \Lpack{xindy} can't cope with this. Email from Frederic Connes, 2005/07/13:
+% \begin{verbatim}
+% ...You use |hyperspindex(\thepage) which xindy doesn't
+% recognise as a valid markup-locref. And I don't know how
+% to add it because xindy only accepts one argument in
+% markup-locref (if the number is not a page number, it will
+% still point to a page with that number) so replacing it
+% with |hyperpage won't work. ...
+% \end{verbatim}
+%
+%
+% The default is \cs{memhyperindextrue}. Setting \cs{memhyperindexfalse}
+% prohibits a hyper index --- setting whatever option in \Lpack{hyperref}
+% to disable hyper indexing will (probably) not work as far as \Lpack{xindy}
+% is concerned.
+% \changes{v1.618}{2005/09/04}{Added \cs{ifmemhyperindex}}
+% \begin{macrocode}
+\newif\ifmemhyperindex
+ \memhyperindextrue
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifm@mxindy}
+% \begin{macro}{\m@mxindytrue}
+% \begin{macro}{\m@mxindyfalse}
+% \begin{macro}{\xindyindex}
+% \begin{macro}{\@@wrspindexhyp}
+% Use \cs{xindyindex} when you are going to use the xindy program rather
+% than makeindex. hyperrefed entries won't work with xindy.
+% The code was supplied by Frederic
+% Connes\footnote{\texttt{frederic@connes.org}} in an email to me on
+% 2006/01/08.
+% \changes{v1.61803}{2008/01/30}{Added \cs{xindyindex} (Frederic Connes
+% mempatch v4.4)}
+% \begin{macrocode}
+\newif\ifm@mxindy
+\m@mxindyfalse
+\newcommand*{\xindyindex}{\m@mxindytrue}
+\def\@@wrspindexhyp#1|#2|#3\\{%
+ \ifshowindexmark\@showidx{#1}\fi
+ \ifx\\#2\\%
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}%
+ \ifm@mxindy{#1}\else{#1|hyperspindexpage(\thepage)}\fi
+ {\@nameuse{the\@sptheidx}}}%
+ \else
+ \def\Hy@temp@A{#2}%
+ \ifx\Hy@temp@A\HyInd@ParenLeft
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}%
+ \ifm@mxindy{#1|#2}\else{#1|#2hyperspindexpage(\thepage)}\fi
+ {\@nameuse{the\@sptheidx}}}%
+ \else
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1|#2}%
+ {\@nameuse{the\@sptheidx}}}%
+ \fi
+ \fi
+ \endgroup
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@wrindexhyp}
+% \begin{macro}{\@@wrspindexhyp}
+% If the \Lpack{hyperref} package is not being used, or \cs{ifmemhyperindex}
+% is false, there is no need
+% to clutter up the index files.
+% \changes{v1.61}{2004/03/28}{Declutter index files if hyperref is not used}
+% \changes{v1.618}{2005/09/02}{Fixed spaces in non-hyperref index files (mempatch v2.3).
+% Reported by Michael W. Daniels.}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{hyperref}{}{\memhyperindexfalse}%
+% \end{macrocode}
+% If the \Lpack{hyperref} package is not being used, or a hyperindex
+% is not required, simplify!
+% \begin{macrocode}
+ \ifmemhyperindex\else
+ \def\@@wrindexhyp#1||\\{%
+ \ifshowindexmark\@showidx{#1}\fi
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1}{\thepage}}%
+ \endgroup
+ \@esphack}%
+ \def\@@wrspindexhyp#1||\\{%
+ \ifshowindexmark\@showidx{#1}\fi
+ \protected@write\@auxout{}%
+ {\string\@@wrindexm@m{\@idxfile}{#1}{\@nameuse{the\@sptheidx}}}%
+ \endgroup
+ \@esphack}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\see}
+% \begin{macro}{\seename}
+% \begin{macro}{\seealso}
+% \begin{macro}{\alsoname}
+% These definitions are taken from the \Lpack{makeidx} package.
+% \begin{macrocode}
+\newcommand*{\see}[2]{\emph{\seename} #1}
+\newcommand*{\seename}{see}
+\newcommand*{\seealso}[2]{\emph{\alsoname} #1}
+\newcommand*{\alsoname}{see also}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\citeindexfile}
+% For the \Lpack{natbib} package, and possibly other packages that do
+% some special indexing.
+% \begin{macrocode}
+\newcommand{\citeindexfile}{\jobname}
+\AtBeginDocument{\@ifpackageloaded{natbib}{%
+ \def\NAT@index{\index[\citeindexfile]{\NAT@idxtxt}}}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The next part of the code is essentially the \Lpack{showidx} package.
+% I tried putting index entries into marginpars but too many on a page
+% led to the `too many floats' problem.
+%
+% \begin{macro}{\indexmarkstyle}
+% \begin{macro}{\@indexbox}
+% \begin{macrocode}
+\newtoks\indexmarkstyle
+ \indexmarkstyle{\normalfont\footnotesize\ttfamily}
+\newinsert\@indexbox
+ \dimen\@indexbox\maxdimen
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\begingroup
+ \catcode`\@\active
+ \expandafter\gdef\csname\string @sanitizeat\endcsname
+ {\def @{\char`\@}}
+\endgroup
+
+% \end{macrocode}
+%
+% \begin{macro}{\@showidx}
+% \begin{macrocode}
+\newcommand{\@showidx}[1]{%
+ \insert\@indexbox{%
+ \@sanitizeat
+ \the\indexmarkstyle
+ \hsize\marginparwidth
+ \hangindent\marginparsep \parindent\z@
+ \everypar{}\let\par\@@par \parfillskip\@flushglue
+ \lineskip\normallineskip
+ \baselineskip .8\normalbaselineskip\sloppy
+ \raggedright \leavevmode
+ \vrule \@height .7\normalbaselineskip \@width \z@\relax
+ #1\relax
+ \vrule \@height \z@ \@depth .3\normalbaselineskip \@width \z@\relax
+ }%
+ \ifhmode\penalty\@M \hskip\z@skip\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@leftidx}
+% \begin{macro}{\@rightidx}
+% \begin{macrocode}
+\newcommand{\@leftidx}{\hskip-\marginparsep \hskip-\marginparwidth}
+\newcommand{\@rightidx}{\hskip\columnwidth \hskip\marginparsep}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@mkidx}
+% \begin{macrocode}
+\newcommand{\@mkidx}{\vbox to \z@{%
+ \rlap{%
+ \if@twocolumn
+ \if@firstcolumn \@leftidx \else \@rightidx \fi
+ \else
+ \if@twoside
+ \ifodd\c@page \@rightidx \else \@leftidx \fi
+ \else
+ \@rightidx
+ \fi
+ \fi
+ \box\@indexbox
+ }%
+ \vss}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Page bottom}
+%
+% \begin{macro}{\raggedbottom}
+% \begin{macro}{\flushbottom}
+% \begin{macro}{\@texttop}
+% \begin{macro}{\mem@flshbot}
+% These kernel macros need changing because of the new \cs{@indexbox}
+% marginal insert.
+% \changes{v3.7d}{2015/04/21}{It makes more sense to explicitly call
+% \cs{flushbottom} than just let \cs{@texttop}. We also add a switch
+% macro to see if \cs{flushbottom} is active. \cs{raggedbottom} and
+% \cs{sloppybottom} sets the switch to false}
+% \begin{macrocode}
+\renewcommand{\raggedbottom}{%
+ \def\mem@flshbot{01}%
+ \def\@textbottom{\vskip\z@ plus.0001fil}%
+ \let\@texttop\@mkidx}
+\renewcommand{\flushbottom}{%
+ \def\mem@flshbot{00}%
+ \let\@textbottom\relax
+ \let\@texttop\@mkidx}
+\let\@texttop\@mkidx
+\flushbottom
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Widows and sloppybottom}
+%
+% There was a discussion \textit{widow handling?} on CTT in
+% May 2006. \texttt{ivowel@gmail.com} wrote
+% \begin{quote}
+% in experimenting with raggedbottom, widowpenalty, and clubpenalty,
+% I think that I have not found a solution that strikes me as
+% particularly desirable. I think what I would really like is that
+% widows (i.e., left-over single lines that begin on the following
+% page) are resolved not by pushing one extra line from the same
+% paragraph also onto the next page, but by stretching the
+% \cs{textheight} to allow this one extra at the bottom of the
+% same page.
+% \end{quote}
+% Donald Arseneau, as he so often does, came up with a solution he
+% termed \cs{sloppybottom}. Here is a generalised version.
+%
+% \begin{macro}{\sloppybottom}
+% \cs{sloppybottom} allows an extra line on a page to save a widow.
+% You must increase the \cs{topskip} (by 60 percent is reasonable) and this
+% will push the text lower on the page. Run \cs{checkandfixthelayout}
+% after the change. For example:
+% \begin{verbatim}
+% \setlength{\topskip}{1.6\topskip}
+% \checkandfixthelayout
+% \sloppybottom
+% ...
+% \end{verbatim}
+% \changes{v1.61803}{2008/01/30}{Added \cs{sloppybottom} (mempatch v4.6)}
+% \changes{v3.7d}{2015/04/21}{Added flush bottom switch}
+% \begin{macrocode}
+\newcommand*{\sloppybottom}{%
+ \def\mem@flshbot{01}%
+ \def\@textbottom{\vskip \z@ \@plus.0001fil \@minus .95\topskip}%
+ \topskip=1\topskip \@plus 0.625\topskip \@minus .95\topskip
+ \def\@texttop{\vskip \z@ \@plus -0.625\topskip \@minus -0.95\topskip}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{Glossaries}
+%
+% Standard LaTeX provides little and insufficient support for
+% glossaries, just a \cs{makeglossary} and \cs{glossary} commands.
+% This class does somewhat better. The code follows along the lines
+% of that for indexes.
+% \changes{v1.618}{2005/09/25}{Added glossary code}
+%
+%
+% \begin{macro}{\ifonecolglossary}
+% \begin{macro}{\onecolglossarytrue}
+% \begin{macro}{\onecolglossaryfalse}
+% TRUE for a one column glossary, otherwise its two column.
+% \begin{macrocode}
+\newif\ifonecolglossary
+ \onecolglossarytrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\onecolglossary}
+% \begin{macro}{\twocolglossary}
+% \changes{v1.61803}{2008/01/30}{Added \cs{onecolglossary} and \cs{twocolglossary}}
+% \begin{macrocode}
+\newcommand*{\onecolglossary}{\onecolglossarytrue}
+\newcommand*{\twocolglossary}{\onecolglossaryfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{environment}{theglossary}
+% The environment \texttt{theglossary} is used for glossaries.
+% It makes a glossary with one or two columns, headed by a chapter-like
+% title.
+% \begin{macrocode}
+\newenvironment{theglossary}{%
+ \if@twocolumn
+ \@restonecolfalse
+ \else
+ \@restonecoltrue
+ \fi
+ \ifonecolglossary
+ \onecolumn
+ \chapter*{\glossaryname}
+ \preglossaryhook
+ \else
+ \setlength{\columnseprule}{\glossaryrule}
+ \setlength{\columnsep}{\glossarycolsep}
+ \twocolumn[\@makeschapterhead{\glossaryname}
+ \preglossaryhook]%
+ \fi
+ \glossarymark
+ \ifnoglossaryintoc\else
+ \phantomsection
+ \addcontentsline{toc}{chapter}{\glossaryname}
+ \fi
+ \thispagestyle{chapter}\parindent\z@
+ \parskip\z@ \@plus .3\p@\relax
+ \begintheglossaryhook}%
+ {\atendtheglossaryhook\if@restonecol\onecolumn\else\twocolumn\fi}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\begintheglossaryhook}
+% \begin{macro}{\atendtheglossaryhook}
+% Two vacuous macros called as the last thing by \verb?\begin{theglossary}?
+% and the first thing by \verb?\end{theglossary}? These could be used,
+% for example, to insert another kind of environment.
+% \begin{macrocode}
+\newcommand*{\begintheglossaryhook}{}
+\newcommand*{\atendtheglossaryhook}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\preglossaryhook}
+% A vacuous macro called after the title is set and before the listing
+% starts. The user can modify it to, for example, add some explanatory
+% text.
+% \begin{macrocode}
+\newcommand*{\preglossaryhook}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifnoglossaryintoc}
+% \begin{macro}{\glossaryintoc}
+% \begin{macro}{\noglossaryintoc}
+% Flag and declarations to control whether or not the glossary
+% title is added to the ToC. Default is to put the title
+% in the ToC.
+% \begin{macrocode}
+\newif\ifnoglossaryintoc
+\newcommand*{\glossaryintoc}{\noglossaryintocfalse}
+\newcommand*{\noglossaryintoc}{\noglossaryintoctrue}
+ \glossaryintoc
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\glossarycolsep}
+% \begin{macro}{\glossaryrule}
+% When the glossary is two column these lengths control the
+% column separation and the width of a rule between the columns.
+% \begin{macrocode}
+\newdimen\glossarycolsep \glossarycolsep=35\p@
+\newdimen\glossaryrule \glossaryrule=0\p@
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\glossaryspace}
+% Vertical space between `letter blocks' in the glossary.
+% Note that this is a macro, not a length.
+% \begin{macrocode}
+\newcommand*{\glossaryspace}{%
+ \par \vskip 1.0\onelineskip \@plus 5\p@ \@minus3\p@\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\makeglossary}
+% The preamble command to set up a glossary. Output is to the
+% \file{\#1.glo} file. We need the \cs{providecommand} in case \cs{nofiles}
+% has been called before the class. \cs{makeglossary} sets up several
+% file-specific macros.
+% \begin{macrocode}
+\providecommand*{\makeglossary}{}
+\renewcommand*{\makeglossary}[1][\jobname]{%
+ \makememglossaryhook
+ \@namedef{memglsact#1}{@}% actual
+ \@namedef{memglsnx#1}{}% no ref
+ \@namedef{memglsn#1}{\thepage}% num by page
+ \@namedef{memglsnf#1}{|memjustarg}% no special number format | emacs
+ \if@filesw \expandafter\newwrite\csname #1memglofile\endcsname
+ \expandafter\immediate\openout \csname #1memglofile\endcsname #1.glo\relax
+ \typeout{Writing glossary file #1.glo }%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makememglossaryhook}
+% A vacuous macro called at the start of the \cs{makeglossary} code.
+% It is redefinable to do something useful.
+% \begin{macrocode}
+\newcommand*{\makememglossaryhook}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glossary}
+% The user command for a raw glossary item. The full calling
+% sequence looks like: \\
+% \cs{glossary}\oarg{file}\parg{key}\marg{term}\marg{desc} \\
+% but most is accomplished by lower level macros. It calls
+% \cs{@glossary} to handle the first optional argument.
+% \begin{macrocode}
+ \def\glossary{\@bsphack%
+ \@ifnextchar [{\@glossary}{\@glossary[\jobname]}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@glossary}
+% \cs{@glossary}\oarg{file} handles the first of the \cs{glossary} optional
+% arguments, even though the calling sequence looks like: \\
+% \cs{@glossary}\oarg{file}\parg{key}\marg{term}\marg{desc}. \\
+% It calls \cs{@@glossary} to handle the second optional argument
+% and the rest.
+% \begin{macrocode}
+\def\@glossary[#1]{%
+ \@ifnextchar ({\@@glossary[#1]}{\@@glossary[#1]()}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@glossary}
+% The base macro for \cs{glossary}. Its real calling sequence is: \\
+% \cs{@@glossary}\oarg{file}\parg{key}\marg{term}\marg{desc}. \\
+% Provided the glossary output file has been set up it calls
+% \cs{@wrglom@m} to write the data, otherwise it throws away its
+% arguments.
+% \begin{macrocode}
+\def\@@glossary[#1](#2)#3#4{%
+ \@ifundefined{#1memglofile}{%
+ \begingroup
+ \@sanitize
+ \endgroup
+ \@esphack%
+ }{%
+ \def\memglofile{#1}%
+ \begingroup
+ \@sanitize
+% \end{macrocode}
+% Use the correct key, \meta{key} if given, otherwise \meta{term}.
+% \begin{macrocode}
+ \ifx\@empty#2\@empty
+ \@wrglom@m{#3}{#3}{#4}%
+ \else
+ \@wrglom@m{#2}{#3}{#4}%
+ \fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@wrglom@m}
+% \cs{@wrglom@m}\marg{key}\marg{term}\marg{desc} writes its three arguments,
+% plus the \meta{ref} and the \meta{num} to the \file{aux} file as the
+% arguments to the \cs{@@wrglom@m} macro.
+% \begin{macrocode}
+\newcommand{\@wrglom@m}[3]{%
+ \protected@write\@auxout{}%
+ {\string\@@wrglom@m{\memglofile}{#1}{#2}{#3}{\@nameuse{memglsnx\memglofile}}{\@nameuse{memglsn\memglofile}}}%
+ \endgroup
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@wrglom@m}
+% The calling sequence looks like: \\
+% \cs{@@wrglom@m}\marg{file}\marg{key}\marg{term}\marg{desc}\marg{ref}\marg{num} \\
+% but is actually really only \\
+% \cs{@@wrglom@m}\marg{file} \\
+% It saves the output file identifier in \cs{memglofile} and
+% \meta{file} as \cs{m@mgf}, then calls \cs{memwritetoglo}
+% to handle the remaining `arguments'.
+% \begin{macrocode}
+\newcommand{\@@wrglom@m}[1]{\begingroup
+ \def\memglofile{\@nameuse{#1memglofile}}%
+ \def\m@mgf{#1}%
+ \@sanitize
+ \memwritetoglo}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memwritetoglo}
+% \begin{macro}{\@ctualm@mwritetoglo}
+% \cs{memwritetoglo}\marg{key}\marg{name}\marg{desc}\marg{ref}\marg{num}
+% will, at an appropriate time write the raw glossary data to the
+% appropriate \file{glo} file.
+%
+% The \file{aux} file is read twice, once as one of the initial
+% actions at the start of the \texttt{document} environment, and again
+% at the end of the \texttt{document} environment. The raw glossary
+% data must only be written once from the \file{aux} to the \file{glo} file.
+% Initially \cs{memwritetoglo} is defined to do nothing, then, after the
+% \file{aux} file has been read at the beginning is redefined to do
+% its writing.
+%
+% The Makeindex program expects its input to be like: \\
+% \verb?\glosaryentry{key@data}{num}?
+% Very cunningly the raw data is fed to the \file{glo}
+% file looking like: \\
+% \verb?\glossaryentry{key@{\memgloterm{term} \memglodesc{desc} \memgloref{ref}}{num}? \\
+% which as far as Makeindex is concerned is simply: \\
+% \verb?\glosaryentry{key@{data}}{num}? \\
+% (note where all the braces are).
+%
+% \begin{macrocode}
+\newcommand{\memwritetoglo}[5]{\endgroup}
+\newcommand{\@ctualm@mwritetoglo}[5]{%
+ \immediate\write \memglofile{\string\glossaryentry{#1\@nameuse{memglsact\m@mgf}
+ {\string\memgloterm{#2}}{\string\memglodesc{#3}}
+ {\string\memgloref{#4}}\@nameuse{memglsnf\m@mgf}}{#5}}%
+ \endgroup}
+\AtBeginDocument{%
+ \let\memwritetoglo\@ctualm@mwritetoglo}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\changeglossactual}
+% \begin{macro}{\changeglossref}
+% \begin{macro}{\changeglossnum}
+% \begin{macro}{\changeglossnumformat}
+% There are internal macros that are file-dependant, their names
+% being constructed from the file name plus a fixed name. The
+% \cs{makeglossary} command initializes these but the user may well need
+% to change them. In the macros below, \texttt{...actual} refers to the
+% actual character in a Makeindex configuration file (default \texttt{@}),
+% \texttt{...ref} to the \meta{ref} glossary argument, \texttt{...num}
+% to the meta{num} argument (default \cs{thepage}) and \texttt{...numformat}
+% to the Makeindex encapsulating command. Example uses are:
+% \begin{verbatim}
+% \changeglossactual[file]{?}
+% \changeglossref[file]{\thepage}
+% \changeglossnum[file]{\thesection}
+% \changeglossnumref[file]{|textbf}
+% \end{verbatim}
+% \begin{macrocode}
+\newcommand*{\changeglossactual}[2][\jobname]{%
+ \@namedef{memglsact#1}{#2}}
+\newcommand*{\changeglossref}[2][\jobname]{%
+ \@namedef{memglsnx#1}{#2}}
+\newcommand*{\changeglossnum}[2][\jobname]{%
+ \@namedef{memglsn#1}{#2}}
+\newcommand*{\changeglossnumformat}[2][\jobname]{%
+ \@namedef{memglsnf#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\glossitem}
+% The final sorted glossary data is in the form: \\
+% \cs{glossitem}\marg{term}\marg{desc}\marg{ref}\marg{num} \\
+% The definition here does little.
+% \begin{macrocode}
+\newcommand{\glossitem}[4]{#1 #2 #3 #4\par}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memgloterm}
+% \begin{macro}{\memglodesc}
+% \begin{macro}{\memgloref}
+% \begin{macro}{\memglonum}
+% These are wrappers round the \meta{term}, \meta{desc}, \meta{ref} and
+% \meta{num} elements in the final data. They are vacuous to start with.
+% \begin{macrocode}
+\newcommand*{\memgloterm}[1]{#1}
+\newcommand*{\memglodesc}[1]{#1}
+\newcommand*{\memgloref}[1]{#1}
+\newcommand*{\memglonum}[1]{#1}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printglossary}
+% \cs{printglossary}\oarg{file} inputs the glossary \file{gst} file.
+% \begin{macrocode}
+\newcommand*{\printglossary}[1][\jobname]{\@input@{#1.gls}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{Notes/Marginalia}
+%
+%
+% \subsection{A simple interface for specifying locations}
+%
+% \changes{v1.61803398d}{2010/01/25}{added}
+%
+% The \Lpack{memoir} class as of December 2009 supports \cs{marginpar},
+% \cs{sidepar}, and \cs{sidebar} for placing information in a margin.
+% The means of specifying in which margin the information should be put
+% is different for each of these. Here a consistent location interface
+% is provided for all marginalia.
+%
+%
+% \begin{macro}{\m@msetm@argin}
+% \begin{macro}{\m@mm@argin}
+% A workhorse macro for setting a margin placement code. The argument
+% may be one of: left, right, outer, or inner, with \cs{m@mm@argin} defined
+% as the corresponding codes of 0, 1, 2, or 3. An unkown argument is coded
+% as a negative number.
+% \begin{macrocode}
+\newcommand*{\m@msetm@argin}[1]{%
+ \def\@tempa{#1}\def\@tempb{left}%
+ \ifx\@tempa\@tempb
+ \def\m@mm@argin{0}%
+ \else
+ \def\@tempb{right}%
+ \ifx\@tempa\@tempb
+ \def\m@mm@argin{1}%
+ \else
+ \def\@tempb{outer}%
+ \ifx\@tempa\@tempb
+ \def\m@mm@argin{2}%
+ \else
+ \def\@tempb{inner}%
+ \ifx\@tempa\@tempb
+ \def\m@mm@argin{3}%
+ \else
+ \def\m@mm@argin{-1}%
+ \fi
+ \fi
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifmemtortm}
+% \begin{macro}{\memtortmtrue}
+% \begin{macro}{\memtortmfalse}
+% A flag set TRUE if the marginalia is to be moved to the right of the text
+% and FALSE if it is to be moved to the left of the text.
+% \begin{macrocode}
+% MEM-TO-RighT-Margin
+\newif\ifmemtortm
+ \memtortmtrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mwhich@margin}
+% \cs{m@mwhich@margin}\marg{code} sets \cs{ifmemtortm} TRUE or FALSE depending
+% on the value of \meta{code} (0 to 3), and other factors.
+% \begin{description}
+% \item[Two column document] If the first column, to the left, otherwise
+% to the right, irrespective the document being
+% one- or two-side.
+% \item[One sided document] If code = 0 (left), to the left, otherwise
+% (code = 1 (right), 2 (outer), 3 (inner)) to the right.
+% \item[Two sided document] depends on whether a recto or verso page:
+% \begin{description}
+% \item[Recto (odd) page] right if code = 1 (right) or 2 (outer), otherwise
+% left.
+% \item[Verso (even) page] left if code = 0 (left) or 2 (outer), otherwise
+% right.
+% \end{description}
+% \end{description}
+%
+%
+% \begin{macrocode}
+\newcommand*{\m@mwhich@margin}[1]{%
+ \memtortmtrue
+ \if@twocolumn
+ \if@firstcolumn% left
+ \memtortmfalse
+ \else% right
+ \memtortmtrue
+ \fi
+ \else
+ \if@twoside
+ \checkoddpage
+ \ifcase #1\relax% 0 left
+ \memtortmfalse
+ \or% 1 right
+ \memtortmtrue
+ \or% 2 outer
+ \ifoddpage
+ \memtortmtrue
+ \else
+ \memtortmfalse
+ \fi
+ \or% 3 inner
+ \ifoddpage
+ \memtortmfalse
+ \else
+ \memtortmtrue
+ \fi
+ \fi% end ifcase
+ \else% oneside
+ \ifnum #1=\z@% 0 left, all else right
+ \memtortmfalse
+ \else
+ \memtortmtrue
+ \fi
+ \fi% end if@twoside
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Marginpars}
+%
+% A \cs{marginpar} is a kind of floating object --- you can't control
+% exactly where it will go. There is one problem with the kernel
+% definition of \cs{marginpar} in that sometimes a \cs{marginpar} may
+% end up on the wrong side of the page. The following is an attempt
+% to fix that using the odd/even page check provided as part of
+% the class.
+%
+% \begin{macro}{\@addmarginpar}
+% The part of the code for \cs{marginpar} that deals with deciding which
+% side of the page it should be printed on is \cs{@addmarginpar}, buried
+% away in the kernel's \texttt{output} routine. A couple of minor changes are made
+% to the kernel code. The first is at the beginning where I have added
+% the \cs{checkoddpage} page checking code.
+% \changes{v1.618033988d}{2010/02/26}{fixed twoside -> left marrgin
+% bug, reported by Frank Wikstr\"om, on private email}
+% In the new margin placement syntax, there is a new syntax: always
+% left, in twoside mode. This cannot be implemented using the normal
+% marginpar placement controls, so we have to add our own.
+% \begin{macrocode}
+\def\@addmarginpar{%
+ \checkoddpage
+% \end{macrocode}
+% Continue with the kernel code. The twocolumn stuff in the new syntax
+% scheme is the same as in the kernel.
+% \begin{macrocode}
+ \@next\@marbox\@currlist{\@cons\@freelist\@marbox
+ \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
+ \if@twocolumn
+ \if@firstcolumn \@tempcnta\m@ne \fi
+ \else
+% \end{macrocode}
+% \changes{v1.618033988d}{2010/02/26}{added as a part of the above
+% mentioned fix}
+% Here we add the new stuff. We make use of the fact that we have
+% hidden all the page checking in \verb?\m@mwhich@margin?, and we only
+% fire it of if we know \verb?\marginparmargin? have been used (via
+% \verb?\ifm@msetmp?).
+% \begin{macrocode}
+ \ifm@msetmp%
+ % \@tempcnta > 0 => right side of page
+ % \@tempcnta < 0 => left side of page
+ \m@mwhich@margin{\m@mmpar@margin}% set left or right margin
+ \ifmemtortm%
+ \@tempcnta\@ne\relax%
+ \else%
+ \@tempcnta\m@ne\relax%
+ \fi%
+ \else%
+ \if@mparswitch
+% \end{macrocode}
+% The next line, reading \\
+% \verb?\ifodd\c@page \else\@tempcnta\m@ne \fi? \\
+% is where the odd/even page checking is done in the kernel code. I
+% replace it with my code, and then continue with the kernel.
+% \begin{macrocode}
+ \ifoddpage \else \@tempcnta\m@ne \fi%
+ \fi%
+ \if@reversemargin \@tempcnta -\@tempcnta \fi%
+ \fi%
+ \fi%
+ \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi
+ \@tempdima\@mparbottom
+ \advance\@tempdima -\@pageht
+ \advance\@tempdima\ht\@marbox
+ \ifdim\@tempdima >\z@
+% \end{macrocode}
+% The next line in the kernel reads: \\
+% \verb?\@latex@warning@no@line {Marginpar on page \thepage\space moved}? \\
+% I have changed the warning message to give the user an indication
+% of the severity of the move. Then follow the kernel on to the end.
+% \begin{macrocode}
+ \@latex@warning@no@line {Marginpar on page
+ \thepage\space moved by \the\@tempdima}%
+ \else
+ \@tempdima\z@
+ \fi
+ \global\@mparbottom\@pageht
+ \global\advance\@mparbottom\@tempdima
+ \global\advance\@mparbottom\dp\@marbox
+ \global\advance\@mparbottom\marginparpush
+ \advance\@tempdima -\ht\@marbox
+ \global\setbox \@marbox
+ \vbox {\vskip \@tempdima
+ \box \@marbox}%
+ \global \ht\@marbox \z@
+ \global \dp\@marbox \z@
+ \kern -\@pagedp
+ \nointerlineskip
+ \hb@xt@\columnwidth
+ {\ifnum \@tempcnta >\z@
+ \hskip\columnwidth \hskip\marginparsep
+ \else
+ \hskip -\marginparsep \hskip -\marginparwidth
+ \fi
+ \box\@marbox \hss}%
+ \nointerlineskip
+ \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Marginpar -- margin interface}
+%
+% The `standard' method of specifying the desired margin for a \cs{marginpar}
+% consists of the two macros \cs{normalmarginpar} and \cs{reversemarginpar},
+% whose effects depend on whether the document is one- or two-sided, whether
+% the page is recto or verso, and if it is set in one- or two-columns.
+%
+% \begin{macro}{\ifm@msetmp}
+% \begin{macro}{m@msetmptrue}
+% \begin{macro}{m@msetmpfalse}
+% TRUE if the macro \cs{marginparmargin} has been called.
+% \begin{macrocode}
+\newif\ifm@msetmp
+ \m@msetmpfalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marginparmargin}
+% \begin{macro}{\m@mmpar@margin}
+% The user command for specifying the desired margin for \cs{marginpar}s.
+% The code is stored as \cs{m@mmpar@margin}, and \cs{setmpbools} is called to
+% convert to the regular \cs{marginpar} booleans.
+% \begin{macrocode}
+\newcommand*{\marginparmargin}[1]{%
+ \m@msetmptrue
+ \m@msetm@argin{#1}%
+ \ifnum\m@mm@argin<\z@
+ \@memwarn{Bad \string\marginparmargin\space argument `#1'\MessageBreak
+ set to `outer'}%
+ \gdef\m@mmpar@margin{2}% set as outer
+ \else
+ \global\let\m@mmpar@margin\m@mm@argin
+ \fi
+ \setmpbools}
+
+% \end{macrocode}
+% \changes{v3.6k}{2013/05/14}{Added default \cs{m@mmpar@margin}}
+% \begin{macrocode}
+\if@twocolumn\else
+ \if@twoside
+ \def\m@mmpar@margin{2}
+ \else
+ \def\m@mmpar@margin{1}
+ \fi
+\fi
+
+% \end{macrocode}
+%
+%
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setmpbools}
+% Given \cs{m@mmpar@margin}, \cs{setmpbools} sets the corresponding
+% \cs{marginpar} location booleans.
+% \begin{macrocode}
+\newcommand*{\setmpbools}{%
+ \if@twoside
+ \@mparswitchtrue
+ \else
+ \@mparswitchfalse
+ \fi
+ \ifcase\m@mmpar@margin\relax% 0 left
+ \@reversemargintrue% \sideparswitchfalse \reversesidepartrue
+ \or% 1 right
+ \@reversemarginfalse% \sideparswitchfalse \reversesideparfalse
+ \or% 2 outer
+ \@reversemarginfalse% \sideparswitchtrue \reversesideparfalse
+ \or% 3 inner
+ \@reversemargintrue% \sideparswitchtrue \reversesidepartrue
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\newcommand*{\m@msetmpcodes}{%
+ \if@mparswitch% 2 sided
+ \if@reversemargin% inner
+ \def\m@mmpar@margin{3}%
+ \else% outer
+ \def\m@mmpar@margin{2}%
+ \fi
+ \else% 1 sided
+ \if@reversemargin% left
+ \def\m@mmpar@margin{0}%
+ \else% right
+ \def\m@mmpar@margin{1}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+%
+% \subsection{A fixed marginpar}
+%
+%
+% Introduce a non-floating marginpar.
+% \changes{v1.4}{2003/11/22}{Added \cs{sidepar} and supports for a fixed
+% marginpar (from patch v1.8)}
+%
+% \begin{macro}{\parnopar}
+% From \theTeXbook{} Exercise 14.15. It creates an `invisible' end/start paragraph,
+% and may be used for getting \TeX{} to try a pagebreak.
+%
+% Roman Eisle (email 2008/09/05) found a problem with the original
+% definition as its effects continued on: \\
+% \verb?\newcommand{\parnopar}{\parfillskip=0pt\par\parskip=0pt\noindent}? \\
+% and he supplied the fix used below.
+%
+% \changes{v1.6180339c}{2008/12/24}{Changed \cs{parnopar} to limit its effect
+% to a single instance}
+% \changes{v3.6e}{2010/08/17}{made \cs{parnopar} sit inside a group}
+% \begin{macrocode}
+\newcommand*{\parnopar}{{\parfillskip=0pt\par\parskip=0pt\noindent}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ifreversesidepar}
+% \begin{macro}{\ifsideparswitch}
+% \changes{v1.61803398d}{2010/01/25}{Added footnote explaining the default}
+% Analogues of \cs{marginpar} controls.\footnote{Note that for some
+% now forgotten reason the default placement of the \cs{sidepar} is
+% reversed in comparison to say \cs{marginpar}. As not to change
+% existing documents, we have left the default like this.}
+% \begin{macrocode}
+\newif\ifreversesidepar
+% \reversesideparfalse
+ \reversesidepartrue
+\newif\ifsideparswitch
+ \sideparswitchfalse
+\if@twoside \sideparswitchtrue \fi
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\ifm@msetsp}
+% \begin{macro}{\m@msetsptrue}
+% \begin{macro}{\m@msetspfalse}
+% \begin{macrocode}
+%% true if \sideparmargin used
+\newif\ifm@msetsp
+ \m@msetspfalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\sideparmargin}
+% \begin{macro}{\m@mspar@margin}
+% User command for specifing the margin for \cs{sidepar}s.
+% The numeric code is stored in \cs{m@mspar@margin}.
+% \begin{macrocode}
+\newcommand*{\sideparmargin}[1]{%
+ \m@msetsptrue
+ \m@msetm@argin{#1}%
+ \ifnum\m@mm@argin<\z@
+ \@memwarn{Bad \string\sideparmargin\space argument `#1'\MessageBreak
+ set to `outer'}%
+ \gdef\m@mspar@margin{2}% set as outer
+ \else
+ \global\let\m@mspar@margin\m@mm@argin
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\m@msidepar@left}
+% \begin{macro}{\m@msidepar@right}
+% Move a \cs{sidepar} into the left/right margin.
+% \begin{macrocode}
+\newcommand*{\m@msidepar@left}{%
+ \@tempdimc\marginparwidth
+ \advance\@tempdimc\marginparsep
+ \kern-\@tempdimc}
+\newcommand*{\m@msidepar@right}{%
+ \@tempdimc\columnwidth
+ \advance\@tempdimc\marginparsep
+ \kern\@tempdimc}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\setspbools}
+% Given the \cs{m@mspar@margin} code, calculates the corresponding
+% \cs{sidepar} location booleans.
+% \begin{macrocode}
+\newcommand*{\setspbools}{%
+ \ifcase\m@mspar@margin\relax% 0 left
+ \sideparswitchfalse \reversesidepartrue
+ \or% 1 right
+ \sideparswitchfalse \reversesideparfalse
+ \or% 2 outer
+ \sideparswitchtrue \reversesideparfalse
+ \or% 3 inner
+ \sideparswitchtrue \reversesidepartrue
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\setspcode}
+% Given the \cs{sidepar} location booleans, sets up the corresponding
+% \cs{m@mspar@margin} numeric codes.
+% \begin{macrocode}
+\newcommand*{\setspcode}{%
+ \ifsideparswitch
+ \ifreversesidepar
+ \def\m@mspar@margin{3}% inner
+ \else
+ \def\m@mspar@margin{2}% outer
+ \fi
+ \else
+ \ifreversesidepar
+ \def\m@mspar@margin{0}% left
+ \else
+ \def\m@mspar@margin{1}% right
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Added}
+% \begin{macro}{\sideparfont}
+% \begin{macro}{\sideparform}
+% The font to be used for \cs{sidepar}s and the alignment for it.
+% \changes{v1.61803398d}{2010/02/04}{Changed default font}
+% \changes{v1.61803398d}{2010/02/05}{added \cs{sideparform}}
+% The \cs{sideparform} holds code that will set the text flush against
+% the edge of the text.\footnote{One might consider redefining this
+% using the \cs{RaggedRight} and \cs{RaggedLeft} macros from the
+% ragged2e package.}
+% \begin{macrocode}
+\newcommand*{\sideparfont}{\normalfont\normalsize}
+\newcommand*{\sideparform}{\ifmemtortm\raggedright\else\raggedleft\fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+%
+% \begin{macro}{\sidepar}
+% \begin{macro}{\@sidepar}
+% \begin{macro}{\sideparvshift}
+% \cs{sidepar}\oarg{left}\marg{right} (per \cs{marginpar}).
+% Sidepars had a nasty habit of moving up or down depending on whether
+% characters in the sidepar and the main text line have ascenders and/or
+% descenders. The length \cs{sideparvshift} was provided to
+% enable adjustments. This is Dan Luecking's modified version of my
+% original code
+% (CTT \textit{Re: sidepars drift up a point}, 2006/04/11) which does a much
+% better job,
+% and the default for \cs{sideparvshift} is now 0pt.
+% \changes{v1.61803}{2008/01/30}{Fixed \cs{sidepars} from moving up and down
+% (mempatch v4.5)}
+% \changes{v1.61803}{2008/01/30}{Normalised font in \cs{@sidepar}
+% (mempatch v4.9)}
+% \changes{v1.61803398d}{2010/01/25}{\cs{@sidepar} changed to fit the
+% interface just added}
+% \changes{v1.61803398d}{2010/02/05}{added \cs{sideparform}}
+% \changes{v3.6h}{2010/10/29}{The inserted text should have the same
+% baseline stretch as the rest of the page notes.}
+% \begin{macrocode}
+\newcommand{\sidepar}{\@dblarg{\@sidepar}}
+\long\def\@sidepar[#1]#2{\leavevmode\@bsphack\strut\vadjust{%
+ \checkoddpage
+ \ifm@msetsp% \sideparmargin used
+%%%% \setspbools
+ \else% \sideparmargin not used, set the \m@mspar@margin code
+ \setspcode
+ \fi
+ \rlap{\kern-\parindent
+ \m@mwhich@margin{\m@mspar@margin}% set left or right margin
+ \ifmemtortm
+ \m@msidepar@right
+ \else
+ \m@msidepar@left
+ \fi
+ \setbox0=\vtop to 0pt{%
+ \begin{minipage}[t]{\marginparwidth}%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \sideparform\sideparfont%
+ \ifmemtortm #2\else #1\fi
+ \end{minipage}%
+ \vss}%
+ \vtop to 0pt{\kern\sideparvshift% default should be 0pt
+ \kern-\dp\strutbox
+ \kern-\ht0
+ \box0 \vss}}}%
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% Vertical shift for sidepar to align with text line
+% \begin{macrocode}
+\newlength{\sideparvshift}
+\setlength{\sideparvshift}{0pt}
+%%%% \setlength{\sideparvshift}{-2.08ex}% seems to work for all font sizes
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Sidebars}
+%
+% \changes{v1.1}{2002/03/19}{Added experimental code for sidebars}
+%
+% On 2002/10/22 Donald Arseneau posted the following code to \ctt{} for adding
+% sidebars to plain TeX.
+% \begin{verbatim}
+% \newinsert\sideins
+% \skip\sideins=0pt
+% \count\sideins=0
+% \dimen\sideins=2in
+%
+% \def\sidebarvsep{25pt}
+% \def\sidebarhsep{15pt}
+%
+% \let\mainpagecontents\pagecontents
+%
+% \def\sidecontents{%
+% \ifvoid\sideins\else
+% {\advance\hsize\sidebarhsep
+% \moveright\hsize \vtop to0pt{%
+% \vskip-\sidebarvsep \vskip\topskip % offset by difference
+% \unvbox\sideins \vss}%
+% }\fi}
+% \def\pagecontents{\sidecontents\mainpagecontents}
+% \long\def\sidebar#1{
+% \insert\sideins{%
+% \splittopskip\sidebarvsep\relax
+% \hsize 1.5in \rightskip=0pt plus 20pt \it
+% \noindent \vbox to \sidebarvsep{}\ignorespaces #1%
+% \ifhmode \unskip\strut\fi \par
+% }%
+% }
+%
+% \end{verbatim}
+%
+% The following started off (2002/03/19) as my attempt to rewrite the above
+% into a form suitable for LaTeX, and this class in particular.
+%
+% Donald Arseneau came up with some improvements to my sidebar code.
+% The impetus
+% for this came from a CTT thread, \textit{whitespace after my command},
+% 2006/11/30 and earlier. In email to me on 2006/11/30 he said:
+% \begin{quotation}
+% For \Lpack{memoir} \cs{sidebar}, it seems the rules are expanding
+% to fill the space for the sidebar, so here is my suggested change
+% to \cs{sidecontents}.
+%
+% It occurs to me that a separate \cs{sidetsep} (or \cs{sidetopsep})
+% would be more valuable than having an explicit 1\cs{onelineskip}.
+%
+% I grouped common code into two macros, and altered \cs{sidebarform} too.
+% \end{quotation}
+%
+% Since then we have been going back and forth, with the result that
+% practically all the complex code is Donald's.
+% \changes{v1.61803}{2008/01/30}{Major rewrite of \cs{sidebar} code
+% (mempatch v4.6 and v4.9)}
+%
+%
+% \begin{macro}{\sideins}
+% Create a new insert called \cs{sideins}, which also creates a corresponding
+% skip, count, dimen, and box. \\
+% \verb?\skip\sideins? is the extra vertical space to allow on the page for
+% the insert, \\
+% \verb?\count\sideins? is the magnification factor for page breaking, \\
+% \verb?\dimen\sideins? is the maximum insertion size (height) per page, \\
+% and the inserted material will be in \verb?\box\sideins? when a page is output.
+% \begin{macrocode}
+\newinsert\sideins
+ \skip\sideins=0pt
+ \count\sideins=0
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidebartopsep}
+% Separation at the top of a sidebar.
+% \begin{macrocode}
+\newlength{\sidebartopsep}
+ \setlength{\sidebartopsep}{0pt}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\setsidebarheight}
+% The macro \cs{setsidebarheight}\marg{length} sets the total
+% height of sidebars on a page to \meta{length}.
+% This is an interface for controlling \verb?\dimen\sideins? properly,
+% taking account of \cs{topskip} and the sidebar font size (and therefore
+% should be invoked \emph{after} declaring \cs{sidebarfont}).
+%
+% Note that \cs{sidebartopsep} is \emph{not} included as part of the
+% allocated height.
+% \begin{macrocode}
+\newcommand{\setsidebarheight}[1]{%
+ \setlength{\dimen\sideins}{#1}%
+ \advance\dimen\sideins-\topskip
+ \advance\dimen\sideins\ht\strutbox}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidebarhsep}
+% \begin{macro}{\sidebarvsep}
+% \begin{macro}{\sidebarwidth}
+% The length \cs{sidebarhsep} is the gap between the typeblock and the sidebar.
+% \cs{sidebarvsep} is the vertical gap between sidebars on a page.
+% The maximum number of sidebar lines on a page is
+% \verb?1 + (\dimen\sideins - \sidebarvsep)?, assuming \verb?\dimen\sideins?
+% is defined in terms of \cs{onelineskip}.
+% The width of the sidebar is \cs{sidebarwidth}.
+% \begin{macrocode}
+\newlength{\sidebarhsep}
+\newlength{\sidebarvsep}
+\newlength{\sidebarwidth}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidebarfont}
+% The font for typesetting the contents of a sidebar.
+% \changes{v1.61803398d}{2010/02/05}{Added a default for \cs{sidebarfont}}
+% \begin{macrocode}
+\newcommand{\sidebarfont}{\normalfont\normalsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsidebars}
+% \cs{setsidebars}\marg{hsep}\marg{width}\marg{vsep}\marg{topsep}\marg{font}\marg{height}
+% sets the main \cs{sidebar} parameters. A \verb?*? argument means leave the
+% setting as is.
+% \changes{v1.61803}{2008/01/30}{Added \cs{setsidebars} (mempatch v4.6)}
+% \begin{macrocode}
+\newcommand*{\setsidebars}[6]{%
+ \nametest{#1}{*}\ifsamename\else
+ \setlength{\sidebarhsep}{#1}\@memznegtest{\sidebarhsep}%
+ \fi
+ \nametest{#2}{*}\ifsamename\else
+ \setlength{\sidebarwidth}{#2}\@memznegtest{\sidebarwidth}%
+ \fi
+ \nametest{#3}{*}\ifsamename\else
+ \setlength{\sidebarvsep}{#3}\@memnegtest{\sidebarvsep}%
+ \fi
+ \nametest{#4}{*}\ifsamename\else
+ \setlength{\sidebartopsep}{#4}%
+ \fi
+ \nametest{#5}{*}\ifsamename\else
+ \def\sidebarfont{#5}%
+ \fi
+ \nametest{#6}{*}\ifsamename\else
+ \setsidebarheight{#6}%
+ \ifdim\dimen\sideins>\z@\else
+%%%% \@memerror{\protect\sidebarheight\space is zero or negative}{\@ehd}%
+ \@memwarn{\protect\sidebarheight\space is zero or negative}%
+ \fi
+ \fi}
+\setsidebars{\marginparsep}% sidebarhsep
+ {\marginparwidth}% sidebarwidth
+ {\onelineskip}% sidebarvsep
+ {0pt}% sidebartopsep
+ {\normalsize\normalfont}% sidebarfont
+ {\textheight}% sidebarheight
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\sidebarform}
+% \cs{sidebarform} sets the `raggedness' in a sidebar. The current definition
+% is less ragged than \cs{raggedright}. Examples:
+% \begin{verbatim}
+% for flushleftright \renewcommand{\sidebarform}{}
+% for raggedleft \renewcommand{\sidebarform}{\raggedleft}
+% \end{verbatim}
+% \changes{v1.4}{2003/11/22}{Added \cs{sidebarform} (from patch v1.5)}
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{sidebarform}}
+% \changes{v1.61803398d}{2010/02/05}{changed to make the text flush
+% against the text}
+% \begin{macrocode}
+\newcommand{\sidebarform}{%\rightskip=\z@ \@plus 2em}
+ %\memRTLrightskip=\z@ \@plus 2em
+ \ifmemtortm\raggedright\else\raggedleft\fi%
+ % \ifmemtortm\memRTLrightskip=\z@ \@plus 2em\else\memRTLleftskip=\z@ \@plus 2em\fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifsidebaroneside}
+% Flag for oneside.
+% \changes{v1.61}{2004/04/05}{Added \cs{ifsidebaroneside}}
+% \changes{v1.61803398d}{2010/02/07}{flaged as deprecated, the macro
+% is not used at all, kept just to ensure that documents does not
+% crash, TO BE DELETED}
+% \begin{macrocode}
+\newif\ifsidebaroneside
+ \if@twoside\sidebaronesidefalse\else\sidebaronesidetrue\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidebarmargin}
+% \begin{macro}{\m@msidebar@margin}
+% \changes{v1.61803398d}{2010/02/07}{removed the mention of
+% \cs{sidebaroneside}, as it is deprecated}
+% \cs{sidebarmargin}\marg{side} sets the side where sidebars will be printed.
+% Valid arguments are: left, right, outer, or inner.
+%
+% \changes{v1.618}{2005/09/03}{Added \cs{sidebarmargin} (mempatch v3.2)}
+% \changes{v1.61803398d}{2010/01/25}{Changed to match new general interface}
+% \begin{macrocode}
+\newcommand*{\sidebarmargin}[1]{%
+ \m@msetm@argin{#1}%
+ \ifnum\m@mm@argin<\z@
+ \@memwarn{Bad \string\sidebarmargin\space argument `#1'\MessageBreak
+ set to `outer'}%
+ \gdef\m@msidebar@margin{2}% set as outer
+ \else
+ \global\let\m@msidebar@margin\m@mm@argin
+ \fi}
+%%%% default outer
+\gdef\m@msidebar@margin{2}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@sideb@left}
+% \begin{macro}{\m@sideb@right}
+% Code used later to put sidebars into the desired margin.
+% \changes{v1.61803}{2008/01/30}{Added \cs{m@sideb@left} and \cs{m@sideb@right}
+% (mempatch v4.6)}
+% \begin{macrocode}
+\newcommand*{\m@sideb@left}{%
+ \@tempdimc \sidebarwidth
+ \advance\@tempdimc\sidebarhsep
+ \kern-\@tempdimc}
+\newcommand*{\m@sideb@right}{%
+ \@tempdimc \columnwidth% or \hsize
+ \advance\@tempdimc\sidebarhsep
+ \kern\@tempdimc}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidecontents}
+% This locates the horizontal position of a sidebar. On two column
+% pages it is put in the margin next to the column where \cs{sidebar}
+% is called, otherwise it is put in the outer (foredge) margin, except
+% for the oneside option when it is put into the right hand margin.
+% This can be separately controlled via \cs{ifsidebaroneside}.
+% Emanuele Vicentini\footnote{\texttt{emanuelevicentini@yahoo.it},
+% private email, 2004/04/05}
+% suggested to code for the oneside option.
+% \changes{v1.61}{2004/04/05}{Changed \cs{sidecontents} for oneside option}
+% \changes{v1.618}{2005/09/03}{Changed \cs{sidecontents} for \cs{sidebarmargin}}
+% \changes{v1.61803}{2008/01/30}{Modified \cs{sidecontents} (mempatch v4.6)}
+% \changes{v1.61803398d}{2010/01/15}{changed to use
+% \cs{m@mwhich@margin} for determining wheter to move right ot left}
+% \begin{macrocode}
+\newcommand{\sidecontents}{\hbox to \z@{%
+ \m@mwhich@margin{\m@msidebar@margin}%
+ \ifmemtortm
+ \m@sideb@right
+ \else
+ \m@sideb@left
+ \fi
+% \end{macrocode}
+% DA and I have gone to and fro on the next bit of code trying to get
+% the top alignment correct.
+% \begin{verbatim}
+% \vtop to0pt{%
+% \vskip\onelineskip
+% \unvbox\sideins \vss}%
+% \end{verbatim}
+% DA has the last word.
+% \begin{macrocode}
+ \vtop to0pt{%
+ \normalsize\normalfont\sidebarfont% select font so we know the strut size
+ \vskip\topskip \vskip-\ht\strutbox
+ \vskip\sidebartopsep% extra vertical shift
+ \unvbox\sideins \vss}%
+ \hss}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidebar}
+% \cs{sidebar}\marg{text} puts \meta{text} into a sidebar.
+%
+% Florence Henry (\texttt{florence.henry@obspm.fr}) in the thread
+% \textit{Of memoir, sidebar, and justification}, 2003/04/02, pointed
+% out that \texttt{itemize} in a \cs{sidebar} could overflow. DA gave the
+% solution hint.
+%
+% DA says that having stacked insertions position properly is difficult.
+% Here he uses the size of the strut to regulate both the height and the
+% depth of each insertion (much as for footnotes). The following is his
+% code and commentary.
+% \changes{v1.4}{2003/11/22}{Revised \cs{sidebar}}
+% \changes{v1.61803}{2008/01/30}{DA's rewrite of \cs{sidebar} (mempatch v4.6)}
+% \begin{macrocode}
+\newcommand{\sidebar}[1]{%
+ \insert\sideins{%
+% \end{macrocode}
+% Begin the insertion with settings. The height of the strut box
+% (dependant on the font) will determine the top alignment both initially
+% and after a page break. The setting for maximum depth does not control
+% anything; see the code further on instead.
+% \changes{v1.61803398d}{2010/02/05}{removed
+% \cs{normalfont}\cs{normalsize}, as these are now in the \cs{sidebarfont}}
+% \changes{v3.6h}{2010/10/29}{the text should have the same baseline
+% stretch as the rest of the page notes.}
+% \begin{macrocode}
+ \hsize\sidebarwidth
+ \@parboxrestore
+ \def\baselinestretch{\m@m@footnote@spacing}%
+% \end{macrocode}
+% \changes{v1.61803398d}{2010/02/05}{Added margin placement check
+% inside \cs{sidebar}}
+% Even though the margin placement is handled inside
+% \cs{sidecontents}, there are some timming issues such that
+% \cs{ifmemtortm} is executed too late for \cs{sidebar}s internals to
+% make use of it. Fixed by adding the margin check to \cs{sidebar} as well.
+% \begin{macrocode}
+ \m@mwhich@margin{\m@msidebar@margin}%
+ \sidebarform\sidebarfont
+ \splittopskip=\ht\strutbox
+ \splitmaxdepth=\dp\strutbox % doesn't do anything useful
+% \end{macrocode}
+% Allow a free split at the top (so this whole insertion moves
+% to the next page if it does not fit).
+% \begin{macrocode}
+ \allowbreak
+% \end{macrocode}
+% Control the (vertical) positioning of non-split entries. Footnotes (and
+% previous versions of \cs{sidebar}) us a strut at the beginning of the text,
+% but we will allow a baseline-skip to perform the same function. This
+% method also introduces a \cs{parskip} when the paragraph begins, so we
+% counteract that. (The problem with an initial strut is that it messes'
+% up entries that begin with vertical space.)
+% \begin{macrocode}
+ \prevdepth=\dp\strutbox % supersedes a "top-strut"
+ \vskip-\parskip
+% \end{macrocode}
+% Now the user's sidebar entry:
+% \begin{macrocode}
+ #1%
+% \end{macrocode}
+% If the entry ended still in a paragraph, take the chance to insert a
+% final strut; then end the paragraph.
+% \begin{macrocode}
+ \ifvmode\else
+ \unskip\@finalstrut\strutbox
+ \fi\par
+% \end{macrocode}
+% Explicitly force the effect of \cs{maxdepth} (\cs{splitmaxdepth}),
+% but using the depth of the strut in the r\^{o}le of \cs{maxdepth}.
+% \begin{macrocode}
+ \ifdim\prevdepth>\dp\strutbox \prevdepth=\dp\strutbox \fi
+% \end{macrocode}
+% Now control how adjacent entries abut (whether or not a final strut got
+% inserted) and how an entry fits at the bottom of the page. Use \cs{vskip}s
+% to move from the text bottom to where a strut would bottom out,
+% but insert an allowed breakpoint at the baseline position
+% (so that the entry baseline may match the page's baseline). Finally
+% insert the extra separation between entries.
+% \begin{macrocode}
+ \ifdim\prevdepth>99\p@
+ \nobreak
+ \vskip-\prevdepth
+ \allowbreak
+ \vskip\dp\strutbox
+ \fi
+ \vskip\sidebarvsep}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Footnotes}
+%
+% For my reference, in case I want to fiddle with it even more
+% than I have already done so, here is the kernel code (from \file{ltfloat.dtx})
+% for footnotes.
+% \DescribeMacro{\footins}
+% The insert for footnotes.
+% \begin{verbatim}
+% \newinsert\footins
+% \skip\footins=\bigskipamount
+% \count\footins=1000
+% \dimen\footins=8in
+% \end{verbatim}
+%
+% \DescribeMacro{\footnoterule}
+% Draws the rule separating footnotes from the main text. It is executed
+% after a \cs{vspace} of \verb?\skip\footins? and should take no vertical
+% space.
+% \begin{verbatim}
+% \def\footnoterule{\kern-3\p@ \hrule \@width 2in \kern 2.6\p@}
+%
+% \@definecounter{footnote}
+% \def\thefootnote{\@arabic\c@footnote}
+% \@definecounter{mpfootnote}
+% \def\thempfootnote{\itshape\@alph\c@mpfootnote}
+% \end{verbatim}
+%
+% \DescribeMacro{\@makefnmark}
+% Generates the footnote marker from \cs{@thefnmark}.
+% \begin{verbatim}
+% \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}
+%
+% \DeclareRobustCommand*\textsuperscript[1]{%
+% \@textsuperscript{\selectfont#1}}
+% \def\@textsuperscript#1{%
+% {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}
+%
+% \newdimen\footnotesep
+% \end{verbatim}
+%
+% \DescribeMacro{\footnote}
+% \cs{footnote}\oarg{num}\marg{text} is what the user uses for footnoting.
+% It defines \cs{@thefnmark} and calls \cs{@footnotemark} and
+% \cs{@footnotetext} to do the work.
+% \begin{verbatim}
+% \def\footnote{\@ifnextchar[\@xfootnote{\stepcounter\@mpfn
+% \protected@xdef\@thefnmark{\thempfn}%
+% \@footnotemark\@footnotetext}}
+% \end{verbatim}
+%
+% \DescribeMacro{\@xfootnote}
+% Handles the optional \meta{num} argument to \cs{footnote}.
+% It defines \cs{@thefnmark} and calls \cs{@footnotemark} and
+% \cs{@footnotetext} to do the work.
+% \begin{verbatim}
+% \def\@xfootnote[#1]{%
+% \begingroup
+% \csname c@\@mpfn\endcsname #1\relax
+% \unrestored@protected@xdef\@thefnmark{\thempfn}%
+% \endgroup
+% \@footnotemark\@footnotetext}
+% \end{verbatim}
+%
+% \DescribeMacro{\@footnotetext}
+% \cs{@footnotetext}\marg{text} sets up for typeseting the footnote
+% (at the bottom of the page). It calls \cs{@makefntext}\marg{text}
+% to actually do the typesetting (\cs{@makefntext} has to be supplied
+% by a class or package).
+% \begin{verbatim}
+% \long\def\@footnotetext#1{%
+% \insert\footins{%
+% \reset@font\footnotesize
+% \interlinepenalty\interfootnotelinepenalty
+% \splittopskip\footnotesep
+% \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+% \hsize\columnwidth \@parboxrestore
+% \protected@edef\@currentlabel{%
+% \csname p@footnote\endcsname\@thefnmark}%
+% \color@begingroup
+% \@makefntext{%
+% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+% \color@endgroup}}
+% \end{verbatim}
+%
+% \DescribeMacro{\footnotemark}
+% \cs{footnotemark}\oarg{num} the user uses this to produce just a
+% footnote mark in the text.
+% \begin{verbatim}
+% \def\footnotemark{%
+% \@ifnextchar[\@xfootnotemark
+% {\stepcounter{footnote}%
+% \protected@xdef\@thefnmark{\thefootnote}%
+% \@footnotemark}}
+% \end{verbatim}
+%
+% \DescribeMacro{\@xfootnotemark}
+% Handles the optional \meta{num} argument to \cs{footnotemark}.
+% \begin{verbatim}
+% \def\@xfootnotemark[#1]{%
+% \begingroup
+% \c@footnote #1\relax
+% \unrestored@protected@xdef\@thefnmark{\thefootnote}%
+% \endgroup
+% \@footnotemark}
+% \end{verbatim}
+%
+% \DescribeMacro{\@footnotemark}
+% Typesets the mark in the main text, via \cs{@makefnmark}.
+% \begin{verbatim}
+% \def\@footnotemark{%
+% \leavevmode
+% \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+% \@makefnmark
+% \ifhmode\spacefactor\@x@sf\fi
+% \relax}
+% \end{verbatim}
+%
+% \DescribeMacro{\footnotetext}
+% \cs{footnotetext}\oarg{num}\marg{text} is user view for creating a footnote
+% without a marker in the main text.
+% \begin{verbatim}
+% \def\footnotetext{%
+% \@ifnextchar [\@xfootnotenext
+% {\protected@xdef\@thefnmark{\thempfn}%
+% \@footnotetext}}
+% \end{verbatim}
+%
+% \DescribeMacro{\@xfootnotetext}
+% Handles the optional \meta{num} argument to \cs{footnotetext}.
+% \begin{verbatim}
+% \def\@xfootnotenext[#1]{%
+% \begingroup
+% \csname c@\@mpfn\endcsname #1\relax
+% \unrestored@protected@xdef\@thefnmark{\thempfn}%
+% \endgroup
+% \@footnotetext}
+% \end{verbatim}
+%
+% \DescribeMacro{\@mpfn}
+% \DescribeMacro{\thempfn}
+% \begin{verbatim}
+% \def\@mpfn{footnote}
+% \def\thempfn{\thefootnote}
+% \end{verbatim}
+%
+% And from \file{ltboxes.dtx} for the \texttt{minipage} environment.
+%
+% \DescribeMacro{\@mpfn}
+% \DescribeMacro{\thempfn}
+% \DescribeMacro{\@footnotetext}
+% When setting up
+% the environment, it includes:
+% \begin{verbatim}
+% \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@
+% \let\@footnotetext\@mpfootnotetext
+% \end{verbatim}
+%
+% \DescribeMacro{\@mpfootnotetext}
+% Later it defines \cs{@mpfootnotetext}\marg{text} as the minipage version
+% of \cs{@footnotetext}.
+% \begin{verbatim}
+% \long\def\@mpfootnotetext#1{%
+% \global\setbox\@mpfootins\vbox{%
+% \unvbox\@mpfootins
+% \reset@font\footnotesize
+% \hsize\columnwidth
+% \@parboxrestore
+% \protected@edef\@currentlabel{%
+% \csname p@mpfootnote\endcsname\@thefnmark}%
+% \color@begingroup
+% \@makefntext{%
+% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+% \color@endgroup}}
+% \end{verbatim}
+%
+% That completes the kernel extracts.
+%
+% \begin{macro}{\footnoterule}
+% Usually, footnotes are separated from the main body of the text
+% by a small rule. This rule is drawn by the macro \cs{footnoterule}.
+% We have to make sure that the rule takes no vertical space (see
+% \file{plain.tex}) so we compensate for the natural heigth of the
+% rule of 0.4pt by adding the right amount of vertical skip.
+%
+% To prevent the rule from colliding with the footnote we first add
+% a little negative vertical skip, then we put the rule and make
+% sure we end up at the same point where we begun this operation.
+% \changes{v3.6k}{2013/05/08}{Added \cs{normalcolor}, this seems to
+% fix a color leak into paragraph footnotes.}
+% \begin{macrocode}
+\renewcommand{\footnoterule}{%
+ \kern-3\p@
+ \normalcolor% added 2013/05/08
+ \hrule width .4\columnwidth
+ \kern 2.6\p@}
+% \end{macrocode}
+% And just to make sure that we are using memoir's font-dependent
+% skips:
+% \begin{macrocode}
+\skip\footins=\bigskipamount
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@footnote}
+% Footnotes are numbered per chapter. The counter is predefined.
+% \begin{macrocode}
+\@addtoreset{footnote}{chapter}
+% \end{macrocode}
+% \end{macro}
+%
+% The footnote mechanism of \LaTeX{} calls the macro \cs{@makefntext}
+% to produce the actual footnote. The macro gets the text of the
+% footnote as its argument and should use \cs{@thefnmark} as the mark
+% of the footnote. The macro \cs{@makefntext} is called when
+% effectively inside a \cs{parbox} of width \cs{columnwidth} (i.e.,
+% with \cs{hsize} = \cs{columnwidth}).
+%
+% An example of what can be achieved is given by the following piece
+% of \TeX{} code.
+% \begin{verbatim}
+% \long\def\@makefntext#1{%
+% \@setpar{\@@par
+% \@tempdima = \hsize
+% \advance\@tempdima-10pt
+% \parshape \@ne 10pt \@tempdima}%
+% \par
+% \parindent 1em\noindent
+% \hbox to \z@{\hss\@makefnmark}#1}
+% \end{verbatim}
+% The effect of this definition is that all lines of the footnote
+% are indented by 10pt, while the first line of a new paragraph is
+% indented by 1em. To change these dimensions, just substitute the
+% desired value for `10pt' (in both places) or `1em'. The mark is
+% flushright against the footnote.
+%
+% The standard classes use a simpler macro, in which the
+% footnote text is set like an ordinary text paragraph, with no
+% indentation except on the first line of a paragraph, and the
+% first line of the footnote. Thus, all the macro must do is set
+% \cs{parindent} to the appropriate value for succeeding paragraphs
+% and put the proper indentation before the mark.
+% \begin{verbatim}
+% \newcommand{\@makefntext}[1]{%
+% \parindent 1em%
+% \noindent
+% \hb@xt@1.8em{\hss\@makefnmark}#1}
+% \end{verbatim}
+%
+% This class provides a configurable specification.
+%
+% Normally, if two or more footnotes are sequentially applied: \\
+% \verb?...text\footnote{first}\footnote{second}...? \\
+% the markers in the text run together
+% (e.g., \ldots text\textsuperscript{12}).
+% The class provides a separator between the markers
+% (e.g., \ldots text\textsuperscript{1,2}).
+% The underlying ideas for this are from the \Lpack{ledmac}
+% package~\cite{LEDMAC},
+% which in turn got them from the \Lpack{footmisc} package~\cite{FOOTMISC}.
+% \changes{v1.4}{2003/11/22}{Added footnote separator (from patch v1.5)}
+%
+% \begin{macro}{\multfootsep}
+% The separator between multiple footnote markers.
+% \begin{macrocode}
+\newcommand*{\multfootsep}{\textsuperscript{\normalfont,}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\multiplefootnotemarker}
+% \begin{macro}{\m@mmf@prepare}
+% \cs{m@mmf@prepare} is a pair of self-cancelling kerns.
+% \begin{macrocode}
+\newcommand*{\multiplefootnotemarker}{3sp}
+\newcommand*{\m@mmf@prepare}{%
+ \kern-\multiplefootnotemarker
+ \kern\multiplefootnotemarker\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mmf@check}
+% If \cs{m@mmf@check} recognises the last kern as \cs{multiplefootnotemarker}
+% it typesets \cs{multfootsep}.
+% \begin{macrocode}
+\newcommand*{\m@mmf@check}{%
+ \ifdim\lastkern=\multiplefootnotemarker\relax
+ \edef\@x@sf{\the\spacefactor}%
+ \unkern
+ \multfootsep
+ \spacefactor\@x@sf\relax
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@footnotemark}
+% We have to modify the kernel's % \cs{@footnotetext} and
+% \cs{@footnotemark}
+% to implement the separator.
+% \changes{v1.618}{2005/09/03}{Stop body font changes leaking into footnotes (mempatch v3.7)}
+% \changes{v1.61803}{2008/01/30}{Keep single spacing in footnotes (mempatch v4.6)}
+% \changes{v3.6g}{2010/09/19}{Made the 'single spacing' configurable.}
+% \changes{v3.6h}{2010/20/22}{\cs{@footnotetext} is redefined later
+% on, so the \cs{m@mold@footnotetext} needs to be moved, we also
+% remove this version of \cs{@footnotetext} such that people do
+% not mistake this for the `real' \cs{@footnotetext}}.
+% \begin{macrocode}
+\renewcommand*{\@footnotemark}{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check
+ \nobreak
+ \fi
+ \@makefnmark
+ \m@mmf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@pn@multiple@marker}
+% This controls the multiple marker handling for successive page
+% notes, i.e., adding a comma between them.
+% \changes{v3.6k}{2013/05/16}{Added hooks, they are not intended for users}
+% \begin{macrocode}
+\newcommand{\mem@pn@multiple@marker}[1]{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check
+ \nobreak
+ \fi
+ \@nameuse{mem@pnmm@start@hook}%
+ #1%
+ \@nameuse{mem@pnmm@end@hook}%
+ \m@mmf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+% \end{macrocode}
+%
+% \end{macro}
+% %
+% \begin{macro}{\footmarkwidth}
+% \begin{macro}{\footmarksep}
+% \begin{macro}{\footparindent}
+% The mark is typset right justified in a box with width \cs{footmarkwidth}.
+% Second and later lines of the text are offset \cs{footmarksep} from the
+% end of the box. Paragraphs in footnotes are indented by \cs{parindent}.
+% \begin{macrocode}
+\newlength{\footmarkwidth}
+\newlength{\footmarksep}
+\newlength{\footparindent}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\footmarkstyle}
+% \begin{macro}{\footscript}
+% The marker is typeset according to \cs{footscript}\marg{marker}. This
+% can be specified by the user via \cs{footmarkstyle}.
+% \begin{macrocode}
+\newcommand*{\footmarkstyle}[1]{\def\footscript##1{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makefootmarkhook}
+% A vacuous macro that the user can redefine to do something useful?
+% \begin{macrocode}
+\newcommand{\makefootmarkhook}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footfootmark}
+% This macro typesets the footnote marker.
+% \begin{macrocode}
+\newcommand{\footfootmark}{%
+ \ifdim\footmarkwidth < \z@
+% \end{macrocode}
+% Negative width, mark is in the margin.
+% \begin{macrocode}
+ \llap{\hb@xt@ -\footmarkwidth{%
+ \hss\normalfont\footscript{\@thefnmark}}%
+ \hspace*{-\footmarkwidth}}%
+ \else
+ \ifdim\footmarkwidth = \z@
+% \end{macrocode}
+% Zero width, mark is at (inside) the margin.
+% \begin{macrocode}
+ {\normalfont\footscript{\@thefnmark}}%
+ \else
+% \end{macrocode}
+% Positive width.
+% \begin{macrocode}
+ \hb@xt@\footmarkwidth{\hss\normalfont\footscript{\@thefnmark}}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makefootmark}
+% \begin{macro}{\@makefntext}
+% The class version of \cs{@makefntext}.
+% \begin{macrocode}
+\newcommand{\makefootmark}[1]{%
+ \leavevmode
+ \parindent \footparindent\noindent
+ \leftskip\footmarksep\relax
+ \advance\leftskip \footmarkwidth \null\nobreak\hskip -\leftskip\relax
+ \makefootmarkhook\relax
+ \footfootmark #1}
+% \end{macrocode}
+% In the thread \textit{memoir and footnote.sty trouble}, 2003/04/02,
+% Patrik Nyman (\texttt{patrik.nyman@orient.su.se}) noted that in order
+% to stop \file{footnote.sty} (from \texttt{mdwtools}) barfing my original \\
+% \verb?\newcommand{\@makefntext}[1]{\makefootmark{#1}}? \\
+% had to be changed.
+% \changes{v1.4}{2004/11/22}{Revised \cs{@makefntext}}
+% \begin{macrocode}
+\newcommand{\@makefntext}[1]{\makefootmark #1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% All that now remains for the footer part is to set the defaults.
+% \begin{macrocode}
+\footmarkstyle{\textsuperscript{#1}}
+\setlength{\footmarkwidth}{1.8em}
+\setlength{\footmarksep}{-1.8em}
+\setlength{\footparindent}{1em}
+
+% \end{macrocode}
+%
+% \begin{macro}{\@makefnmark}
+% The footnote markers that are printed in the text to point to the
+% footnotes should be produced by the macro \cs{@makefnmark}. We use
+% the default definition for it.
+% \begin{macrocode}
+%\renewcommand\@makefnmark{\hbox{\@textsuperscript{%
+% \normalfont\@thefnmark}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footref}
+% Sometimes it is desireable to reference a footnote more than
+% once.
+% If a footnote is labelled (e.g., \verb?\footnote{text\label{fn}}?) then
+% the macro \cs{footref}\marg{fn} will print the footnote marker.
+% The code is essentially a much simplified version of \cs{footnotemark}
+% from \file{ltfloat.dtx}.
+% \changes{v1.0}{2001/10/30}{Added \cs{footref}}
+% \begin{macrocode}
+\newcommand{\footref}[1]{%
+ \begingroup
+ \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
+ \endgroup
+ \@footnotemark}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The following code for footnotes that can include verbatims is based
+% on Jeremy Gibbons \textit{`Footnotes with verbatim material'}
+% in the column \textit{`Hey --- it works'} (edited by Jeremy Gibbons),
+% TeX and TUG NEWS, vol 2 no. 4, p 9, October 1993. I have updated
+% the basic code so that it works for LaTeX2e.
+%
+% \begin{macro}{\verbfootnote}
+% \begin{macro}{\@xverbfootnote}
+% \cs{verbfootnote} is just like \cs{footnote} except that it can contain
+% verbatim material.
+% \begin{macrocode}
+\def\verbfootnote{\@ifnextchar[\@xverbfootnote{\stepcounter\@mpfn
+ \protected@xdef\@thefnmark{\thempfn}%
+ \@footnotemark\@verbfootnotetext}}
+
+\def\@xverbfootnote[#1]{%
+ \begingroup
+ \csname c@\@mpfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thefnmark{\thempfn}%
+ \endgroup
+ \@footnotemark\@verbfootnotetext}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@verbfootnotetext}
+% This is the secret ingredient. It is based on the \cs{footnote} macro
+% in \theTeXbook{} page 363, which somehow manages to read an argument
+% with verbatims. As Knuth says that it is subtle and involves trickery,
+% don't expect me to even try to explain anything.
+%
+% I'm not at all sure about the color bits, though!
+% \changes{v1.618}{2005/09/02}{Fixed colors in \cs{verbfootnote} (mempatch v2.3)}
+% \begin{macrocode}
+\long\def\@verbfootnotetext{%
+ \insert\footins\bgroup
+ \footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+%%%% \color@begingroup
+ \@makefntext{\rule{\z@}{\footnotesep}\ignorespaces}%
+ \futurelet\next\fo@t
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fo@t}
+% \begin{macro}{\f@@t}
+% \begin{macro}{\f@t}
+% \begin{macro}{\@foot}
+% Guess what these do.
+% \changes{v1.61803}{2008/01/30}{Added \cs{m@mmf@prepare} to \cs{@foot} to
+% implement the multifootnotemark separator (noted by zarko, CTT 2005/01/15)}
+% \begin{macrocode}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else \let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{%
+ \color@begingroup
+ #1\@foot
+ \color@endgroup}
+\def\@foot{%
+ \strut\egroup
+%%%% \color@endgroup
+ \m@mmf@prepare
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@verbmpfootnotetext}
+% Footnotes in minipages are a little different, so another
+% version of \cs{...footnotetext}.
+% \begin{macrocode}
+\long\def\@verbmpfootnotetext{%
+ \global\setbox\@mpfootins\vbox{%
+ \reset@font\footnotesize
+ \unvbox\@mpfootins
+ \bgroup
+ \hsize\columnwidth
+ \@parboxrestore
+ \edef\@currentlabel{\csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{\rule{\z@}{\footnotesep}\ignorespaces}%
+ }
+ \futurelet\next\fo@t
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@minipagerestore}
+% To get the \cs{verbfootnote} to work in a \texttt{minipage} we have to use
+% \cs{@verbmpfootnotetext} instead of \cs{@verbfootnotetext}. There is
+% a nice hook in the kernel \texttt{minipage} code for this.
+%
+% As of version 1.61803 the following code is placed earlier. \\
+% \verb?\def\@minipagerestore{\let\@verbfootnotetext\@verbmpfootnotetext}?
+% \end{macro}
+%
+%
+% \subsection{Major extensions for footnotes}
+%
+% \begin{macrocode}
+%%%%%%%%%%%%%% major extension to footnoting
+
+% \end{macrocode}
+%
+% This all requires modifications to the output routine's \cs{@makecol},
+% which will be done later.
+%
+% \begin{macro}{\setfootnoterule}
+% Per Starb\"{a}ck found (CTT \textit{feetbelowfloat in memoir}, 2006/11/24)
+% that \cs{feetbelowfloat} did not affect anything when \cs{raggedbottom}
+% is in effect.
+%
+% \cs{setfootnoterule}\oarg{vfill}\marg{uplift}\marg{width}\marg{thickness}
+% defines the \cs{footnoterule}. Memoir's default setting is \\
+% \verb?\setfootnoterule{3pt}{0.4\columnwidth}{\normalrulethickness}? \\
+% To force footnotes to the bottom after a \cs{raggedbottom} use \\
+% \verb?\setfootnoterule[\vfill]{3pt}{0.4\columnwidth}{\normalrulethickness}?
+% \changes{v1.61803}{2008/01/30}{Added \cs{setfootnoterule} (memptatch v4.6)}
+% \changes{v3.6k}{2013/05/08}{Added \cs{normalcolor}, this seems to
+% fix a color leak into paragraph footnotes.}
+% \begin{macrocode}
+\newcommand*{\setfootnoterule}[4][]{%
+ \def\footnoterule{\kern -#2\relax #1\relax
+ \normalcolor% added 2013/05/08
+ \hrule width #3\relax
+ \kern #2\kern-#4}}
+\setfootnoterule{3pt}{0.4\columnwidth}{\normalrulethickness}
+
+% \end{macrocode}
+% \end{macro}
+%
+% All sorts of extra kinds of footnotes.
+%
+% \begin{macro}{\m@mdoextrafeet}
+% \begin{macro}{\extrafeetins}
+% \begin{macro}{\extrafeetinshook}
+% These macros are hooks into \cs{@makecol}.
+% \changes{v1.618}{2005/09/02}{Fixed memoir/listings spacing problem (from Cartsten Heinz, mempatch v2.3)}
+% \changes{v1.618}{2005/09/03}{Set \cs{boxmaxdepth} in \cs{extrafeetins} (mmempatch v3.1)}
+% \begin{macrocode}
+\newcommand{\m@mdoextrafeet}{\extrafeetins}
+\newcommand*{\extrafeetins}{%
+ \setbox\@outputbox \vbox{%
+ \boxmaxdepth \@maxdepth
+ \unvbox\@outputbox
+ \ifvoid\footinsv@r\else\@footstartv@r\@footgroupv@r\fi
+ \extrafeetinshook}}
+\newcommand{\extrafeetinshook}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mdodoreinextrafeet}
+% \begin{macro}{\extrafeetreinshook}
+% Hooks into \cs{@reinserts} for multiple footnote kinds.
+% \begin{macrocode}
+\newcommand{\m@mdodoreinextrafeet}{%
+ \ifvoid\footinsv@r\else\insert\footinsv@r{\unvbox\footinsv@r}\fi
+ \extrafeetreinshook}
+\newcommand{\extrafeetreinshook}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\foottextfont}
+% \begin{macro}{\footinsdim}
+% \begin{macro}{\@preamfntext}
+% General macros.
+% \begin{macrocode}
+\newcommand{\foottextfont}{\footnotesize}
+\newlength{\footinsdim}
+ \setlength{\footinsdim}{8in} % standard for \dimen\footins
+\newcommand{\@preamfntext}{%
+ \interlinepenalty\interfootnotelinepenalty
+ \floatingpenalty \@MM
+ \splittopskip=\footnotesep
+ \splitmaxdepth=\dp\strutbox
+ \@parboxrestore}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% We are going to change some of the kernel footnote macros
+%
+% \begin{macro}{\@mpfootnotetext}
+% \begin{macro}{\@plainmpfootnotetext}
+% \changes{v1.6180}{2006/06/12}{Stop font changes leaking into footnotes.
+% The v1.618 change was too early}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable'}
+% \begin{macrocode}
+\renewcommand{\@mpfootnotetext}[1]{%
+ \global\setbox\@mpfootins\vbox{%
+ \unvbox\@mpfootins
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \foottextfont \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \reset@font%
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces{\foottextfont #1}%
+ \@finalstrut\strutbox}%
+ \color@endgroup}}
+
+% \end{macrocode}
+% Save our revised version of \cs{@mpfootnotetext}
+% \changes{v3.6h}{2010/10/22}{\cs{m@mold@mpfootnotetext} renamed to \cs{@plainmpfootnotetext}}
+% \begin{macrocode}
+\let\@plainmpfootnotetext\@mpfootnotetext
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% We also to patch the minipage environment. We can use
+% \cs{@minipagerestore} for the \texttt{begin} part (done earlier),
+% but have to
+% modify \cs{endminipage}
+%
+% \begin{macro}{\m@mdoextrafeetmini}
+% \begin{macro}{\extrafeetminihook}
+% \begin{macro}{\@minipagerestore}
+% \begin{macrocode}
+\newcommand{\m@mdoextrafeetmini}{%
+ \extrafeetminihook}
+\newcommand{\extrafeetminihook}{}
+%%%%\renewcommand{\@minipagerestore}{\m@mdoextrafeetmini}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\extrafeetendmini}
+% \begin{macro}{\extrafeetendminihook}
+% \begin{macrocode}
+\newcommand{\extrafeetendmini}{%
+ \ifvoid\@mpfootinsv@r\else
+ \vskip\skip\@mpfootins
+ \normalcolor\footnoterule\mp@footgroupv@r
+ \fi
+ \extrafeetendminihook}
+\newcommand{\extrafeetendminihook}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mdoextrafeetendmini}
+% \begin{macro}{\endminipage}
+% This is our patched version of \cs{endminipage}.
+% \begin{macrocode}
+\newcommand{\m@mdoextrafeetendmini}{\extrafeetendmini}
+\def\endminipage{%
+ \par
+ \unskip
+ \ifvoid\@mpfootins\else
+ \vskip\skip\@mpfootins
+ \normalcolor
+ \footnoterule
+ \unvbox\@mpfootins
+ \fi
+ \m@mdoextrafeetendmini
+ \@minipagefalse
+ \color@endgroup
+ \egroup
+ \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\plainfootnotes}
+% The declaration for standard footnotes; easy, just use the saved
+% versions of \cs{@footnotetext} and \cs{@mpfootnotetext}.
+% \changes{v3.6h}{2010/10/22}{\cs{m@mold@footnotetext} renamed
+% \cs{@plainfootnotetext} and \cs{m@mold@mpfootnotetext} as \cs{@plainmpfootnotetext}}
+% \begin{macrocode}
+\newcommand{\plainfootnotes}{%
+ \let\@footnotetext\@plainfootnotetext
+ \let\@mpfootnotetext\@plainmpfootnotetext}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Now for lots of somewhat tedious code, interspersed with complex
+% `Dirty Tricks' type things.
+%
+% Robert Schlicht~\footnote{Private email, 2004/03/12,
+% (\texttt{w.m.l@gmx.net})} [RS] has provided valuable help in tuning
+% up the code.
+%
+%
+% \begin{macro}{\newfootnoteseries}
+% \cs{newfootnoteseries}\marg{series} creates the set of macros required
+% for footnote code (see the kernel code presented earlier).
+% The created macros have \meta{series} appended to their name.
+% \changes{v1.61}{2004/03/14}{Added skip setup to \cs{newfootnoteseries}}
+% \changes{v1.61}{2004/03/24}{Use \cs{newcounter} instead of \cs{newcount}
+% in \cs{newfootnoteseries}}
+% \begin{macrocode}
+\newcommand{\newfootnoteseries}[1]{%
+ \expandafter\newinsert\csname footins#1\endcsname% -> \footins#1
+ \expandafter\skip\csname footins#1\endcsname \bigskipamount%
+%%% - > \skip\footins#1 % [RS]
+ \newcounter{footnote#1}% -> \c@footnote#1
+ \@nameuse{c@footnote#1} \z@% -> \c@footnote#1=0
+ \global\@namelet{p@footnote#1} \@empty% -> \p@footnote#1
+ \@namedef{thefootnote#1}{\arabic{footnote#1}}% -> \thefootnote#1
+ \@namedef{foottextfont#1}{\foottextfont}% -> \foottextfont#1
+ \m@makefootnote{#1}% -> \footnote#1
+ \m@make@xfootnote{#1}% -> \@xfootnote#1
+ \m@make@footnotetext{#1}% -> \@footnotetext#1
+ \m@makefootnotemark{#1}% -> \footnotemark#1
+ \m@make@xfootnotemark{#1}% -> \@xfootnotemark#1
+ \m@make@footnotemark{#1}% -> \@footnotemark#1
+ \m@makefootnotetext{#1}% -> \footnotetext#1
+ \m@make@xfootnotenext{#1}% -> \@xfootnotenext#1
+ \m@make@mpfn{#1}% -> \@mpfn#1
+ \m@makethempfn{#1}% -> \thempfn#1
+ \m@make@makefnmark{#1}% -> \@makefnmark#1
+ \m@makefootref{#1}% -> \footref#1
+ \m@makefootfootmark{#1}% -> \footfootmark#1
+ \m@makemakefootmark{#1}% -> \makefootmark#1
+ \m@makefootmarkstyle{#1}% -> \footmarkstyle#1
+ \@namedef{@makefntext#1}##1{\@nameuse{makefootmark#1} ##1}%
+ \m@make@footstart{#1}% -> \@footstart#1
+ \m@make@footgroup{#1}% -> \@footgroup#1
+ \expandafter\newinsert\csname @mpfootins#1\endcsname% -> \@mpfootins#1
+ \newcounter{mpfootnote#1}% -> \c@mpfootnote#1
+ \global\@namelet{p@mpfootnote#1}\@empty
+ \@namedef{thempfootnote#1}{\itshape\alph{mpfootnote#1}}%
+ \m@make@mpfootnotetext{#1}% -> \@mpfootnotetext#1
+% \end{macrocode}
+% Reset the counter per chapter, except for articles.
+% \changes{v1.6}{2004/03/14}{Added chapter reset for footnote series [RS]}
+% \begin{macrocode}
+ \ifartopt\else% [RS]
+ \expandafter\@cons\csname cl@chapter\endcsname {{footnote#1}}%
+ \fi
+% \end{macrocode}
+% Add the footnote to the (re)insert hooks.
+% \begin{macrocode}
+ \g@addto@macro{\extrafeetinshook}{%
+ \ifvoid\@nameuse{footins#1}\else
+ \@nameuse{@footstart#1}\@nameuse{@footgroup#1}\fi}
+ \g@addto@macro{\extrafeetreinshook}{%
+ \ifvoid\@nameuse{footins#1}\else
+ \insert\@nameuse{footins#1}{\unvbox\@nameuse{footins#1}}\fi}
+ \g@addto@macro{\extrafeetendminihook}{%
+ \ifvoid\@nameuse{@mpfootins#1}\else
+ \vskip\skip\@mpfootins
+ \normalcolor\footnoterule\@nameuse{mp@footgroup#1}\fi}
+ \g@addto@macro{\extrafeetminihook}{%
+ \@namedef{@mpfn#1}{mpfootnote#1}
+ \@namedef{thempfn#1}{\@nameuse{thempfootnote#1}}
+ \csname c@mpfootnote#1\endcsname\z@
+ \expandafter\let\expandafter\@t@mp \csname @mpfootnotetext#1\endcsname
+ \expandafter\let \csname @footnotetext#1\endcsname \@t@mp}
+ \g@addto@macro{\@mem@extranofeet}{% % [RS]
+ \ifvoid\@nameuse{footins#1}\else\@mem@nofootfalse\fi}
+ \plainfootstyle{#1}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootnote}
+% \cs{m@makefootnote}\marg{series} creates \cs{footnote<series>}
+% \changes{v1.4}{2004/01/21}{In \cs{m@makefootnote} changed \cs{advance}
+% to \cs{stepcounter} to make change global}
+% \begin{macrocode}
+\newcommand{\m@makefootnote}[1]{
+ \@namedef{footnote#1}{\@ifnextchar[
+ {\@nameuse{@xfootnote#1}}{%\advance \@nameuse{c@\@mpfn#1} by \@ne
+ \stepcounter{\@mpfn#1}%
+ \@name@p@xdef{@thefnmark#1}{\@nameuse{thempfn#1}}%
+ \@nameuse{@footnotemark#1}\@nameuse{@footnotetext#1}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@xfootnote}
+% \cs{m@make@xfootnote}\marg{series} creates \cs{@xfootnote<series>}
+% \begin{macrocode}
+\newcommand{\m@make@xfootnote}[1]{
+ \@namedef{@xfootnote#1}[##1]{%
+ \begingroup
+ \csname c@\@mpfn#1\endcsname ##1\relax
+ \@name@unresp@xdef{@thefnmark#1}{\@nameuse{thempfn#1}}%
+ \endgroup
+ \@nameuse{@footnotemark#1}\@nameuse{@footnotetext#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@footnotetext}
+% \cs{m@make@footnotetext}\marg{series} creates \cs{@footnotetext<series>}
+% \changes{v1.6180339a}{2008/08/07}{Removed a space from
+% \cs{m@make@footnotetext} and \cs{m@make@mpfootnotetext}
+% (courtesy David Wilson)}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@footnotetext}[1]{%
+ \@namelongdef{@footnotetext#1}##1{%
+ \insert\@nameuse{footins#1}{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \@preamfntext
+ \hsize\columnwidth
+ \protected@edef\@currentlabel{%
+ \csname p@footnote#1\endcsname\@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@makefntext#1}{%
+ \rule\z@\footnotesep\ignorespaces{\@nameuse{foottextfont#1}##1}% <- v1.6180339a
+ \@finalstrut\strutbox}%
+ \color@endgroup}%
+ \m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mpfootnotetext}
+% \cs{m@make@mpfootnotetext}\marg{series} creates \cs{@mpfootnotetext<series>}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@mpfootnotetext}[1]{%
+ \@namelongdef{@mpfootnotetext#1}##1{%
+ \global\setbox\@nameuse{@mpfootins#1}\vbox{%
+ \unvbox\@nameuse{@mpfootins#1}%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote#1\endcsname\@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@makefntext#1}{%
+ \rule\z@\footnotesep\ignorespaces{\@nameuse{foottextfont#1}##1}% <- v1.6180339a
+ \@finalstrut\strutbox}%
+ \color@endgroup}%
+ \m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootnotemark}
+% \changes{v1.61}{2004/03/24}{Changed \cs{advance} to \cs{stepcounter}
+% in \cs{m@makefootnotemark}}
+% \cs{m@makefootnotemark}\marg{series} creates \cs{footnotemark<series>}
+% \begin{macrocode}
+\newcommand{\m@makefootnotemark}[1]{
+\@namedef{footnotemark#1}{%
+ \@ifnextchar[ {\@nameuse{@xfootnotemark#1}}
+ {%\advance\@nameuse{c@footnote#1} by \@ne%
+ \stepcounter{footnote#1}%
+ \@name@p@xdef{@thefnmark#1}{\@nameuse{thefootnote#1}}%
+ \@nameuse{@footnotemark#1}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@xfootnotemark}
+% \cs{m@make@xfootnotemark}\marg{series} creates \cs{@xfootnotemark<series>}
+% \begin{macrocode}
+\newcommand{\m@make@xfootnotemark}[1]{%
+ \@namedef{@xfootnotemark#1}[##1]{%
+ \begingroup
+ \@nameuse{c@footnote#1} ##1\relax
+ \@name@unresp@xdef{@thefnmark#1}{\@nameuse{thefootnote#1}}%
+ \endgroup
+ \@nameuse{@footnotemark#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@footnotemark}
+% \cs{m@make@footnotemark}\marg{series} creates \cs{@footnotemark<series>}
+% \begin{macrocode}
+\newcommand{\m@make@footnotemark}[1]{%
+\@namedef{@footnotemark#1}{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check
+ \nobreak
+ \fi
+ \@nameuse{@makefnmark#1}%
+ \m@mmf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootmarkstyle}
+% \cs{m@makefootmarkstyle}\marg{series} creates \cs{footmarkstyle<series>}
+% \begin{macrocode}
+\newcommand{\m@makefootmarkstyle}[1]{%
+ \@namedef{footmarkstyle#1}##1{%
+ \@namedef{footscript#1}####1{##1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootnotetext}
+% \cs{m@makefootnotetext}\marg{series} creates \cs{footnotetext<series>}
+% \begin{macrocode}
+\newcommand{\m@makefootnotetext}[1]{%
+\@namedef{footnotetext#1}{%
+ \@ifnextchar[ {\@nameuse{@xfootnotenext#1}}%
+ {\@name@p@xdef{@thefnmark#1}{\@nameuse{thempfn#1}}%
+ \@nameuse{@footnotetext#1}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@xfootnotenext}
+% \cs{m@make@xfootnotenext}\marg{series} creates \cs{@xfootnotenext<series>}
+% \begin{macrocode}
+\newcommand{\m@make@xfootnotenext}[1]{
+\@namedef{@xfootnotenext#1}[##1]{%
+ \begingroup
+ \csname c@\@mpfn#1\endcsname ##1\relax
+ \@name@unresp@xdef{@thefnmark#1}{\@nameuse{thempfn#1}}%
+ \endgroup
+ \@nameuse{@footnotetext#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mpfn}
+% \cs{m@make@mpfn}\marg{series} creates \cs{@mpfn<series>}
+% \begin{macrocode}
+\newcommand{\m@make@mpfn}[1]{%
+ \@namedef{@mpfn#1}{\@nameuse{footnote#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makethempfn}
+% \cs{m@makethempfn}\marg{series} creates \cs{thempfn<series>}
+% \begin{macrocode}
+\newcommand{\m@makethempfn}[1]{%
+ \@namedef{thempfn#1}{\@nameuse{thefootnote#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@makefnmark}
+% \cs{m@make@makefnmark}\marg{series} creates \cs{@makefnmark<series>}
+% \begin{macrocode}
+\newcommand{\m@make@makefnmark}[1]{%
+ \@namedef{@makefnmark#1}{%
+ \hbox{\@textsuperscript{\normalfont\@nameuse{@thefnmark#1}}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootref}
+% \cs{m@makefootref}\marg{series} creates \cs{footref<series>}
+% \begin{macrocode}
+\newcommand{\m@makefootref}[1]{%
+ \@namedef{footref#1}##1{%
+ \begingroup
+ \@name@unresp@xdef{@thefnmark#1}{\ref{##1}}%
+ \endgroup
+ \@nameuse{@footnotemark#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makefootfootmark}
+% \cs{m@makefootfootmark}\marg{series} creates \cs{footfootmark<series>}
+% \begin{macrocode}
+\newcommand{\m@makefootfootmark}[1]{%
+ \@namedef{footfootmark#1}{%
+ \ifdim\footmarkwidth < \z@
+ \llap{\hb@xt@ -\footmarkwidth{%
+ \hss\normalfont\@nameuse{footscript#1}%
+ {\@nameuse{@thefnmark#1}}}%
+ \hspace*{-\footmarkwidth}}%
+ \else
+ \ifdim\footmarkwidth = \z@
+ {\normalfont\@nameuse{footscript#1}{\@nameuse{@thefnmark#1}}}%
+ \else
+ \hb@xt@\footmarkwidth{%
+ \hss\normalfont\@nameuse{footscript#1}%
+ {\@nameuse{@thefnmark#1}}}%
+ \fi
+ \fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makemakefootmark}
+% \changes{v1.61}{2004/03/23}{Removed extraneous space from \cs{m@makemakefootmark}}
+% \cs{m@makemakefootmark}\marg{series} creates \cs{makefootmark<series>}
+% \begin{macrocode}
+\newcommand{\m@makemakefootmark}[1]{%
+ \@namedef{makefootmark#1}##1{%
+ \leavevmode
+ \parindent \footparindent\noindent
+ \leftskip\footmarksep\relax
+ \advance\leftskip \footmarkwidth
+ \null\nobreak\hskip -\leftskip\relax
+ \makefootmarkhook\relax
+ \@nameuse{footfootmark#1}##1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@footgroup}
+% \cs{m@make@footgroup}\marg{series} creates \cs{@footgroup<series>}
+% \begin{macrocode}
+\newcommand{\m@make@footgroup}[1]{%
+ \@namedef{@footgroup#1}{\unvbox\@nameuse{footins#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@makemp@footgroup}
+% \cs{m@makemp@footgroup}\marg{series} creates \cs{mp@footgroup<series>}
+% \begin{macrocode}
+\newcommand{\m@makemp@footgroup}[1]{%
+ \@namedef{mp@footgroup#1}{\unvbox\@nameuse{@mpfootins#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@footstart}
+% \cs{m@make@footstart}\marg{series} creates \cs{@footstart<series>}.
+%
+% The footnote series should of course use
+% the skip associated with that series not just
+% \cs{vskip}\cs{bigskipamount}.
+% \changes{v3.7d}{2015/04/22}{Changed the \cs{vskip}}
+% \changes{v3.7d}{2015/04/22}{Added the feet at bottom part}
+% \begin{macrocode}
+\newcommand{\m@make@footstart}[1]{%
+ \@namedef{@footstart#1}{%
+ %\vskip\bigskipamount
+ \mem@if@flushbottomF\m@mopfn@bottom
+ \vskip\skip\csname footins#1\endcsname
+ \leftskip=\z@
+ \rightskip=\z@
+ \footnoterule}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\plainfootstyle}
+% \cs{plainfootstyle}\marg{series} specifies a plain (normal) footnote
+% style for \meta{series}.
+% \begin{macrocode}
+\newcommand{\plainfootstyle}[1]{%
+ \m@make@footnotetext{#1}%
+ \m@make@footgroup{#1}%
+ \m@make@footstart{#1}%
+ \m@make@mpfootnotetext{#1}%
+ \m@makemp@footgroup{#1}%
+ \@nameuse{footmarkstyle#1}{\textsuperscript{##1}}
+ \expandafter\dimen\csname footins#1\endcsname=\footinsdim
+ \expandafter\count\csname footins#1\endcsname=1000\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Now the basic code for footnote declarations (we will be
+% using \texttt{footnotev@r} instead of the regular \texttt{footnote}).
+%
+% \begin{macro}{\footinsv@r}
+% Define the new \cs{footinsv@r} insert.
+% \begin{macrocode}
+\newinsert\footinsv@r
+ \skip\footinsv@r\bigskipamount
+ \count\footinsv@r=1000 % no magnifcation
+ \dimen\footinsv@r=\footinsdim
+% \end{macrocode}
+% \end{macro}
+% Create a new \verb?v@r? footnote series.
+% \begin{macrocode}
+\m@make@footstart{v@r}
+% \end{macrocode}
+%
+% \begin{macro}{\@footgroupv@r}
+% Initialise the \texttt{footgroup} for the series to do nothing.
+% \begin{macrocode}
+\newcommand{\@footgroupv@r}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% And also for minipages:
+% \begin{macro}{\@mpfootinsv@r}
+% \begin{macro}{\mp@footgroupv@r}
+% \begin{macrocode}
+\newinsert\@mpfootinsv@r
+\newcommand{\mp@footgroupv@r}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \Lpack{ledmac} package style footnotes (see \file{ledmac.dtx} for
+% more detailed explanations).
+%
+% The two- and three-column notes use a macro \cs{m@mrigidbalance}
+% to split text into a number of columns. This is based on \theTeXbook,
+% page 397.
+% \begin{macro}{\m@m@k}
+% \begin{macro}{\m@m@h}
+% \begin{macrocode}
+\newcount\m@m@k \newdimen\m@m@h
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mrigidbalance}
+% \begin{macro}{\m@mdosplits}
+% \begin{macro}{\m@msplitoff}
+% \cs{m@mrigidbalance}\marg{box}\marg{num}\marg{length} splits a
+% \meta{box} (of text) into \meta{num} columns with \meta{length}
+% space between the top baseline and the top of the \cs{vbox}.
+% \begin{macrocode}
+\newcommand*{\m@mrigidbalance}[3]{\setbox0=\box#1 \m@m@k=#2 \m@m@h=#3
+ \@@line{\splittopskip=\m@m@h \vbadness=\@M \hfilneg
+ \valign{##\vfill\cr\m@mdosplits}}}
+\newcommand*{\m@mdosplits}{\ifnum\m@m@k>0 \noalign{\hfil}\m@msplitoff
+ \global\advance\m@m@k-1\cr\m@mdosplits\fi}
+\newcommand*{\m@msplitoff}{\dimen0=\ht0
+ \divide\dimen0 by\m@m@k \advance\dimen0 by\m@m@h
+ \setbox2 \vsplit0 to \dimen0
+ \unvbox2 }
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Two column footnotes}
+%
+% \begin{macro}{\twocolumnfootnotes}
+% Declaration for two column footnotes. This causes the standard
+% \cs{footnote} and friends to internally use the \verb?v@r? series,
+% which here produces two column footnotes.
+% \changes{v1.61}{2004/03/14}{Made [RS] change to \cs{twocolumnfootnotes}}
+% \begin{macrocode}
+\newcommand{\twocolumnfootnotes}{%
+ \@namedef{foottextfontv@r}{\foottextfont}% % [RS]
+ \let\@footnotetext\@twocolfootnotetext
+ \dimen\footinsv@r=2\footinsdim
+ \count\footinsv@r=500\relax
+ \m@make@twocol@footgroup{v@r}%
+ \let\@footgroupv@r\@twocol@footgroupv@r
+ \let\@mpfootnotetext\@mptwocolfootnotetext
+ \m@make@mptwocol@footgroup{v@r}%
+ \let\mp@footgroupv@r\@mptwocol@footgroupv@r}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@twocolfootnotetext}
+% \cs{@twocolfootnotetext}\marg{text} is the two column version of
+% \cs{@footnotetext} for the \verb?v@r? series.
+% \changes{v1.618}{2005/09/03}{Added missing percent to \cs{@twocolfootnotetext} (mempatch v3.1)}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@twocolfootnotetext}[1]{\insert\footinsv@r{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@twocolfootfmt{#1}%
+ \color@endgroup}%
+ \m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@preamtwofmt}
+% Give each column 0.45 of the textwidth.
+% \begin{macrocode}
+\newcommand{\@preamtwofmt}{%
+ \hsize .45\hsize
+ \parindent=\z@
+ \tolerance=5000\relax
+ \raggedright
+ \leavevmode}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@twocolfootfmt}
+% \cs{@twocolfootfmt}
+% \begin{macrocode}
+\newcommand{\@twocolfootfmt}[1]{%
+ \@preamtwofmt
+ {\footfootmark\strut {\foottextfont #1}\strut\par}\allowbreak}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mptwocolfootnotetext}
+% \cs{@mptwocolfootnotetext}\marg{text} is the two column version
+% of \cs{@mpfootnotetext} for the \verb?v@r? series for minipages.
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@mptwocolfootnotetext}[1]{%
+ \global\setbox\@mpfootinsv@r\vbox{%
+ \unvbox\@mpfootinsv@r
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@twocolfootfmt{#1}%
+ \color@endgroup}%
+ \m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\twocolumnfootstyle}
+% \cs{twocolumnfootstyle}\marg{series} specifies a two column footnote
+% style for \meta{series}.
+% \begin{macrocode}
+\newcommand{\twocolumnfootstyle}[1]{%
+ \m@make@twocolfootnotetext{#1}%
+ \m@make@mptwocolfootnotetext{#1}%
+ \m@make@twocolfootfmt{#1}%
+ \m@make@twocol@footgroup{#1}%
+ \m@make@mptwocol@footgroup{#1}%
+ \m@make@footstart{#1}%
+ \@namelongdef{@footnotetext#1}##1{%
+ \@nameuse{@twocolfootnotetext#1}{##1}}%
+ \@namelongdef{@mpfootnotetext#1}##1{%
+ \@nameuse{@mptwocolfootnotetext#1}{##1}}%
+ \@namedef{@footgroup#1}{\@nameuse{@twocol@footgroup#1}}%
+ \@namedef{mp@footgroup#1}{\@nameuse{@mptwocol@footgroup#1}}%
+ \expandafter\dimen\csname footins#1\endcsname=2\footinsdim
+ \expandafter\count\csname footins#1\endcsname=500\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@twocolfootnotetext}
+% \cs{m@make@twocolfootnotetext}\marg{series} creates
+% \cs{@twocolfootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@twocolfootnotetext}[1]{%
+ \@namelongdef{@twocolfootnotetext#1}##1{%
+ \insert\@nameuse{footins#1}{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote#1\endcsname \@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@twocolfootfmt#1}{##1}%
+ \color@endgroup}%
+ \m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mptwocolfootnotetext}
+% \cs{m@make@mptwocolfootnotetext}\marg{series} creates
+% \cs{@mptwocolfootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@mptwocolfootnotetext}[1]{%
+\@namelongdef{@mptwocolfootnotetext#1}##1{%
+ \global\setbox\@nameuse{@mpfootins#1}\vbox{%
+ \unvbox\@nameuse{@mpfootins#1}
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote#1\endcsname\@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@twocolfootfmt#1}{##1}%
+ \color@endgroup}\m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@twocolfootfmt}
+% \cs{m@make@twocolfootfmt}\marg{series} creates
+% \cs{@twocolfootfmt}\meta{series}
+% \changes{v1.61}{2004/03/14}{Removed space from \cs{m@make@twocolfootfmt} [RS]}
+% \begin{macrocode}
+\newcommand{\m@make@twocolfootfmt}[1]{%
+ \@namedef{@twocolfootfmt#1}##1{%
+ \@preamtwofmt
+ {\@nameuse{footfootmark#1}\strut
+ {\@nameuse{foottextfont#1}##1}\strut\par}\allowbreak}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@twocol@footgroup}
+% \cs{m@make@twocol@footgroup}\marg{series} creates
+% \cs{@twocol@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@twocol@footgroup}[1]{%
+ \@namedef{@twocol@footgroup#1}{{%
+ \@nameuse{foottextfont#1} \splittopskip=\ht\strutbox
+ \m@mrigidbalance{\@nameuse{footins#1}}{\tw@}{\splittopskip}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mptwocol@footgroup}
+% \cs{m@make@mptwocol@footgroup}\marg{series} creates
+% \cs{@mptwocol@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@mptwocol@footgroup}[1]{%
+\@namedef{@mptwocol@footgroup#1}{{%
+ \@nameuse{foottextfont#1} \splittopskip=\ht\strutbox
+ \m@mrigidbalance{\@nameuse{@mpfootins#1}}{\tw@}{\splittopskip}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Three column footnotes}
+%
+% \begin{macro}{\threecolumnfootnotes}
+% Declaration for three column footnotres.
+% \changes{v1.61}{2004/03/14}{Made [RS] change to \cs{threecolumnfootnotes}}
+% \begin{macrocode}
+\newcommand{\threecolumnfootnotes}{%
+ \@namedef{foottextfontv@r}{\foottextfont}% % [RS]
+ \let\@footnotetext\@threecolfootnotetext
+ \dimen\footinsv@r=3\footinsdim
+ \count\footinsv@r=333\relax
+ \m@make@threecol@footgroup{v@r}%
+ \let\@footgroupv@r\@threecol@footgroupv@r
+ \let\@mpfootnotetext\@mpthreecolfootnotetext
+ \m@make@mpthreecol@footgroup{v@r}%
+ \let\mp@footgroupv@r\@mpthreecol@footgroupv@r}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@threecolfootnotetext}
+% \cs{@threecolfootnotetext}\marg{text} is the three column version of
+% \cs{@footnotetext}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@threecolfootnotetext}[1]{\insert\footinsv@r{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@threecolfootfmt{#1}%
+ \color@endgroup}\m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@preamthreefmt}
+% Give each column 0.3 of the text width.
+% \begin{macrocode}
+\newcommand{\@preamthreefmt}{%
+ \hsize .3\hsize
+ \parindent=\z@
+ \tolerance=5000\relax
+ \raggedright
+ \leavevmode}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@threecolfootfmt}
+%
+% \begin{macrocode}
+\newcommand{\@threecolfootfmt}[1]{%
+ \@preamthreefmt
+ {\footfootmark\strut {\foottextfont #1}\strut\par}\allowbreak}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mpthreecolfootnotetext}
+% \cs{@mpthreecolfootnotetext}\marg{text} is the three column version of
+% \cs{@mpfootnotetext}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@mpthreecolfootnotetext}[1]{%
+ \global\setbox\@mpfootinsv@r\vbox{%
+ \unvbox\@mpfootinsv@r
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@threecolfootfmt{#1}%
+ \color@endgroup}\m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\threecolumnfootstyle}
+% \cs{threecolumnfootstyle}\marg{series} specifies three column footnote style
+% for \meta{series}
+% \begin{macrocode}
+\newcommand{\threecolumnfootstyle}[1]{%
+ \m@make@threecolfootnotetext{#1}%
+ \m@make@mpthreecolfootnotetext{#1}%
+ \m@make@threecolfootfmt{#1}%
+ \m@make@threecol@footgroup{#1}%
+ \m@make@mpthreecol@footgroup{#1}%
+ \m@make@footstart{#1}%
+ \@namelongdef{@footnotetext#1}##1{%
+ \@nameuse{@threecolfootnotetext#1}{##1}}%
+ \@namelongdef{@mpfootnotetext#1}##1{%
+ \@nameuse{@mpthreecolfootnotetext#1}{##1}}%
+ \@namedef{@footgroup#1}{\@nameuse{@threecol@footgroup#1}}%
+ \@namedef{mp@footgroup#1}{\@nameuse{@mpthreecol@footgroup#1}}%
+ \expandafter\dimen\csname footins#1\endcsname=3\footinsdim
+ \expandafter\count\csname footins#1\endcsname=333\relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@threecolfootnotetext}
+% \cs{m@make@threecolfootnotetext}\marg{series} creates
+% \cs{@threecolfootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@threecolfootnotetext}[1]{%
+\@namelongdef{@threecolfootnotetext#1}##1{%
+ \insert\@nameuse{footins#1}{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote#1\endcsname \@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@threecolfootfmt#1}{##1}%
+ \color@endgroup}\m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mpthreecolfootnotetext}
+% \cs{m@make@mpthreecolfootnotetext}\marg{series} creates
+% \cs{@mpthreecolfootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@mpthreecolfootnotetext}[1]{%
+\@namelongdef{@mpthreecolfootnotetext#1}##1{%
+ \global\setbox\@nameuse{@mpfootins#1}\vbox{%
+ \unvbox\@nameuse{@mpfootins#1}
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote#1\endcsname\@nameuse{@thefnmark#1}}%
+ \color@begingroup
+ \@nameuse{@threecolfootfmt#1}{##1}%
+ \color@endgroup}\m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@threecolfootfmt}
+% \cs{m@make@threecolfootfmt}\marg{series} creates
+% \cs{@threecolfootfmt}\meta{series}
+% \changes{v1.61}{2004/03/14}{Removed space from \cs{m@make@threecolfootfmt} [RS]}
+% \begin{macrocode}
+\newcommand{\m@make@threecolfootfmt}[1]{%
+\@namelongdef{@threecolfootfmt#1}##1{%
+ \@preamthreefmt
+ {\@nameuse{footfootmark#1}\strut
+ {\@nameuse{foottextfont#1}##1}\strut\par}\allowbreak}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@threecol@footgroup}
+% \cs{m@make@threecol@footgroup}\marg{series} creates
+% \cs{@threecol@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@threecol@footgroup}[1]{%
+\@namedef{@threecol@footgroup#1}{{%
+ \@nameuse{foottextfont#1} \splittopskip=\ht\strutbox
+ \m@mrigidbalance{\@nameuse{footins#1}}{\thr@@}{\splittopskip}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mpthreecol@footgroup}
+% \cs{m@make@mpthreecol@footgroup}\marg{series} creates
+% \cs{@mpthreecol@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@mpthreecol@footgroup}[1]{%
+\@namedef{@mpthreecol@footgroup#1}{{%
+ \@nameuse{foottextfont#1} \splittopskip=\ht\strutbox
+ \m@mrigidbalance{\@nameuse{@mpfootins#1}}{\thr@@}{\splittopskip}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Paragraphed footnotes}
+%
+% Paragraphed footnotes are based on \theTeXbook, page 398ff, in the
+% Dirty Tricks appendix. It does a lot of box manipulations.
+%
+% \begin{macro}{\m@munvxh}
+% \cs{m@munvxh}\marg{vbox}: unvbox, extract the last line, and unhbox it.
+% \begin{macrocode}
+\newcommand{\m@munvxh}[1]{%
+ \setbox0=\vbox{\unvbox#1%
+ \global\setbox1=\lastbox}%
+ \unhbox1
+ \unskip
+ \unskip
+ \unpenalty
+ \hskip\m@mipn@skip}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mungebox}
+%
+% \begin{macrocode}
+\newcommand{\m@mungebox}{%
+ \setbox0=\hbox{\m@munvxh0}%
+ \dp0=\z@
+ \ht0=\footfudgefactor\wd0
+ \box0
+ \penalty0}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mipn@skip}
+% \begin{macro}{\m@minterparanoteglue}
+% These are `inter-para-note-skip' and `inter-parafootnote' glue, for
+% paragraphed footnotes.
+% \begin{macrocode}
+\newskip\m@mipn@skip
+\newcommand*{\m@minterparanoteglue}[1]{%
+ {\foottextfont\global\m@mipn@skip=#1\relax}}
+\m@minterparanoteglue{1em plus.4em minus.4em}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mmakehboxofhboxes}
+% Make an hbox of hboxes.
+% \begin{macrocode}
+\newcommand*{\m@mmakehboxofhboxes}{\setbox0=\hbox{}%
+ \loop
+ \unpenalty
+ \setbox2=\lastbox
+ \ifhbox2
+ \setbox0=\hbox{\box2\unhbox0}
+ \repeat}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mremovehboxes}
+% \begin{macrocode}
+\newcommand*{\m@mremovehboxes}{\setbox0=\lastbox
+ \ifhbox0{\m@mremovehboxes}\unhbox0 \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footfudgefiddle}
+% TeX uses \verb?\footfufgefactor? to estimate the space required for
+% paragraphed footnotes. If it underestimates then the notes approach,
+% or cover, the footer. \verb?\footfudgefiddle? can be changed (upward) from
+% its default to improve matters.
+% \begin{macrocode}
+\newcommand*{\footfudgefiddle}{64}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\paragraphfootnotes}
+% Declaration for paragraphed footnotes.
+% \changes{v1.61}{2004/03/14}{Made [RS] change to \cs{paragraphfootnotes}}
+% \begin{macrocode}
+\newcommand{\paragraphfootnotes}{%
+ \@namedef{foottextfontv@r}{\foottextfont}% % [RS]
+ \let\@footnotetext\@parafootnotetext
+ \dimen\footinsv@r=\footinsdim
+ \count\footinsv@r=1000\relax
+ \m@make@para@footgroup{v@r}%
+ \let\@footgroupv@r\@para@footgroupv@r
+ \let\@mpfootnotetext\@mpparafootnotetext
+ \m@make@mppara@footgroup{v@r}%
+ \let\mp@footgroupv@r\@mppara@footgroupv@r
+ {\foottextfont
+ \dimen0=\baselineskip
+ \multiply\dimen0 by 1024
+ \divide\dimen0 by \hsize \multiply\dimen0 by \footfudgefiddle
+ \xdef\footfudgefactor{\expandafter\strip@pt\dimen0 }}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@parafootnotetext}
+% \cs{@parafootnotetext}\marg{text} is a paragraph version of
+% \cs{@footnotetext}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@parafootnotetext}[1]{\insert\footinsv@r{
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \setbox0=\vbox{\hsize=\maxdimen
+ \color@begingroup
+ \noindent \@parafootfmt{#1}%
+ \color@endgroup}%
+ \m@mungebox}\m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@parafootfmt}
+% \cs{@parafootfmt}\marg{text} is a paragraph version of
+% \cs{@footfmt}
+% \begin{macrocode}
+\newcommand{\@parafootfmt}[1]{%
+ \parindent=\z@
+ \parfillskip=0pt \@plus 1fil
+ {\footfootmark\strut {\foottextfont #1}\penalty-10}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mpparafootnotetext}
+% \cs{@mpparafootnotetext}\marg{text} is a paragraph version of
+% \cs{@mpfootnotetext}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@mpparafootnotetext}[1]{%
+ \global\setbox\@mpfootinsv@r\vbox{%
+ \unvbox\@mpfootinsv@r
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\foottextfont
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote\endcsname\@thefnmark}%
+ \setbox0=\vbox{\hsize=\maxdimen
+ \color@begingroup
+ \noindent \@parafootfmt{#1}%
+ \color@endgroup}%
+ \m@mungebox}\m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\paragraphfootstyle}
+% \cs{paragraphfootstyle}\marg{series} specifies paragraphed footnote style
+% for \meta{series}.
+% \begin{macrocode}
+\newcommand{\paragraphfootstyle}[1]{%
+ \m@make@parafootnotetext{#1}%
+ \m@make@mpparafootnotetext{#1}%
+ \m@make@parafootfmt{#1}%
+ \m@make@para@footgroup{#1}%
+ \m@make@mppara@footgroup{#1}%
+ \m@make@para@footstart{#1}%
+ \@namelongdef{@footnotetext#1}##1{%
+ \@nameuse{@parafootnotetext#1}{##1}}%
+ \@namelongdef{@mpfootnotetext#1}##1{%
+ \@nameuse{@mpparafootnotetext#1}{##1}}%
+ \@namedef{@footgroup#1}{\@nameuse{@para@footgroup#1}}%
+ \@namedef{mp@footgroup#1}{\@nameuse{@mppara@footgroup#1}}%
+ \@namedef{@footstart#1}{\@nameuse{@para@footstart#1}}%
+ \expandafter\dimen\csname footins#1\endcsname=\footinsdim
+ \expandafter\count\csname footins#1\endcsname=1000\relax
+ {\@nameuse{foottextfont#1}%
+ \dimen0=\baselineskip
+ \multiply\dimen0 by 1024
+ \divide\dimen0 by \hsize \multiply\dimen0 by 64
+ \xdef\footfudgefactor{\expandafter\strip@pt\dimen0 }}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@parafootnotetext}
+% \cs{m@make@parafootnotetext}\marg{series} creates
+% \cs{@parafootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@parafootnotetext}[1]{%
+\@namelongdef{@parafootnotetext#1}##1{%
+ \insert\@nameuse{footins#1}{
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \@preamfntext
+ \protected@edef\@currentlabel{%
+ \csname p@footnote#1\endcsname \@nameuse{@thefnmark#1}}%
+ \setbox0=\vbox{\hsize=\maxdimen
+ \color@begingroup
+ \noindent \@nameuse{@parafootfmt#1}{##1}%
+ \color@endgroup}%
+ \m@mungebox}\m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mpparafootnotetext}
+% \cs{m@make@mpparafootnotetext}\marg{series} creates
+% \cs{@mpparafootnotetext}\meta{series}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\m@make@mpparafootnotetext}[1]{%
+\@namelongdef{@mpparafootnotetext#1}##1{%
+ \global\setbox\@nameuse{@mpfootins#1}\vbox{%
+ \unvbox\@nameuse{@mpfootins#1}
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font\@nameuse{foottextfont#1}%
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@mpfootnote#1\endcsname\@nameuse{@thefnmark#1}}%
+ \setbox0=\vbox{\hsize=\maxdimen
+ \color@begingroup
+ \noindent \@nameuse{@parafootfmt#1}{##1}%
+ \color@endgroup}%
+ \m@mungebox}\m@mmf@prepare}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@parafootfmt}
+% \cs{m@make@parafootfmt}\marg{series} creates
+% \cs{@parafootfmt}\meta{series}
+% \changes{v1.61}{2004/03/14}{Removed space from \cs{m@make@parafootfmt} [RS]}
+% \begin{macrocode}
+\newcommand{\m@make@parafootfmt}[1]{%
+\@namelongdef{@parafootfmt#1}##1{%
+ \parindent=\z@
+ \parfillskip=0pt \@plus 1fil
+ {\@nameuse{footfootmark#1}\strut
+ {\@nameuse{foottextfont#1}##1}\penalty-10}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@para@footgroup}\marg{series} creates
+% \cs{@para@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@para@footgroup}[1]{%
+\@namedef{@para@footgroup#1}{%
+ \unvbox\@nameuse{footins#1}
+ \m@mmakehboxofhboxes
+ \setbox0=\hbox{\unhbox0 \m@mremovehboxes}%
+ \@nameuse{foottextfont#1}%
+ \noindent\unhbox0\par}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@mppara@footgroup}
+% \cs{m@make@mppara@footgroup}\marg{series} creates
+% \cs{@mppara@footgroup}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@mppara@footgroup}[1]{%
+\@namedef{@mppara@footgroup#1}{%
+ \unvbox\@nameuse{@mpfootins#1}
+ \m@mmakehboxofhboxes
+ \setbox0=\hbox{\unhbox0 \m@mremovehboxes}%
+ \@nameuse{foottextfont#1}%
+ \noindent\unhbox0\par}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@make@para@footstart}
+% \cs{m@make@para@footstart}\marg{series} creates
+% \cs{@para@footstart}\meta{series}
+% \begin{macrocode}
+\newcommand{\m@make@para@footstart}[1]{%
+\@namedef{@para@footstart#1}{%
+ \vskip\bigskipamount
+ \leftskip=\z@
+ \rightskip=\z@
+ \parindent=\z@
+ \vskip\skip\@nameuse{footins#1}%
+ \footnoterule}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Nasty insert bits}
+% \changes{v1.61803}{2008/01/30}{Put \cs{@makecol} and associated code
+% into new section `Nasty insert bits' (mempatch various)}
+%
+% \cs{sidebar} is implemented as a new kind of \cs{insert} and the
+% extended footnotes are also implemented via new kinds of \cs{insert}s.
+% New \cs{insert}s mean that the kernel's \cs{@makecol} must be revised
+% to cater for them. As this is part of the output process it is nasty to
+% do.
+%
+% Before v1.61803 \cs{@makecol} got (re)defined at several points in the
+% code. Here is what I hope is the final version od \cs{@makecol} and
+% associated code after having resolved and combined all the changes.
+%
+%
+% \begin{macro}{\if@mem@nofoot}
+% \begin{macro}{\@mem@testifnofoot}
+% \begin{macro}{\@mem@extranofoot}
+% These are from [RS] as \cs{@doclearpage} should check for more than
+% just \cs{footins} being void. Note that this covers all current
+% class defined inserts, including sidebars.
+% \changes{v1.61}{2004/03/14}{Added \cs{if@mem@nofoot},
+% \cs{@mem@testifnofoot}, and
+% \cs{@mem@extranofoot}}
+% \begin{macrocode}
+\newif\if@mem@nofoot
+\newcommand*{\@mem@testifnofoot}{%
+ \@mem@nofoottrue
+ \ifvoid\footins\else\@mem@nofootfalse\fi
+ \ifvoid\footinsv@r\else\@mem@nofootfalse\fi
+ \ifvoid\sideins\else\@mem@nofootfalse\fi
+ \@mem@extranofeet}
+\newcommand*{\@mem@extranofeet}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\memold@doclearpage}
+% \begin{macro}{\mem@doclearpage}
+% \begin{macro}{\@doclearpage}
+% I thought that I could get away with using the kernel's
+% \cs{@doclearpage} but [RS] discovered that I couldn't.
+% \changes{v1.62}{2004/03/14}{Redid \cs{@doclearpage} using [RS] code}
+% \changes{v3.7d}{2015/04/23}{Opdated \cs{mem@doclearpage} to match
+% \Lpack{fixltx2e} v1.1s (which will be the base of the ltx kernel for
+% TL15)}
+% \begin{macrocode}
+\let\memold@doclearpage\@doclearpage
+\newcommand{\mem@doclearpage}{%
+ \@mem@testifnofoot
+ \if@mem@nofoot
+ \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
+ \setbox\@tempboxa\box\@cclv
+ \xdef\@deferlist{\@toplist\@botlist\@deferlist}%
+ \global \let \@toplist \@empty
+ \global \let \@botlist \@empty
+ \global \@colroom \@colht
+ \ifx \@currlist\@empty
+ \else
+ \@latexerr{Float(s) lost}\@ehb
+ \global \let \@currlist \@empty
+ \fi
+ \@makefcolumn\@deferlist
+ \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}%
+ \if@twocolumn
+ \if@firstcolumn
+ \xdef\@deferlist{\@dbltoplist\@deferlist}%
+ \global \let \@dbltoplist \@empty
+ \global \@colht \textheight
+ \begingroup
+ \@dblfloatplacement
+ \@makefcolumn\@deferlist
+ \@whilesw\if@fcolmade \fi{\@outputpage
+ \@makefcolumn\@deferlist}%
+ \endgroup
+ \else
+ \vbox{}\clearpage
+ \fi
+ \fi
+ \ifx\@deferlist\@empty \else\clearpage \fi
+ \else
+ \setbox\@cclv\vbox{\box\@cclv\vfil}%
+ \@makecol\@opcol
+ \clearpage
+ \fi
+ % older version
+ % \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
+ % \setbox\@tempboxa\box\@cclv
+ % \xdef\@deferlist{\@toplist\@botlist\@deferlist}%
+ % \global\let\@toplist\@empty
+ % \global\let\@botlist\@empty
+ % \global\@colroom\@colht
+ % \ifx \@currlist\@empty
+ % \else
+ % \@latexerr{Float(s) lost}\@ehb
+ % \global\let\@currlist\@empty
+ % \fi
+ % \@makefcolumn\@deferlist
+ % \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}%
+ % \if@twocolumn
+ % \if@firstcolumn
+ % \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}%
+ % \global\let\@dbltoplist\@empty
+ % \global\@colht\textheight
+ % \begingroup
+ % \@dblfloatplacement
+ % \@makefcolumn\@dbldeferlist
+ % \@whilesw\if@fcolmade \fi{\@outputpage
+ % \@makefcolumn\@dbldeferlist}%
+ % \endgroup
+ % \else
+ % \vbox{}\clearpage
+ % \fi
+ % \fi
+ % \else
+ % \setbox\@cclv\vbox{\box\@cclv\vfil}%
+ % \@makecol\@opcol
+ % \clearpage
+ % \fi
+}
+% \end{macrocode}
+% Replace the kernel's \cs{@doclearpage}.
+% \begin{macrocode}
+\gdef\@doclearpage{\mem@doclearpage}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\m@m@makecolfloats}
+% \begin{macro}{\m@m@makecoltext}
+% These two macros contain code common to versions of \cs{@makecol}
+% \begin{macrocode}
+\newcommand*{\m@m@makecolfloats}{%
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global\let\@midlist\@empty
+ \@combinefloats}
+\newcommand*{\m@m@makecoltext}{%
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \setbox\@outputbox \vbox to\@colht{%
+ \@texttop
+ \dimen@ \dp\@outputbox
+ \unvbox \@outputbox
+ \vskip -\dimen@
+ \@textbottom}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@m@makecolintro}
+% A hook into the revised \cs{@makecol}
+% \begin{macrocode}
+\newcommand*{\m@m@makecolintro}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mopfootnote}
+% (footnote) code for possible use in \cs{@makecol}.
+% \changes{v3.7d}{2015/04/21}{Added feature to force footnotes to the
+% bottom of the page in a ragged context}
+% \begin{macrocode}
+\newcommand*{\m@mopfootnote}{\setbox\@outputbox \vbox{%
+ \boxmaxdepth\@maxdepth
+ \@tempdima\dp\@cclv
+ \unvbox\@cclv
+ \vskip-\@tempdima
+% \end{macrocode}
+% We then add a macro call that is only activated if we are not using
+% \cs{flushbottom}. If \cs{feetatbottom} is active, then a
+% \cs{vfill} is added. Solution inspired by \Lpack{footmisc}.
+% \begin{macrocode}
+ \mem@if@flushbottomF\m@mopfn@bottom
+ \vskip \skip\footins
+ \color@begingroup
+ \normalcolor
+ \footnoterule
+ \unvbox \footins
+ \color@endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mopfootnotebf}
+% (footnote) code in support of footnotes below floats.
+% Problem with original code noted by J{\o}rgen Larsen (\url{jl@ruc.dk})
+% on 2008/05/24. Updated 2015.
+% \changes{v1.618033}{2008/06/02}{Added \cs{m@mopfootnotebf}}
+% \changes{v3.7d}{2015/04/21}{Added feature to force footnotes to the
+% bottom of the page in a ragged context}
+% \begin{macrocode}
+\newcommand*{\m@mopfootnotebf}{%
+ \setbox\@outputbox \vbox{%
+ \boxmaxdepth\@maxdepth
+ \unvbox\@outputbox
+% \end{macrocode}
+% We then add a macro call as above.
+% \begin{macrocode}
+ \mem@if@flushbottomF\m@mopfn@bottom
+ \vskip\skip\footins
+ \color@begingroup
+ \normalcolor
+ \footnoterule
+ \unvbox \footins
+ \color@endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mopsidebar}
+% (sidebar) code for possible use in \cs{@makecol}.
+% From DA's latest sidebar fixes.
+% \begin{macrocode}
+\newcommand*{\m@mopsidebar}{%
+ \ifvoid\sideins\else
+ \setbox\@outputbox \vbox{%
+ \sidecontents
+ \unvbox\@outputbox}
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@makecol}
+% DA's latest version of \cs{@makecol} (giving the standard
+% footnote order (bottom floats after footnotes)) putting the sidebar
+% insert after the others (from mempatch v4.9). The code is renewed on
+% page~\pageref{makecol} onwards.
+% \begin{macrocode}
+ % \gdef\mem@makecol{%
+ % \m@m@makecolintro
+ % \ifvoid\footins
+ % \setbox\@outputbox \box\@cclv
+ % \else
+ % \m@mopfootnote
+ % \fi
+ % \m@mdoextrafeet
+ % \m@m@makecolfloats
+ % \m@mopsidebar
+ % \m@m@makecoltext
+ % \global \maxdepth \@maxdepth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@makecolbf}
+% A version of \cs{@makecol} which puts footnotes at the bottom of the page
+% (after any bottom floats). The code is renewed on
+% page~\pageref{makecol} onwards.
+% \changes{v1.618033}{2008/06/02}{Used \cs{m@mopfootnotebf} instead of
+% \cs{m@mopfootnote} in \cs{mem@makecolbf}}
+% \begin{macrocode}
+ % \gdef\mem@makecolbf{%
+ % \m@m@makecolintro
+ % \setbox\@outputbox \box\@cclv
+ % \m@m@makecolfloats
+ % \ifvoid\footins\else
+ % \m@mopfootnotebf
+ % \fi
+ % \m@mdoextrafeet
+ % \m@mopsidebar
+ % \m@m@makecoltext
+ % \global\maxdepth \@maxdepth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@makecoldblf}
+% A version of \cs{@makecol} which is a placeholder to fix the doublefloat
+% problem.
+%
+% \begin{macrocode}
+\gdef\mem@makecoldblf{%
+ \m@m@makecolintro
+ \setbox\@outputbox \box\@cclv
+ \m@m@makecolfloats
+ \m@mopsidebar% <- added
+ \ifvoid\footins
+ \else
+ \m@mopfootnote
+ \fi
+ \m@mdoextrafeet
+ \m@m@makecoltext
+ \global \maxdepth \@maxdepth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\feetabovefloat}
+% \begin{macro}{\feetbelowfloat}
+% \begin{macro}{\@makecol}
+% declarations to put footnotes above bottom floats (standard \LaTeX)
+% or at the bottom of the page
+% \begin{macrocode}
+\newcommand{\feetabovefloat}{\gdef\@makecol{\mem@makecol}}
+\newcommand{\feetbelowfloat}{\gdef\@makecol{\mem@makecolbf}}
+\feetabovefloat
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\feetatbottom}
+% \begin{macro}{\feetbelowragged}
+% \begin{macro}{\m@mopfn@bottom}
+% \begin{macro}{\mem@if@flushbottomF}
+% If a page is typeset with a ragged bottom then any footnotes are
+% added directly under the text. It may look better if the footnotes
+% are added to the text block from the bottom up.
+% \begin{macrocode}
+\newcommand\feetatbottom{\def\m@mopfn@bottom{\vfill\relax}}
+\newcommand\feetbelowragged{\let\m@mopfn@bottom\relax}
+\feetbelowragged
+% \end{macrocode}
+% Next we add a test to see if \cs{flushbottom} is active. This macro
+% is used within \cs{m@mopfootnote} and \cs{m@mopfootnotebf} to
+% force the footnotes to the bottom \emph{only} when \cs{flushbottom}
+% is \emph{not} active, hince the \texttt{F} in the name.
+% \begin{macrocode}
+\newcommand\mem@if@flushbottomF[1]{%
+ \if\mem@flshbot\else#1\fi%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@reinserts}
+% DA's final version from last patch.
+% \changes{v3.6d}{2010/06/30}{THere is a newer version further down
+% the code}
+% \begin{macrocode}
+ % \gdef\@reinserts{%
+ % \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+ % \m@mdodoreinextrafeet
+ % \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi
+ % \ifvoid\sideins\else\insert\sideins{\unvbox\sideins}\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.61803398d}{2010/01/25}{Added section about side footnotes}
+% \subsection{Side footnotes} \label{sec:sidefootnotes}
+%
+%
+% \subsubsection{Extension to the regular footnote}
+%
+% The code here enables the regular \cs{footnote} to be set in the
+% margin. It is based on Robin Fairbairns' \Lpack{footmisc} package.
+%
+% \begin{macro}{\ifm@mfnmargin}
+% \begin{macro}{\footnotesatfoot}
+% \begin{macro}{\footnotesinmargin}
+% Declarations for regular footnotes to be set as normal at the foot
+% of the page, or in the margin.
+% \begin{macrocode}
+\newif\ifm@mfnmargin
+\newcommand*{\footnotesatfoot}{\m@mfnmarginfalse}
+\newcommand*{\footnotesinmargin}{\m@mfnmargintrue}
+\footnotesatfoot
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \changes{v1.61803398d}{2010/01/25}{Remember that we actually have
+% several \cs{@footnotetext} in memoir, might be an idea to clean this
+% up at some point/daleif}
+% \begin{macro}{\@footnotetext}
+% \begin{macro}{\m@mold@footnotetext}
+% Change \cs{@footnotetext} to enable footnotes to be put into the margin
+% by using \cs{marginpar}.
+% \begin{macrocode}
+\renewcommand{\@footnotetext}[1]{%
+ \ifm@mfnmargin% use marginpar
+% \end{macrocode}
+% Use \cs{marginpar} for placing the footnote.
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+ \marginpar{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font
+ \foottextfont
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{\ignorespaces#1}%
+ \color@endgroup}%
+ \else% regular feet
+% \end{macrocode}
+% This is the original code for \cs{@footnotetext}.
+% \changes{v1.618033988c}{2010/02/20}{sporadic spaces removed, error
+% reported on texlive mailinglist}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+ \insert\footins{%
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \reset@font
+ \foottextfont
+ \@preamfntext
+ \hsize\columnwidth
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces{\foottextfont #1}%
+ \@finalstrut\strutbox}%
+ \color@endgroup}%
+ \fi%
+ \m@mmf@prepare}
+% \end{macrocode}
+% Need to save this version of \cs{@footnotetext}, it is
+% used within \cs{plainfootnotes}.
+% \changes{v3.6h}{2010/10/22}{Moved \cs{m@mold@footnotetext} to this
+% location, and renamed it to \cs{@plainfootnotetext}}
+% \begin{macrocode}
+\let\@plainfootnotetext\@footnotetext
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Bottom aligned side footnotes}
+%
+% The code for the bottom aligned marginal footnotes is based partly on
+% the \cs{sidebar} code and code from David Salomon, 'Output Routines:
+% Examples and Techniques. Part III: Insertions', \textit{TUGboat},
+% 11, 4, pp 588--605, Nov 1990.
+%
+% \begin{macro}{\sidefootmargin}
+% \begin{macro}{\m@msidefoot@margin}
+% \cs{sidefootmargin} is the user command for setting the side for
+% side footnotes (stored as \cs{m@msidefoot@margin}). The default
+% is \texttt{outer}.
+% \begin{macrocode}
+\newcommand*{\sidefootmargin}[1]{%
+ \m@msetm@argin{#1}%
+ \ifnum\m@mm@argin<\z@
+ \@memwarn{Bad \string\sidefootmargin\space argument `#1'\MessageBreak
+ set to `outer'}%
+ \gdef\m@msidefoot@margin{2}% set as outer
+ \else
+ \global\let\m@msidefoot@margin\m@mm@argin
+ \fi}
+\sidefootmargin{outer}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\sidefootins}
+% As for any non-main text matter we need an insert.
+% \begin{macrocode}
+\newinsert\sidefootins
+ \skip\sidefootins=0pt
+ \count\sidefootins=0\relax
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootadjust}
+% \begin{macro}{\sidefootheight}
+% \begin{macro}{\setsidefootheight}
+% The length \cs{sidefootadjust} can be used for fine control over the
+% vertivcal position of the base of the column of side footnotes.
+% The length \cs{sidefootheight}
+% is the height of the column and is best set by the \cs{setsidefootheight}
+% macro, which takes the desired height as its argument and sets the height
+% of the \cs{sidefootins} \cs{insert}. The height is
+% initially set to the \cs{textheight}.
+% \begin{macrocode}
+\newlength{\sidefootadjust}
+ \setlength{\sidefootadjust}{0pt}
+\newlength{\sidefootheight}
+\newcommand*{\setsidefootheight}[1]{%
+ \setlength{\dimen\sidefootins}{#1}%
+ \advance\dimen\sidefootins -\topskip
+ \advance\dimen\sidefootins \ht\strutbox
+ \setlength{\sidefootheight}{\dimen\sidefootins}}
+\setsidefootheight{\textheight}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sidefoothsep}
+% \begin{macro}{\sidefootwidth}
+% \begin{macro}{\sidefootvsep}
+% The horizontal space between the text block and side footnotes
+% (\cs{sidefoothsep}),
+% the width of the column of notes (\cs{sidefootwidth}),
+% and the vertical space between consecutive side footnotes
+% (\cs{sidefootvsep}).
+% \changes{v1.61803398d}{2010/02/05}{removed \cs{sidefootfont}}
+% \begin{macrocode}
+\newlength{\sidefoothsep}
+\newlength{\sidefootvsep}
+\newlength{\sidefootwidth}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setsidefeet}
+% The macro \cs{setsidefeet}\marg{hsep}\marg{width}\marg{vsep}\marg{adj}\marg{font}\marg{height}
+% sets the specifications for the side footnotes. An `*' means `use
+% the current
+% value'.
+% \changes{v1.61803398d}{2010/02/05}{changed \cs{sidefootfont} to
+% \cs{sidefoottextfont}}
+%
+% \begin{macrocode}
+\newcommand*{\setsidefeet}[6]{%
+ \nametest{#1}{*}\ifsamename\else
+ \setlength{\sidefoothsep}{#1}\@memznegtest{\sidefoothsep}%
+ \fi
+ \nametest{#2}{*}\ifsamename\else
+ \setlength{\sidefootwidth}{#2}\@memznegtest{\sidefootwidth}%
+ \fi
+ \nametest{#3}{*}\ifsamename\else
+ \setlength{\sidefootvsep}{#3}\@memznegtest{\sidefootvsep}%
+ \fi
+ \nametest{#4}{*}\ifsamename\else
+ \setlength{\sidefootadjust}{#4}%
+ \fi
+ \nametest{#5}{*}\ifsamename\else
+ \def\sidefoottextfont{#5}%
+ \fi
+ \nametest{#6}{*}\ifsamename\else
+ \setsidefootheight{#6}%
+ \ifdim\dimen\sidefootins>\z@\else
+ \@memerror{\protect\sidefootheight\space is zero or negative}{\@ehd}%
+ \fi
+ \fi}
+\setsidefeet{\marginparsep}{\marginparwidth}%
+ {\onelineskip}{0pt}%
+ {\normalfont\footnotesize}{\textheight}%
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\sidefootform}
+% Set the sidefootnotes raggedy right
+% \begin{macrocode}
+\newcommand*{\sidefootform}{\rightskip=\z@ \@plus 2em}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\m@sideft@left}
+% \begin{macro}{\m@sideft@right}
+% Macros placing the sidefootnotes at the left and the right respectively.
+% \begin{macrocode}
+\newcommand*{\m@sideft@left}{%
+ \@tempdimc \sidefootwidth
+ \advance\@tempdimc\sidefoothsep
+ \kern-\@tempdimc}
+\newcommand*{\m@sideft@right}{%
+ \@tempdimc \columnwidth% or \hsize
+ \advance\@tempdimc\sidefoothsep
+ \kern\@tempdimc}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mdownsf}
+% A length used in the vertical positioning of sidefootnotes.
+% (Perhaps one of the \cs{@tempdim} lengths could be used instead?)
+% \begin{macrocode}
+\newlength{\m@mdownsf}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootcontents}
+% The essence of the sidefootnote task. This first positions the column
+% to the left or the right and then tries to make the bottom of the
+% column align with the bottom of the textblock.
+% \begin{macrocode}
+\newcommand*{\sidefootcontents}{\hbox to \z@{%
+ \m@mwhich@margin{\m@msidefoot@margin}%
+ \ifmemtortm
+ \m@sideft@right
+ \else
+ \m@sideft@left
+ \fi
+% \end{macrocode}
+% Now the fun part. The general idea is to measure the height of the insert's
+% contents, subtract this from the specified height of the insert,
+% and move the contents down by that amount.
+% The code below seems to work except when sidefootnotes
+% spill over to the following page; also, like \cs{sidebar},
+% they are out of vertical alignment when on a \cs{chapter} page.
+% I haven't found a way to automatically
+% adjust for these, which is why the \cs{sidefootadjust} length is
+% there to enable manual adjustment.
+% \changes{v1.61803398d}{2010/02/05}{changed \cs{sidefootfont}
+% to \cs{sidefoottextfont}}
+% \begin{macrocode}
+ \vtop to 0pt{% original
+ \normalsize\normalfont\sidefoottextfont
+ \vskip\topskip \vskip-\ht\strutbox
+ \vskip\sidefootadjust% use this for minor vertical adjustment
+ \m@mdownsf=\dimen\sidefootins
+ \advance\m@mdownsf-\ht\sidefootins
+ \advance\m@mdownsf-\dp\sidefootins
+% \end{macrocode}
+% Here's where the fiddling occurs, arrived at by a mixture of theory and
+% experiment.
+% \begin{macrocode}
+ \ifdim\m@mdownsf>\sidefootvsep
+ \advance\m@mdownsf\sidefootvsep
+ \advance\m@mdownsf 0.5\ht\strutbox
+ \fi
+ \vskip\m@mdownsf% --- basically works
+ \unvbox\sidefootins%
+ \vss}%
+ \hss}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mopsidefoot}
+% If there are any sidefeet then add them to the output.
+% \begin{macrocode}
+\newcommand*{\m@mopsidefoot}{%
+ \ifvoid\sidefootins\else
+ \setbox\@outputbox \vbox{%
+ \sidefootcontents
+ \unvbox\@outputbox}
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@makecol}
+% \begin{macro}{\mem@makecolbf}
+% \begin{macro}{\@reinserts}
+% \begin{macro}{\@mem@extranofeet}
+% \begin{macro}{@mem@testifnofoot}
+% Revise these to cater for the new sidefoot insert.\label{makecol}
+% \changes{v3.7c}{2013/11/28}{Spurious space}
+% \begin{macrocode}
+\gdef\mem@makecol{%
+ \m@m@makecolintro
+ \ifvoid\footins
+ \setbox\@outputbox \box\@cclv
+ \else
+ \m@mopfootnote
+ \fi
+ \m@mdoextrafeet
+ \m@m@makecolfloats
+ \m@mopsidebar
+ \m@mopsidefoot
+ \m@m@makecoltext
+ \global \maxdepth \@maxdepth}
+
+% \end{macrocode}
+%
+% \changes{v1.618033988b}{2010/02/17}{a bf was missing in \cs{m@mopfootnotebf}}
+% \changes{v3.7c}{2013/11/28}{Spurious space}
+% \begin{macrocode}
+\gdef\mem@makecolbf{%
+ \m@m@makecolintro
+ \setbox\@outputbox \box\@cclv
+ \m@m@makecolfloats
+ \ifvoid\footins
+ \else
+ \m@mopfootnotebf
+ \fi
+ \m@mdoextrafeet
+ \m@mopsidebar
+ \m@mopsidefoot
+ \m@m@makecoltext
+ \global \maxdepth \@maxdepth}
+
+% \end{macrocode}
+% \changes{v3.6d}{2010/06/30}{There should not be an \cs{else} on the
+% kludge line}
+% \changes{v3.6f}{2010/08/22}{There should not be an \cs{else} on the
+% kludge line, then remember to remove it}
+% \begin{macrocode}
+\gdef\@reinserts{%
+ \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+ \m@mdodoreinextrafeet
+ \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi
+ \ifvoid\sideins\else\insert\sideins{\unvbox\sideins}\fi
+ \ifvoid\sidefootins\else\insert\sidefootins{\unvbox\sidefootins}\fi}
+
+% \end{macrocode}
+%
+% The easy way of extending the \cs{clearpage} code is by:
+% \begin{verbatim}
+% \renewcommand*{\@mem@extranofeet}{%
+% \ifvoid\sidefootins\else\@mem@nofootfalse\fi}
+% \end{verbatim}
+% but as so many other changes have to be made it's probably better to
+% leave that alone and change \cs{@mem@testifnofoot} directly.
+% \begin{macrocode}
+\renewcommand*{\@mem@testifnofoot}{%
+ \@mem@nofoottrue
+ \ifvoid\footins\else\@mem@nofootfalse\fi
+ \ifvoid\footinsv@r\else\@mem@nofootfalse\fi
+ \ifvoid\sideins\else\@mem@nofootfalse\fi
+ \ifvoid\sidefootins\else\@mem@nofootfalse\fi
+ \@mem@extranofeet}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{The sidefootnote macros}
+%
+% The macros here are essentially a copy of the ones for \cs{footnote}.
+% I have not done anything about sidefootnotes in minipages, as I can't
+% imagine a use for them while simultaneously making the final appearance
+% looking good.
+%
+% The usual counter.
+% \begin{macrocode}
+\newcounter{sidefootnote}
+ \renewcommand{\thesidefootnote}{\@arabic\c@sidefootnote}
+\@addtoreset{sidefootnote}{chapter}
+
+% \end{macrocode}
+%
+% By using: \\
+% \verb?\letcountercounter{sidefootnote}{footnote}? \\
+% the same counter will be used for both footnotes and sidefootnotes.
+% This can be reverted to separate counters by; \\
+% \verb?\unletcounter{sidefootnote}?
+%
+% \begin{macro}{\sidefoottextfont}
+% The font for the sidefootnotes.
+% \changes{v1.61803398d}{2010/02/06}{\cs{sidefoottextfont} is already
+% defined by the initial issuing of \cs{setsidefeet}}
+% \begin{macrocode}
+%\newcommand*{\sidefoottextfont}{\normalfont\footnotesize}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The remainder of the code is a copied from that for \cs{footnote}
+% but with the appropriate variables for \cs{sidefootnote}s
+%
+% \begin{macro}{\@sidempfn}
+% \begin{macro}{\thesidempfn}
+% \begin{macrocode}
+\newcommand*{\@sidempfn}{sidefootnote}
+\newcommand*{\thesidempfn}{\thesidefootnote}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@makesidefnmark}
+% \begin{macrocode}
+\newcommand*{\@makesidefnmark}{\hbox{\@textsuperscript{%
+ \normalfont\@thesidefnmark}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@preamsidefntext}
+% \begin{macrocode}
+\newcommand{\@preamsidefntext}{%
+ \interlinepenalty\interfootnotelinepenalty
+ \floatingpenalty \@MM
+ \splittopskip=\footnotesep
+ \splitmaxdepth=\dp\strutbox
+ \@parboxrestore}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@sidefootnotetext}
+% \changes{v1.61803398d}{2010/02/05}{changed \cs{sidefootfont}
+% to \cs{sidefoottextfont}}
+% \changes{v3.6g}{2010/09/19}{made 'single spacing' configurable}
+% \begin{macrocode}
+\newcommand{\@sidefootnotetext}[1]{\insert\sidefootins{%
+ \hsize\sidefootwidth
+ \@parboxrestore
+ \def\baselinestretch{\m@m@footnote@spacing}%
+ \sidefootform \normalsize\normalfont\sidefoottextfont
+ \splittopskip=\ht\strutbox
+ \splitmaxdepth=\dp\strutbox
+ \allowbreak
+ \prevdepth=\dp\strutbox
+ \vskip-\parskip
+ \protected@edef\@currentlabel{%
+ \csname p@sidefootnote\endcsname\@thesidefnmark}%
+\color@begingroup
+\@makesidefntext{{\sidefoottextfont #1}}%
+\color@endgroup
+ \ifvmode\else
+ \unskip\@finalstrut\strutbox
+ \fi
+ \par
+ \ifdim\prevdepth>\dp\strutbox \prevdepth=\dp\strutbox\fi
+ \ifdim\prevdepth>99\p@
+ \nobreak
+ \vskip-\prevdepth
+ \allowbreak
+ \vskip\dp\strutbox
+ \fi
+ \vskip\sidefootvsep}%
+ \m@mmf@prepare}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@sidefootnotemark}
+% \begin{macrocode}
+\newcommand*{\@sidefootnotemark}{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check
+ \nobreak
+ \fi
+ \@makesidefnmark
+ \m@mmf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootnote}
+% \begin{macrocode}
+\newcommand*{\sidefootnote}{\@ifnextchar[
+ \@xsidefootnote{\stepcounter\@sidempfn
+ \protected@xdef\@thesidefnmark{\thesidempfn}%
+ \@sidefootnotemark\@sidefootnotetext}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xsidefootnote}
+% \begin{macrocode}
+\def\@xsidefootnote[#1]{%
+ \begingroup
+ \csname c@\@sidempfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thesidefnmark{\thesidempfn}%
+ \endgroup
+ \@sidefootnotemark\@sidefootnotetext}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootnotemark}
+% \begin{macrocode}
+\newcommand{\sidefootnotemark}{%
+ \@ifnextchar[
+ \@xsidefootnotemark
+ {\stepcounter{sidefootnote}%
+ \protected@xdef\@thesidefnmark{\thesidefootnote}%
+ \@sidefootnotemark}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xsidefootnotemark}
+% \begin{macrocode}
+\def\@xsidefootnotemark[#1]{%
+ \begingroup
+ \c@sidefootnote #1\relax
+ \unrestored@protected@xdef\@thesidefnmark{\thesidefootnote}%
+ \endgroup
+ \@sidefootnotemark}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootnotetext}
+% \begin{macrocode}
+\newcommand*{\sidefootnotetext}{%
+ \@ifnextchar[
+ \@xsidefootnotetext
+ {\protected@xdef\@thesidefnmark{\thesidempfn}%
+ \@sidefootnotetext}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xsidefootnotetext}
+% \begin{macrocode}
+\def\@xsidefootnotetext[#1]{%
+ \begingroup
+ \csname c@\@sidempfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thesidefnmark{\thesidempfn}%
+ \endgroup
+ \@sidefootnotetext}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sidefootmarkstyle}
+% \begin{macro}{\sidefootscript}
+% \begin{macro}{\makesidefootmarkhook}
+% \begin{macro}{\sidefootfootmark}
+% \begin{macrocode}
+\newcommand*{\sidefootmarkstyle}[1]{\def\sidefootscript##1{#1}}
+\newcommand*{\makesidefootmarkhook}{}
+\newcommand*{\sidefootfootmark}{%
+ \ifdim\sidefootmarkwidth < \z@
+ \llap{\hb@xt@ -\sidefootmarkwidth{%
+ \hss\normalfont\sidefootscript{\@thesidefnmark}}%
+ \hspace*{-\sidefootmarkwidth}}%
+ \else
+ \ifdim\sidefootmarkwidth = \z@
+ {\normalfont\sidefootscript{\@thesidefnmark}}%
+ \else
+ \hb@xt@\sidefootmarkwidth{\hss\normalfont\sidefootscript{\@thesidefnmark}}%
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makesidefootmark}
+% \changes{v1.61803398d}{2010/02/04}{Made \cs{makesidefootmark} long
+% as the similar \cs{footnote} command, otherwise one cannot make side
+% footnotes containign several paragraphs}
+% \begin{macrocode}
+\newcommand{\makesidefootmark}[1]{%
+ \leavevmode
+ \parindent \sidefootparindent\noindent
+ \leftskip\sidefootmarksep\relax
+ \advance\leftskip \sidefootmarkwidth \null\nobreak\hskip -\leftskip\relax
+ \makesidefootmarkhook\relax
+ \sidefootfootmark #1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makesidefntext}
+% \begin{macrocode}
+\newcommand{\@makesidefntext}[1]{\makesidefootmark #1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Final layout.
+% \begin{macro}{\sidefootmarkwidth}
+% \begin{macro}{\sidefootmarksep}
+% \begin{macro}{\sidefootparindent}
+% \changes{v1.61803398d}{2010/02/04}{changed the defaults for
+% \cs{sidefootmarkwidth} and \cs{sidefootmarksep} to zero, from 1em
+% and -1em, looks better with the narrow margins}
+% \begin{macrocode}
+\newlength{\sidefootmarkwidth}
+ \setlength{\sidefootmarkwidth}{0em}
+\newlength{\sidefootmarksep}
+ \setlength{\sidefootmarksep}{0em}
+\newlength{\sidefootparindent}
+ \setlength{\sidefootparindent}{1em}
+\sidefootmarkstyle{\textsuperscript{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{End notes}
+%
+% \changes{v3.6h}{2011/01/19+}{Reimplemented page notes}
+% This used to be a copy of the \Lpack{pagenote} package, with minor
+% amendments. But it turned out that the implementation used by
+% \Lpack{pagenote} at that time, had a few serious flaws. In this
+% implementation we will instead turn to the trick used by the
+% \Lpack{endnotes} package to overcome the same problem.
+% For the sake of history, let us summarise what the actual problem
+% was. Basically the command \cs{pagenote}\marg{text} would write an
+% entry to an external file in the following format
+% \begin{verbatim}
+% \noteentry{nom}{id}{text}{pagenum}
+% \end{verbatim}
+% and when typesetting the page notes, this file would be read into
+% the document and \cs{noteentry} would typeset each page note. The
+% main problem here is \verb|{text}| which is written verbatimly to
+% the external file, but it is written on a single line!, thus an
+% input like this
+% \begin{verbatim}
+% \pagenote{Test%
+% test}
+% \end{verbatim}
+% would give us the entry
+% \begin{verbatim}
+% \noteentry{num}{id}{Test%test}{pagenum}
+% \end{verbatim}
+% oops! This is what we will solve using inspiration from
+% \Lpack{endnotes}, kudos to John Lavagnino.
+%
+%
+% \begin{macro}{\ifm@mpnpageopt}
+% \begin{macro}{\ifm@mpncontopt}
+% We need two flags for the options.
+% \cs{m@mpnpageoptfalse} means that page numbers are not available and
+% \cs{m@mpncontopt} means that note numbers are reset at each \cs{chapter}.
+% \begin{macrocode}
+\newif\ifm@mpnpageopt
+ \m@mpnpageoptfalse
+\newif\ifm@mpncontopt
+ \m@mpncontoptfalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@pagenote}
+% \begin{macro}{\thepagenote}
+% We need a counter for the notes. This is the default definition.
+% \begin{macrocode}
+\newcounter{pagenote}[chapter]
+\renewcommand{\thepagenote}{\arabic{pagenote}}
+\setcounter{pagenote}{0}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\notepageref}
+% \begin{macro}{\continuousnotenums}
+% \changes{v3.6h}{2011/01/19}{Removed references to pagenote package}
+% Let the user change the default options. \cs{notepageref} makes
+% page numbers available in the typeset list of page note and
+% \cs{continuousnotenums} means that notes will be numbered
+% continuously throughout the document.
+% \begin{macrocode}
+\newcommand*{\notepageref}{\m@mpnpageopttrue}
+\@onlypreamble\notepageref
+\newcommand*{\continuousnotenums}{%
+ \counterwithout{pagenote}{chapter}
+ \renewcommand{\thepagenote}{\arabic{pagenote}}}
+\@onlypreamble\continuousnotenums
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ifmempagenotes}
+% Need to check if notes are required.
+% \begin{macrocode}
+\newif\ifmempagenotes
+ \mempagenotesfalse
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makepagenote}
+% This sets up the note file. At the end it emasculates itself so it can only
+% be used once.
+% \begin{macrocode}
+\newcommand*{\makepagenote}{%
+ \newwrite\@notefile
+ \immediate\openout\@notefile=\jobname.ent
+ \mempagenotestrue
+% \end{macrocode}
+% \begin{macro}{\pagenote}
+% Make sure that this has a useful definition.
+% \changes{v3.6h}{2011/01/19}{Made \cs{pagenote} robust}
+% \changes{v3.6j}{2011/03/01}{Removed \cs{@sanitize}}
+% \changes{v3.6k}{2011/03/08}{Actually need \cs{@sanitize} for the
+% optional argument. But we need to remove spaces from this}
+% \begin{macrocode}
+ \DeclareRobustCommand\pagenote{\@bsphack\begingroup
+ \rem@special{\ }% <--- added
+ \@sanitize
+ \m@m@wrpnote}%
+% \end{macrocode}
+% \end{macro}
+% \changes{v3.6h}{2011/01/19}{Added the redefinition of \cs{mem@footto@pagenote}}
+% \begin{macro}{\mem@footto@pagenote}
+% The same as for \cs{pagenote} but here we use a special version of
+% the writing macro that will ignore the optional argument. This will
+% internally be used when the user ask for foot notes to be turned
+% into page notes.
+% \changes{v3.6j}{2011/03/01}{Removed \cs{@sanitize}}
+% \changes{v3.6k}{2011/03/08}{Actually need \cs{@sanitize} for the
+% optional argument. But we need to remove spaces from this}
+% \begin{macrocode}
+ \DeclareRobustCommand\mem@footto@pagenote{\@bsphack\begingroup
+ \rem@special{\ }% <--- added
+ \@sanitize
+ \def\mem@pn@step{01}%
+ \m@m@wrpnote}%
+% \end{macrocode}
+% \end{macro}
+% At the end we make sure \cs{makepagenote} can only do something once.
+% \begin{macrocode}
+ \typeout{Writing note file \jobname.ent}%
+ \let\makepagenote\@empty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\immediate@protected@write}
+% We might have to do some immediate writes. This is an immediate
+% version of the kernel \cs{protected@write}.
+% \begin{macrocode}
+\newcommand{\immediate@protected@write}[3]{%
+ \begingroup
+ #2%
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\immediate\write#1{#3}}%
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@m@pnwrite}
+% \begin{macro}{\m@m@pnwrited}
+% In the old implementation we used \cs{immediate@protected@write}
+% unless the user asked for page numbers in the notes, the new
+% implementation use the same writing method for all cases, for easy
+% of notation we collect it in a macro. Seems UTF8 is an interesting
+% beast, \cs{immediate@protected@write} can write it to disk, but
+% \cs{m@m@pnwrite} cannot. To get past this we also include a version
+% that has an embedded \cs{detokenize} (thanks to Heiko Oberdiek for
+% that hint).
+% \changes{v3.6k}{2011/04/06}{Added the version with \cs{detokenize}}
+% \begin{macrocode}
+\newcommand{\m@m@pnwrite}[3]{\immediate\write#1{#3}}
+\newcommand{\m@m@pnwrited}[3]{\immediate\write#1{\detokenize{#3}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pnchap}
+% \begin{macro}{\pnschap}
+% Redefine these for different subheadings in the notes list.
+% \begin{macrocode}
+\newcommand*{\pnchap}{\f@rtoc}
+\newcommand*{\pnschap}{\f@rbdy}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\c@pagenoteshadow}
+% \begin{macro}{\mem@pn@step}
+% \begin{macro}{\mem@pn@lastkern}
+% Utilities, a counter to provide us with a unique name for each page
+% note, a toggle macro and a length to hold a lastkern (because
+% someone may hide it from us).
+% \begin{macrocode}
+\newcounter{pagenoteshadow}
+ \setcounter{pagenoteshadow}{0}
+\newcommand\mem@pn@step{00} % i.e. true
+\newlength\mem@pn@lastkern
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@m@wrpnote}
+% This writes the note information to the note file. If the optional argument
+% is empty it increments the
+% note counter and calls \cs{notenumintext} to handle its appearance in
+% the body text. We write an entry of the following design
+% \begin{verbatim}
+% \startnoteentry{notenumber}{id}{auto label key}{hyperref}
+% macro:->text
+% \endnoteentry
+% \end{verbatim}
+%
+% \begin{macro}{\m@m@pnwrite@fourtharg}
+% \begin{macro}{\m@m@pnwrite@fourtharg@hyperref}
+% In order for us to add \Lpack{hyperref} support we will need to
+% record the hyperref anchor label into the page note data. We do this
+% though \verb|\m@m@pnwrite@fourtharg|, which by default just adds
+% \verb|{}| to the page note data. \Lpack{memhfixc} makes it point
+% toward \verb|\m@m@pnwrite@fourtharg@hyperref| instead. We make sure
+% to pass it the optional argument from \verb?\pagenote?, if this is
+% precent a hyper anchor is not passed on.
+% \changes{v3.6k}{2013/05/17}{Macro needs to test an argument}
+% \begin{macrocode}
+\newcommand\m@m@pnwrite@fourtharg[1]{\m@m@pnwrited\@notefile{}{{}}}
+\newcommand\m@m@pnwrite@fourtharg@hyperref[1]{%
+ \@ifmtarg{#1}{%
+ \m@m@pnwrite\@notefile{}{{\Hy@pagenote@currentHref}}%
+ }{%
+ \m@m@pnwrited\@notefile{}{{}}%
+ }}
+
+% \end{macrocode}
+% \end{macro}
+% % \end{macro}
+%
+% \changes{v1.61803}{2008/05/25}{Made \cs{m@m@wrpnote} match the effect
+% described in memman regarding the optional argument.}
+% \changes{v3.6h}{2011/01/19}{Changed the internal implementation}
+% \begin{macrocode}
+\newcommand{\m@m@wrpnote}[2][]{%
+% \end{macrocode}
+% If \Lpack{hyperref} is loaded it issues a whatisit and thus
+% hide/reset the last kern, which is needed for the algorithm used for
+% the multiple notes in a row feature (adding commas). So we start by
+% storing the last kern, and refstep a shadow counter such that we
+% can generate more or less unique label keys.
+% \begin{macrocode}
+ \mem@pn@lastkern=\lastkern%
+ \refstepcounter{pagenoteshadow}%
+% \end{macrocode}
+% If the user asks for it enable page back refs, we use labels and
+% references for this (bonus: automatic support for hyperlinks if
+% \Lpack{hyperref} is available).
+% \begin{macrocode}
+ \ifm@mpnpageopt%
+ \phantomsection%
+ \label{pagenote\thepagenoteshadow-\thesheetsequence}%
+ \fi%
+% \end{macrocode}
+% Next we want to be able to reuse this macro just for writing the
+% entry to disk, no writing a marker in the text (think replacement
+% for \cs{footnotetext}), we use the toggle for this and also remember
+% to re-insert the code needed for comma separated multiple markers
+% \begin{macrocode}
+ \if\mem@pn@step%
+ \@ifmtarg{#1}{\refstepcounter{pagenote}%
+ % this enables the ^{1,2} feature
+ \ifdim\mem@pn@lastkern=\multiplefootnotemarker%
+ \m@mmf@prepare% rerun
+ \fi%
+ \mem@pn@multiple@marker{\notenumintext{\thepagenote}}%
+ }{}%
+ \fi%
+% \end{macrocode}
+% Check if this is the first note in a division, and if so indicate this
+% in the file.
+% \changes{v3.6h}{2011/01/25}{Added \cs{pagenotesubheadstarred}}
+% \begin{macrocode}
+ \ifm@mpn@new@chap%
+ \global\m@mpn@new@chapfalse%
+ \addtonotes{\string\pagenotesubhead{\@chapapp}{\thechapter}{\pnchap}}%
+ \fi%
+ \ifm@mpn@new@schap%
+ \global\m@mpn@new@schapfalse%
+ \addtonotes{\string\pagenotesubheadstarred{\@chapapp}{}{\pnschap}}%
+ \fi%
+% \end{macrocode}
+% Next we write to the notes file. Instead of writing everything as a
+% macro with arguments, we will use three writes. One to start a new
+% entry with a few (non-text) arguments, then the text itself, and
+% finally an end of entry marker macro. There is a slight complication
+% here. The \verb|#1| may be UTF8 so it has to be written unexpanded
+% to disk, but macros like \verb|\thepagenote| need to be
+% expanded. Luckily \TeX\ eats up spaces when reading arguments, so we
+% simply writte several lines using two different writing methods.
+% \changes{v3.6k}{2011/04/06}{Rewritten to use a different writing method}
+% \begin{macrocode}
+ \m@m@pnwrite\@notefile{}%
+ {\string\startnoteentry{\thepagenote}}%
+ \m@m@pnwrited\@notefile{}{{#1}}%
+ \m@m@pnwrite\@notefile{}%
+ {{pagenote\thepagenoteshadow-\thesheetsequence}}%
+% \end{macrocode}
+% Add the fourth argument.
+% \changes{v3.6k}{2013/05/16}{Added fourth argument for the note data}
+% \changes{v3.6k}{2013/05/17}{Fourth arg, should depend on \#1}
+% \begin{macrocode}
+ \m@m@pnwrite@fourtharg{#1}%
+% \end{macrocode}
+% Getting the newline stuff to work require
+% \verb|\immediate\write| which we defined earlier. We then write the
+% text `verbatimly' using the detokenized macro.
+% \changes{v3.6k}{2011/04/06}{No longer any need for the \cs{meaning} construction.}
+% \begin{macrocode}
+ \begingroup%
+ \newlinechar='40%
+ \m@m@pnwrited\@notefile{}{#2}%
+ \endgroup%
+% \end{macrocode}
+% Remember to also write a marker that ends the entry.
+% \begin{macrocode}
+ \m@m@pnwrite\@notefile{}%
+ {\string\endnoteentry}%
+ \endgroup%
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pagenote}
+% \begin{macro}{\mem@footto@pagenote}
+% The user command to generate a note. It is given substance
+% by \cs{makepagenote}. Supplied with a special version used if the
+% user asks for all footnotes to be turned into page notes.
+% \changes{v3.6h}{2011/01/19}{Added \cs{mem@footto@pagenote}}
+% \begin{macrocode}
+\def\pagenote{\@bsphack\begingroup \@sanitize\m@m@pagenote}
+\let\mem@footto@pagenote\pagenote
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@m@pagenote}
+% \begin{macrocode}
+\newcommand{\m@m@pagenote}[2][]{\endgroup\@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pagetofootnote}
+% \begin{macro}{\foottopagenote}
+% \begin{macro}{\memsavefootnote}
+% \begin{macro}{\memsavepagenote}
+% Let the user change pagenotes to footnotes, or vice-versa. In either
+% case the optional argument is ignored.
+% \changes{v3.6h}{2010/12/07}{\cs{footnote} should be long}
+% \changes{v3.6h}{2010/12/09}{because of the way
+% \cs{pagenote} is defined, we cannot redefine \cs{footnote} to have
+% any arguments, we need to go another route}
+% \changes{v3.6h}{2010/12/09}{Added a check for the race condition}
+% We have a race condition, if both \cs{pagetofootnote} and
+% \cs{makepagenote} is issued in the same document,
+% \cs{pagetofootnote} need to come last.
+% \begin{macrocode}
+\newcommand*{\pagetofootnote}{%
+ \let\memsavepagenote\pagenote
+ \renewcommand{\pagenote}[2][]{\footnote{##2}}
+% \end{macrocode}
+% Basic idea is, if pagenotes mode is on when \cs{pagetofootnote} is
+% issued, everything is fine. Else we test at end document (because
+% \cs{makepagenote} can go anywhere).
+% \begin{macrocode}
+ \ifmempagenotes\else%
+ \AtEndDocument{%
+ \ifmempagenotes%
+ \@memerror{The use of \string\pagetofootnote\space before
+ \string\makepagenote\space^^Jdoes not make
+ sense. \string\makepagenote\space make some redefinitions that
+ are not picked up if \string\pagetofootnote\space is issued
+ before \string\makepagenote
+ }{}
+ \fi
+ }
+ \fi
+}
+% \end{macrocode}
+% Next the more challenging one. We make the footnote counter act as
+% the page note counter, this ensure that \cs{footnotemark} still work
+% when the user ask to have footnotes converted into page
+% notes. \cs{footnotetext} is the same as the page note writer macro,
+% but without writing the marker, here we use the special page note macro.
+% \begin{macrocode}
+\newcommand*{\foottopagenote}{%
+ \let\memsavefootnote\footnote
+% \end{macrocode}
+% \changes{v3.6k}{2013/05/02}{Remember to remove footnote counter from
+% chapter reset}
+% Since we alias the footnote counter to the pagenote counter, we need
+% to rewmove the footnote counter from the chapter reset, otherwise
+% \cs{continuousnotenums} will be wrong.
+% \begin{macrocode}
+ \counterwithout{footnote}{chapter}
+ \letcountercounter{footnote}{pagenote}
+ \renewcommand\footnotetext[2][]{\mem@footto@pagenote{##2}}
+ \renewcommand{\footnote}[2][]{\pagenote{##2}}
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\addtonotes}
+% \cs{addtonotes}\marg{text} puts \meta{text} into the notes file.
+% \changes{v3.6i}{2011/02/18}{\cs{addtonotes} need \cs{immediate@protected@write}}
+% \begin{macrocode}
+\newcommand{\addtonotes}[1]{\ifmempagenotes
+ \IfFileExists{\jobname.ent}{\immediate@protected@write\@notefile{}{#1}}{\mempnofilewarn}%
+\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\notenumintext}
+% \begin{macro}{\notenuminnotes}
+% \cs{notenumintext}\marg{notenum} typesets \meta{notenum} (in the
+% body text).
+% \begin{macrocode}
+\newcommand{\notenumintext}[1]{%
+ \textsuperscript{#1}}
+% \end{macrocode}
+% \cs{notenuminnotes}\marg{notenum} typesets \meta{notenum} (i.e. the
+% very first item when typesetting a note).
+% \begin{macrocode}
+\newcommand{\notenuminnotes}[1]{%
+ {\normalfont #1.}\space}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\noteentry}
+% \changes{v3.6}{2010/12/14}{explanation was wrong}
+% \changes{v3.6h}{2011/01/19}{removed}
+% \cs{noteentry}\marg{notenum}\marg{id}\marg{text}\marg{pagenum}
+% typesets a note. This macro is not used anymore.
+% \begin{macrocode}
+ %\newcommand{\noteentry}[4]{} % not used any more!
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\idtextinnotes}
+% \cs{idtextinnotes}\marg{id text} typesets the note's \meta{id text}.
+% \begin{macrocode}
+\newcommand{\idtextinnotes}[1]{%
+ [#1]\space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\noteidinnotes}
+% \cs{noteidinnotes}\marg{notenum}\marg{id} is used to typeset the note
+% identification (in the note listing). It is set so that it typesets the
+% \meta{id} if it is not empty, otherwise it sets the \meta{notenum}.
+% \begin{macrocode}
+\newcommand{\noteidinnotes}[2]{%
+ \@ifmtarg{#2}{%
+ \notenuminnotes{#1}}{\idtextinnotes{#2}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pageinnotes}
+% \begin{macro}{\printpageinnotes}
+% \begin{macro}{\printpageinnoteshyperref}
+% \changes{v3.6h}{2011/01/19}{Changed to match new implementation}
+% \cs{pageinnotes}\marg{key} calls
+% \cs{printpageinnotes}\marg{key} to typeset the originating
+% page number (in the note), but only if the \cs{notepageref} declaration
+% has been used. Remember we provide an automatically generated label
+% key, thus we use \cs{pageref} to get the page number. We provide a
+% \Lpack{hyperref} version which is automatically used whenever
+% \Lpack{hyperref} is loaded.
+% \begin{macrocode}
+\newcommand{\pageinnotes}[1]{%
+ \ifm@mpnpageopt \printpageinnotes{#1}\fi}
+\newcommand*{\printpageinnotes}[1]{%
+ (\pagerefname\ \pageref{#1})\space}
+\newcommand\printpageinnoteshyperref[1]{%
+(\hyperref[#1]{\pagerefname\ \pageref*{#1}})\space}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\noteinnotes}
+% \cs{noteinnotes}\marg{text} is used to typeset the note's text
+% (in the note list). This macro is not used any more, but doesn't do
+% any harm to leave it here.
+% \begin{macrocode}
+\newcommand{\noteinnotes}[1]{#1} % not used anymore!
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prenoteinnotes}
+% \begin{macro}{\postnoteinnotes}
+% These are called immediately before and after the note information is
+% typeset.
+% \begin{macrocode}
+\newcommand{\prenoteinnotes}{\par\noindent}
+\newcommand{\postnoteinnotes}{\par}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\prenotetext}
+% \begin{macro}{\postnotetext}
+% Thise two macros are executed just before and just after the note
+% text. Does nothing by default.
+% \begin{macrocode}
+\newcommand\prenotetext{}
+\newcommand\postnotetext{}
+
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\notesname}
+% \begin{macro}{\notedivision}
+% Heading for note list.
+% \begin{macrocode}
+\providecommand*{\notesname}{Notes}
+\newcommand*{\notedivision}{\chapter{\notesname}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.6h}{2010/12/14}{typo}
+% \changes{v3.6h}{2011/01/19}{There is no reason to use two macros to
+% implement a starred and non starred version in this case.}
+% \begin{macro}{\printpagenotes}
+% \begin{macro}{\printpagenotes*}
+% User commands to print the note file.
+% \begin{macrocode}
+\newcommand*{\printpagenotes}{\@ifstar{\mem@printpagenotes{00}}{\mem@printpagenotes{01}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mempnofilewarn}
+% Warning when the notes file does not exist.
+% \begin{macrocode}
+\newcommand*{\mempnofilewarn}{%
+ \ClassWarning{memoir}{There is no .ent file}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\startnoteentrystart}
+% \begin{macro}{\endnoteentryend}
+% \begin{macro}{\pagenoteanchor}
+% \begin{macro}{\pagenotebyanchor}
+% Utility macros to handle page note formating and hyperlinks.
+% \changes{v3.6k}{2013/05/16}{altered to use four arguments instead of three}
+% \changes{v3.6k}{2013/05/16}{Added page note anchor}
+% \changes{v3.6k}{2013/05/17}{Forgot about labels in the note text.}
+% \changes{v3.7g}{2018/01/03}{Added \cs{phantomsection}, otherwise
+% \cs{label} does not work correctly. Reported in \texttt{https://tex.stackexchange.com/q/408448/3929}}
+% \begin{macrocode}
+\newcommand\startnoteentrystart[4]{%
+ \prenoteinnotes%
+ \noteidinnotes{#1}{#2}%
+ \@ifmtarg{#2}{\phantomsection\def\@currentlabel{#1}}{}%
+ \pagenoteanchor{#4}%
+ \pageinnotes{#3}%
+ \prenotetext%
+}
+\def\endnoteentryend{\postnotetext\postnoteinnotes}
+\let\pagenoteanchor\@gobble
+% \end{macrocode}
+% The page note hyper anchor should of course only be added when there
+% is an anchor.
+% \changes{v3.6k}{2013/05/17}{Forgot to test the argument}
+% \begin{macrocode}
+\newcommand\pagenotehyperanchor[1]{%
+ \expandafter\@ifmtarg\expandafter{#1}{}{%
+ \Hy@raisedlink{\hyper@@anchor{#1}{\relax}}}}%
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mem@printpagenotes}
+% \begin{macro}{\startnoteentry}
+% \begin{macro}{\ednoteentry}
+% The internal macro for printing the list of page notes. The two
+% macros \cs{startnoteentry} and \cs{endnoteentry} are also defined here.
+% \changes{v3.6k}{2011/03/09}{Start and end entry better be long}
+% \changes{v3.6k}{2011/04/06}{We no longer use \cs{meaning} when
+% writing the data to disk, so no need to remove \texttt{>} any
+% more. Also removed the safe GT stuff}
+% \begin{macrocode}
+% \changes{v3.6k}{2013/05/16}{\cs{startnoteentry} should expect four args}
+\newcommand\mem@printpagenotes[1]{%
+ \ifmempagenotes
+ \notedivision
+ \IfFileExists{\jobname.ent}{%
+ \begingroup
+ \long\def\startnoteentry####1####2####3####4{%
+ \begingroup
+ \startnoteentrystart{####1}{####2}{####3}{####4}%
+ }
+ \long\def\endnoteentry{\endnoteentryend\endgroup}
+ \immediate\closeout\@notefile
+ \input{\jobname.ent}%
+ \if#1\immediate\openout\@notefile=\jobname.ent\fi%
+ \endgroup
+ }{%
+ \mempnofilewarn
+ }%
+ \fi%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@sprintpagenotes}
+% Macro implementing \cs{printpagenotes*}. Removed
+% \changes{v3.6h}{2011/01/20}{Removed}
+% \begin{macrocode}
+ % \newcommand*{\@sprintpagenotes}{%
+ % \ifmempagenotes
+ % \notedivision
+ % \IfFileExists{\jobname.ent}{%
+ % \immediate\closeout\@notefile
+ % \input{\jobname.ent}%
+ % \immediate\openout\@notefile=\jobname.ent%
+ % }{%
+ % \mempnofilewarn
+ % }%
+ % \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@printpagenotes}
+% Macro implementing \cs{printpagenotes}. Removed
+% \changes{v3.6h}{2011/01/20}{Removed}
+% \begin{macrocode}
+ % \newcommand*{\@printpagenotes}{%
+ % \ifmempagenotes
+ % \notedivision
+ % \IfFileExists{\jobname.ent}{%
+ % \immediate\closeout\@notefile
+ % \input{\jobname.ent}%
+ % }{%
+ % \mempnofilewarn
+ % }
+ % \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pagenotesubhead}
+% \begin{macro}{\pagenotesubheadstarred}
+% \changes{v3.6h}{2011/01/25}{Added \cs{pagenotesubheadstarred}}
+% The section heading before each set of notes. \\
+% \cs{pagenotesubhead}\marg{chaptername}\marg{number}\marg{title}
+% The \cs{pagenotesubheadstarred} macro is used for unnumbered
+% devisions. By default it is the same as \cs{pagenotesubhead}, but
+% the user can change this. For example it may look odd with an title
+% like this: >>Chapter Title<< when there is no number.
+% \begin{macrocode}
+\newcommand*{\pagenotesubhead}[3]{%
+ \section*{#1 #2 #3}}
+\newcommand\pagenotesubheadstarred{\pagenotesubhead}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Change marks} \label{sec:vct}
+%
+% When preparing a manuscript it normally goes through
+% several iterations. The commands provided may be used to identify
+% changes made to a document during its life cycle.
+%
+% The code for this part of the class is based on the version
+% controls in the \Lpack{iso} class~\cite{ISOCLASS}.
+%
+% \subsection{Print control}
+%
+% Members of the development group often need to see the changes
+% between document versions, while the general public does not.
+% \begin{macro}{\ifchangemarks}
+% This controls the appearence of the version controls defined
+% below.
+% \begin{macrocode}
+\newif\ifchangemarks\changemarksfalse
+% \end{macrocode}
+% The marks only work properly when the \Lopt{draft} option
+% is in effect. Also, the command \cs{changemarkstrue} must be
+% put in the document preamble.
+% \end{macro}
+%
+% \begin{macro}{\changemarks}
+% \begin{macro}{\nochangemarks}
+% More user friendly version of \cs{changemarks(true/false)}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{changemarks} and \cs{nochangemarks}}
+% \begin{macrocode}
+\newcommand*{\changemarks}{\changemarkstrue}
+\newcommand*{\nochangemarks}{\changemarksfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\v@rid}
+% This acts as an alias for \cs{marginpar} when both \cs{ifchangemarks} is
+% true and the \Lopt{draft} option is in effect, otherwise it throws
+% away its two arguments.
+% \changes{v1.2}{2002/07/27}{Added \cs{@bsphack} and \cs{@esphack} to \cs{v@rid}}
+% \begin{macrocode}
+\newcommand{\v@rid}[2]{%
+ \@bsphack
+ \ifchangemarks
+ \ifdraftdoc
+ \marginpar[#1]{#2}%
+ \fi\fi
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Change marking}
+%
+% The following commands flag changes in the typeset document. Each of
+% the commands takes one parameter which is intended to be a
+% `change number' or comment for tracking purposes. A symbol and
+% the \meta{change-id} is put into the margin near where the command
+% is given. The marking commands should be attached to some word or
+% punctuation mark in the text otherwise extraneous spaces may creep
+% into the final document.
+% \changes{v1.2}{2002/07/27}{Added \cs{@bsphack} and \cs{@esphack} to changemarks}
+% \begin{macro}{\added}
+% \cs{added}\marg{change-id}
+% Flags, with the symbol $\oplus$, that something has been added
+% to the manuscript.
+% \begin{macrocode}
+\newcommand{\added}[1]{%
+ \@bsphack
+ \ifchangemarks
+ \v@rid{\small$\oplus$ #1}{\small$\oplus$ #1}%
+ \fi
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\deleted}
+% \cs{deleted}\marg{change-id}
+% Flags, with the symbol $\neq$, that something has been deleted
+% from the manuscript.
+% \begin{macrocode}
+\newcommand{\deleted}[1]{%
+ \@bsphack
+ \ifchangemarks
+ \v@rid{\small$\neq$ #1}{\small$\neq$ #1}%
+ \fi
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\changed}
+% \cs{changed}\marg{change-id}
+% Flags, with the symbol $\Leftrightarrow$, that something
+% has been changed in the text.
+% \begin{macrocode}
+\newcommand{\changed}[1]{%
+ \@bsphack
+ \ifchangemarks
+ \v@rid{\small$\Leftrightarrow$ #1}{\small$\Leftrightarrow$ #1}%
+ \fi
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Trimming marks}
+%
+% The \Lopt{showtrims} options prints trimming marks at the corners
+% of the logical page. The code for this comes from ideas gleaned
+% from Martin Schr\"{o}der's \Lpack{everyshi} package~\cite{EVERYSHI}
+% and Melchior Franz's \Lpack{crop} package~\cite{CROP}.
+% The implementation and any errors are mine.
+%
+% The implementation up to October 2002 was limited to putting a cross
+% at the page corners. The manual directed users to the \Lpack{crop}
+% packge if they wanted anything more. In October 2002 the implementation
+% was substantially extended. The background to this is below.
+%
+% Before the release of version 1.7 of \Lpack{crop} in May 2002 its
+% author asked me to make some changes to \Lpack{memoir} that would be
+% helpful to him, and I did so. Later he told me that the changes were
+% unnecessary and I reverted to the original \Lpack{memoir} code.
+%
+% On 2002/10/06 Peter Heslin (\url{peter.heslin@ucd.ie}) started a
+% thread on \url{comp.text.tex} titled `Incompatibility of memoir.cls
+% and crop.sty' in which he said that \Lpack{memoir} and \Lpack{crop}
+% did not seem to work together. The following are some snippets from
+% that thread, identified by the various proponents.
+% \begin{description}
+% \item[crop] Ah, yes. It cannot work with all those \cs{settrims} etc.
+% crop.sty does only respect \verb?\stock{width,height}?,
+% but none of the other memoir specific trim marks stuff \ldots
+%
+% \item[crop] \ldots I'm not a memoir expert. crop.sty respects all the
+% usual LaTeX paper dimensions and simply puts the marks around the
+% page. It works with all standard classes and the KOMA classes. memoir
+% seems to do things completely differently \ldots
+%
+% Sorry, but I'm afraid I have to pass the problem to the memoir
+% author. \ldots
+%
+% \item[memoir] I will try and take a look at the problem but I'm
+% not a crop expert --- I've never used it. However it seems odd to
+% me that crop doesn't work with memoir. Memoir provides a different
+% interface for specifying the page layout but then translates everything
+% to the standard length variables. \ldots
+%
+% \item[crop] You've just taken code from it \verb?...:->?
+%
+% crop doesn't have its own idea at all. It just uses that of DEK
+% and LaTeX, which says, that the reference point of the output box
+% in the output routine is assumed 1 inch to the left [later corrected
+% to right] and 1 inch down
+% from the upper left (virtual) paper corner.
+%
+% \item[crop] With other words: crop changes \cs{hoffset} and \cs{voffset},
+% in order to center the logical (virtual) page on the physical sheet
+% of paper, in the middle of the crop marks. The length macros
+% \cs{evensidemargin} and \cs{oddsidemargin} are unchanged and refer still
+% to the logical page (modulo 1 inch).
+%
+% The memoir class, in contrast (mis)uses the LaTeX margins
+% \cs{even(odd)sidemargin} for that purpose.
+%
+% Thus, the meaning of \cs{even(odd)sidemargin} is different
+% in both packages.
+% \end{description}
+%
+% Given all the above I concluded that \Lpack{crop} would remain
+% as it was, and that in order to satisfy Peter Heslin I would have
+% to extend the trimming marks. The following was originally limited to
+% extensions
+% asked for by Peter Heslin.
+%
+% \begin{macro}{\showtrimsoff}
+% \begin{macro}{\showtrimson}
+% Switch trimming marksoff and on. Requested by James Hunt on CTT
+% \textit{Are crop marks needed on every page?}, February 2006.
+% \changes{v1.61803}{2008/01/30}{Added \cs{showtrimsoff} and \cs{showtrimson}
+% (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\showtrimsoff}{\showtrimsfalse}
+\newcommand*{\showtrimson}{\showtrimstrue}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\trimmark}
+% This is a cross
+% in a zero sized picture for marking the corner of a logical page. Up to
+% version 1.0 the macro used \cs{setlength} for adjusting the \cs{unitlength}
+% but Henrik Holm\footnote{Message to \ctt{} on 2002/01/04
+% (\texttt{h.holm@spray.no})} discovered that if the \Lpack{calc} package
+% is used then LaTeX complains about a missing number.
+% \changes{v1.0a}{2002/01/04}{Removed \cs{setlength} from \cs{trimmark}. Stops
+% problem with the calc package.}
+% \begin{macrocode}
+\newcommand*{\trimmark}{%
+ \begin{picture}(0,0)
+ \unitlength 1cm
+ \thinlines
+ \put(-2,0){\line(1,0){4}}
+ \put(0,-2){\line(0,1){4}}
+ \end{picture}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Ltrimpictl}
+% \begin{macro}{\Ltrimpictr}
+% \begin{macro}{\Ltrimpicbl}
+% \begin{macro}{\Ltrimpicbr}
+% `L' shaped trim marks for four corners.
+% \changes{v1.3}{2002/10/10}{Added \cs{Ltrimpictl}, \cs{Ltrimpictr}, \cs{Ltrimpicbl}
+% and \cs{Ltrimpicbr}}
+% \begin{macrocode}
+\newcommand*{\Ltrimpictl}{%
+ \begin{picture}(0,0)
+ \unitlength 1mm
+ \thinlines
+ \put(-2,0){\line(-1,0){18}}
+ \put(0,2){\line(0,1){18}}
+ \end{picture}}
+\newcommand*{\Ltrimpictr}{%
+ \begin{picture}(0,0)
+ \unitlength 1mm
+ \thinlines
+ \put(2,0){\line(1,0){18}}
+ \put(0,2){\line(0,1){18}}
+ \end{picture}}
+\newcommand*{\Ltrimpicbl}{%
+ \begin{picture}(0,0)
+ \unitlength 1mm
+ \thinlines
+ \put(-2,0){\line(-1,0){18}}
+ \put(0,-2){\line(0,-1){18}}
+ \end{picture}}
+\newcommand*{\Ltrimpicbr}{%
+ \begin{picture}(0,0)
+ \unitlength 1mm
+ \thinlines
+ \put(2,0){\line(1,0){18}}
+ \put(0,-2){\line(0,-1){18}}
+ \end{picture}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Ftrimpicbl}
+% Frame the page.
+% \changes{v1.3}{2002/10/10}{Added \cs{Ftrimpictl}}
+% \begin{macrocode}
+\newcommand*{\Ftrimpicbl}{%
+ \begin{picture}(0,0)
+ \unitlength 1pt
+ \thinlines
+ \put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}
+ \end{picture}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tmarktl}
+% \begin{macro}{\tmarktr}
+% \begin{macro}{\tmarkbl}
+% \begin{macro}{\tmarkbr}
+% The trimming marks used for corner display.
+% \changes{v1.3}{2002/10/10}{Added \cs{tmarktl}, \cs{tmarktr}, \cs{tmarkbl}
+% and \cs{tmarkbr}}
+% \begin{macrocode}
+\newcommand*{\tmarktl}{\trimmark}
+\newcommand*{\tmarktr}{\trimmark}
+\newcommand*{\tmarkbl}{\trimmark}
+\newcommand*{\tmarkbr}{\trimmark}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tmarktm}
+% \begin{macro}{\tmarkml}
+% \begin{macro}{\tmarkmr}
+% \begin{macro}{\tmarkbm}
+% The trimming marks used for mid-side display.
+% \changes{v1.3}{2002/10/10}{Added \cs{tmarktm}, \cs{tmarkml}, \cs{tmarkmr}
+% and \cs{tmarkbm}}
+% \changes{v1.6180339c}{2009/11/13}{Fill in these four macros. Easier
+% for users to define them to do nothing, than coming up with the code}
+% \begin{macrocode}
+\newcommand*{\tmarktm}{%
+ \begin{picture}(0,0)%
+ \unitlength 1mm
+ \thinlines
+ \put(0,2){\line(0,1){10}}
+ \end{picture}}
+\newcommand*{\tmarkml}{%
+ \begin{picture}(0,0)%
+ \unitlength 1mm
+ \thinlines
+ \put(-2,0){\line(-1,0){10}}
+ \end{picture}}
+\newcommand*{\tmarkmr}{%
+ \begin{picture}(0,0)%
+ \unitlength 1mm
+ \thinlines
+ \put(2,0){\line(1,0){10}}
+ \end{picture}}
+\newcommand*{\tmarkbm}{%
+ \begin{picture}(0,0)%
+ \unitlength 1mm
+ \thinlines
+ \put(0,-12){\line(0,1){10}}
+ \end{picture}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\trimXmarks}
+% \begin{macro}{\trimLmarks}
+% \begin{macro}{\trimFrame}
+% \begin{macro}{\trimNone}
+% These are declarations for the different kinds of trimming marks.
+% \changes{v1.3}{2002/10/10}{Added \cs{trimXmarks}, \cs{trimLmarks},
+% \cs{trimFrame} and \cs{trimNone}}
+% \begin{macrocode}
+\newcommand*{\trimXmarks}{%
+ \let\tmarktl\trimmark
+ \let\tmarktr\trimmark
+ \let\tmarkbl\trimmark
+ \let\tmarkbr\trimmark}
+\newcommand*{\trimLmarks}{%
+ \let\tmarktl\Ltrimpictl
+ \let\tmarktr\Ltrimpictr
+ \let\tmarkbl\Ltrimpicbl
+ \let\tmarkbr\Ltrimpicbr}
+\newcommand*{\trimFrame}{%
+ \let\tmarktl\null
+ \let\tmarktr\null
+ \let\tmarkbl\Ftrimpicbl
+ \let\tmarkbr\null}
+\newcommand*{\trimNone}{%
+ \let\tmarktl\relax
+ \let\tmarktr\relax
+ \let\tmarkbl\relax
+ \let\tmarkbr\relax
+ \let\tmarktm\relax
+ \let\tmarkml\relax
+ \let\tmarkmr\relax
+ \let\tmarkbm\relax}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\trimmarks}
+% \begin{macro}{\trimmarkscolor}
+% This positions four marks (\cs{trimmark}) at the corners of a
+% logical page. It is basically a \cs{vbox} with zero height and width.
+%
+% Bastiaan Niels Veelo reported (2003/07/11) odd things (e.g., some
+% macros ignored) when changing trim marks. Turns out to be related
+% to the use of \cs{protect}. The macro \cs{trimmarkscolor} can be
+% used to change the color of the trimmarks. Despite its name, it is
+% not a color but just an empty macro.
+% \changes{v1.1}{2002/03/10}{Changed \cs{trimmarks} to work properly with the oneside option}
+% \changes{v1.3}{2002/10/10}{Changed \cs{trimmarks} to use \cs{tmarktl}, etc.,
+% instead of four \cs{trimmark}s}
+% \changes{v1.4}{2003/11/22}{Fiddled \cs{protect} in \cs{trimmaks}
+% (from patch v1.7)}
+% \changes{v3.6h}{2010/12/05}{Added \cs{trimmarkscolor}}
+% \begin{macrocode}
+\newcommand*\trimmarkscolor{}
+\newcommand*{\trimmarks}{%
+ \vbox to \z@{\vskip-1in \vskip\trimtop % top of logical page
+ \hb@xt@\z@{\hskip-1in
+ \ifodd\c@page
+ \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \else
+ \if@twoside
+ \hskip\trimedge % left of logical page
+ \else
+ \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \fi
+ \fi
+ \vbox to \paperheight{%
+ \let\protect\relax % <- v1.4 addition
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarktl\hfil\tmarktm\hfil\tmarktr}%
+ \vfil
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarkml\hfil\tmarkmr}%
+ \vfil
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarkbl\hfil\tmarkbm\hfil\tmarkbr}}%
+ \hss}%
+ \vss}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Quark marks}
+%
+% William Adams (2006/08/28) supplied the following code to use trim marks
+% along the style of Quark Xpress.
+%
+% \begin{macro}{\registrationColour}
+% \begin{macro}{\quarkmarks}
+% Trim marks on the style of Quark Express.
+% \changes{v1.61803}{2008/01/30}{Added \cs{quarkmarks} (mempatch v4.6)}
+% \changes{v3.6h}{2010/12/05}{Added \cs{normalfont} such that font
+% changes going over a page break does not effect the quarks
+% text. Reported by Rasmus Villemoes.}
+% \changes{v3.6j}{2011/02/28}{Typo hsip -> hskip, reported by Alex Ball}
+% \begin{macrocode}
+\newcommand*{\registrationColour}[1]{#1}
+\newcommand*{\quarkmarks}{%
+\renewcommand*{\tmarktl}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(-36,0){\line(1,0){24}}
+ \put(0,12){\line(0,1){24}}
+ \put(3,27){\normalfont\ttfamily\fontsize{8bp}{10bp}\selectfont\jobname\ \
+ \today\ \ \printtime\ \ Page \thepage}
+ \end{picture}}}
+\renewcommand*{\tmarktm}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(-24,24){\line(1,0){48}}
+ \put(0,12){\line(0,1){24}}
+ \put(0,24){\oval(12,12)}
+ \end{picture}}}
+\renewcommand*{\tmarktr}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(12,0){\line(1,0){24}}
+ \put(0,12){\line(0,1){24}}
+ \end{picture}}}
+\renewcommand*{\tmarkmr}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(12,0){\line(1,0){24}}
+ \put(24,-24){\line(0,1){48}}
+ \put(24,0){\oval(12,12)}
+ \end{picture}}}
+\renewcommand*{\tmarkbr}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(12,0){\line(1,0){24}}
+ \put(0,-36){\line(0,1){24}}
+ \end{picture}}}
+\renewcommand*{\tmarkbm}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(-24,-24){\line(1,0){48}}
+ \put(0,-36){\line(0,1){24}}
+ \put(0,-24){\oval(12,12)}
+ \end{picture}}}
+\renewcommand*{\tmarkbl}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(-36,0){\line(1,0){24}}
+ \put(0,-36){\line(0,1){24}}
+ \end{picture}}}
+\renewcommand*{\tmarkml}{\registrationColour{%
+ \begin{picture}(0,0)
+ \setlength{\unitlength}{1bp}\thicklines
+ \put(-36,0){\line(1,0){24}}
+ \put(-24,-24){\line(0,1){48}}
+ \put(-24,0){\oval(12,12)}
+ \end{picture}}}
+\renewcommand*{\trimmarks}{%
+%% \special{papersize=\the\stockwidth,\the\stockheight}
+ {%
+ \vbox to \z@{\vskip-1in \vskip\trimtop % top of logical page
+ \hb@xt@\z@{\hskip-1in
+ \ifodd\c@page
+ \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \else
+ \if@twoside
+ \hskip\trimedge % left of logical page
+ \else
+ \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \fi
+ \fi
+ \vbox to \paperheight{%
+ \let\protect\relax % <- v1.4 addition
+% \end{macrocode}
+% We remember to add \cs{trimmarkscolor}
+% \changes{v3.6h}{2010/12.05}{added \cs{trimmarkscolor}}
+% \begin{macrocode}
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarktl\hfil\tmarktm\hfil\tmarktr}%
+ \vfil
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarkml\hfil\tmarkmr}%
+ \vfil
+ \hb@xt@\paperwidth{\trimmarkscolor\tmarkbl\hfil\tmarkbm\hfil\tmarkbr}}%
+ \hss}%
+ \vss}}%
+}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% Any marks are put onto the pages by adding to the \cs{shipout}
+% routine.
+%
+% \begin{macro}{\mem@oldshipout}
+% Keep a copy of the current version of \cs{shipout} in \cs{mem@oldshipout}.
+% \begin{macrocode}
+\let\mem@oldshipout\shipout
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mem@shipi}
+% \begin{macro}{\mem@shipii}
+% Effectively these will add the \cs{trimmarks} to the box holding
+% the contents of the page. Note that any \cs{makeindex} must come
+% \emph{before} \Lpack{pagesel} (and \Lpack{selectp}) package.
+% \changes{v1.618}{2005/09/03}{Changed \cs{mem@shipii} for the pagesel package,
+% courtesy James Szinger (mempatch v311)}
+% \changes{v1.61803}{2008/01/30}{Added \cs{ifshowtrims} to \cs{mem@shipii}
+% (mempatch v4.5)}
+% \changes{v1.6180339f}{2009/06/24}{Added Dan Luecking's fix to
+% \cs{mem@shippii} to cater for another merry hyperref change!}
+% \changes{v1.6180339c}{2009/11/13}{Replaced Dans fix with a fix from
+% Heiko Oberdiek}
+% \begin{macrocode}
+\newcommand*{\mem@shipi}{%
+ \ifvoid\@cclv\expandafter\aftergroup\fi\mem@shipii}
+\newcommand*\mem@shipii{%
+ \ifvoid\@cclv
+ \mem@oldshipout\box\@cclv
+ \else
+ \ifshowtrims
+% \end{macrocode}
+% Heiko Oberdiek responded to a problem reported by Rolf
+% Niepraschk. The earlier implementation might cause the output box to
+% be shifted. Heikos explanation (in response to the line
+% \verb?\mem@oldshipout\vbox{\trimmarks\ifvbox\@cclv\unvbox\else\box\fi\@cclv}?) :
+% \begin{verbatim}
+% In vertical mode (\mem@oldshipout\vbox{...}) TeX puts
+% interline skip between two boxes (\trimmarks and \@cclv),
+% here \linekskip (1pt) is put inbetween causing the
+% shift downwards.
+% \end{verbatim}
+% Heiko also provided the fix used below. Actually Heikos fix also
+% fixes a problem that might cause glue settings to disappear.
+% \begin{macrocode}
+ \mem@oldshipout\vbox{%
+ \trimmarks
+ \nointerlineskip
+ \box\@cclv
+ }%
+ \else
+ \mem@oldshipout\box\@cclv
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\shipout}
+% Our new version of \cs{shipout}, which is only needed for the
+% \Lopt{showtrims} option. This adds \cs{mem@shipi} to the page box
+% which then calls the original version of \cs{shipout}.
+% \begin{macrocode}
+\ifshowtrims
+ \renewcommand*{\shipout}{\afterassignment\mem@shipi\setbox\@cclv=}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Verbatims, boxes, and files}
+%
+% All the code in this section was added for version 1.2 of the class.
+% \changes{v1.2}{2002/07/27}{Section `Verbatims, boxes and files' added}
+%
+% \subsection{Modified version of the verbatim package}
+%
+% Much of this is from the \Lpack{verbatim} package code~\cite{VERBATIM}.
+% Unless indicated otherwise, the code and commentary is from that
+% package.
+%
+%
+% \subsubsection{Preliminaries}
+%
+% \begin{macro}{\every@verbatim}
+% \begin{macro}{\afterevery@verbatim}
+% The hook (i.e., token register) \cs{every@verbatim}
+% is initialized to \meta{empty}.
+%
+% PW added the \cs{afterevery@verbatim} hook.
+% \begin{macrocode}
+\newtoks\every@verbatim
+ \every@verbatim={}
+\newtoks\afterevery@verbatim
+ \afterevery@verbatim={}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makeother}
+% \cs{@makeother} takes as argument a character and changes
+% its category code to $12$ (other).
+% \begin{macrocode}
+\def\@makeother#1{\catcode`#112\relax}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@vobeyspaces}
+% The macro \cs{@vobeyspaces} causes spaces in the input
+% to be printed as spaces in the output.
+% \begin{macrocode}
+\begingroup
+ \catcode`\ =\active%
+ \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
+ \expandafter\endgroup\x
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@xobeysp}
+% The macro \cs{@xobeysp} produces exactly one space in
+% the output, protected against breaking just before it.
+% (\cs{@M} is an abbreviation for the number $10000$.)
+% \begin{macrocode}
+\def\@xobeysp{\leavevmode\penalty\@M\ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim@line}
+% We use a newly defined token register called \cs{verbatim@line}
+% that will be used as the character buffer.
+% \begin{macrocode}
+\newtoks\verbatim@line
+% \end{macrocode}
+% \end{macro}
+%
+% PW. I have extended the original \Lpack{verbatim} package code to handle
+% TABs within verbatims. Normally TeX replaces a TAB by either a single space or
+% ignores it altogether. For this purpose I have bits of code from the \Lpack{moreverb}
+% package~\cite{MOREVERB} for handling TABs.
+%
+% \textit{Code and commentary from moreverb.}
+%
+% We define a few auxiliary macros and counters for expanding tabs.
+% \begin{macrocode}
+\newcount\tab@position
+% \end{macrocode}
+%
+% \begin{macro}{\@xobeytab}
+% \cs{@xobeytab} puts enough spaces in to get to the next nominal
+% tab stop
+% \begin{macrocode}
+\def\@xobeytab{%
+ \loop
+ \toks@\expandafter{\the\toks@\@xobeysp}%
+ \advance\tab@position-1
+ \ifnum\tab@position>0 \repeat
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vobeytabs}
+% \cs{@vobeytabs} initialises use of \cs{@xobeytab}. Needs to be
+% executed within a group, as mustn't be allowed to leak out into the
+% wide world.
+%
+% \begin{macrocode}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\@vobeytabs{\catcode`\^^I\active\let^^I\@xobeytab}%
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@tabexpand}
+% \cs{verbatim@tabexpand}\marg{body of line}\cs{@nil} processes every
+% character of a line by tail recursion, counting the characters and
+% juggling things when a tab is encountered.
+% \begin{macrocode}
+\def\verbatim@tabexpand#1{%
+ \ifx#1\@nil
+ \the\toks@
+ \expandafter\par
+ \else
+ \ifx#1\@xobeytab
+ \@xobeytab
+ \else
+% \end{macrocode}
+%
+% We can safely put \cs{@xobeysp} into the token register, since it
+% does precisely what we need
+% \begin{macrocode}
+ \toks@\expandafter{\the\toks@#1}%
+ \advance\tab@position\m@ne
+ \fi
+ \ifnum\tab@position=0 \tab@position\tab@size \fi
+ \expandafter\verbatim@tabexpand
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \textit{End of code and commentary from moreverb.}
+%
+% PW. Some macros for turning tabbing on and off.
+%
+% \begin{macro}{\tabson}
+% \begin{macro}{\tabsoff}
+% \begin{macro}{\@maybeobeytabs}
+% \cs{tabson} turns tabbing on, and \cs{tabsoff} turns it off. Default
+% is no tabbing.
+% \begin{macrocode}
+\newif\ift@bs
+\newcommand{\tabson}[1][4]{%
+ \ifnum\@ne > #1\relax
+ \tabsoff
+ \else
+ \t@bstrue
+ \def\tab@size{#1\relax}%
+ \def\@maybeobeytabs{\@vobeytabs}%
+ \fi
+}
+\newcommand{\tabsoff}{%
+ \t@bsfalse
+ \def\tab@size{\z@}%
+ \def\@maybeobeytabs{}%
+}
+\tabsoff
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tabverbatim@processline}
+% Process a line with TABs (extracted from \Lpack{moreverb}).
+% \begin{macrocode}
+\def\tabverbatim@processline{\tab@position\tab@size
+ \toks@{}%
+ \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\notabverbatim@processline}
+% Processes a line ignoring TABs (this is the original \Lpack{verbatim}
+% package definition of \cs{verbatim@processline}).
+% \begin{macrocode}
+\def\notabverbatim@processline{\the\verbatim@line\par}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \textit{We are now back to the \Lpack{verbatim} code.}
+%
+% The following four macros are defined globally in a way suitable for
+% the \texttt{verbatim} and \texttt{verbatim*} environments.
+% \begin{macro}{\verbatim@startline}
+% \begin{macro}{\verbatim@addtoline}
+% \begin{macro}{\verbatim@processline}
+% \cs{verbatim@startline} initializes processing of a line
+% by emptying the character buffer (\cs{verbatim@line}).
+% \begin{macrocode}
+\def\verbatim@startline{\verbatim@line{}}
+% \end{macrocode}
+% \cs{verbatim@addtoline} adds the tokens in its argument
+% to our buffer register \cs{verbatim@line} without expanding
+% them.
+% \begin{macrocode}
+\def\verbatim@addtoline#1{%
+ \verbatim@line\expandafter{\the\verbatim@line#1}}
+% \end{macrocode}
+% Processing a line inside a \texttt{verbatim} or \texttt{verbatim*}
+% environment means printing it.
+% Ending the line means that we have to begin a new paragraph.
+% We use \cs{par} for this purpose. Note that \cs{par}
+% is redefined in \cs{@verbatim} to force \TeX{} into horizontal
+% mode and to insert an empty box so that empty lines in the input
+% do appear in the output.
+% (PW changed next line from \\
+% \verb?\def\verbatim@processline{\the\verbatim@line\par}?
+% \begin{macrocode}
+\def\verbatim@processline{\notabverbatim@processline}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@finish}
+% As a default, \cs{verbatim@finish} processes the remaining
+% characters.
+% When this macro is called we are facing the following problem:
+% when the \verb?\end{verbatim}?
+% command is encountered \cs{verbatim@processline} is called
+% to process the characters preceding the command on the same
+% line. If there are none, an empty line would be output if we
+% did not check for this case.
+%
+% If the line is empty \verb?\the\verbatim@line? expands to
+% nothing. To test this we use a trick similar to that on p.\ 376
+% of the \TeX{}book, but with \verb?$?\ldots\verb?|$? instead of
+% the \verb?!? tokens. These \verb?$? tokens can never have the same
+% category code as a \verb?$? token that might possibly appear in the
+% token register \cs{verbatim@line}, as such a token will always have
+% been read with category code $12$ (other).
+% Note that \cs{ifcat} expands the following tokens so that
+% \verb?\the\verbatim@line? is replaced by the accumulated
+% characters
+% \begin{macrocode}
+\def\verbatim@finish{\ifcat$\the\verbatim@line$\else
+ \verbatim@processline\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{The \texttt{verbatim} and \texttt{verbatim*} environments}
+%
+% \begin{macro}{\verbatim@font}
+% We start by defining the macro \cs{verbatim@font} that is
+% to select the font and to set font-dependent parameters.
+% Then we go through \cs{verbatim@nolig@list} to avoid
+% certain ligatures.
+% \cs{verbatim@nolig@list} is a macro defined in the \LaTeXe{} kernel
+% to expand to
+% \begin{verbatim}
+% \do\`\do\<\do\>\do\,\do\'\do\-
+% \end{verbatim}
+% All the characters in this list can be part of a ligature in some
+% font or other.
+%
+% PW. This is the original version which I'm going to replace.
+% \begin{verbatim}
+% \def\verbatim@font{\normalfont\ttfamily
+% \hyphenchar\font\m@ne
+% \let\do\do@noligs
+% \verbatim@nolig@list}
+% \end{verbatim}
+% Actually the kernel defines the macro \verb+\@noligs+ which just
+% runs the last two lines of the \verb+\verbatim@font+ above. As other
+% package may add stuff to \verb+\@noligs+, we will use that instead.
+% \end{macro}
+%
+% \begin{macro}{\setverbatimfont}
+% \begin{macro}{\m@mverbfont}
+% \begin{macro}{\verbatim@font}
+% User level handle for changing the font used for verbatim text.
+% \changes{v1.61803398}{2009/09/10}{Changed the last two lines of
+% \cs{verbatim@font} into using \cs{@noligs} instead. This fixes
+% problem with upquote.}
+% \begin{macrocode}
+\newcommand{\setverbatimfont}[1]{\def\m@mverbfont{#1}}
+\setverbatimfont{\normalfont\ttfamily}
+
+\def\verbatim@font{\m@mverbfont
+ \hyphenchar\font\m@ne
+ \@noligs}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@verbatim}
+% The macro \cs{@verbatim} sets up things properly.
+% First of all, the tokens of the \cs{every@verbatim} hook
+% are inserted.
+% Then a \texttt{trivlist} environment is started and its first
+% \cs{item} command inserted.
+% Each line of the \texttt{verbatim} or \texttt{verbatim*}
+% environment will be treated as a separate paragraph.
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{@verbatim}}
+% \begin{macrocode}
+\def\@verbatim{\the\every@verbatim
+ \trivlist \item \relax
+% \end{macrocode}
+% The following extra vertical space is for compatibility with the
+% \LaTeX kernel: otherwise, using the \Lpack{verbatim} package changes
+% the vertical spacing of a \texttt{verbatim} environment nested within a
+% \texttt{quote} environment.
+% \begin{macrocode}
+ \if@minipage\else\vskip\parskip\fi
+% \end{macrocode}
+% The paragraph parameters are set appropriately:
+% the penalty at the beginning of the environment,
+% left and right margins, paragraph indentation, the glue to
+% fill the last line, and the vertical space between paragraphs.
+% The latter space has to be zero since we do not want to add
+% extra space between lines.
+% \begin{macrocode}
+ \@beginparpenalty \predisplaypenalty
+%%% \leftskip\@totalleftmargin\rightskip\z@
+ \memRTLleftskip\@totalleftmargin\memRTLrightskip\z@
+ \parindent\z@\parfillskip\@flushglue\parskip\z@
+% \end{macrocode}
+% There's one point to make here:
+% the \texttt{list} environment uses \TeX's \cs{parshape}
+% primitive to get a special indentation for the first line
+% of the list.
+% If the list begins with a \texttt{verbatim} environment
+% this \cs{parshape} is still in effect.
+% Therefore we have to reset this internal parameter explicitly.
+% We could do this by assigning $0$ to \cs{parshape}.
+% However, there is a simpler way to achieve this:
+% we simply tell \TeX{} to start a new paragraph.
+% As is explained on p.~103 of the \TeX{}book, this resets
+% \cs{parshape} to zero.
+% \begin{macrocode}
+ \@@par
+% \end{macrocode}
+% We now ensure that \cs{par} has the correct definition,
+% namely to force \TeX{} into horizontal mode
+% and to include an empty box.
+% This is to ensure that empty lines do appear in the output.
+% Afterwards, we insert the \cs{interlinepenalty} since \TeX{}
+% does not add a penalty between paragraphs (here: lines)
+% by its own initiative. Otherwise a \texttt{verbatim} environment
+% could be broken across pages even if a \cs{samepage}
+% declaration were present.
+%
+% However, in a top-aligned minipage, this will result in an extra
+% empty line added at the top. Therefore, a slightly more
+% complicated construct is necessary.
+% One of the important things here is the inclusion of
+% \cs{leavevmode} as the first macro in the first line, for example,
+% a blank verbatim line is the first thing in a list item.
+% \begin{macrocode}
+ \def\par{%
+ \if@tempswa
+ \leavevmode\null\@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+% \end{macrocode}
+% But to avoid an error message when the environment
+% doesn't contain any text, we redefine \cs{@noitemerr}
+% which will in this case be called by \cs{endtrivlist}.
+% \begin{macrocode}
+ \def\@noitemerr{\@warning{No verbatim text}}%
+% \end{macrocode}
+% Now we call \cs{obeylines} to make the end of line character
+% active,
+% \begin{macrocode}
+ \obeylines
+% \end{macrocode}
+% change the category code of all special characters,
+% to $12$ (other).
+% \begin{macrocode}
+ \let\do\@makeother \dospecials
+% \end{macrocode}
+% and switch to the font to be used.
+% \begin{macrocode}
+ \verbatim@font
+% \end{macrocode}
+% To avoid a breakpoint after the labels box, we remove the penalty
+% put there by the list macros: another use of \cs{unpenalty}!
+% \begin{macrocode}
+ \everypar \expandafter{\the\everypar \unpenalty}%
+% \end{macrocode}
+% PW added next code at end of \cs{@verbatim}.
+% \begin{macrocode}
+ \wrapright\the\afterevery@verbatim}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim}
+% \begin{macro}{\verbatim*}
+% Now we define the toplevel macros.
+% \cs{verbatim} is slightly changed:
+% after setting up things properly it calls
+% \cs{verbatim@start}.
+% This is done inside a group, so that \cs{verbatim} can be used
+% directly, without \cs{begin}.
+%
+% PW. The following is the original code, but I want a version of
+% \texttt{verbatim} that recognises TABs.
+% \begin{verbatim}
+% \begin{macrocode}
+% \def\verbatim{%
+% \begingroup\@verbatim \frenchspacing\@vobeyspaces
+% \verbatim@start}
+% \end{macrocode}
+% \cs{verbatim*} is defined accordingly.
+% \begin{macrocode}
+% \@namedef{verbatim*}{\begingroup\@verbatim\verbatim@start}
+% \def\endverbatim{\endtrivlist\endgroup}
+% \expandafter\let\csname endverbatim*\endcsname=\endverbatim
+% \end{macrocode}
+% \end{verbatim}
+%
+% PW. My code for these is a modified version of the original \Lpack{verbatim}
+% code.
+% \begin{macrocode}
+\def\verbatim{\begingroup
+ \ift@bs
+ \def\verbatim@processline{\tabverbatim@processline}%
+ \fi
+ \@verbatim \frenchspacing\@vobeyspaces\@maybeobeytabs\verbatim@start}
+\@namedef{verbatim*}{\begingroup
+ \ift@bs
+ \def\verbatim@processline{\tabverbatim@processline}%
+ \fi
+ \@verbatim\@maybeobeytabs\verbatim@start}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\endverbatim}
+% \begin{macro}{\endverbatim*}
+% To end the \texttt{verbatim} and \texttt{verbatim*}
+% environments it is only necessary to finish the
+% \texttt{trivlist} environment started in \cs{@verbatim} and
+% close the corresponding group, and handle\footnote{Noted by
+% Zarko Cucej (\url{zarko.cucej@uni-mb.si}).} following (non-) paragraph,
+% by using \cs{@doendpe}.
+% \changes{v1.4}{2003/11/22}{Added \cs{@doendpe} to \cs{endverbatim}
+% (from patch v1.8)}
+% \changes{v2.0a}{2004/03/01}{Refixed \cs{endverbatim}}
+% \begin{macrocode}
+\def\endverbatim{\endtrivlist\endgroup\@doendpe}
+\@namelet{endverbatim*}\endverbatim
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% For abnormal \cs{parskip}s the NTG class included the following, but I'm
+% not sure if it is relevant here, but if it is just how it should be included.
+% \begin{verbatim}
+% From NTG, where it is a \cs{def}
+% \providecommand*{\verbatim}{%
+% \topsep=-0.5\parskip
+% \@verbatim
+% \frenchspacing\@vobeyspaces \@xverbatim}
+% \end{verbatim}
+%
+%
+% \subsubsection{The \texttt{comment} environment}
+%
+% The \cs{comment} macro is similar to \cs{verbatim*}.
+% However, we do not need to switch fonts or set special
+% formatting parameters such as \cs{parindent} or \cs{parskip}.
+% We need only set the category code of all special characters
+% to $12$ (other) and that of \verb?^^M? (the end of line character)
+% to $13$ (active).
+% The latter is needed for macro parameter delimiter matching in
+% the internal macros defined below.
+% In contrast to the default definitions used by the
+% \cs{verbatim} and \cs{verbatim*} macros,
+% we define \cs{verbatim@addtoline} to throw away its argument
+% and \cs{verbatim@processline}, \cs{verbatim@startline},
+% and \cs{verbatim@finish} to act as no-ops.
+% Then we call \cs{verbatim@}.
+% But the first thing we do is to call \cs{@bsphack} so that
+% this environment has no influence whatsoever upon the spacing.
+%
+% PW: This is the original code for the \texttt{comment} environment,
+% which I'm going to change.
+% \begin{verbatim}
+% \def\comment{\@bsphack
+% \let\do\@makeother\dospecials\catcode`\^^M\active
+% \let\verbatim@startline\relax
+% \let\verbatim@addtoline\@gobble
+% \let\verbatim@processline\relax
+% \let\verbatim@finish\relax
+% \verbatim@}
+% \end{verbatim}
+% \cs{endcomment} is very simple: it only calls
+% \cs{@esphack} to take care of the spacing.
+% The \cs{end} macro closes the group and therefore takes care
+% of restoring everything we changed.
+% \begin{verbatim}
+% \let\endcomment=\@esphack
+% \end{verbatim}
+%
+% PW: The remainder of this section is my code.
+%
+% \begin{macro}{\setupcomment}
+% \cs{setupcomment} does all the \cs{let}s in the original \cs{comment} code.
+% \begin{macrocode}
+\newcommand{\setupcomment}{%
+ \let\do\@makeother\dospecials\catcode`\^^M\active
+ \let\verbatim@startline\relax
+ \let\verbatim@addtoline\@gobble
+ \let\verbatim@processline\relax
+ \let\verbatim@finish\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% The macros below do no checking to see if something has (not) been defined
+% previously. It's `user beware' time.
+%
+% \begin{macro}{\newcomment}
+% \cs{newcomment}\marg{name} creates a new comment environment called
+% \meta{name}. This is a generalisation of the original comment code.
+% \begin{macrocode}
+\newcommand{\newcomment}[1]{%
+ \expandafter\def\csname #1\endcsname{\@bsphack\setupcomment\verbatim@}%
+ \expandafter\let\csname end#1\endcsname=\@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\commentsoff}
+% \cs{commentsoff}\marg{name} switches off the \meta{name} comment
+% environment by defining the relevent macros to do nothing.
+% \begin{macrocode}
+\newcommand{\commentsoff}[1]{%
+ \expandafter\def\csname #1\endcsname{}%
+ \expandafter\def\csname end#1\endcsname{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\commentson}
+% \cs{commentson}\marg{name} switches on the \meta{name} comment
+% environment. It has to do the same things as \cs{newcomment} does,
+% so let \cs{newcomment} do the work.
+% \begin{macrocode}
+\newcommand{\commentson}[1]{\newcomment{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% We had better supply the \texttt{comment} environment, as promised.
+% \begin{macrocode}
+\newcomment{comment}
+
+% \end{macrocode}
+%
+% PW: That is the end of my changes and extensions to the original
+% \texttt{comment} environment code.
+%
+%
+% \subsubsection{The main loop}
+%
+% Here comes the tricky part:
+% During the definition of the macros we need to use the special
+% characters \verb?\?, \verb?{?, and \verb?}? not only with their
+% normal category codes,
+% but also with category code $12$ (other).
+% We achieve this by the following trick:
+% first we tell \TeX{} that \verb?\?, \verb?{?, and \verb?}?
+% are the lowercase versions of \verb?!?, \verb?[?, and \verb?]?.
+% Then we replace every occurrence of \verb?\?, \verb?{?, and \verb?}?
+% that should be read with category code $12$ by \verb?!?, \verb?[?,
+% and \verb?]?, respectively,
+% and give the whole list of tokens to \cs{lowercase},
+% knowing that category codes are not altered by this primitive!
+%
+% But first we have ensure that
+% \verb?!?, \verb?[?, and \verb?]? themselves have
+% the correct category code!
+% To allow special settings of these codes we hide their setting in
+% the macro \cs{vrb@catcodes}. If it is already defined our new
+% definition is skipped.
+% \begin{macrocode}
+\@ifundefined{vrb@catcodes}%
+ {\def\vrb@catcodes{%
+ \catcode`\!12\catcode`\[12\catcode`\]12}}{}
+% \end{macrocode}
+% This trick allows us to use this code for applications where other
+% category codes are in effect.
+%
+% We start a group to keep the category code changes local.
+% \begin{macrocode}
+\begingroup
+ \vrb@catcodes
+ \lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\}
+% \end{macrocode}
+% We also need the end-of-line character \verb?^^M?,
+% as an active character.
+% If we were to simply write \verb?\catcode`\^^M=\active?
+% then we would get an unwanted active end of line character
+% at the end of every line of the following macro definitions.
+% Therefore we use the same trick as above:
+% we write a tilde \verb?~? instead of \verb?^^M? and
+% pretend that the
+% latter is the lowercase variant of the former.
+% Thus we have to ensure now that the tilde character has
+% category code $13$ (active).
+% \begin{macrocode}
+ \catcode`\~=\active \lccode`\~=`\^^M
+% \end{macrocode}
+% The use of the \cs{lowercase} primitive leads to one problem:
+% the uppercase character `\texttt{C}' needs to be used in the
+% code below and its case must be preserved.
+% So we add the command:
+% \begin{macrocode}
+ \lccode`\C=`\C
+% \end{macrocode}
+% Now we start the token list passed to \cs{lowercase}.
+% We use the following little trick (proposed by Bernd Raichle):
+% The very first token in the token list we give to \cs{lowercase} is
+% the \cs{endgroup} primitive. This means that it is processed by
+% \TeX{} immediately after \cs{lowercase} has finished its operation,
+% thus ending the group started by \cs{begingroup} above. This avoids
+% the global definition of all macros.
+% \begin{macrocode}
+ \lowercase{\endgroup
+% \end{macrocode}
+% \begin{macro}{\verbatim@start}
+% The purpose of \cs{verbatim@start} is to check whether there
+% are any characters on the same line as the \verb?\begin{verbatim}?
+% and to pretend that they were on a line by themselves.
+% On the other hand, if there are no characters remaining
+% on the current line we shall just find an end of line character.
+% \cs{verbatim@start} performs its task by first grabbing the
+% following character (its argument).
+% This argument is then compared to an active \verb?^^M?,
+% the end of line character.
+% \begin{macrocode}
+ \def\verbatim@start#1{%
+ \verbatim@startline
+ \if\noexpand#1\noexpand~%
+% \end{macrocode}
+% If this is true we transfer control to \cs{verbatim@}
+% to process the next line. We use
+% \cs{next} as the macro which will continue the work.
+% \begin{macrocode}
+ \let\next\verbatim@
+% \end{macrocode}
+% Otherwise, we define \cs{next} to expand to a call
+% to \cs{verbatim@} followed by the character just
+% read so that it is reinserted into the text.
+% This means that those characters remaining on this line
+% are handled as if they formed a line by themselves.
+% \begin{macrocode}
+ \else \def\next{\verbatim@#1}\fi
+% \end{macrocode}
+% Finally we call \cs{next}.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@}
+% The three macros \cs{verbatim@}, \cs{verbatim@@},
+% and \cs{verbatim@@@} form the ``main loop'' of the
+% \texttt{verbatim} environment.
+% The purpose of \cs{verbatim@} is to read exactly one line
+% of input.
+% \cs{verbatim@@} and \cs{verbatim@@@} work together to
+% find out whether the four characters
+% \cs{end} (all with category code $12$ (other)) occur in that
+% line.
+% If so, \cs{verbatim@@@} will call
+% \cs{verbatim@test} to check whether this \cs{end} is
+% part of \verb?\end{verbatim}? and will terminate the environment
+% if this is the case.
+% Otherwise we continue as if nothing had happened.
+% So let's have a look at the definition of \cs{verbatim@}:
+% \begin{macrocode}
+ \def\verbatim@#1~{\verbatim@@#1!end\@nil}%
+% \end{macrocode}
+% Note that the \verb?!? character will have been replaced by a
+% \verb?\? with category code $12$ (other) by the \cs{lowercase}
+% primitive governing this code before the definition of this
+% macro actually takes place.
+% That means that
+% it takes the line, puts \cs{end} (four character tokens)
+% and \cs{@nil} (one control sequence token) as a
+% delimiter behind it, and
+% then calls \cs{verbatim@@}.
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@}
+% \cs{verbatim@@} takes everything up to the next occurrence of
+% the four characters \cs{end} as its argument.
+% \begin{macrocode}
+ \def\verbatim@@#1!end{%
+% \end{macrocode}
+% That means: if they do not occur in the original line, then
+% argument \verb?#1? is the
+% whole input line, and \cs{@nil} is the next token
+% to be processed.
+% However, if the four characters \cs{end} are part of the
+% original line, then
+% \verb?#1? consists of the characters in front of \cs{end},
+% and the next token is the following character (always remember
+% that the line was lengthened by five tokens).
+% Whatever \verb?#1? may be, it is verbatim text,
+% so \verb?#1? is added to the line currently built.
+% \begin{macrocode}
+ \verbatim@addtoline{#1}%
+% \end{macrocode}
+% The next token in the input stream
+% is of special interest to us.
+% Therefore \cs{futurelet} defines \cs{next} to be equal
+% to it before calling \cs{verbatim@@@}.
+% \begin{macrocode}
+ \futurelet\next\verbatim@@@}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@@}
+% \cs{verbatim@@@} will now read the rest of the tokens on
+% the current line,
+% up to the final \cs{@nil} token.
+% \begin{macrocode}
+ \def\verbatim@@@#1\@nil{%
+% \end{macrocode}
+% If the first of the above two cases occurred, i.e.\ no
+% \cs{end} characters were on that line, \verb?#1? is empty
+% and \cs{next} is equal to \cs{@nil}.
+% This is easily checked.
+% \begin{macrocode}
+ \ifx\next\@nil
+% \end{macrocode}
+% If so, this was a simple line.
+% We finish it by processing the line we accumulated so far.
+% Then we prepare to read the next line.
+% \begin{macrocode}
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% Otherwise we have to check what follows these \cs{end}
+% tokens.
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% Before we continue, it's a good idea to stop for a moment
+% and remember where we are:
+% We have just read the four character tokens \cs{end}
+% and must now check whether the name of the environment (surrounded
+% by braces) follows.
+% To this end we define a macro called \cs{@tempa}
+% that reads exactly one character and decides what to do next.
+% This macro should do the following: skip spaces until
+% it encounters either a left brace or the end of the line.
+% But it is important to remember which characters are skipped.
+% The \cs{end}\meta{optional spaces}\verb?{? characters
+% may be part of the verbatim text, i.e.\ these characters
+% must be printed.
+%
+% Assume for example that the current line contains
+% \begin{verbatim*}
+% \end {AVeryLongEnvironmentName}
+%\end{verbatim*}
+% As we shall soon see, the scanning mechanism implemented here
+% will not find out that this is text to be printed until
+% it has read the right brace.
+% Therefore we need a way to accumulate the characters read
+% so that we can reinsert them if necessary.
+% The token register \cs{@temptokena} is used for this purpose.
+%
+% Before we do this we have to get rid of the superfluous
+% \cs{end} tokens at the end of the line.
+% To this end we define a temporary macro whose argument
+% is delimited by \verb?\end\@nil? (four character tokens
+% and one control sequence token) to be used below
+% on the rest of the line, after appending a \cs{@nil} token to it.
+% (Note that this token can never appear in \verb?#1?.)
+% We use the following definition of
+% \cs{@tempa} to get the rest of the line (after the first
+% \cs{end}).
+% \begin{macrocode}
+ \def\@tempa##1!end\@nil{##1}%
+% \end{macrocode}
+% We mentioned already that we use token register
+% \cs{@temptokena}
+% to remember the characters we skip, in case we need them again.
+% We initialize this with the \cs{end} we have thrown away
+% in the call to \cs{@tempa}.
+% \begin{macrocode}
+ \@temptokena{!end}%
+% \end{macrocode}
+% We shall now call \cs{verbatim@test}
+% to process the characters
+% remaining on the current line.
+% But wait a moment: we cannot simply call this macro
+% since we have already read the whole line.
+% Therefore we have to first expand the macro \cs{@tempa} to insert
+% them again after the \cs{verbatim@test} token.
+% A \verb?^^M? character is appended to denote the end of the line.
+% (Remember that this character comes disguised as a tilde.)
+% \begin{macrocode}
+ \def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%
+% \end{macrocode}
+% That's almost all, but we still have to
+% now call \cs{next} to do the work.
+% \begin{macrocode}
+ \fi \next}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim@test}
+% We define \cs{verbatim@test} to investigate every token
+% in turn.
+% \begin{macrocode}
+ \def\verbatim@test#1{%
+% \end{macrocode}
+% First of all we set \cs{next} equal to \cs{verbatim@test}
+% in case this macro must call itself recursively in order to
+% skip spaces.
+% \begin{macrocode}
+ \let\next\verbatim@test
+% \end{macrocode}
+% We have to distinguish four cases:
+% \begin{enumerate}
+% \item The next token is a \verb?^^M?, i.e.\ we reached
+% the end of the line. That means that nothing
+% special was found.
+% Note that we use \cs{if} for the following
+% comparisons so that the category code of the
+% characters is irrelevant.
+% \begin{macrocode}
+ \if\noexpand#1\noexpand~%
+% \end{macrocode}
+% We add the characters accumulated in token register
+% \cs{@temptokena} to the current line. Since
+% \cs{verbatim@addtoline} does not expand its argument,
+% we have to do the expansion at this point. Then we
+% \cs{let} \cs{next} equal to \cs{verbatim@}
+% to prepare to read the next line.
+% \begin{macrocode}
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena}%
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% \item A space character follows.
+% This is allowed, so we add it to \cs{@temptokena}
+% and continue.
+% \begin{macrocode}
+ \else \if\noexpand#1
+ \@temptokena\expandafter{\the\@temptokena#1}%
+% \end{macrocode}
+% \item An open brace follows.
+% This is the most interesting case.
+% We must now collect characters until we read the closing
+% brace and check whether they form the environment name.
+% This will be done by \cs{verbatim@testend}, so here
+% we let \cs{next} equal this macro.
+% Again we will process the rest of the line, character
+% by character.
+% The characters forming the name of the environment will
+% be accumulated in \cs{@tempc}.
+% We initialize this macro to expand to nothing.
+% \begin{macrocode}
+ \else \if\noexpand#1\noexpand[%
+ \let\@tempc\@empty
+ \let\next\verbatim@testend
+% \end{macrocode}
+% Note that the \verb?[? character will be a \verb?{? when
+% this macro is defined.
+% \item Any other character means that the \cs{end} was part
+% of the verbatim text.
+% Add the characters to the current line and prepare to call
+% \cs{verbatim@} to process the rest of the line.
+% \begin{macrocode}
+ \else
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena}%
+ \def\next{\verbatim@#1}%
+ \fi\fi\fi
+% \end{macrocode}
+% \end{enumerate}
+% The last thing this macro does is to call \cs{next}
+% to continue processing.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@testend}
+% \cs{verbatim@testend} is called when
+% \cs{end}\meta{optional spaces}\verb?{? was seen.
+% Its task is to scan everything up to the next \verb?}?
+% and to call \cs{verbatim@@testend}.
+% If no \verb?}? is found it must reinsert the characters it read
+% and return to \cs{verbatim@}.
+% The following definition is similar to that of
+% \cs{verbatim@test}:
+% it takes the next character and decides what to do.
+% \begin{macrocode}
+ \def\verbatim@testend#1{%
+% \end{macrocode}
+% Again, we have four cases:
+% \begin{enumerate}
+% \item \verb?^^M?: As no \verb?}? is found in the current line,
+% add the characters to the buffer. To avoid a
+% complicated construction for expanding
+% \cs{@temptokena}
+% and \cs{@tempc} we do it in two steps. Then we
+% continue with \cs{verbatim@} to process the
+% next line.
+% \begin{macrocode}
+ \if\noexpand#1\noexpand~%
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc}%
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% \item \verb?}?: Call \cs{verbatim@@testend} to check
+% if this is the right environment name.
+% \begin{macrocode}
+ \else\if\noexpand#1\noexpand]%
+ \let\next\verbatim@@testend
+% \end{macrocode}
+% \item \verb?\?: This character must not occur in the name of
+% an environment. Thus we stop collecting characters.
+% In principle, the same argument would apply to other
+% characters as well, e.g., \verb?{?.
+% However, \verb?\? is a special case, since it may be
+% the first character of \cs{end}. This means that
+% we have to look again for
+% \cs{end}\marg{environment name}
+% Note that we prefixed the \verb?!? by a \cs{noexpand}
+% primitive, to protect ourselves against it being an
+% active character.
+% \begin{macrocode}
+ \else\if\noexpand#1\noexpand!%
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc}%
+ \def\next{\verbatim@!}%
+% \end{macrocode}
+% \item Any other character: collect it and continue.
+% We cannot use \cs{edef} to define \cs{@tempc}
+% since its replacement text might contain active
+% character tokens.
+% \begin{macrocode}
+ \else \expandafter\def\expandafter\@tempc\expandafter
+ {\@tempc#1}\fi\fi\fi
+% \end{macrocode}
+% \end{enumerate}
+% As before, the macro ends by calling itself, to
+% process the next character if appropriate.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@testend}
+% Unlike the previous macros \cs{verbatim@@testend} is simple:
+% it has only to check if the \cs{end}\marg{...}
+% matches the corresponding \cs{begin}\marg{...}
+% \begin{macrocode}
+ \def\verbatim@@testend{%
+% \end{macrocode}
+% We use \cs{next} again to define the things that are
+% to be done.
+% Remember that the name of the current environment is
+% held in \cs{@currenvir}, the characters accumulated
+% by \cs{verbatim@testend} are in \cs{@tempc}.
+% So we simply compare these and prepare to execute
+% \cs{end}\marg{current environment}
+% macro if they match.
+% Before we do this we call \cs{verbatim@finish} to process
+% the last line.
+% We define \cs{next} via \cs{edef} so that
+% \cs{@currenvir} is replaced by its expansion.
+% Therefore we need \cs{noexpand} to inhibit the expansion
+% of \cs{end} at this point.
+% \begin{macrocode}
+ \ifx\@tempc\@currenvir
+ \verbatim@finish
+ \edef\next{\noexpand\end{\@currenvir}%
+% \end{macrocode}
+% Without this trick the \cs{end} command would not be able
+% to correctly check whether its argument matches the name of
+% the current environment and you'd get an
+% interesting \LaTeX{} error message such as:
+% \begin{verbatim}
+%! \begin{verbatim*} ended by \end{verbatim*}.
+%\end{verbatim}
+% But what do we do with the rest of the characters, those
+% that remain on that line?
+% We call \cs{verbatim@rescan} to take care of that.
+% Its first argument is the name of the environment just
+% ended, in case we need it again.
+% \cs{verbatim@rescan} takes the list of characters to be
+% reprocessed as its second argument.
+% (This token list was inserted after the current macro
+% by \cs{verbatim@@@}.)
+% Since we are still in an \cs{edef} we protect it
+% by means of\cs{noexpand}.
+% \begin{macrocode}
+ \noexpand\verbatim@rescan{\@currenvir}}%
+% \end{macrocode}
+% If the names do not match, we reinsert everything read up
+% to now and prepare to call \cs{verbatim@} to process
+% the rest of the line.
+% \begin{macrocode}
+ \else
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc]}%
+ \let\next\verbatim@
+ \fi
+% \end{macrocode}
+% Finally we call \cs{next}.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@rescan}
+% In principle \cs{verbatim@rescan} could be used to
+% analyse the characters remaining after the \verb?\end{...}?
+% command and pretend that these were read
+% ``properly'', assuming ``standard'' category codes are in
+% force.\footnote{Remember that they were all read with
+% category codes $11$ (letter) and $12$ (other) so
+% that control sequences are not recognized as such.}
+% But this is not always possible (when there are unmatched
+% curly braces in the rest of the line).
+% Besides, we think that this is not worth the effort:
+% After a \texttt{verbatim} or \texttt{verbatim*} environment
+% a new line in the output is begun anyway,
+% and an \verb?\end{comment}? can easily be put on a line by itself.
+% So there is no reason why there should be any text here.
+% For the benefit of the user who did put something there
+% (a comment, perhaps)
+% we simply issue a warning and drop them.
+% The method of testing is explained in Appendix~D, p.\ 376 of
+% the \TeX{}book. We use \verb?^^M? instead of the \verb?!?
+% character used there
+% since this is a character that cannot appear in \verb?#1?.
+% The two \cs{noexpand} primitives are necessary to avoid
+% expansion of active characters and macros.
+%
+% One extra subtlety should be noted here: remember that
+% the token list we are currently building will first be
+% processed by the \cs{lowercase} primitive before \TeX{}
+% carries out the definitions.
+% This means that the `\texttt{C}' character in the
+% argument to the \cs{@warning} macro must be protected against
+% being changed to `\texttt{c}'. That's the reason why we added the
+% \verb?\lccode`\C=`\C? assignment above.
+% We can now finish the argument to \cs{lowercase} as well as the
+% group in which the category codes were changed.
+% \begin{macrocode}
+ \def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else
+ \@warning{Characters dropped after `\string\end{#1}'}\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{The \cs{verbatiminput} command}
+%
+% \begin{macro}{\verbatim@in@stream}
+% We begin by allocating an input stream (out of the 16 available
+% input streams).
+% \begin{macrocode}
+\newread\verbatim@in@stream
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@readfile}
+% The macro \cs{verbatim@readfile} encloses the main loop by calls to
+% the macros \cs{verbatim@startline} and \cs{verbatim@finish},
+% respectively. This makes sure
+% that the user can initialize and finish the command when the file
+% is empty or doesn't exist. The \texttt{verbatim} environment has a
+% similar behaviour when called with an empty text.
+% \begin{macrocode}
+\def\verbatim@readfile#1{%
+ \verbatim@startline
+% \end{macrocode}
+% When the file is not found we issue a warning.
+% \begin{macrocode}
+ \openin\verbatim@in@stream #1\relax
+ \ifeof\verbatim@in@stream
+ \typeout{No file #1.}%
+ \else
+% \end{macrocode}
+% At this point we pass the name of the file to \cs{@addtofilelist}
+% so that its appears appears in the output of a \cs{listfiles}
+% command.
+% In addition, we use \cs{ProvidesFile} to make a log entry in the
+% transcript file and to distinguish files read in via
+% \cs{verbatiminput} from others.
+% \begin{macrocode}
+ \@addtofilelist{#1}%
+ \ProvidesFile{#1}[(verbatim)]%
+% \end{macrocode}
+% While reading from the file it is useful to switch off the
+% recognition of the end-of-line character. This saves us stripping
+% off spaces from the contents of the line.
+% \begin{macrocode}
+ \expandafter\endlinechar\expandafter\m@ne
+ \expandafter\verbatim@read@file
+ \expandafter\endlinechar\the\endlinechar\relax
+ \closein\verbatim@in@stream
+ \fi
+ \verbatim@finish
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@read@file}
+% All the work is done in \cs{verbatim@read@file}. It reads the input
+% file line by line and recursively calls itself until the end of
+% the file.
+% \begin{macrocode}
+\def\verbatim@read@file{%
+ \read\verbatim@in@stream to\next
+ \ifeof\verbatim@in@stream
+ \else
+% \end{macrocode}
+% For each line we call \cs{verbatim@addtoline} with the contents of
+% the line. \hskip0pt plus 3cm\penalty0\hskip0pt plus -3cm
+% \cs{verbatim@processline} is called next.
+% \begin{macrocode}
+ \expandafter\verbatim@addtoline\expandafter{\next}%
+ \verbatim@processline
+% \end{macrocode}
+% After processing the line we call \cs{verbatim@startline} to
+% initialize all before we read the next line.
+% \begin{macrocode}
+ \verbatim@startline
+% \end{macrocode}
+% Without \cs{expandafter} each call of \cs{verbatim@read@file} uses
+% space in \TeX's input stack.\footnote{A standard \TeX\ would
+% report an overflow error if you try to read a file with more than
+% ca.\ 200~lines. The same error occurs if the first line of code
+% in \S 390 of \textsl{``TeX: The Program''\/} is missing.}
+% \begin{macrocode}
+ \expandafter\verbatim@read@file
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatiminput}
+% \cs{verbatiminput} first starts a group to keep font and category
+% changes local.
+% Then it calls the macro \cs{verbatim@input} with additional
+% arguments, depending on whether an asterisk follows.
+%
+% PW. I added the TAB checking code.
+% \begin{macrocode}
+\def\verbatiminput{\begingroup
+ \ift@bs
+ \def\verbatim@processline{\tabverbatim@processline}%
+ \fi
+ \@ifstar{\verbatim@input{\@maybeobeytabs}}%
+ {\verbatim@input{\frenchspacing\@vobeyspaces\@maybeobeytabs}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@input}
+% \cs{verbatim@input} first checks whether the file exists, using
+% the standard macro cs{IfFileExists} which leaves the name of the
+% file found in \cs{@filef@und}.
+% Then everything is set up as in the \cs{verbatim} macro.
+% \begin{macrocode}
+\def\verbatim@input#1#2{%
+ \IfFileExists {#2}{\@verbatim #1\relax
+% \end{macrocode}
+% Then it reads in the file, finishes off the \texttt{trivlist}
+% environment started by \cs{@verbatim} and closes the group.
+% This restores everything to its normal settings.
+% \begin{macrocode}
+ \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
+% \end{macrocode}
+% If the file is not found a more or less helpful message is
+% printed. The final \cs{endgroup} is needed to close the group
+% started in \cs{verbatiminput} above.
+% \begin{macrocode}
+ {\typeout {No file #2.}\endgroup}}
+% \end{macrocode}
+% \end{macro}
+%
+% \textit{That completes my borrowings from \Lpack{verbatim}.}
+%
+% The next bunch of code implements wrapping verbatim lines so they, hopefully,
+% stay within the typeblock.
+%
+% \begin{macro}{\verbatimindent}
+% \begin{macro}{\verbatimbreakchar}
+% \begin{macro}{\setverbatimbreak}
+% The length \cs{verbatimindent} is the distance continuation lines are indented
+% from the left margin. \cs{verbatimbreakchar} is the character to indicate
+% a wrapped line.
+% \begin{macrocode}
+\newlength{\verbatimindent}
+ \setlength{\verbatimindent}{3em}
+\newcommand*{\verbatimbreakchar}{\char`\%}
+\newcommand*{\setverbatimbreak}{%
+ \vspace*{-\baselineskip}%
+ \def\@xobeysp{~\discretionary{\verbatimbreakchar}%
+ {\kern\verbatimindent}{}}%
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\raggedwrap}
+% \begin{macro}{\wrappingon}
+% \begin{macro}{\wrapright}
+% \begin{macro}{\wrappingoff}
+% \cs{wrappingon} and \cs{wrappingoff} enable/prohibit wrapping. The
+% default is \cs{wrappingoff}.
+%
+% The macro
+% \cs{wrapright} is used to set paragraph skips; without raggedright the
+% lines
+% may break at the first space \emph{outside} the text area. However,
+% Paul (\url{paulaugust2003@yahoo.com}) found that wrapped verbatims
+% in a list (e.g., \texttt{itemize}) were not indented although regular
+% verbatims were indented. \cs{raggedwrap} is a variation on \cs{raggedright}
+% (\cs{leftskip} is set to \cs{@totalleftmargin} instead of 0pt), and seems
+% to have fixed the problem with the original code which used
+% \cs{raggedright}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{raggedwrap} (mempatch v4.4)}
+% \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{raggedwrap}}
+% \begin{macrocode}
+\newcommand*{\raggedwrap}{%
+ \@rightskip\@flushglue
+%%% \rightskip\@rightskip
+ \memRTLrightskip\@rightskip
+%%% \leftskip\@totalleftmargin
+ \memRTLleftskip\@totalleftmargin
+ \parindent\ragrparindent}
+\newcommand*{\wrappingon}{%
+ \def\@xobeysp{~\discretionary{\verbatimbreakchar}%
+ {\kern\verbatimindent}{}}%
+ \def\wrapright{\raggedwrap}}
+\newcommand*{\wrappingoff}{%
+ \def\@xobeysp{\leavevmode\penalty\@M\ }%
+ \def\wrapright{}}
+\wrappingoff
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Writing and boxing verbatim}
+%
+% This bunch of code is from the \Lpack{moreverb} package.
+%
+% \begin{environment}{verbatimoutput}
+% \verb?\begin{verbatimoutput}?\marg{filename} writes all text in its body to a
+% file, the name of which it is given as an argument. (The code was
+% written by Rainer Sch\"opf but the environment was called
+% \verb?verbatimwrite?). In the code below, uncommenting \\
+% \verb?\catcode`\^^I=12? \\
+% will result in TABs being written as \verb?^^I?.
+% \changes{v1.3}{2002/09/27}{Changed name verbatimwrite to
+% verbatimoutput (but neither were mentioned in the manual)}
+% \begin{macrocode}
+\newwrite \verbatim@out
+\def\verbatimoutput#1{%
+ \@bsphack
+ \immediate\openout \verbatim@out #1
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active %% \catcode`\^^I=12
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out
+ {\the\verbatim@line}}%
+ \verbatim@start}
+% \end{macrocode}
+% \begin{macrocode}
+\def\endverbatimoutput{%
+ \immediate\closeout\verbatim@out
+ \@esphack}
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+% \begin{environment}{fboxverbatim}
+% \texttt{fboxverbatim} puts the contents of a verbatim environment
+% in a framing box. (PW: This was originally called \texttt{boxedverbatim}).
+%
+% (Written by Victor Eijkhout.)
+%
+% Bug fix (supplied by David Carlisle) 1995/12/28, marked
+% \verb+%%%DPC%%%+
+%
+% First, redefine `processline' to produce only a line as wide
+% as the natural width of the line
+%
+% \begin{macrocode}
+\def\fboxverbatim{\begingroup%
+ \tabsoff %% PW otherwise box fills the width
+ \def\verbatim@processline{%
+ {\setbox0=\hbox{\the\verbatim@line}%
+ \hsize=\wd0 \the\verbatim@line\par}}%
+% \end{macrocode}
+%
+% Now save the verbatim code in a box
+%
+% \begin{macrocode}
+ \@minipagetrue%%%DPC%%%
+ \@tempswatrue%%%DPC%%%
+ \setbox0=\vbox\bgroup \verbatim
+}
+% \end{macrocode}
+%
+% At the end of the environment, we (umm) simply have to stick the
+% results into a frame.
+%
+% \begin{macrocode}
+\def\endfboxverbatim{%
+ \endverbatim
+ \unskip\setbox0=\lastbox %%%DPC%%%
+% \end{macrocode}
+%
+% Now everything's in the box, so we can close it\dots
+%
+% \begin{macrocode}
+ \egroup
+% \end{macrocode}
+%
+% To change the code for centering, the next line needs a spot of
+% hacking.
+%
+% \begin{macrocode}
+ \fbox{\box0}% <<<=== change here for centering,...
+\endgroup}
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+% \subsection{The shortvrb package}
+%
+% The following is the \Lpack{shortvrb} package code (from \texttt{doc.dtx}
+% by Frank Mittelbach). It has been so useful to me that I wanted
+% to include it in the class.
+%
+% CODE AND COMMENTARY IS BY FRANK MITTELBACH
+%
+% \begin{macro}{\MakeShortVerb}
+% \begin{macrocode}
+\def\MakeShortVerb#1{%
+ \expandafter\ifx\csname cc\string#1\endcsname\relax
+% \end{macrocode}
+% \begin{macrocode}
+ \@shortvrbinfo{Made }{#1}%
+ \add@special{#1}%
+% \end{macrocode}
+% Then the character's current catcode is stored in \verb?\cc\?\meta{c}.
+% \begin{macrocode}
+ \expandafter
+ \xdef\csname cc\string#1\endcsname{\the\catcode`#1}%
+% \end{macrocode}
+% The character is spliced into the definition using the same trick as
+% used in \cs{verb} (for instance), having activated \verb?~? in a group.
+% \begin{macrocode}
+ \begingroup
+ \catcode`\~\active \lccode`\~`#1%
+ \lowercase{%
+% \end{macrocode}
+% The character's old meaning is recorded in \verb?\ac\?\meta{c} prior to
+% assigning it a new one.
+% \begin{macrocode}
+ \global\expandafter\let
+ \csname ac\string#1\endcsname~%
+ \gdef~{\verb~}}%
+ \endgroup
+% \end{macrocode}
+% Finally the character is made active.
+% \begin{macrocode}
+ \global\catcode`#1\active
+% \end{macrocode}
+% If we suspect that \meta{c} is already a short reference, we tell
+% the user. Now he or she is responsible if anything goes wrong\,\dots
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% \begin{macrocode}
+ \@shortvrbinfo\@empty{#1 already}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\DeleteShortVerb}
+% Here's the means of undoing a \cs{MakeShortVerb}, for instance in a
+% region where you need to use the character outside a verbatim
+% environment. It arranges for \cs{dospecials} and \cs{@sanitize} to be
+% altered appropriately, restores the saved catcode and, if necessary,
+% the character's meaning (as stored by
+% \cs{MakeShortVerb}). If the catcode wasn't stored in
+% \verb?\cc\?\meta{c} (by \cs{MakeShortVerb}) the command is silently
+% ignored.
+% \begin{macrocode}
+\def\DeleteShortVerb#1{%
+ \expandafter\ifx\csname cc\string#1\endcsname\relax
+ \else
+% \end{macrocode}
+% \begin{macrocode}
+ \@shortvrbinfo{Deleted }{#1 as}%
+ \rem@special{#1}%
+ \global\catcode`#1\csname cc\string#1\endcsname
+% \end{macrocode}
+% We must not forget to reset \verb?\cc\?\meta{c}, otherwise the check in
+% \cs{MakeShortVerb} for a repeated definition will not work.
+% \begin{macrocode}
+ \global \expandafter\let \csname cc\string#1\endcsname \relax
+ \ifnum\catcode`#1=\active
+ \begingroup
+ \catcode`\~\active \lccode`\~`#1%
+ \lowercase{%
+ \global\expandafter\let\expandafter~%
+ \csname ac\string#1\endcsname}%
+ \endgroup \fi \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@shortvrbinfo}
+% Helper function for info messages.
+% \begin{macrocode}
+\def\@shortvrbinfo#1#2{%
+ \ClassInfo{memoir}{%
+ #1\expandafter\@gobble\string#2 a short reference
+ for \string\verb}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\add@special}
+% This helper macro adds its argument to the
+% \cs{dospecials} macro which is conventionally used by verbatim macros
+% to alter the catcodes of the currently active characters. We need
+% to add \verb?\do\?\meta{c} to the expansion of \cs{dospecials} after
+% removing the character if it was already there to avoid multiple
+% copies building up should \cs{MakeShortVerb} not be balanced by
+% \cs{DeleteShortVerb} (in case anything that uses \cs{dospecials} cares
+% about repetitions).
+% \begin{macrocode}
+\def\add@special#1{%
+ \rem@special{#1}%
+ \expandafter\gdef\expandafter\dospecials\expandafter
+ {\dospecials \do #1}%
+% \end{macrocode}
+% Similarly we have to add \verb?\@makeother\?\meta{c} to \cs{@sanitize}
+% (which is used in things like \cs{index} to re-catcode all special
+% characters except braces).
+% \begin{macrocode}
+ \expandafter\gdef\expandafter\@sanitize\expandafter
+ {\@sanitize \@makeother #1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rem@special}
+% The inverse of cs{add@special} is slightly trickier. \cs{do} is
+% re-defined to expand to nothing if its argument is the character of
+% interest, otherwise to expand simply to the argument. We can then
+% re-define \cs{dospecials} to be the expansion of itself. The space
+% after \verb?=`##1? prevents an expansion to \cs{relax}!
+% \begin{macrocode}
+\def\rem@special#1{%
+ \def\do##1{%
+ \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+ \xdef\dospecials{\dospecials}%
+% \end{macrocode}
+% Fixing \cs{@sanitize} is the same except that we need to re-define
+% \cs{@makeother} which obviously needs to be done in a group.
+% \begin{macrocode}
+ \begingroup
+ \def\@makeother##1{%
+ \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+ \xdef\@sanitize{\@sanitize}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% END OF MITTELBACH CODE AND COMMENTARY.
+%
+% \subsection{General verbatim boxing and line numbering}
+%
+% A while ago I wrote a package that I never released. Here it is
+% now, updated and improved. The package was based on code originally
+% posted to \ctt{} by Donald Arseneau on 13 July 2000.
+%
+% This is DA's posted code.
+% \begin{verbatim}
+% \RequirePackage{verbatim}
+% \def\boxverbflag{14 }
+%
+% \def\boxedverbatim{%
+% \fboxsep=1em
+% \def\verbatim@processline{\leavevmode
+% \vrule\vbox{\advance\hsize-.8p@ \@@line
+% {\strut\kern\fboxsep\the\verbatim@line\hss}%
+% \kern\fbozsep}\vrule\par}%
+% \@verbatim % but make some replacement settings
+% % \ifdim\@totalleftmargin>\fboxsep \fboxsep\@totalleftmargin \fi
+% \leftskip\x@skip \rightskip\z@skip
+% \interlinepenalty\boxverbflag
+% \parfillskip\z@ plus\p@ minus\p@
+% \lineskip-\fboxsep \baselineskip\z@skip
+% \frenchspacing\@vobeyspaces
+% \boxverb@toprule
+% \verbatim@start}
+%
+% \def\endboxedverbatim{\hrule\endtrivlist}
+%
+% \@namefdef{boxedverbatim*}{\let\frenchspacing\@gobble \boxedverbatim}
+% \@namefdef{endboxedverbatim*}{\hrule\endtrivlist}
+%
+% \output=\expandafter{\expandafter\boxverb@split \the\output}
+%
+% \def\boxverb@toprule{\hrule \nobreak \vskip-.1\p@
+% \@@line{\vrule height2\fboxsep \hss \vrule}}
+%
+% \def\boxverb@split{\ifnum\outputpenalty=\boxverbflag
+% \ifdim\dp\@cclv=\z@
+% \setbox\@cclv\vbox{\unvbox\@cclv\hrule\kern-.4pt}%
+% \null \kern-.7\topskip \boxverb@toprule
+% \fi\fi}
+% \end{verbatim}
+% That's the end of DA's posted code
+%
+% I have extended this to provide:
+% \begin{itemize}
+% \item A (multipage) boxed verbatim
+% \item A (multipage) boxed verbatim input
+% \item Normally each `page' is boxed, but start/end rules can be switched off
+% at page boundaries
+% \item A heading can be put at the start of `continuation' pages
+% \item Lines of verbatim text can be numbered
+% \item Can be `downgraded' to normal verbatim environment
+% \end{itemize}
+%
+% OK, on to the main code.
+%
+% \begin{macro}{\boxverbflag}
+% \begin{macro}{\bvboxsep}
+% \begin{macrocode}
+\def\boxverbflag{14 }
+\newlength{\bvboxsep} % user can change this
+\setlength{\bvboxsep}{1em}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\newif\ifbvperpage % start/end lines on every page of multipage verbatim
+\bvperpagetrue
+
+% \end{macrocode}
+%
+% \begin{macro}{\bvtopofpage}
+% \begin{macro}{\b@vtop}
+% Can use \cs{bvtopofpage} to put a heading above continued verbatims.
+% For example \\
+% \verb?\bvtopofpage{\begin{center}\normalfont (Continued)\end{center}}? \\
+% It only works for \cs{bvperpagetrue}.
+% \begin{macrocode}
+\newcommand{\bvtopofpage}[1]{%
+ \long\def\b@vtop{#1}}
+\def\b@vtop{} % used in \boxverb@split for heading
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@memfbvline}
+% \begin{macro}{\c@bvlinectr}
+% Counter for adjusting the starting line number for boxed verbatims
+% and for the line number itself..
+% \begin{macrocode}
+\newcounter{memfbvline}
+ \c@memfbvline=\z@
+\newcounter{bvlinectr}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setbvlinenums}
+% \cs{setbvlinenums}\marg{firstline}\marg{startnumsat} sets the first line
+% number to \meta{firstline} and the first line number to be printed is
+% \meta{startnumsat}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{setbvlinenums} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\setbvlinenums}[2]{%
+ \c@bvlinectr #1\relax \advance\c@bvlinectr \m@ne
+ \ifnum\z@<\linemodnum% we are printing line numbers
+ \@tempcnta #2\relax
+ \divide\@tempcnta\linemodnum
+ \multiply\@tempcnta\linemodnum
+ \c@memfbvline #2\relax
+ \advance\c@memfbvline-\@tempcnta
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theb@vlinenumber}
+% \begin{macro}{\resetbvlinenumber}
+% \cs{resetbvlinenumber} reinitializes the line numbering.
+% \changes{v1.61803}{2008/01/30}{Changed \cs{theb@vlinenumber} (mempatch v4.9)}
+% \begin{macrocode}
+\def\theb@vlinenumber{\getthelinenumber{bvlinectr}{memfbvline}}
+\newcommand*{\resetbvlinenumber}{\setcounter{bvlinectr}{0}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\b@vdocount}
+% \begin{macro}{\bvnumlength}
+% Increment line number if counting. A line number is printed in
+% a space width \cs{bvnumlength}, which is given a temporary value here.
+% \begin{macrocode}
+\def\b@vdocount{\ifbvcountlines\stepcounter{bvlinectr}\fi}
+\newlength{\bvnumlength}
+%% \settowidth{\bvnumlength}{\vlvnumfont 9999}
+\settowidth{\bvnumlength}{\normalfont 999}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifbvcountinside}
+% \begin{macro}{\bvnumbersinside}
+% \begin{macro}{\bvnumbersoutside}
+% Flag and commands for positioning the numbers. Default is to print
+% them inside the box.
+% \begin{macrocode}
+\newif\ifbvcountinside % TRUE if line numbers inside box
+ \bvcountinsidetrue
+\newcommand*{\bvnumbersinside}{\bvcountinsidetrue}
+\newcommand*{\bvnumbersoutside}{\bvcountinsidefalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\b@vdoinside}
+% \begin{macro}{\b@vdooutside}
+% Print numbers inside (outside) the box.
+% \begin{macrocode}
+\def\b@vdoinside{%
+ \ifbvcountlines\ifbvcountinside%
+ \makebox[\bvnumlength][r]{%
+ \vlvnumfont \theb@vlinenumber\space}%
+ \fi\fi}
+
+\def\b@vdooutside{%
+ \ifbvcountlines\ifbvcountinside\else%
+ \llap{\makebox[\bvnumlength][r]{%
+ \vlvnumfont \theb@vlinenumber\space}}%
+ \fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@m@mline}
+% \cs{@@line} is defined as \verb?\def\@@line{\hb@xt@\hsize}? and I need
+% an equivalent for \cs{linewidth} instead of \cs{hsize} for use in
+% \cs{setupboxverb@line}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{@@m@mline} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand*{\@@m@mline}{\hb@xt@\linewidth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setupboxverb@line}
+% Use a macro for the first main part of DA's code for \cs{boxedverbatim},
+% adding lots of hooks.
+%
+% Per Starb\"{a}ck had problems with the combination of \texttt{adjustwidth}
+% with \texttt{boxedverbatim} (see CTT \textit{Re: [memoir] adjustwidth +
+% boxedverbatim}, 2007/02/10) and Lars Madsen came up with a suggestion to
+% use \cs{linewidth} instead of \cs{hsize}.
+% \changes{v1.61803}{2008/01/30}{Changed \cs{hsize} to \cs{linewidth} in
+% \cs{setupboxverb@line} (mempatch v4.9)}
+% \begin{macrocode}
+\newcommand{\setupboxverb@line}{%
+ \par
+ \ifbvperpage
+ \output=\expandafter{\expandafter\boxverb@split \the\output}
+ \fi
+% \end{macrocode}
+% \begin{macro}{\verbatim@processline}
+% \begin{macrocode}
+ \def\verbatim@processline{\leavevmode
+ \b@vdocount%
+ \bvleftsidehook\vbox{\advance% \hsize-.8\p@ \@@line % changed to \linewidth
+ \linewidth-.8\p@ \@@line
+ {\b@vdooutside\strut\kern\bvboxsep%
+ \b@vdoinside%
+ \ift@bs
+ \tabverbatim@processline
+ \else
+ \the\verbatim@line
+ \fi
+ \hss}%
+ \kern\bvboxsep}\bvrightsidehook\par}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\setupbox@verb}
+% Use a macro for the second main part of DA's code, and integrate it
+% with the other verbatim codes (e.g., include \cs{@maybeobeytags}).
+% \begin{macrocode}
+\newcommand{\setupbox@verb}{%
+ \leftskip\z@skip \rightskip\z@skip
+ \interlinepenalty\boxverbflag
+ \parfillskip\z@ plus\p@ minus\p@
+ \lineskip-\bvboxsep \baselineskip\z@skip
+ \frenchspacing\@vobeyspaces\@maybeobeytabs
+ \boxverb@toprule}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\boxedverbatim}
+% \begin{macro}{\endboxedverbatim}
+% \begin{macro}{\boxedverbatim*}
+% \begin{macro}{\endboxedverbatim*}
+% Given the two macros above, we can write a briefer version of DA's
+% \cs{boxedverbatim(*)}.
+% As noted by Zarko Cucej\footnote{\url{zarko.cucej@uni-mb.si}}, have to handle
+% a following (no-) paragraph.
+% \changes{v1.4}{2003/11/22}{Added \cs{@doendpe} to \cs{endboxedverbatim}
+% (from patch v1.8)}
+% \begin{macrocode}
+\def\boxedverbatim{\begingroup
+ \let\@@line\@@m@mline% new from mempatch v4.9
+ \setupboxverb@line
+ \@verbatim
+ \setupbox@verb
+ \verbatim@start}
+\def\endboxedverbatim{\bvendrulehook\endtrivlist\endgroup\@doendpe}
+\@namedef{boxedverbatim*}{\let\frenchspacing\@gobble \boxedverbatim}
+\@namelet{endboxedverbatim*}\endboxverbatim
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\boxverb@toprule{\bvtoprulehook
+ \@@line{\bvleftsidehook \bvtopmidhook \bvrightsidehook}}
+
+% \end{macrocode}
+%
+% \begin{macro}{\bvendofpage}
+% \cs{bvendofpage}\marg{spec} sets the boxed verbatim `end of page' to \meta{spec}.
+% \changes{v1.618}{2005/09/02}{Added \cs{bvendofpage} (mempatch v2.3d)}
+% \changes{v1.61803}{2008/01/30}{Changed \cs{bvendofpage} to include width}
+% \begin{macrocode}
+\newcommand*{\bvendofpage}[1]{%
+ \def\boxverb@botpage{#1}}
+%%%%\bvendofpage{\hrule\kern-.4pt}
+\bvendofpage{\hrule width\linewidth\kern-.4pt}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\boxverb@split}
+% \begin{macrocode}
+\def\boxverb@split{\ifnum\outputpenalty=\boxverbflag
+ \ifdim\dp\@cclv=\z@
+%%%% \setbox\@cclv\vbox{\unvbox\@cclv\hrule\kern-.4pt}%
+ \setbox\@cclv\vbox{\unvbox\@cclv\boxverb@botpage}%
+ \null \kern-.7\topskip \b@vtop \boxverb@toprule
+ \fi
+\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bvtoprulehook}
+% \begin{macro}{\bvendrulehook}
+% \begin{macro}{\bvleftsidehook}
+% \begin{macro}{\bvrightsidehook}
+% \begin{macro}{\bvtopmidhook}
+% The new hooks, for the top, bottom, left and right of the box.
+% \changes{v1.61803}{2008/01/30}{Added \cs{linewidth} to \cs{bvtoprulehook} and
+% \cs{bvendrulehook} (mempatch v4.9)}
+% \begin{macrocode}
+\def\bvtoprulehook{\hrule width\linewidth \nobreak\vskip-.1\p@}
+\def\bvendrulehook{\hrule width\linewidth}
+\def\bvleftsidehook{\vrule}
+\def\bvrightsidehook{\vrule}
+\def\bvtopmidhook{\rule{0\p@}{2\bvboxsep} \hss}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\boxedverbatiminput}
+% \begin{macro}{\boxedverbatim@input}
+% \cs{boxedverbatiminput}\marg{filename} read in filename contents as verbatim
+% \begin{macrocode}
+\newcommand{\boxedverbatiminput}{\begingroup
+ \@ifstar{\let\frenchspacing\@gobble
+ \boxedverbatim@input\relax}%
+ {\boxedverbatim@input{\frenchspacing\@vobeyspaces}}}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\boxedverbatim@input#1#2{%
+ \setupboxverb@line
+ \IfFileExists{#2}{\@verbatim #1\relax
+ \setupbox@verb
+ \verbatim@readfile{\@filef@und}%
+ \bvendrulehook\endtrivlist\endgroup\@doendpe}%
+ {\typeout {No file #2.}\endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Some prepackaged boxing styles.
+%
+% \begin{macro}{\bvbox}
+% Original (default) boxing.
+% \begin{macrocode}
+\newcommand{\bvbox}{%
+ \bvperpagetrue%
+ \renewcommand{\bvtoprulehook}{\hrule \nobreak \vskip-.1\p@}%
+ \renewcommand{\bvleftsidehook}{\vrule}%
+ \renewcommand{\bvrightsidehook}{\vrule}%
+ \renewcommand{\bvendrulehook}{\hrule}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nobvbox}
+% No boxing
+% \begin{macrocode}
+\newcommand{\nobvbox}{%
+ \bvperpagefalse%
+ \renewcommand{\bvtoprulehook}{}%
+ \renewcommand{\bvleftsidehook}{}%
+ \renewcommand{\bvrightsidehook}{}%
+ \renewcommand{\bvendrulehook}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bvtopandtail}
+% Head and foot horizontal lines only
+% \begin{macrocode}
+\newcommand{\bvtopandtail}{%
+ \bvperpagefalse%
+ \renewcommand{\bvtoprulehook}{\hrule \nobreak \vskip-.1\p@}%
+ \renewcommand{\bvleftsidehook}{}%
+ \renewcommand{\bvrightsidehook}{}%
+ \renewcommand{\bvendrulehook}{\hrule}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bvsides}
+% Side vertical lines only
+% \begin{macrocode}
+\newcommand{\bvsides}{%
+ \bvperpagefalse%
+ \renewcommand{\bvtoprulehook}{\vskip 3ex}%
+ \renewcommand{\bvleftsidehook}{\vrule}%
+ \renewcommand{\bvrightsidehook}{\vrule}%
+ \renewcommand{\bvendrulehook}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{The framed package}
+%
+% The following code is the \Lpack{framed} package~\cite{FRAMED}
+% by Donald Arseneau.
+% \changes{v1.4}{2003/11/22}{Updated framed code to v0.8a of the package}
+% \changes{v1.61803}{2008/01/30}{Updated framed code to v0.95 of the package}
+%
+% \begin{macro}{\framed}
+% \begin{macro}{\endframed}
+% \begin{macro}{\shaded}
+% \begin{macro}{\endshaded}
+% \begin{macrocode}
+\let\framed\relax \let\endframed\relax
+\let\shaded\relax \let\endshaded\relax
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Way back when DA sent me a pre-release copy of v0.6 of his \Lpack{framed}
+% package~\cite{FRAMED}.
+% We also discussed good ways of embedding it into the class. One result
+% being that I defined some some items \cs{AtBeginDocument}, but this is
+% no longer required as DA has changed \Lpack{framed} to cooperate
+% with memoir. We continue to have sporadic email conversations about the
+% interaction of \Lpack{memoir} and \Lpack{framed}.
+%
+% Here is a modified version of \file{framed.sty}. In particular
+% I moved some of DA's description of the code into the general commentary
+% instead of comments within the code.
+%
+% \begin{verbatim}
+% framed.sty v 0.95 2007/10/04
+% Copyright (C) 1992-2007 by Donald Arseneau (asnd@triumf.ca)
+% These macros may be freely transmitted, reproduced, or modified
+% provided that this notice is left intact.
+%
+%====================== Begin Instructions =======================
+%
+% framed.sty
+% ~~~~~~~~~~
+% Create framed, shaded, or differently highlighted regions that can
+% break across pages. The environments defined are
+% framed -- ordinary frame box (\fbox) with edge at margin
+% shaded -- shaded background (\colorbox) bleeding into margin
+% snugshade -- similar
+% leftbar -- thick vertical line in left margin
+% to be used like
+% \begin{framed}
+% copious text
+% \end{framed}
+%
+% But the more general purpose of this package is to facilitate the
+% creation of environments that enable page breaking
+% within arbitrary decorations using a simple new-environment definition
+% incorporating \FrameCommand and
+% \begin{MakeFramed}{settings} ... \end{MakeFramed}
+%
+% The "framed" environment uses "\fbox" as its "\FrameCommand" with
+% the additional settings \fboxrule=\FrameRule and \fboxsep=\FrameSep.
+% You can change these lengths (using \setlength) and you can change
+% the definition of \FrameCommand to use much fancier boxes.
+%
+% In fact, the "shaded" environment just redefines \FrameCommand to be
+% \colorbox{shadecolor} (and you have to define the color "shadecolor":
+% \definecolor{shadecolor}...).
+%
+% A page break is allowed, and even encouraged, before the framed
+% environment. If you want to attach some text (a box title) to the
+% frame, then the text should be inserted by \FrameCommand.
+%
+% The contents of the framed regions are restricted:
+% Floats, footnotes, marginpars and head-line entries will be lost.
+% (Some of these may be handled in a later version.)
+% This package will not work with the page breaking of multicol.sty,
+% or other systems that perform column-balancing.
+%
+% The MakeFramed environment does the work. Its "settings" argument
+% should contain any adjustments to the text width (applied to \hsize,
+% and using the "\width" of the frame itself) as well as a "restore"
+% command -- \@parboxrestore or \FrameRestore or something similar;
+% as an example, the snugshade environment shows how to suppress excess
+% spacing within the box, copying the code from minipage.
+%
+% Expert commands:
+% \MakeFramed, \endMakeFramed: the "MakeFramed" environment
+% \FrameCommand: command to draw the frame around its argument
+% \FrameRestore: restore some text settings, but fewer than \@parboxrestore
+% \FrameRule: length register; \fboxrule for default "framed".
+% \FrameSep: length register; \fboxsep for default "framed".
+% \FrameHeightAdjust: macro; height of frame above baseline at top of page
+%
+% This is still a `pre-production' version because I can think of many
+% features/improvements that should be made. Nevertheless, starting
+% with version 0.5 it should be bug-free.
+%
+% ToDo:
+% Test more varieties of list
+% Improve and correct documentation
+% Propagation of \marks
+% Handle footnotes (how??) floats (?) and marginpars.
+% Stretchability modification.
+%======================== End Instructions ========================
+%
+% \ProvidesPackage{framed}[2007/10/04 v 0.95:
+% framed or shaded text with page breaks]
+%
+% \newenvironment{framed}% using default \FrameCommand
+% {\MakeFramed {\advance\hsize-\width \FrameRestore}}%
+% {\endMakeFramed}
+%
+% \newenvironment{shaded}{%
+% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}%
+% \MakeFramed {\FrameRestore}}%
+% {\endMakeFramed}
+%
+% \newenvironment{leftbar}{%
+% \def\FrameCommand{\vrule width 3pt \hspace{10pt}}%
+% \MakeFramed {\advance\hsize-\width \FrameRestore}}%
+% {\endMakeFramed}
+%
+% \newenvironment{snugshade}{%
+% \def\FrameCommand{\colorbox{shadecolor}}%
+% \MakeFramed {\FrameRestore\@setminipage}}%
+% {\par\unskip\endMakeFramed}
+%
+% \end{verbatim}
+%
+% Now for the package code.
+%
+% \begin{macrocode}
+\chardef\FrameRestore=\catcode`\| % for debug
+\catcode`\|=\catcode`\% % (debug: insert space after backslash)
+
+% \end{macrocode}
+%
+% \begin{macro}{\MakeFramed}
+% \begin{macrocode}
+\def\MakeFramed#1{\par
+% \end{macrocode}
+% measure added width and height; call result \cs{width} and \cs{height}
+% \begin{macrocode}
+ \fb@sizeofframe\FrameCommand
+ \let\width\fb@frw \let\height\fb@frh
+% \end{macrocode}
+% insert pre-penalties and skips
+% \begin{macrocode}
+ \begingroup
+ \skip@\lastskip
+ \if@nobreak\else
+ \penalty9999 % updates \page parameters
+ \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@
+% \end{macrocode}
+% not infinitely stretchable, so encourage a page break here
+% \begin{macrocode}
+ \edef\@tempa{\the\skip@}%
+ \ifx\@tempa\zero@glue \penalty-30
+ \else \vskip-\skip@ \penalty-30 \vskip\skip@
+ \fi\fi\fi
+ \penalty\z@
+% \end{macrocode}
+% Give a stretchy breakpoint that will always be taken in preference
+% to the \cs{penalty} 9999 used to update page parameters. The cube root
+% of 10000/100 indicates a multiplier of 0.21545, but the maximum
+% calculated badness is really 8192, not 10000, so the multiplier
+% is 0.2301.
+% \begin{macrocode}
+ \advance\skip@ \z@ plus-.5\baselineskip
+ \advance\skip@ \z@ plus-.231\height
+ \advance\skip@ \z@ plus-.231\skip@
+ \advance\skip@ \z@ plus-.231\topsep
+ \vskip-\skip@ \penalty 1800 \vskip\skip@
+ \fi
+ \addvspace{\topsep}%
+ \endgroup
+% \end{macrocode}
+% clear out pending page break
+% \begin{macrocode}
+ \penalty\@M \vskip 2\baselineskip \vskip\height
+ \penalty9999 \vskip -2\baselineskip \vskip-\height
+ \penalty9999 % updates \pagetotal
+|\message{After clearout, \pagetotal=\the\pagetotal,
+| \pagegoal=\the\pagegoal. }%
+ \fb@adjheight
+ \setbox\@tempboxa\vbox\bgroup
+ #1% Modifications to \hsize (can use \width and \height)
+ \textwidth\hsize \columnwidth\hsize}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endMakeFramed}
+% \begin{macrocode}
+\def\endMakeFramed{\par
+ \kern\z@
+ \hrule\@width\hsize\@height\z@
+ \penalty-100 % put depth into height
+ \egroup
+ % {\showoutput\showbox\@tempboxa}%
+ \begingroup
+ \fb@put@frame\FrameCommand\FirstFrameCommand
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fb@put@frame}
+% \cs{fb@put@frame}\marg{nosplit}\marg{split}
+% takes the contents of \cs{@tempboxa} and puts all,
+% or a piece,
+% of it on the page with a frame (\cs{FrameCommand}, \cs{FirstFrameCommand},
+% \cs{MidFrameCommand}, or \cs{LastFrameCommand}). It recurses until all of
+% \cs{@tempboxa} has been used up. (\cs{@tempboxa} must have zero depth.) \\
+% \meta{nosplit} = attempted framing command, if no split \\
+% \meta{split} = framing command if split.
+%
+% First iteration: Try to fit with \cs{FrameCommand}. If it does not fit,
+% split for \cs{FirstFrameCommand}.
+%
+% Later iteration: Try to fit with \cs{LastFrameCommand}. If it does not
+% fit, split for \cs{MidFrameCommand}.
+% \begin{macrocode}
+\def\fb@put@frame#1#2{\relax
+ \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi
+ \ifinner
+ \fb@putboxa#1%
+ \fb@afterframe
+ \else
+ \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page
+ \ifdim\dimen@<2\baselineskip % Too little room on page
+| \message{Page has only \the\dimen@\space room left; eject. }%
+ \eject \fb@adjheight \fb@put@frame#1#2%
+ \else % there's appreciable room left on the page
+ \fb@sizeofframe#1%
+| \message{\string\pagetotal=\the\pagetotal,
+| \string\pagegoal=\the\pagegoal,
+| \string\pagestretch=\the\pagestretch,
+| \string\pageshrink=\the\pageshrink,
+| \string\fb@frh=\fb@frh. \space}
+| \message{Box of size \the\ht\@tempboxa\space + \fb@frh}%
+ \begingroup % temporarily set \dimen@ to be...
+ \advance\dimen@.8\pageshrink % maximum space available on page
+ \advance\dimen@-\fb@frh\relax % space available for frame's contents
+ \expandafter\endgroup
+% \end{macrocode}
+% expand \cs{ifdim}, then restore \cs{dimen@} to real room left on page
+% \begin{macrocode}
+ \ifdim\dimen@>\ht\@tempboxa % whole box does fit
+| \message{fits in \the\dimen@. }%
+% \end{macrocode}
+% Use vsplit anyway to capture the marks \\
+% !!!???!!! MERGE THIS WITH THE else CLAUSE!!!
+% \begin{macrocode}
+ \fb@putboxa#1%
+ \fb@afterframe
+ \else % box must be split
+| \message{must be split to fit in \the\dimen@. }%
+% \end{macrocode}
+% update frame measurement to use \cs{FirstFrameCommand}
+% or \cs{MidFrameCommand}
+% \begin{macrocode}
+ \fb@sizeofframe#2%
+ \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page:
+ \vskip \fb@frh \@plus\pagestretch \@minus.8\pageshrink
+ \kern137sp\kern-137sp\penalty-30
+ \unvbox\@tempboxa}%
+ \edef\fb@resto@set{\boxmaxdepth\the\boxmaxdepth
+ \splittopskip\the\splittopskip}%
+ \boxmaxdepth\z@ \splittopskip\z@
+| \message{Padded box of size \the\ht\@tempboxa\space split
+| to \the\dimen@}%
+% \end{macrocode}
+% Split box here
+% \begin{macrocode}
+ \setbox\tw@\vsplit\@tempboxa to\dimen@
+| \toks99\expandafter{\splitfirstmark}%
+| \toks98\expandafter{\splitbotmark}%
+| \message{Marks are: \the\toks99, \the\toks98. }%
+ \setbox\tw@\vbox{\unvbox\tw@}% natural-sized
+| \message{Natural height of split box is \the\ht\tw@, leaving
+| \the\ht\@tempboxa\space remainder. }%
+% \end{macrocode}
+% If the split-to size $>$ (\cs{vsize}-\cs{topskip}), then set box to full size
+% \begin{macrocode}
+ \begingroup
+ \advance\dimen@\topskip
+ \expandafter\endgroup
+ \ifdim\dimen@>\pagegoal
+| \message{Frame is big -- Use up the full column. }%
+ \dimen@ii\pagegoal
+ \advance\dimen@ii -\topskip
+ \advance\dimen@ii \FrameHeightAdjust\relax
+ \else % suspect this is wrong:
+% \end{macrocode}
+% If the split-to size $>$ feasible room-on-page, rebox it smaller.
+% \begin{macrocode}
+ \advance\dimen@.8\pageshrink
+ \ifdim\ht\tw@>\dimen@
+| \message{Box too tall; rebox it to \the\dimen@. }%
+ \dimen@ii\dimen@
+ \else % use natural size
+ \dimen@ii\ht\tw@
+ \fi
+ \fi
+% \end{macrocode}
+% Re-box contents to desired size \cs{dimen@ii}
+% \begin{macrocode}
+ \advance\dimen@ii -\fb@frh
+ \setbox\tw@\vbox to\dimen@ii \bgroup
+% \end{macrocode}
+% remove simulated frame and page flexibility:
+% \begin{macrocode}
+ \vskip -\fb@frh \@plus-\pagestretch \@minus-.8\pageshrink
+ \unvbox\tw@ \unpenalty\unpenalty
+ \ifdim\lastkern=-137sp % whole box went to next page
+| \message{box split at beginning! }%
+ % need work here???
+ \egroup \fb@resto@set \eject % (\vskip for frame size was discarded)
+ \fb@adjheight
+ \fb@put@frame#1#2% INSERTED ???
+ \else % Got material split off at the head
+ \egroup \fb@resto@set
+ \ifvoid\@tempboxa % it all fit after all
+| \message{box split at end! }%
+ \setbox\@tempboxa\box\tw@
+ \fb@putboxa#1%
+ \fb@afterframe
+ \else % it really did split
+| \message{box split as expected. Its reboxed height
+| is \the\ht\tw@. }%
+ \ifdim\wd\tw@>\z@
+ \wd\tw@\wd\@tempboxa
+% \end{macrocode}
+% PW: the next line was: \\
+% \verb!\centerline{#2{\box\tw@}}% ??? \centerline bad idea?! \\
+% but I have changed it as follows so that \cs{centerline} can be changed
+% from elsewhere if useful.
+% \begin{macrocode}
+ \memfblineboxtwo{#2{\box\tw@}}% ??? \centerline bad idea? \\
+ \else
+| \message{Zero width means likely blank.
+| Don't frame it (guess)}%
+ \box\tw@
+ \fi
+ \hrule \@height\z@ \@width\hsize
+ \eject
+ \fb@adjheight
+ \fb@put@frame\LastFrameCommand\MidFrameCommand
+ \fi\fi\fi\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memfblineboxtwo}
+% \begin{macro}{\memfblineboxa}
+% PW: this is an addition of mine. There is a question mark against the
+% use of \cs{centerline} within the \Lenv{framed} code. I have
+% created these two macros which are used in the code instead of
+% \cs{centerline}, so that those parts of the code can be easily altered.
+% are used instead
+% \begin{macrocode}
+\newcommand{\memfblineboxtwo}[1]{\centerline{#1}}
+\newcommand{\memfblineboxa}[1]{\centerline{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@putboxa}
+% \begin{macrocode}
+\def\fb@putboxa#1{%
+ \ifvoid\@tempboxa
+%%%% PackageWarning{framed}{Boxa is void -- discard it. }%
+ \@memwarn{Boxa is void -- discard it. }%
+ \else
+| \message{Frame and place boxa. }%
+| %{\showoutput\showbox\@tempboxa}%
+%%%%%%% \centerline{#1{\box\@tempboxa}}%
+ \memfblineboxa{#1{\box\@tempboxa}}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fb@afterframe}
+% \begin{macrocode}
+\def\fb@afterframe{%
+ \nointerlineskip \null %{\showoutput \showlists}
+ \penalty-30 \vskip\topsep \relax}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fb@frw}
+% \begin{macro}{\fb@frh}
+% \begin{macro}{\fb@sizeofframe}
+% \cs{fb@sizeofframe}\marg{framecommand} measures width and height added by
+% frame (\meta{framecommand}) and call the results \cs{fb@frw} and \cs{fb@frh}.
+% \begin{macrocode}
+\newdimen\fb@frw
+\newdimen\fb@frh
+\def\fb@sizeofframe#1{\begingroup
+ \setbox\z@\vbox{\vskip-5in \hbox{\hskip-5in
+ #1{\hbox{\vrule \@height 4.7in \@depth.3in \@width 5in}}}%
+ \vskip\z@skip}%
+| \message{Measuring frame addition for \string#1 in \@currenvir\space
+| gives ht \the\ht\z@\space and wd \the\wd\z@. }%
+%{\showoutput\showbox\z@}%
+ \global\fb@frw\wd\z@ \global\fb@frh\ht\z@
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fb@adjheight}
+% \begin{macrocode}
+\def\fb@adjheight{%
+ \vbox to\FrameHeightAdjust{}% get proper baseline skip from above.
+ \penalty\@M \nointerlineskip
+ \vskip-\FrameHeightAdjust
+ \penalty\@M} % useful for tops of pages
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zero@glue}
+% \begin{macrocode}
+\edef\zero@glue{\the\z@skip}
+
+\catcode`\|=\FrameRestore
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FrameCommand}
+% \begin{macro}{\FrameRule}
+% \begin{macro}{\FrameSep}
+% \begin{macro}{\FirstFrameCommand}
+% \begin{macro}{\MidFrameCommand}
+% \begin{macro}{\LastFrameCommand}
+% Provide configuration commands:
+% \begin{macrocode}
+\providecommand\FrameCommand{%
+ \setlength\fboxrule{\FrameRule}\setlength\fboxsep{\FrameSep}%
+ \fbox}
+\@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{}
+\@ifundefined{FrameSep} {\newdimen\FrameSep \FrameSep =3\fboxsep}{}
+\providecommand\FirstFrameCommand{\FrameCommand}
+\providecommand\MidFrameCommand{\FrameCommand}
+\providecommand\LastFrameCommand{\FrameCommand}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\FrameHeightAdjust}
+% Height of frame above first baseline when frame starts a page:
+% \begin{macrocode}
+\providecommand\FrameHeightAdjust{6pt}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FrameRestore}
+% \cs{FrameRestore} has parts of \cs{@parboxrestore}, performing a similar but
+% less complete restoration of a default layout. See how it is used in the
+% "settings" argument of \cs{MakeFrame}. Though not a parameter, \cs{hsize}
+% should be set to the desired total line width available inside the
+% frame before invoking \cs{FrameRestore}.
+% \begin{macrocode}
+\def\FrameRestore{%
+ \let\if@nobreak\iffalse
+ \let\if@noskipsec\iffalse
+ \let\-\@dischyph
+ \let\'\@acci\let\`\@accii\let\=\@acciii
+ % \message{FrameRestore:
+ % \@totalleftmargin=\the \@totalleftmargin,
+ % \rightmargin=\the\rightmargin,
+ % \@listdepth=\the\@listdepth. }%
+% \end{macrocode}
+% Test if we are in a list (or list-like paragraph)
+% \begin{macrocode}
+ \ifnum \ifdim\@totalleftmargin>\z@ 1\fi
+ \ifdim\rightmargin>\z@ 1\fi
+ \ifnum\@listdepth>0 1\fi 0>\z@
+ % \message{In a list: \linewidth=\the\linewidth,
+ % \@totalleftmargin=\the\@totalleftmargin,
+ % \parshape=\the\parshape, \columnwidth=\the\columnwidth,
+ % \hsize=\the\hsize,
+ % \labelwidth=\the\labelwidth. }%
+% \end{macrocode}
+% Now try to propagate changes of width from \cs{hsize} to list parameters.
+% This is deficient, but a more advanced way to indicate modification to text
+% dimensions is not (yet) provided; in particular, no separate left/right
+% adjustment. (PW. I have provided a macro for the next few lines as I think
+% that I may have a reason to allow them to be easily changed).
+% \begin{macrocode}
+%%% \@setminipage % snug fit around the item
+%%% \advance\linewidth-\columnwidth \advance\linewidth\hsize
+%%% \parshape\@ne \@totalleftmargin \linewidth
+ \memfblistfixparams
+ \else % Not in list
+ \linewidth=\hsize
+ %\message{No list, set \string\linewidth=\the\hsize. }%
+ \fi
+ \sloppy}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\memfblistfixparams}
+% An extract of some code from \cs{FrameRestore}.
+% Try to propagate changes of width from \cs{hsize} to list parameters.
+% This is deficient, but a more advanced way to indicate modification to text
+% dimensions is not (yet) provided; in particular, no separate left/right
+% adjustment.
+% \begin{macrocode}
+\newcommand*{\memfblistfixparams}{%
+ \@setminipage % snug fit around the item
+ \advance\linewidth-\columnwidth \advance\linewidth\hsize
+ \parshape\@ne \@totalleftmargin \linewidth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% I have moved the following from the start of the \Lpack{framed}
+% package to here.
+%
+% \begin{environment}{framed}
+% \begin{environment}{shaded}
+% \begin{environment}{leftbar}
+% \begin{environment}{snugshade}
+% \begin{macrocode}
+\newenvironment{framed}% using default \FrameCommand
+ {\MakeFramed {\advance\hsize-\width \FrameRestore}}%
+ {\endMakeFramed}
+
+\newenvironment{shaded}{%
+ \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}%
+ \MakeFramed {\FrameRestore}}%
+ {\endMakeFramed}
+
+\newenvironment{leftbar}{%
+ \def\FrameCommand{\vrule width 3pt \hspace{10pt}}%
+ \MakeFramed {\advance\hsize-\width \FrameRestore}}%
+ {\endMakeFramed}
+
+\newenvironment{snugshade}{%
+ \def\FrameCommand{\colorbox{shadecolor}}%
+ \MakeFramed {\FrameRestore\@setminipage}}%
+ {\par\unskip\endMakeFramed}
+
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+% As the package used \cs{newenvironment} it will
+% burp if it is used with the class. There are two options: either
+% prevent \Lpack{framed} from being loaded, or kill the environments
+% if it is loaded. I'm going for the latter as Donald will be updating
+% his package at some point and author's may want to use it before it's
+% updated here.
+%
+% \begin{macrocode}
+\AtBeginPackage{framed}{%
+ \let\framed\relax \let\endframed\relax
+ \let\shaded\relax \let\endshaded\relax
+ \let\leftbar\relax \let\endleftbar\relax
+ \let\snugshade\relax \let\endsnugshade\relax}
+
+% \end{macrocode}
+%
+%
+% \begin{environment}{qframe}
+% This is from an email to me from DA shortly after he released \Lpack{framed}
+% v 0.95.
+% \begin{quote}
+% A frame more like a simple parbox.
+% Notably useful for use
+% inside a single list item --- the frame matches the text of the other
+% items.
+% \end{quote}
+% He actually called it \Lenv{pframe} and said that something similar
+% could be in a later version of \Lpack{framed}.
+%
+% I have found it useful for framing \Lenv{quote} or \Lenv{adjustwidth}
+% environments, or similar. Hence the name, from
+% `\textit{q}uote \textit{frame}'.
+% \changes{v1.61803}{2008/01/30}{Added the qframe environment}
+% \begin{macrocode}
+\newenvironment{qframe}{%
+ \def\FrameCommand##1{\fboxrule=\FrameRule\fboxsep=\FrameSep
+ \hskip\@totalleftmargin\fbox{##1}% There is no \@totalrightmargin, so...
+ \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
+ \MakeFramed{\advance\hsize-\width
+ \advance\hsize \FrameSep
+ \@totalleftmargin\z@ \linewidth=\hsize}}%
+ {\endMakeFramed}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{qshade}
+% And here is my corresponding version for \Lenv{shaded}.
+% \changes{v1.61803}{2008/01/30}{Added the qshade environment}
+% \begin{macrocode}
+\newenvironment{qshade}{%
+ \def\FrameCommand##1{\fboxsep=\FrameSep
+ \hskip\@totalleftmargin
+ \hskip -1\FrameSep
+ \colorbox{shadecolor}{##1}%
+ \hskip-\linewidth \hskip-\@totalleftmargin
+ \hskip -1\FrameSep
+ \hskip\columnwidth}%
+ \MakeFramed{\advance\hsize-\width
+ \advance\hsize 3\FrameSep
+ \@totalleftmargin\z@ \linewidth=\hsize}}%
+ {\endMakeFramed}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{The newfile package}
+%
+% The following code is from the \Lpack{newfile} package.
+% To try and avoid name clashes with other packages, each internal macro
+% in this package includes the character string `\verb?stre@m?'.
+%
+% \begin{macro}{\newoutputstream}
+% \cs{newoutputstream}\marg{stream} creates a new output stream called \meta{stream}.
+% Different files may be associated with the \meta{stream}. Note that
+% TeX permits no more than 16 output streams.
+% \begin{macrocode}
+\newcommand*{\newoutputstream}[1]{%
+ \@ifundefined{#1outstre@m}%
+ {\expandafter\newwrite\csname #1outstre@m\endcsname
+ \csname newif\expandafter\endcsname
+ \csname ifstre@m#1open\endcsname
+ \global\csname stre@m#1openfalse\endcsname
+ \expandafter\ifx\csname atstreamopen#1\endcsname\relax
+ \global\@namedef{atstreamopen#1}{}%
+ \fi
+ \expandafter\ifx\csname atstreamclose#1\endcsname\relax
+ \global\@namedef{atstreamclose#1}{}%
+ \fi
+ }%
+ {\@memwarn{Output stream #1\space is already defined}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newinputstream}
+% \cs{newinputstream}\marg{stream} creates a new input stream called \meta{stream}.
+% Different files may be associated with the \meta{stream}. Note that
+% TeX permits no more than 16 input streams.
+% \begin{macrocode}
+\newcommand*{\newinputstream}[1]{%
+ \@ifundefined{#1instre@m}%
+ {\expandafter\newread\csname #1instre@m\endcsname
+ \csname newif\expandafter\endcsname
+ \csname ifstre@m#1open\endcsname
+ \global\csname stre@m#1openfalse\endcsname
+ \expandafter\ifx\csname atstreamopen#1\endcsname\relax
+ \global\@namedef{atstreamopen#1}{}%
+ \fi
+ \expandafter\ifx\csname atstreamclose#1\endcsname\relax
+ \global\@namedef{atstreamclose#1}{}%
+ \fi
+ }%
+ {\@memwarn{Input stream #1\space is already defined}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Some checking macros will be useful as some of the checks occur in
+% multiple places.
+%
+% \begin{macro}{\IfStreamOpen}
+% \cs{IfStreamOpen}\marg{stream}\marg{TRUE code}\marg{FALSE code}
+% checks if stream \meta{stream} is currently open.
+% \begin{macrocode}
+\newcommand{\IfStreamOpen}[3]{%
+ \csname ifstre@m#1open\endcsname#2\else#3\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\instre@mandopen}
+% \cs{instre@mandopen}\marg{stream}\marg{TRUE code} checks if \meta{stream}
+% is an input stream and is open. If so, it executes \meta{TRUE code}.
+% \begin{macrocode}
+\newcommand{\instre@mandopen}[2]{%
+ \@ifundefined{#1instre@m}{%
+ \@memwarn{#1\space is not an input stream}}%
+ {\IfStreamOpen{#1}{#2}{%
+ \@memwarn{Input stream #1\space is not open}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\instre@mandclosed}
+% \cs{instre@mandclosed}\marg{stream}\marg{TRUE code} checks if \meta{stream}
+% is an input stream and is closed (not open).
+% If so, it executes \meta{TRUE code}.
+% \begin{macrocode}
+\newcommand{\instre@mandclosed}[2]{%
+ \@ifundefined{#1instre@m}{%
+ \@memwarn{#1\space is not an input stream}}%
+ {\IfStreamOpen{#1}{%
+ \@memwarn{Input stream #1\space is open}}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\outstre@mandopen}
+% \cs{outstre@mandopen}\marg{stream}\marg{TRUE code} checks if \meta{stream}
+% is an output stream and is open. If so, it executes \meta{TRUE code}.
+% \begin{macrocode}
+\newcommand{\outstre@mandopen}[2]{%
+ \@ifundefined{#1outstre@m}{%
+ \@memwarn{#1\space is not an output stream}}%
+ {\IfStreamOpen{#1}{#2}{%
+ \@memwarn{Output stream #1\space is not open}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\outstre@mandclosed}
+% \cs{outstre@mandclosed}\marg{stream}\marg{TRUE code} checks if \meta{stream}
+% is an output stream and is closed (not open).
+% If so, it executes \meta{TRUE code}.
+% \begin{macrocode}
+\newcommand{\outstre@mandclosed}[2]{%
+ \@ifundefined{#1outstre@m}{%
+ \@memwarn{#1\space is not an output stream}}%
+ {\IfStreamOpen{#1}{%
+ \@memwarn{Output stream #1\space is open}}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\openoutputfile}
+% \cs{openoutputfile}\marg{filename}\marg{stream} opens the file called
+% \meta{filename} and attaches it to the stream \meta{stream} for
+% writing. However, if the \cs{nofiles} command has been given the
+% file is \emph{not} attached to the stream. No more than one file can be
+% attached to a stream at any given time.
+% \begin{macrocode}
+\newcommand*{\openoutputfile}[2]{%
+ \outstre@mandclosed{#2}{%
+ \global\@namedef{#1@filename}{#1}%
+ \if@filesw
+ \immediate\openout\@nameuse{#2outstre@m}=\@nameuse{#1@filename}%
+ \fi
+ \global\csname stre@m#2opentrue\endcsname%
+ \@nameuse{atstreamopen#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\closeoutputstream}
+% \cs{closeoutputstream}\marg{stream} closes the stream \meta{stream}.
+% \begin{macrocode}
+\newcommand*{\closeoutputstream}[1]{%
+ \outstre@mandopen{#1}{%
+ \@nameuse{atstreamclose#1}%
+ \immediate\closeout\@nameuse{#1outstre@m}%
+ \global\csname stre@m#1openfalse\endcsname}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\openinputfile}
+% \cs{openinputfile}\marg{filename}\marg{stream} opens the file called
+% \meta{filename} and attaches it to the stream \meta{stream} for
+% reading. The file is added to the list of files.
+% No more than one file can be attached to a stream at
+% any given time.
+% \begin{macrocode}
+\newcommand{\openinputfile}[2]{%
+ \IfFileExists{#1}{% file exists
+ \instre@mandclosed{#2}{%
+ \@addtofilelist{#1}%
+ \global\@namedef{#1@filename}{#1}%
+ \immediate\openin\@nameuse{#2instre@m}=\@nameuse{#1@filename}%
+ \global\csname stre@m#2opentrue\endcsname%
+ \@nameuse{atstreamopen#2}}}%
+ {% file not found
+ \typeout{No file #1.}
+ }}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\closeinputstream}
+% \cs{closeinputstream}\marg{stream} closes the stream \meta{stream}.
+% \begin{macrocode}
+\newcommand{\closeinputstream}[1]{%
+ \instre@mandopen{#1}{%
+ \@nameuse{atstreamclose#1}%
+ \immediate\closein\@nameuse{#1instre@m}%
+ \global\csname stre@m#1openfalse\endcsname}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{writeverbatim}
+% \verb?\begin{writeverbatim}?\marg{stream} writes the contents of
+% the environment as verbatim text to the given \meta{stream}.
+% \begin{macrocode}
+\def\writeverbatim#1{%
+ \@bsphack
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\@nameuse{#1outstre@m}{\the\verbatim@line}}%
+ \verbatim@start}
+\def\endwriteverbatim{\@esphack}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\addtostream}
+% \cs{addtostream}\marg{stream}\marg{text} writes \meta{text} to the
+% given \meta{stream}.
+% \begin{macrocode}
+\newcommand{\addtostream}[2]{%
+ \@bsphack
+ \outstre@mandopen{#1}{%
+ {\let\protect\string
+ \immediate\write\@nameuse{#1outstre@m}{#2}%
+ }}%
+ \@esphack}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifstre@mnoteof}
+% \begin{macro}{\checkstre@mnoteof}
+% \cs{checkstre@mnoteof}\marg{stream} sets \cs{ifstre@mnoteof} to TRUE if
+% \meta{stream} is not at the end of the file (i.e., it is the opposite
+% of \cs{ifeof}).
+% \begin{macrocode}
+\newif\ifstre@mnoteof
+\newcommand{\checkstre@meof}[1]{%
+ \stre@mnoteoftrue\ifeof\@nameuse{#1instre@m}\stre@mnoteoffalse\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\readstream}
+% \cs{readstream}\marg{stream} reads the contents of
+% the given \meta{stream} as \cs{input} text.
+% \begin{macrocode}
+\def\readstream#1{
+ \instre@mandopen{#1}{%
+ \loop \checkstre@meof{#1} \ifstre@mnoteof
+ \read\@nameuse{#1instre@m} to\temptokstre@m
+ \temptokstre@m
+ \repeat
+ }}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\readaline}
+% \cs{readaline}\marg{stream} reads what TeX considers to be one line
+% from the given \meta{stream} as \cs{input} text.
+% \begin{macrocode}
+\def\readaline#1{
+ \instre@mandopen{#1}{%
+ \ifeof\@nameuse{#1instre@m}
+ \@memwarn{No more to read from stream #1}
+ \else
+ \read\@nameuse{#1instre@m} to\temptokstre@m
+ \temptokstre@m
+ \fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\readverbatim}
+% \cs{readverbatim}\marg{stream} reads the contents of
+% the given \meta{stream} as verbatim text.
+%
+% The read verbatim code is a slight variation on code from the
+% \Lpack{verbatim} package. Most of the setup is done by the macros
+% \cs{stre@mverb@input}\marg{setup}\marg{stream} and
+% \cs{verbatim@readstre@m}\marg{stream}. Finally, \cs{verbatim@read@file}
+% is a \Lpack{verbatim} package macro.
+% \begin{macrocode}
+\def\readverbatim{\begingroup
+ \ift@bs
+ \def\verbatim@processline{\tabverbatim@processline}%
+ \fi
+ \@ifstar{\stre@mverb@input{\@maybeobeytabs}}%
+ {\stre@mverb@input{\frenchspacing\@vobeyspaces\@maybeobeytabs}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\stre@mverb@input}
+% \begin{macro}{\@verbinstre@m}
+% \cs{stre@mverb@input}\marg{setup}\marg{stream} is a stream
+% version of \cs{verbatim@input}. It defines \cs{@verbinstre@m}
+% to be \meta{stream}.
+%
+% \begin{macrocode}
+\newcommand{\stre@mverb@input}[2]{%
+ \IfStreamOpen{#2}%
+ {\@verbatim #1\relax
+ \def\@verbinstre@m{\@nameuse{#2instre@m}}
+ \verb@readstre@m\endtrivlist\endgroup\@doendpe}%
+ {\@memwarn{Stream #2\space is not open}\endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\verb@readstre@m}
+% \cs{verb@readstre@m} is the stream analogue to \cs{verbatim@readfile}.
+% \begin{macrocode}
+\newcommand{\verb@readstre@m}{%
+ \verbatim@startline
+ \expandafter\endlinechar\expandafter\m@ne
+ \expandafter\verbatim@read@stre@m
+ \expandafter\endlinechar\the\endlinechar\relax
+ \verbatim@finish}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@read@stre@m}
+% \cs{verbatim@read@stre@m} is the analogue to \cs{verbatim@readfile}.
+% It gets its input from the stream \cs{@verbinstre@m}, which is defined
+% in the \cs{stre@mverb@input} macro.
+% \begin{macrocode}
+\newcommand{\verbatim@read@stre@m}{%
+ \read\@verbinstre@m to\next
+ \ifeof\@verbinstre@m
+ \else
+ \expandafter\verbatim@addtoline\expandafter{\next}%
+ \verbatim@processline
+ \verbatim@startline
+ \expandafter\verbatim@read@stre@m
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\readboxedverbatim}
+% \cs{readboxedverbatim}\marg{stream} is the equivalent of
+% \cs{readverbtim} except that it generates a boxed verbatim.
+% \begin{macrocode}
+\newcommand{\readboxedverbatim}{\begingroup
+ \@ifstar{\stre@mbvin\relax}%
+ {\stre@mbvin{\frenchspacing\@vobeyspaces}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\stre@mbvin}
+% \cs{stre@mbvin}\marg{setup}\marg{stream} is the workhorse for
+% \cs{readboxedverbatim}, and in its turn it uses \cs{verb@readstre@m}.
+% \begin{macrocode}
+\newcommand{\stre@mbvin}[2]{%
+ \IfStreamOpen{#2}%
+ {\setupboxverb@line
+ \@verbatim #1\relax
+ \def\@verbinstre@m{\@nameuse{#2instre@m}}%
+ \setupbox@verb
+ \verb@readstre@m\bvendrulehook\endtrivlist\endgroup\@doendpe}%
+ {\@memwarn{Stream #2\space is not open}\endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \section{Utilities}
+%
+%
+% \subsection{Extra `provide' commands}
+%
+% \begin{macro}{\provideenvironment}
+% Works like \cs{providecommand} but for environments.
+% \changes{v1.2}{2002/08/04}{Added \cs{provideenvironment} and supports}
+% \begin{macrocode}
+\newcommand{\provideenvironment}{\@star@or@long\m@mprovenv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mprovenv}
+% This checks if the environment has been defined. If not it calls
+% the kernel code for \cs{newenvironment} otherwise it calls code to
+% discard arguments.
+% \begin{macrocode}
+\newcommand{\m@mprovenv}[1]{\@ifundefined{#1}%
+ {\new@environment{#1}}% % create new environment
+ {\@memwarn{Environment `#1' already defined}%
+ \m@mgobbleoptsandtwo}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\m@mgobbleoptsandtwo}
+% \begin{macro}{\m@mgobbleoptandtwo}
+% \cs{m@mgobbleoptsandtwo} gobbles the \verb?[opt][opt]{begin}{end}? arguments to
+% \cs{provideenvironment}. It is actually more general than that as it will
+% gobble any sequence of any number of optional arguments followed by
+% two required arguments. If there are no optional arguments it disposes
+% of the two required ones, otherwise it calls a recursive procedure to
+% discard any number of optionals, then two required ones.
+%
+% \cs{m@mgobbleoptandtwo} recursively discards optional arguments, then finally
+% two required arguments.
+% \begin{macrocode}
+\newcommand{\m@mgobbleoptsandtwo}{%
+ \@ifnextchar [{\m@mgobbleoptandtwo}{\@gobbletwo}}
+\def\m@mgobbleoptandtwo[#1]{%
+ \@ifnextchar [{\m@mgobbleoptandtwo}{\@gobbletwo}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\providecounter}
+% Works like the other \cs{provide...} commands, but for counters.
+% Code is based on \cs{newcounter} in \file{ltcounts.dtx}.
+% \changes{v1.2}{2002/07/17}{Added \cs{providecounter}}
+% \begin{macrocode}
+\newcommand*{\providecounter}[1]{%
+ \@ifundefined{c@#1}%
+ {\newcounter{#1}}%
+ {\@memwarn{Counter `#1' already defined}%
+ \@ifnextchar[{\m@mgobbleopt}{}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mgobbleopt}
+% Gobble an optional argument.
+% \changes{v1.2}{2002/07/07}{Added \cs{m@mgobbleopt}}
+% \begin{macrocode}
+\def\m@mgobbleopt[#1]{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\providelength}
+% Works like the other \cs{provide...} commands, but for lengths.
+% Code is based on \cs{provide@command} in \file{ltdefns.dtx}.
+% \changes{v1.2}{2002/07/17}{Added \cs{providelength}}
+% \begin{macrocode}
+\newcommand*{\providelength}[1]{%
+ \begingroup
+ \escapechar\m@ne\xdef\@gtempa{{\string#1}}%
+ \endgroup
+ \expandafter\@ifundefined\@gtempa
+ {\newlength{#1}}%
+ {\@memwarn{Length #1 already defined}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newloglike}
+% \begin{macro}{\m@mnewlog}
+% \begin{macro}{\m@mnewlogs}
+% For defining a new log-like math function.
+% \verb?\newloglike{\fun}{string}? or \verb?\newloglike*{\fun}{string}?.
+% The starred version is for functions with limits (like an integral sign).
+% \changes{v1.6}{2004/01/28}{Added \cs{newloglike}}
+% \begin{macrocode}
+\newcommand*{\newloglike}{\@ifstar{\m@mnewlogs}{\m@mnewlog}}
+\newcommand*{\m@mnewlogs}[2]{%
+ \newcommand*{#1}{\mathop{\operator@font #2}}}
+\newcommand*{\m@mnewlog}[2]{%
+ \newcommand*{#1}{\mathop{\operator@font #2}\nolimits}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\provideloglike}
+% \begin{macro}{\m@mprovlogs}
+% \begin{macro}{\m@mprovlog}
+% The provide version of \cs{newloglike}.
+% \changes{v1.6}{2004/01/28}{Added \cs{provideloglike}}
+% \begin{macrocode}
+\newcommand*{\provideloglike}{\@ifstar{\m@mprovlogs}{\m@mprovlog}}
+\newcommand*{\m@mprovlogs}[2]{%
+ \providecommand*{#1}{\mathop{\operator@font #2}}}
+\newcommand*{\m@mprovlog}[2]{%
+ \providecommand*{#1}{\mathop{\operator@font #2}\nolimits}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Changing counters}
+%
+% In LaTeX, a new counter called, say `ctr', is created by the command
+% \verb?\newcounter{ctr}[within]?. If the optional within argument is given
+% the the counter `ctr' is reset to zero each time the counter `within'
+% changes. The command \cs{thectr} typesets the value of the counter ctr.
+% This is automatically defined by \cs{newcounter} and is initialised
+% to typeset arabic numerals. Sometimes it may be desireable to change
+% the counter definitions.
+%
+% The following code is based on the \Lpack{chngcntr} package~\cite{CHNGCNTR}.
+%
+% \begin{macro}{\@removefromreset}
+% This code uses David Carlisle's \cs{@removefromreset} command as
+% specified in the remreset package~\cite{REMRESET}.
+% It is provided here as a convenience to the user, and with
+% David Carlisle's permission.
+%
+% START OF DAVID CARLISLE'S CODE
+% \begin{macrocode}
+\providecommand{\@removefromreset}[2]{{%
+ \expandafter\let\csname c@#1\endcsname\@removefromreset
+ \def\@elt##1{%
+ \expandafter\ifx\csname c@##1\endcsname\@removefromreset
+ \else
+ \noexpand\@elt{##1}%
+ \fi}%
+ \expandafter\xdef\csname cl@#2\endcsname{%
+ \csname cl@#2\endcsname}}}
+
+% \end{macrocode}
+% END OF DAVID CARLISLE'S CODE
+% \end{macro}
+%
+% \begin{macro}{\@ifbothcntrs}
+% This is called as \\
+% \cs{@ifbothcntrs}\marg{cntr}\marg{within}\marg{code when both are counters}.
+% This tests if both \meta{cntr} and \meta{within} are counters.
+% \begin{macrocode}
+\newcommand{\@ifbothcntrs}[3]{%
+ \@ifundefined{c@#1}{% counter undefined
+ \@memerror{#1 is not a counter}{\@eha}}%
+ {% else counter is defined
+ \@ifundefined{c@#2}{% within undefined
+ \@memerror{#2 is not a counter}{\@eha}}%
+ {% else both counter and within are defined
+ #3}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\counterwithin}
+% \begin{macro}{\counterwithin*}
+% \begin{macro}{\@csinstar}
+% \begin{macro}{\@csin}
+% It is sometimes desireable to change a counter that has been defined
+% by \verb?\newcounter{ctr}? to act as though it had been defined as
+% \verb?\newcounter{ctr}[within]?. The command
+% \verb?\counterwithin{ctr}{within}? accomplishes this. By default,
+% it also redefines the \cs{thectr} command so that it typesets values
+% in the style \verb?\thewithin.\arabic{ctr}?. The starred version of the
+% command suppresses the redefinition of \cs{thectr}.
+% \changes{v3.7g}{2018/03/09}{As of TeXLive 2018 \cs{counterwithin}
+% and \cs{counterwithout} will be moved into the kernel. We therefore
+% change to using \cs{providecommand} instead of \cs{newcommand} to
+% avoid colisions}
+% \begin{macrocode}
+\providecommand{\counterwithin}{\@ifstar{\@csinstar}{\@csin}}
+\providecommand{\@csinstar}[2]{%
+ \@ifbothcntrs{#1}{#2}{\@addtoreset{#1}{#2}}}
+\providecommand{\@csin}[2]{%
+ \@ifbothcntrs{#1}{#2}{\@addtoreset{#1}{#2}%
+ \@namedef{the#1}{\@nameuse{the#2}.\arabic{#1}}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\counterwithout}
+% \begin{macro}{\counterwithout*}
+% \begin{macro}{\@csoutstar}
+% \begin{macro}{\@csout}
+% Likewise, the command \verb?\counterwithout{ctr}{within}? changes a
+% counter that has been created by \verb?\newcounter{ctr}[within]? to act
+% as though it had been created by \verb?\newcounter{ctr}?. By default it
+% also redefines the \cs{thectr} command so that it just typesets an arabic
+% numeral. The starred version of the command suppresses the redefinition
+% of \cs{thectr}.
+% \changes{v1.618}{2005/09/03}{Deleted chngctr from \cs{@csoutstar} (mempatch v3.4)}
+% \changes{v3.7g}{2018/03/09}{As of TeXLive 2018 \cs{counterwithin}
+% and \cs{counterwithout} will be moved into the kernel. We therefore
+% change to using \cs{providecommand} instead of \cs{newcommand} to
+% avoid colisions}
+% \begin{macrocode}
+\providecommand{\counterwithout}{\@ifstar{\@csoutstar}{\@csout}}
+\providecommand{\@csoutstar}[2]{%
+ \@ifbothcntrs{#1}{#2}{\@removefromreset{#1}{#2}}}
+\providecommand{\@csout}[2]{%
+ \@ifbothcntrs{#1}{#2}{\@removefromreset{#1}{#2}%
+ \@namedef{the#1}{\arabic{#1}}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Any number of \verb?\counterwithin{ctr}{...}? and \verb?\counterwithout{ctr}{...}?
+% commands can be issued for a given counter, ctr, if you wish to toggle
+% between the two styles. The current value of ctr is unaffected by
+% \cs{counterwithin} and \cs{counterwithout}. If you want to change the value
+% after one of these commands, use \verb?\setcounter{ctr}{...}?, and to change
+% the typeseting style use \verb?\renewcommand{\thectr}{...}?.
+%
+%
+% \begin{macro}{\letcountercounter}
+% \begin{macro}{\c@m@morig@ctr}
+% \begin{macro}{\unletcounter}
+% At times it is handy to `let' one counter act as if it was a
+% different counter. Say you have two constructions, each with their
+% own counter A and B, now you want them to cooperate, counting in
+% unison. This can be done using the \verb?\letcountercounter?.
+%
+% \medskip
+%
+% \cs{letcountercounter}\marg{counterA}\marg{counterB} \cs{let}s
+% (make the same) \meta{counterA} to \meta{counterB}. The
+% original of \meta{counterA} is kept in \cs{c@m@morig@ctr}\meta{counterA}.
+%
+% \cs{unletcounter}\marg{counterA} restores \meta{counterA} to its un\cs{let}
+% condition.
+%
+% The code is based on Donald Arseneau's `Re: \cs{let}, \cs{csname} and
+% \cs{endcsname}', CTT, 2004/12/08. The long version, where \cs{xp}
+% is actually \cs{expandafter} is along the lines of:
+% \begin{verbatim}
+% \xp\xp\xp\let\xp\csname\xp c@#1\xp\endcsname\csname c@#2\endcsname
+% \end{verbatim}
+% which employs 6 \cs{expandafter}s. DA's version uses only 2. The technique
+% can be applied to other kinds of \cs{let}s.
+%
+% \begin{macrocode}
+\newcommand*{\letcountercounter}[2]{%
+ \expandafter\let\csname c@m@morig@ctr#1\expandafter\endcsname%
+ \csname c@#1\endcsname
+ \expandafter\let\csname c@#1\expandafter\endcsname%
+ \csname c@#2\endcsname}
+\newcommand*{\unletcounter}[1]{%
+ \expandafter\let\csname c@#1\expandafter\endcsname%
+ \csname c@m@morig@ctr#1\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Odd/even page checking}
+%
+% It is difficult to check robustly if the current page is odd or even.
+% This code, which is based on the \Lpack{chngpage} package~\cite{CHNGPAGE},
+% provides a method that has proved (so far) to be robust.
+% It works by writing out a label and on the next LaTeX run checks
+% the page reference for the label.
+%
+% \begin{macro}{\ifoddpage}
+% \begin{macro}{\oddpagetrue}
+% \begin{macro}{\oddpagefalse}
+% \begin{macro}{\ifstrictpagecheck}
+% \begin{macro}{\strictpagechecktrue}
+% \begin{macro}{\strictpagecheckfalse}
+% \begin{macro}{\strictpagecheck}
+% \begin{macro}{\easypagecheck}
+% The boolean \cs{ifoddpage} is TRUE if the checked page is odd. The
+% boolean \cs{ifstrictpagecheck} is for turning on (TRUE) and off (FALSE)
+% the strictest method of page checking.
+% \changes{v1.61803}{2008/01/30}{Added \cs{strictpagecheck} and \cs{easypagecheck}}
+% \begin{macrocode}
+\newif\ifoddpage
+\newif\ifstrictpagecheck
+ \strictpagecheckfalse
+\newcommand*{\strictpagecheck}{\strictpagechecktrue}
+\newcommand*{\easypagecheck}{\strictpagecheckfalse}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@cp@cntr}
+% \begin{macro}{\cplabel}
+% The counter \verb?cp@cntr? is used to make unique labels, which start
+% with \cs{cplabel}.
+% \begin{macrocode}
+\newcounter{cp@cntr}
+\newcommand{\cplabel}{^_}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\checkoddpage}
+% This is the user level command to check for odd/even page. It does
+% a robust check for \cs{strictpagecheck} otherwise the simple minded
+% check. It sets \cs{ifoddpage} to TRUE if the page is odd, otherwise
+% it sets it to FALSE.
+%
+% This is now fixed so that it should work for non-arabic page numbering.
+% It uses a new label/pageref variant based on the page counter value, not
+% its printed representation. This also gets rid of worrying about hyperref!!
+% The problem was discovered by Bastiaan Niels Veelo
+%
+% \changes{v1.4}{2003/11/22}{Complete rewrite of odd page checking
+% (from patch v1.6)}
+% \begin{macrocode}
+\DeclareRobustCommand{\checkoddpage}{%
+ \oddpagefalse%
+ \ifstrictpagecheck%
+ \stepcounter{cp@cntr}\pmemlabel{\cplabel\thecp@cntr}%
+ \@memcnta=\pmemlabelref{\cplabel\thecp@cntr}\relax
+ \ifodd\@memcnta\oddpagetrue\fi
+ \else
+ \ifodd\c@page\oddpagetrue\fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\thepmemc@@page}
+% The value of the page counter.
+% \begin{macrocode}
+\gdef\thepmemc@@page{\the\c@page}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pmemprotected@write}
+% \cs{pmemprotected@write} is a modified version of the kernel's
+% \cs{protected@write}.
+%
+% This version of the macro was provided by Romano Giannetti
+% (\url{romano@dea.icai.upco.es}) on 15 July 2003.
+% \begin{macrocode}
+\long\def\pmemprotected@write#1#2#3{%
+ \begingroup
+ \let\thepmemc@@page\relax
+ #2%
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\write#1{#3}}%
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pmemlabel}
+% A version of \cs{label} that uses \cs{pmemprotected@write}.
+% \begin{macrocode}
+\newcommand{\pmemlabel}[1]{\@bsphack
+ \pmemprotected@write\@auxout{}%
+ {\string\newpmemlabel{#1}{\thepmemc@@page}}%
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newpmemlabel}
+% \begin{macro}{\pmemlabelref}
+% We have to be able to cope with a particular label
+% not (yet) being in the the \file{.aux} file when we come to check
+% the page number.
+% \begin{macrocode}
+\newcommand{\newpmemlabel}[2]{{\global\@namedef{m@#1}{#2}}}
+\newcommand{\pmemlabelref}[1]{%
+ \expandafter\ifx\csname m@#1\endcsname\relax
+ 0%
+ \else
+ \csname m@#1\endcsname
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Checking for empty arguments}
+%
+% Like page checking, testing for an empty macro argument is more
+% difficult than it might appear at first sight.
+%
+% The following code is from the \Lpack{ifmtarg} package~\cite{IFMTARG}.
+%
+% \begin{macro}{\@ifmtarg}
+% \begin{macro}{\@ifnotmtarg}
+% \cs{@ifmtarg}\marg{arg}\marg{code when empty}\marg{code when arg not empty} \\
+% \cs{@ifnotmtarg}\marg{arg}\marg{code when arg not empty} \\
+% \begin{macrocode}
+\begingroup
+\catcode`\Q=3
+\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}
+\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}
+\long\gdef\@ifnotmtarg#1{\@xifmtarg#1QQ\@firstofone\@gobble\@nil}
+\endgroup
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Some example uses:
+% \begin{verbatim}
+% \newcommand{\isempty}[1]{%
+% \@ifmtarg{#1}{\typeout{YES}}{\typeout{NO}}}
+% \newcommand{\isnotempty}[1]{%
+% \@ifnotmtarg{#1}{\typeout{YES}}}
+%
+% \isempty{} -> YES \isnotempty{} ->
+% \isempty{ } -> YES \isnotempty{ } ->
+% \isempty{A} -> NO \isnotempty{A} -> YES
+% \isempty{ A } -> NO \isnotempty{ A } -> YES
+% \end{verbatim}
+%
+%
+% \subsection{Changing the page layout in the document}
+%
+% You should not do this, but\ldots
+%
+% The following code is essentially from the \Lpack{chngpage}
+% package~\cite{CHNGPAGE}.
+%
+% \begin{macro}{\ch@ngetext}
+% This macro sets the page output parameters.
+% \begin{macrocode}
+\DeclareRobustCommand{\ch@ngetext}{%
+ \setlength{\@colht}{\textheight}\setlength{\@colroom}{\textheight}%
+ \setlength{\vsize}{\textheight}\setlength{\columnwidth}{\textwidth}%
+ \if@twocolumn%
+ \advance\columnwidth-\columnsep \divide\columnwidth\tw@%
+ \@firstcolumntrue%
+ \fi%
+ \setlength{\hsize}{\columnwidth}%
+ \setlength{\linewidth}{\hsize}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\changetext}
+% \cs{changetext}\marg{H}\marg{W}\marg{E}\marg{O}\marg{G}
+% adds the given lengths to 5 main bits of the page layout. An empty
+% argument means `no change'.
+% \begin{macrocode}
+\DeclareRobustCommand{\changetext}[5]{%
+ \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}%
+ \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}%
+ \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}%
+ \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}%
+ \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}%
+ \ch@ngetext}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Any given change lasts until another \cs{changetext} command is given.
+% A \cs{changetext} command should only be issued between two paragraphs.
+%
+% \cs{changetext} should not be used by anyone unless they really
+% know what they are doing. If you really know what you are doing
+% then you should know enough not to use it.
+%
+% \begin{macro}{\changepage}
+% Change the page layout, but DON'T.
+% \changes{v1.61803}{2008/01/30}{Added \cs{changepage} to match chngpage.sty}
+% \begin{macrocode}
+\DeclareRobustCommand{\changepage}[9]{%
+ \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}%
+ \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}%
+ \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}%
+ \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}%
+ \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}%
+ \ch@ngetext
+ \@ifmtarg{#6}{}{\addtolength{\topmargin}{#6}}%
+ \@ifmtarg{#7}{}{\addtolength{\headheight}{#7}}%
+ \@ifmtarg{#8}{}{\addtolength{\headsep}{#8}}%
+ \@ifmtarg{#9}{}{\addtolength{\footskip}{#9}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Temporarily changing the text width}
+%
+%
+% \begin{environment}{adjustwidth}
+% \begin{environment}{adjustwidth*}
+% \verb?\begin{adjustwidth}?\marg{left}\marg{right}
+% adds the given lengths to the left and right hand margins. A positive
+% value will shorten the text and a negative value will widen it. The
+% starred version of the environment will cause the
+% margin changes to switch between odd and even pages.
+%
+% This code is based on the \Lpack{chngpage} package.
+% \changes{v0.2}{2001/06/03}{Replaced optional arg of adjustwidth by adjustwidth*}
+% \begin{macrocode}
+\newenvironment{adjustwidth}[2]{%
+ \begin{list}{}{%
+ \topsep\z@%
+ \listparindent\parindent%
+ \parsep\parskip%
+ \@ifmtarg{#1}{\setlength{\leftmargin}{\z@}}%
+ {\setlength{\leftmargin}{#1}}%
+ \@ifmtarg{#2}{\setlength{\rightmargin}{\z@}}%
+ {\setlength{\rightmargin}{#2}}%
+ }
+ \item[]}{\end{list}}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newenvironment{adjustwidth*}[2]{%
+ \begin{list}{}{%
+ \topsep\z@%
+ \listparindent\parindent%
+ \parsep\parskip%
+ \checkoddpage
+ \ifoddpage % odd numbered page
+ \@ifmtarg{#1}{\setlength{\leftmargin}{\z@}}%
+ {\setlength{\leftmargin}{#1}}%
+ \@ifmtarg{#2}{\setlength{\rightmargin}{\z@}}%
+ {\setlength{\rightmargin}{#2}}%
+ \else % even numbered page
+ \@ifmtarg{#2}{\setlength{\leftmargin}{\z@}}%
+ {\setlength{\leftmargin}{#2}}%
+ \@ifmtarg{#1}{\setlength{\rightmargin}{\z@}}%
+ {\setlength{\rightmargin}{#1}}%
+ \fi
+ }
+ \item[]}{\end{list}}
+
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% The environments only work for complete paragraphs.
+%
+% \subsection{Centering text}
+%
+% \begin{macro}{\calccentering}
+% This macro calculates the amount to be added to the spine margin
+% (and subtracted from the foredge margin)
+% in order to center the textblock. Call as \\
+% \verb?\calccentering{\length}? and it sets \cs{length}
+% to the required value. Then use as \\
+% \verb?\begin{adjustwidth*}{\length}{-\length}...?
+% \begin{macrocode}
+\newcommand{\calccentering}[1]{
+ #1 = \paperwidth
+ \advance #1 by -\textwidth
+ \divide #1 by \tw@
+ \advance #1 by -\spinemargin}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{vplace}
+% \verb?\begin{vplace}?\oarg{decimal number} centers its body vertically. The
+% optional argument \meta{decimal number} increases ($>1.0$) or decreases
+% ($<1.0$) the space above the body with respect to the space below.
+% This is more robust than the method proposed in the manual.
+% \changes{v1.61803}{2008/01/30}{Added vplace environment (mempatch v4.4)}
+% \changes{v3.6g}{2010/08/27}{Both should be \cs{vspace*}}
+% \begin{macrocode}
+\newenvironment{vplace}[1][1]{%
+ \par\vspace*{\stretch{#1}}%
+}{%
+ \vspace*{\stretch{1}}%
+ \par}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Moving from the current page}
+%
+% Much of this code is taken from the \Lpack{nextpage} package~\cite{NEXTPAGE}.
+%
+% Clear to next page is \cs{clearpage}.
+%
+% \begin{macro}{\cleartoevenpage}
+% \cs{cleartoevenpage}\oarg{text} clears to the next even
+% numbered page,
+% putting the optional \meta{text} on the skipped page, if any.
+% \begin{macrocode}
+\newcommand{\cleartoevenpage}[1][\@empty]{%
+ \clearpage%
+ \ifodd\c@page\hbox{}#1\clearpage\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Move to the next page without flushing floats is \cs{newpage}.
+%
+% \begin{macro}{\movetoevenpage}
+% \cs{movetoevenpage}\oarg{text} moves to the next even
+% numbered page without flushing floats,
+% putting the optional \meta{text} on the skipped page, if any.
+% \begin{macrocode}
+\newcommand{\movetoevenpage}[1][\@empty]{%
+ \newpage%
+ \ifodd\c@page\hbox{}#1\newpage\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Clear to next odd numbered page is \cs{cleardoublepage}.
+%
+% \begin{macro}{\cleartooddpage}
+% \cs{cleartooddpage}\oarg{text} clears to the next odd
+% numbered page,
+% putting the optional \meta{text} on the skipped page, if any.
+% \begin{macrocode}
+\newcommand{\cleartooddpage}[1][\@empty]{%
+ \clearpage%
+ \ifodd\c@page\else\hbox{}#1\clearpage\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\movetooddpage}
+% \cs{movetooddpage}\oarg{text} moves to the next odd
+% numbered page without flushing floats,
+% putting the optional \meta{text} on the skipped page, if any.
+% \begin{macrocode}
+\newcommand{\movetooddpage}[1][\@empty]{%
+ \newpage%
+ \ifodd\c@page\else\hbox{}#1\newpage\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Example uses: \\
+% \begin{verbatim}
+% \cleartooddpage % same as \cleardouble page
+% \cleartooddpage[\thispagestyle{empty}] % No headings on the skipped page
+% \cleartoevenpage % go to next even numbered page
+% Next example puts text on a skipped page
+% \cleartoevenpage[\vspace*{\hfill}THIS PAGE LEFT BLANK\vspace*{\hfill}]
+% \end{verbatim}
+%
+%
+%
+% \subsection{Needing space at the bottom of a page}
+%
+% \begin{macro}{\needspace}
+% \cs{needspace}\marg{length} checks if the is \meta{length} amount
+% of vertical space left on the page. If there is not it will start
+% a new page. The code is a variant of code thought of for the
+% \Lpack{needspace} package~\cite{NEEDSPACE}.
+% \changes{v1.4}{2003/11/16}{Added patch v1.4 versions of needspace macros}
+% \changes{v3.6g}{2010/09/09}{Added a \cs{vskip0pt} at the end to make
+% it work better with \cs{section} and friends}
+% \begin{macrocode}
+\newcommand{\needspace}[1]{\begingroup\setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@\penalty -100\vskip\z@\@plus-\dimen@
+ \vskip\dimen@\penalty 9999\vskip-\dimen@\vskip\z@skip\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Needspace}
+% \begin{macro}{\Needspace*}
+% \cs{Needspace} and \cs{Needspace*} are more robust versions of \cs{needspace},
+% which depends on penalties. If either \cs{needspace} or \cs{Needspace}
+% produce a short page it will be ragged bottom, even if \cs{flushbottom}
+% is in effect. The \cs{Needspace*} version honours the \cs{...bottom}
+% declaration.
+% \begin{macrocode}
+\newcommand{\Needspace}{\@ifstar{\M@sneedsp@}{\M@needsp@}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\M@sneedsp@}
+% \begin{macro}{\M@needsp@}
+% These implement \cs{Needspace*} and \cs{needspace} respectively.
+% \begin{macrocode}
+\newcommand{\M@sneedsp@}[1]{\par \penalty-100\begingroup
+ \setlength{\dimen@}{#1}%
+ \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
+ \ifdim \dimen@>\dimen@ii
+ \break
+ \fi\endgroup}
+\newcommand{\M@needsp@}[1]{\par \penalty-100\begingroup
+ \setlength{\dimen@}{#1}%
+ \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
+ \ifdim \dimen@>\dimen@ii
+ \ifdim \dimen@ii>\z@
+ \vfil
+ \fi
+ \break
+ \fi\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Overlong lines}
+%
+% LaTeX provides \cs{fussy} and \cs{sloppy} to control the amount of slack
+% in a line while trying to make justified lines. Their definitions are:
+% \begin{verbatim}
+% \def\fussy{%
+% \emergencystretch\z@
+% \tolerance 200%
+% \hfuzz .1\p@
+% \vfuzz\hfuzz}
+% \def\sloppy{%
+% \tolerance 9999%
+% \emergencystretch 3em%
+% \hfuzz .5\p@
+% \vfuzz\hfuzz}
+% \end{verbatim}
+%
+% \begin{macro}{\midsloppy}
+% Somewhere between \cs{fussy} and \cs{sloppy}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{midsloppy} and midsloppypar
+% (mempatch v4.5)}
+% \begin{macrocode}
+\newcommand*{\midsloppy}{%
+ \tolerance 5000%
+ \hbadness 4000%
+ \emergencystretch 1.5em%
+ \hfuzz .1\p@
+ \vfuzz\hfuzz}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{midsloppypar}
+% A paragraph form of \cs{midsloppy}; equivalent to \verb?\par \midsloppy ... \par}?
+% \begin{macrocode}
+\newenvironment{midsloppypar}{\par\midsloppy}{\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Text spacing commands}
+%
+% While we're at it, new text spacing commands to supplement
+% the kernel's \\
+% \verb?\, (\thinspace) = 3/18 em?
+% \changes{v1.4}{2003/11/16}{Extra text spacing macros from patch v1.4}
+% \begin{macro}{\medspace}
+% \begin{macro}{\:}
+% Medium space \verb?\: (\medspace) = 4/18 em?
+% \begin{macrocode}
+\newcommand{\medspace}{\kern .22222em }
+\DeclareRobustCommand{\:}{%
+ \relax\ifmmode\mskip\medmuskip\else\medspace\fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\!}
+% Negative thin space (- 3/18 em).
+% Patrik Nyman (private email 2003/10/06) pointed out I had missed
+% the final \verb?\fi? !!!!.
+% \begin{macrocode}
+\DeclareRobustCommand{\!}{%
+ \relax\ifmmode\mskip-\thinmuskip\else\negthinspace\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Fractions and subscripts}
+%
+%
+% Styles for fractions like 3/4.
+%
+% \begin{macro}{\slashfracstyle}
+% \cs{slashfracstyle} based on the kernel \cs{textsuperscript} macro
+% \changes{v1.4}{2003/11/16}{Added \cs{slashfrac} and supports (from patch v1.4)}
+% \begin{macrocode}
+\DeclareRobustCommand*{\slashfracstyle}[1]{%
+ {\m@th\ensuremath{\mbox{\fontsize\sf@size\z@\selectfont #1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\slashfrac}
+% \cs{slashfrac} based on TeXbook exercise 11.6
+% \begin{macrocode}
+\DeclareRobustCommand*{\slashfrac}[2]{\leavevmode
+ \raise.5ex\hbox{\slashfracstyle{#1}}\kern-.13em/%
+ \kern-.15em\lower.25ex\hbox{\slashfracstyle{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\textsubscript}
+% \begin{macro}{\@textsubscript}
+% \cs{textsubscript}, for text subscripts, based on the kernel
+% \cs{textsuperscript} macro.
+% \changes{v1.4}{2003/11/16}{Added \cs{textsubscript} and supports
+% (from patch v1.5)}
+% \changes{v3.7d}{2014/07/28}{\cs{@textsubscript} should be provided,
+% not newcommaded, otherwise one cannot load \Lpack{fixltx2e} before
+% \cs{documentclass}, reported by Ulrike Fischer}
+% \changes{v3.7d}{2015/03/05}{Requested by the LTX3 team as they are
+% updating the LaTeX kernel with the \Lpack{fixltx2e} fixes. Added
+% \cs{@ifundefined} wapper}
+% \begin{macrocode}
+\@ifundefined{textsubscript}{%
+ \DeclareRobustCommand*{\textsubscript}[1]{%
+ \@textsubscript{\selectfont#1}}
+ \providecommand*{\@textsubscript}[1]{%
+ {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
+}{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Numbers to names}
+%
+% \begin{macrocode}
+%%%%%%%%%%%%%%%%%%%% number formatting
+
+% \end{macrocode}
+%
+% The macros here convert an integer number in the range 0--2147483647
+% (TeX's maximum) into
+% the natural language name of the number.
+% \changes{v1.4}{2003/11/16}{Much extended numbers to names (patch v1.2)}
+%
+% \begin{macro}{\iflowernumtoname}
+% A flag for lowercasing the initial letters.
+% \begin{macrocode}
+\newif\iflowernumtoname
+ \lowernumtonamefalse
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifpriornum}
+% \begin{macro}{\ifminusnumber}
+% \begin{macro}{\ifnotnumtonameallcaps}
+% \begin{macro}{\ifmakeordinal}
+% Some new booleans
+% \begin{macrocode}
+\newif\ifpriornum
+\newif\ifminusnumber
+\newif\ifnotnumtonameallcaps
+\newif\ifmakeordinal
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\namenumberand}
+% \begin{macro}{\namenumbercomma}
+% \begin{macro}{\lcminusname}
+% \begin{macro}{\ucminusname}
+% \begin{macro}{\minusname}
+% Some macros representing characters/words for number formatting.
+% \begin{macrocode}
+\newcommand*{\namenumberand}{ and }
+\newcommand*{\namenumbercomma}{, }
+\newcommand*{\lcminusname}{minus }
+\newcommand*{\ucminusname}{Minus }
+\let\minusname\lcminusname
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fnumbersep}
+% \begin{macro}{\tensunitsep}
+% \begin{macro}{\nthstring}
+% \begin{macro}{\iststring}
+% \begin{macro}{\iindstring}
+% \begin{macro}{\iiirdstring}
+% \begin{macro}{\tiethstring}
+% \begin{macro}{\teenstring}
+% More characters/words for formatting
+% \begin{macrocode}
+\newcommand*{\fnumbersep}{,}
+\newcommand*\tensunitsep{-}
+\newcommand*{\nthstring}{th} % nth
+\newcommand*{\iststring}{st} % 1st
+\newcommand*{\iindstring}{nd} % 2nd
+\newcommand*{\iiirdstring}{rd} % 3rd
+\newcommand*{\tiethstring}{tieth} % tieth
+\newcommand*{\teenstring}{teen} % teen
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ordscript}
+% How to format the ordinal string
+% \begin{macrocode}
+\newcommand{\ordscript}[1]{#1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\m@mten}
+% An internal shorthand for 10
+% \begin{macrocode}
+\chardef\m@mten=10 % shorthand for 10
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@ism@mctr}
+% \begin{macro}{\c@xsm@mctr}
+% \begin{macro}{\c@csm@mctr}
+% \begin{macro}{\c@ksm@mctr}
+% \begin{macro}{\c@xksm@mctr}
+% Counters for digits (units to ten thousands) in a number
+% \begin{macrocode}
+\newcounter{ism@mctr} % units
+\newcounter{xsm@mctr} % tens
+\newcounter{csm@mctr} % hundreds
+\newcounter{ksm@mctr} % thousands
+\newcounter{xksm@mctr} % ten thousands
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@cksm@mctr}
+% \begin{macro}{\c@msm@mctr}
+% \begin{macro}{\c@xmsm@mctr}
+% \begin{macro}{\c@cmsm@mctr}
+% \begin{macro}{\c@bsm@mctr}
+% Counters for digits (hundred thousands to billions) in a number
+% \begin{macrocode}
+\newcounter{cksm@mctr} % hundred thousands
+\newcounter{msm@mctr} % millions
+\newcounter{xmsm@mctr} % ten millions
+\newcounter{cmsm@mctr} % hundred millions
+\newcounter{bsm@mctr} % billions
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@workm@mctr}
+% A `work' counter.
+% \begin{macrocode}
+\newcounter{workm@mctr}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\numdigits}
+% \cs{numdigits}\marg{number} splits the \meta{number} into individual digits.
+% It sets \cs{minusnumbertrue} if the number is negative, otherwise it is false.
+% \begin{macrocode}
+\newcommand*{\numdigits}[1]{%
+ \setcounter{ism@mctr}{0}%
+ \setcounter{xsm@mctr}{0}%
+ \setcounter{csm@mctr}{0}%
+ \setcounter{ksm@mctr}{0}%
+ \setcounter{xksm@mctr}{0}%
+ \setcounter{cksm@mctr}{0}%
+ \setcounter{msm@mctr}{0}%
+ \setcounter{xmsm@mctr}{0}%
+ \setcounter{cmsm@mctr}{0}%
+ \setcounter{bsm@mctr}{0}%
+ \setcounter{workm@mctr}{#1}%
+ \minusnumberfalse
+ \ifnum \c@workm@mctr < \z@ % negative
+ \minusnumbertrue
+ \c@workm@mctr = -\c@workm@mctr
+ \fi
+ \ifnum \c@workm@mctr > \m@ne % units
+ \c@ism@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@ism@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % tens
+ \c@xsm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@xsm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % hundreds
+ \c@csm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@csm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % thousands
+ \c@ksm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@ksm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % ten thousands
+ \c@xksm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@xksm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % hundred thousands
+ \c@cksm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@cksm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % millions
+ \c@msm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@msm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % ten millions
+ \c@xmsm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@xmsm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@ % hundred millions
+ \c@cmsm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@cmsm@mctr by -\c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \fi
+ \ifnum \c@workm@mctr > \z@% billions
+ \c@bsm@mctr = \c@workm@mctr
+ \divide \c@workm@mctr by \m@mten
+ \multiply \c@workm@mctr by \m@mten
+ \advance \c@bsm@mctr by -\c@workm@mctr
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\form@tnumber}
+% \cs{form@tnumber}\marg{number} formats \meta{number} as digits.
+% \begin{macrocode}
+\newcommand*{\form@tnumber}[1]{%
+ \numdigits{#1}%
+ \ifminusnumber-\fi
+ \priornumfalse
+ \ifnum \c@bsm@mctr > \z@ % billions
+ \priornumtrue
+ \thebsm@mctr\fnumbersep
+ \fi
+ \ifpriornum % hundred millions
+ \thecmsm@mctr
+ \else
+ \ifnum \c@cmsm@mctr > \z@
+ \priornumtrue
+ \thecmsm@mctr
+ \fi
+ \fi
+ \ifpriornum % ten millions
+ \thexmsm@mctr
+ \else
+ \ifnum \c@xmsm@mctr > \z@
+ \priornumtrue
+ \thexmsm@mctr
+ \fi
+ \fi
+ \ifpriornum % millions
+ \themsm@mctr\fnumbersep
+ \else
+ \ifnum \c@msm@mctr > \z@
+ \priornumtrue
+ \themsm@mctr\fnumbersep
+ \fi
+ \fi
+ \ifpriornum % hundred thousands
+ \thecksm@mctr
+ \else
+ \ifnum \c@cksm@mctr > \z@
+ \priornumtrue
+ \thecksm@mctr
+ \fi
+ \fi
+ \ifpriornum % ten thousands
+ \thexksm@mctr
+ \else
+ \ifnum \c@xksm@mctr > \z@
+ \priornumtrue
+ \thexksm@mctr
+ \fi
+ \fi
+ \ifpriornum % thousands
+ \theksm@mctr\fnumbersep
+ \else
+ \ifnum \c@ksm@mctr > \z@
+ \priornumtrue
+ \theksm@mctr\fnumbersep
+ \fi
+ \fi
+ \ifpriornum % hundreds
+ \thecsm@mctr
+ \else
+ \ifnum \c@csm@mctr > \z@
+ \priornumtrue
+ \thecsm@mctr
+ \fi
+ \fi
+ \ifpriornum % tens
+ \thexsm@mctr
+ \else
+ \ifnum \c@xsm@mctr > \z@
+ \priornumtrue
+ \thexsm@mctr
+ \fi
+ \fi
+ \theism@mctr} % units
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cardinal}
+% \cs{cardinal}\marg{number} prints \meta{number} unformatted.
+% \begin{macrocode}
+\newcommand*{\cardinal}[1]{%
+ \begingroup
+ \let\fnumbersep\relax
+ \form@tnumber{#1}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fcardinal}
+% \cs{fcardinal}\marg{number} prints \meta{number} formatted.
+% \begin{macrocode}
+\newcommand*{\fcardinal}[1]{%
+ \begingroup
+ \form@tnumber{#1}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ordinal}
+% \cs{ordinal}\marg{number} prints \meta{number} as an unformatted ordinal.
+% \begin{macrocode}
+\newcommand*{\ordinal}[1]{%
+ \begingroup
+ \let\fnumbersep\relax
+ \form@tnumber{#1}%
+ \let\ordstring\nthstring
+ \ifnum \c@xsm@mctr=\@ne\else
+ \ifcase \c@ism@mctr
+ \or \let\ordstring\iststring% 1st
+ \or \let\ordstring\iindstring% 2nd
+ \or \let\ordstring\iiirdstring% 3rd
+ \fi
+ \fi
+ \ordscript{\ordstring}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fordinal}
+% \cs{fordinal}\marg{number} prints \meta{number} as a formatted ordinal.
+% \begin{macrocode}
+\newcommand*{\fordinal}[1]{%
+ \begingroup
+ \form@tnumber{#1}%
+ \let\ordstring\nthstring
+ \ifnum \c@xsm@mctr=\@ne\else
+ \ifcase \c@ism@mctr
+ \or \let\ordstring\iststring% 1st
+ \or \let\ordstring\iindstring% 2nd
+ \or \let\ordstring\iiirdstring% 3rd
+ \fi
+ \fi
+ \ordscript{\ordstring}%
+ \endgroup
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The next, tedious, code is for translating numbers into names.
+%
+% \begin{macro}{\nNameo}
+% \begin{macro}{\nNamec}
+% \begin{macro}{\nNamem}
+% \begin{macro}{\nNamemm}
+% \begin{macro}{\nNamemmm}
+% Names of major numbers: $0$, $10^{2}$, $10^{3}$, $10^{6}$, and $10^{9}$.
+% \begin{macrocode}
+\newcommand*\nNameo{\iflowernumtoname z\else Z\fi ero}
+\newcommand*\nNamec{\iflowernumtoname h\else H\fi undred}
+\newcommand*\nNamem{\iflowernumtoname t\else T\fi housand}
+\newcommand*\nNamemm{\iflowernumtoname m\else M\fi illion}
+\newcommand*\nNamemmm{\iflowernumtoname b\else B\fi illion}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamei}
+% \begin{macro}{\nNameii}
+% \begin{macro}{\nNameiii}
+% \begin{macro}{\nNameiv}
+% \begin{macro}{\nNamev}
+% These are the names for numbers 1 to 5.
+% \begin{macrocode}
+\newcommand*\nNamei{\iflowernumtoname o\else O\fi ne}
+\newcommand*\nNameii{\iflowernumtoname t\else T\fi wo}
+\newcommand*\nNameiii{\iflowernumtoname t\else T\fi hree}
+\newcommand*\nNameiv{\iflowernumtoname f\else F\fi our}
+\newcommand*\nNamev{\iflowernumtoname f\else F\fi ive}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamevi}
+% \begin{macro}{\nNamevii}
+% \begin{macro}{\nNameviii}
+% \begin{macro}{\nNameix}
+% \begin{macro}{\nNamex}
+% These are the names for numbers 6 to 10.
+% \begin{macrocode}
+\newcommand*\nNamevi{\iflowernumtoname s\else S\fi ix}
+\newcommand*\nNamevii{\iflowernumtoname s\else S\fi even}
+\newcommand*\nNameviii{\iflowernumtoname e\else E\fi ight}
+\newcommand*\nNameix{\iflowernumtoname n\else N\fi ine}
+\newcommand*\nNamex{\iflowernumtoname t\else T\fi en}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamexi}
+% \begin{macro}{\nNamexii}
+% \begin{macro}{\nNamexiii}
+% \begin{macro}{\nNamexiv}
+% \begin{macro}{\nNamexv}
+% These are the names for numbers 11 to 15.
+% \begin{macrocode}
+\newcommand*\nNamexi{\iflowernumtoname e\else E\fi leven}
+\newcommand*\nNamexii{\iflowernumtoname t\else T\fi welve}
+\newcommand*\nNamexiii{\iflowernumtoname t\else T\fi hir\teenstring}
+\newcommand*\nNamexiv{\iflowernumtoname f\else F\fi our\teenstring}
+\newcommand*\nNamexv{\iflowernumtoname f\else F\fi if\teenstring}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamexvi}
+% \begin{macro}{\nNamexvii}
+% \begin{macro}{\nNamexviii}
+% \begin{macro}{\nNamexix}
+% \begin{macro}{\nNamexx}
+% These are the names for numbers 16 to 20.
+% \begin{macrocode}
+\newcommand*\nNamexvi{\iflowernumtoname s\else S\fi ix\teenstring}
+\newcommand*\nNamexvii{\iflowernumtoname s\else S\fi even\teenstring}
+\newcommand*\nNamexviii{\iflowernumtoname e\else E\fi igh\teenstring}
+\newcommand*\nNamexix{\iflowernumtoname n\else N\fi ine\teenstring}
+\newcommand*\nNamexx{\iflowernumtoname t\else T\fi wenty}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamexxx}
+% \begin{macro}{\nNamexl}
+% \begin{macro}{\nNamel}
+% \begin{macro}{\nNamelx}
+% \begin{macro}{\nNamelxx}
+% These are the names for numbers 30 to 70.
+% \begin{macrocode}
+\newcommand*\nNamexxx{\iflowernumtoname t\else T\fi hirty}
+\newcommand*\nNamexl{\iflowernumtoname f\else F\fi orty}
+\newcommand*\nNamel{\iflowernumtoname f\else F\fi ifty}
+\newcommand*\nNamelx{\iflowernumtoname s\else S\fi ixty}
+\newcommand*\nNamelxx{\iflowernumtoname s\else S\fi eventy}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nNamelxxx}
+% \begin{macro}{\nNamexc}
+% These are the names for numbers 80 to 90.
+% \begin{macrocode}
+\newcommand*\nNamelxxx{\iflowernumtoname e\else E\fi ighty}
+\newcommand*\nNamexc{\iflowernumtoname n\else N\fi inety}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\unitnumbername}
+% Get the name of a unit (0 -- 9).
+% \begin{macrocode}
+\newcommand*{\unitnumbername}[1]{%
+ \ifcase #1 \nNameo\or
+ \nNamei\or
+ \nNameii\or
+ \nNameiii\or
+ \nNameiv\or
+ \nNamev\or
+ \nNamevi\or
+ \nNamevii\or
+ \nNameviii\or
+ \nNameix\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\teennumbername}
+% Get the name of a 'teen number (10 -- 19)
+% \begin{macrocode}
+\newcommand*{\teennumbername}[1]{%
+ \ifcase #1 \nNamex\or
+ \nNamexi\or
+ \nNamexii\or
+ \nNamexiii\or
+ \nNamexiv\or
+ \nNamexv\or
+ \nNamexvi\or
+ \nNamexvii\or
+ \nNamexviii\or
+ \nNamexix\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tensnumbername}
+% Get the name of a tens number (20 -- 90)
+% \begin{macrocode}
+\newcommand*{\tensnumbername}[2]{%
+ \ifnum #1=\@ne
+ \teennumbername{#2}\ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \else
+ \ifcase #1
+ \or
+ \or \nNamexx
+ \or \nNamexxx
+ \or \nNamexl
+ \or \nNamel
+ \or \nNamelx
+ \or \nNamelxx
+ \or \nNamelxxx
+ \or \nNamexc
+ \fi
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \ifnum #2 > \z@ \tensunitsep\unitnumbername{#2}\fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Names of small ordinals. The use of \cs{nthstring} instead of `th' saves
+% some tokens.
+% \begin{macrocode}
+\newcommand*\nthNameo{\nNameo\nthstring}
+\newcommand*\nthNamei{\iflowernumtoname f\else F\fi irst}
+\newcommand*\nthNameii{\iflowernumtoname s\else S\fi econd}
+\newcommand*\nthNameiii{\iflowernumtoname t\else T\fi hird}
+\newcommand*\nthNameiv{\nNameiv\nthstring}
+\newcommand*\nthNamev{\iflowernumtoname f\else F\fi if\nthstring}
+\newcommand*\nthNamevi{\nNamevi\nthstring}
+\newcommand*\nthNamevii{\nNamevii\nthstring}
+\newcommand*\nthNameviii{\iflowernumtoname e\else E\fi igh\nthstring}
+\newcommand*\nthNameix{\iflowernumtoname n\else N\fi in\nthstring}
+\newcommand*\nthNamexii{\iflowernumtoname t\else T\fi welf\nthstring}
+
+% \end{macrocode}
+%
+% \begin{macro}{\unitordinalname}
+% Get the ordinal name of a unit (0 -- 9)
+% \begin{macrocode}
+\newcommand*{\unitordinalname}[1]{%
+ \ifcase #1 \nthNameo\or
+ \nthNamei\or
+ \nthNameii\or
+ \nthNameiii\or
+ \nthNameiv\or
+ \nthNamev\or
+ \nthNamevi\or
+ \nthNamevii\or
+ \nthNameviii\or
+ \nthNameix\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\teenordinalname}
+% Get the ordinal name of a 'teen number (10 -- 19). Using \cs{nthstring}
+% instead of `th' to save some tokens.
+% \begin{macrocode}
+\newcommand*{\teenordinalname}[1]{%
+ \ifcase #1 \nNamex\nthstring\or
+ \nNamexi\nthstring\or
+ \nthNamexii\or
+ \nNamexiii\nthstring\or
+ \nNamexiv\nthstring\or
+ \nNamexv\nthstring\or
+ \nNamexvi\nthstring\or
+ \nNamexvii\nthstring\or
+ \nNamexviii\nthstring\or
+ \nNamexix\nthstring\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tensordinalname}
+% Get the ordinal name of a tens number (20 -- 90)
+% (Mathew Dafilis (\texttt{mpd@swin.edu.au}) sent Email on 2003/11/14
+% saying that \cs{ordinaltoname} didn't work for 20, 30, etc. He was
+% correct. It is now fixed.
+% \begin{macrocode}
+\newcommand*{\tensordinalname}[2]{%
+ \ifnum #1=\@ne
+ \teenordinalname{#2}\ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \else
+ \ifnum #2> \z@
+ \ifcase #1
+ \or
+ \or \nNamexx
+ \or \nNamexxx
+ \or \nNamexl
+ \or \nNamel
+ \or \nNamelx
+ \or \nNamelxx
+ \or \nNamelxxx
+ \or \nNamexc
+ \fi
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \tensunitsep\unitordinalname{#2}
+ \else
+ \ifcase #1
+ \or
+ \or \nthNamexx
+ \or \nthNamexxx
+ \or \nthNamexl
+ \or \nthNamel
+ \or \nthNamelx
+ \or \nthNamelxx
+ \or \nthNamelxxx
+ \or \nthNamexc
+ \fi
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The names of tens ordinals. The use of \cs{tiethstring} instead
+% of `tieth' saves somes tokens.
+% \begin{macrocode}
+\newcommand*\nthNamexx{\iflowernumtoname t\else T\fi wen\tiethstring}
+\newcommand*\nthNamexxx{\iflowernumtoname t\else T\fi hir\tiethstring}
+\newcommand*\nthNamexl{\iflowernumtoname f\else F\fi or\tiethstring}
+\newcommand*\nthNamel{\iflowernumtoname f\else F\fi if\tiethstring}
+\newcommand*\nthNamelx{\iflowernumtoname s\else S\fi ix\tiethstring}
+\newcommand*\nthNamelxx{\iflowernumtoname s\else S\fi even\tiethstring}
+\newcommand*\nthNamelxxx{\iflowernumtoname e\else E\fi igh\tiethstring}
+\newcommand*\nthNamexc{\iflowernumtoname n\else N\fi ine\tiethstring}
+
+% \end{macrocode}
+%
+% \begin{macro}{\n@me@number}
+% \cs{n@me@number}\marg{number} is an internal macro to convert a
+% \meta{number} to names.
+% \begin{macrocode}
+\newcommand*{\n@me@number}[1]{%
+\begingroup
+ \numdigits{#1}%
+ \ifminusnumber\minusname\fi
+ \priornumfalse
+%% billions
+ \ifnum \c@bsm@mctr > \z@
+ \unitnumbername{\thebsm@mctr}\space
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi\nNamemmm
+ \priornumtrue
+ \fi
+%% hundred millions
+ \ifnum \c@cmsm@mctr > \z@
+ \ifpriornum\namenumbercomma\fi
+ \unitnumbername{\thecmsm@mctr}\space
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi\nNamec
+ \priornumtrue
+ \fi
+%% tens/units millions
+ \ifnum \c@xmsm@mctr > \z@
+ \ifpriornum
+ \ifnum\c@cmsm@mctr>\z@\namenumberand\else\namenumbercomma\fi
+ \fi
+ \tensnumbername{\thexmsm@mctr}{\themsm@mctr}%
+ \priornumtrue
+ \else
+ \ifnum \c@msm@mctr > \z@
+ \ifpriornum
+ \ifnum\c@cmsm@mctr>\z@\namenumberand\else\namenumbercomma\fi
+ \fi
+ \unitnumbername{\themsm@mctr}%
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \priornumtrue
+ \fi
+ \fi
+ \ifnum \c@cmsm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamemm
+ \else
+ \ifnum \c@xmsm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamemm
+ \else
+ \ifnum \c@msm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamemm
+ \fi
+ \fi
+ \fi
+%% hundred thousands
+ \ifnum \c@cksm@mctr > \z@
+ \ifpriornum\namenumbercomma\fi
+ \unitnumbername{\thecksm@mctr}\space
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi\nNamec
+ \priornumtrue
+ \fi
+%% tens/units thousands
+ \ifnum \c@xksm@mctr > \z@
+ \ifpriornum
+ \ifnum\c@cksm@mctr>\z@\namenumberand\else\namenumbercomma\fi
+ \fi
+ \tensnumbername{\thexksm@mctr}{\theksm@mctr}%
+ \priornumtrue
+ \else
+ \ifnum \c@ksm@mctr > \z@
+ \ifpriornum
+ \ifnum\c@cksm@mctr>\z@\namenumberand\else\namenumbercomma\fi
+ \fi
+ \unitnumbername{\theksm@mctr}%
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi
+ \priornumtrue
+ \fi
+ \fi
+ \ifnum \c@cksm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamem
+ \else
+ \ifnum \c@xksm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamem
+ \else
+ \ifnum \c@ksm@mctr > \z@
+ \ifpriornum\space\fi
+ \nNamem
+ \fi
+ \fi
+ \fi
+%% hundreds
+ \ifnum \c@csm@mctr > \z@
+ \ifpriornum\namenumbercomma\fi
+ \unitnumbername{\thecsm@mctr}\space
+ \ifnotnumtonameallcaps\lowernumtonametrue\fi\nNamec
+ \priornumtrue
+ \fi
+%% tens/units
+ \ifmakeordinal
+ \ifnum \c@xsm@mctr > \z@
+ \ifpriornum\namenumberand\fi
+ \tensordinalname{\thexsm@mctr}{\theism@mctr}%
+ \else
+ \ifnum \c@ism@mctr > \z@
+ \ifpriornum\namenumberand\fi
+ \unitordinalname{\theism@mctr}%
+ \else
+ \ifpriornum\nthstring\else\unitordinalname{\theism@mctr}\fi
+ \fi
+ \fi
+ \else % not ordinal
+ \ifnum \c@xsm@mctr > \z@
+ \ifpriornum\namenumberand\fi
+ \tensnumbername{\thexsm@mctr}{\theism@mctr}%
+ \else
+ \ifnum \c@ism@mctr > \z@
+ \ifpriornum\namenumberand\fi
+ \unitnumbername{\theism@mctr}%
+ \else
+ \ifpriornum\else\unitnumbername{\theism@mctr}\fi
+ \fi
+ \fi
+ \fi % end ifmakeordinal
+\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.61803}{2008/01/30}{Made all \cs{(num/ordinal)toname} robust}
+% \begin{macro}{\numtoname}
+% Lowercase all names
+% \begin{macrocode}
+\DeclareRobustCommand{\numtoname}[1]{%
+ \makeordinalfalse
+ \notnumtonameallcapstrue%
+ \lowernumtonametrue%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\numtoName}
+% Uppercase first letter of first name (all else lowercase).
+% \begin{macrocode}
+\DeclareRobustCommand{\numtoName}[1]{%
+ \makeordinalfalse
+ \notnumtonameallcapstrue%
+ \lowernumtonamefalse%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NumToName}
+% Uppercase first letter of all names (all else lowercase).
+% \begin{macrocode}
+\DeclareRobustCommand{\NumToName}[1]{%
+ \makeordinalfalse
+ \notnumtonameallcapsfalse%
+ \lowernumtonamefalse%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ordinaltoname}
+% Lowercase all ordinal names
+% \begin{macrocode}
+\DeclareRobustCommand{\ordinaltoname}[1]{%
+ \makeordinaltrue
+ \notnumtonameallcapstrue%
+ \lowernumtonametrue%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ordinaltoName}
+% Uppercase first letter of first ordinal name (all else lowercase).
+% \begin{macrocode}
+\DeclareRobustCommand{\ordinaltoName}[1]{%
+ \makeordinaltrue
+ \notnumtonameallcapstrue%
+ \lowernumtonamefalse%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\OrdinalToName}
+% Uppercase first letter of all ordinal names (all else lowercase).
+% \begin{macrocode}
+\DeclareRobustCommand{\OrdinalToName}[1]{%
+ \makeordinaltrue
+ \notnumtonameallcapsfalse%
+ \lowernumtonamefalse%
+ \n@me@number{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{A fix for two column headings}
+%
+%
+% This is from a posting by Donald Arseneau to \ctt{} on 23 April 2001 to fix
+% a problem --- `When I use \verb?\onecolumn\chapter...? its headline
+% is printed lower on the page than for two-column chapters'
+%
+% DA and I had previously discussed this in relation to the Index
+% and I had put a hack into the \Lpack{tocbibind} package to fix the Index.
+%
+% Donald posted the following.
+%
+% \cs{vspace*} gives bad spacing after a pagebreak and \cs{@makechapterhead}
+% starts with \cs{vspace*}.
+% The biggest problem is the definition of \cs{@topnewpage}, which is used
+% for the two-column spanning text. Here is a redefinition:
+% \changes{v0.2}{2001/06/03}{Added DA's redefinition of \cs{@topnewpage}}
+% \begin{macro}{\@topnewpage}
+% \begin{macrocode}
+\long\def \@topnewpage [#1]{%
+ \@nodocument
+ \@next\@currbox\@freelist{}{}%
+ \global \setbox\@currbox
+ \vbox {%
+ \break
+ \prevdepth\z@
+ \begingroup
+ \normalcolor
+ \hsize\textwidth
+ \@parboxrestore
+ \col@number \@ne
+ #1%
+ \vskip -\dbltextfloatsep
+ \endgroup
+ \null % ordinary \baselineskip
+ \vskip -\topskip
+ }%
+ \begingroup %% \showbox\@currbox
+ \splitmaxdepth\maxdepth \splittopskip\topskip
+ \setbox\@tempboxa \vsplit\@currbox to \z@
+ \endgroup %% \showbox\@currbox
+ \ifdim \ht\@currbox>\textheight
+ \ht\@currbox \textheight
+ \fi
+ \global \count\@currbox \tw@
+ \@tempdima -\ht\@currbox
+ \advance \@tempdima -\dbltextfloatsep
+ \global \advance \@colht \@tempdima
+ \ifx \@dbltoplist \@empty
+ \else
+ \@latexerr{Float(s) lost}\@ehb
+ \let \@dbltoplist \@empty
+ \fi
+ \@cons \@dbltoplist \@currbox
+ \global \@dbltopnum \m@ne
+ \ifdim \@colht<2.5\baselineskip
+ \@latex@warning@no@line {Optional argument of \noexpand\twocolumn
+ too tall on page \thepage}%
+ \@emptycol
+ \if@firstcolumn
+ \else
+ \@emptycol
+ \fi
+ \else
+ \global \vsize \@colht
+ \global \@colroom \@colht
+ \@floatplacement
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The original version of \cs{@topnewpage} is in \file{ltouput.dtx}, line 159.
+%
+% \subsection{Time of day}
+%
+% William Adams (2006/08/28) supplied a basis for
+% \cs{printime}, which he needed for \cs{quarkmarks} but I have used one
+% from \textit{TeX for the Impatient}
+% as it saves some counters.
+% \changes{v1.61803}{2008/01/30}{Added \cs{printime} and friends (mempatch v4.6)}
+% \begin{macro}{\m@mcalchm}
+% Calculate the hours and minutes from \cs{time}.
+% \begin{macrocode}
+\newcommand*{\m@mcalchm}{%
+ \count0 = \time \divide \count0 by 60\relax
+ \count2 = \count0\relax% the hour
+ \count4 = \time \multiply\count0 by 60\relax
+ \advance\count4 by -\count0\relax% the minute
+ \ifnum\count4<10 \toks1 = {0}% make a leading zero
+ \else \toks1 = {}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hmpunct}
+% \begin{macro}{\amname}
+% \begin{macro}{\pmname}
+% User format controls for \cs{printtime}
+% \begin{macrocode}
+%%% punctuation, am and pm for \printtime
+\newcommand*{\hmpunct}{:}% hours minutes separator
+\newcommand*{\amname}{am}% ante meridiem
+\newcommand*{\pmname}{pm}% post meridiem
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printtime}
+% \begin{macro}{\printtime*}
+% Print the time of day as 24 hour clock or 12 hour clock
+% \cs{printtime} prints the time par 24 hour clock and \cs{printtime*}
+% per 12 hour clock.
+% \begin{macrocode}
+\newcommand*{\printtime}{%
+ \@ifstar{\m@msprtime}{\m@mprtime}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\m@mprtime}
+% \begin{macro}{\m@msprtime}
+% These implement time printing: \cs{m@mprtime} as 24 hour clock and
+% \cs{m@msprtime} as 12 hour clock
+% \begin{macrocode}
+\newcommand*{\m@mprtime}{\begingroup
+ \m@mcalchm
+ \number\count2\hmpunct\the\toks1 \number\count4
+ \endgroup}
+\newcommand*{\m@msprtime}{\begingroup
+ \m@mcalchm
+ \def\@mpm{\pmname}%
+ \ifnum\count2<1\relax% early in the morning
+ \count2=12\relax
+ \ifnum\count4>0\relax% not midnight
+ \def\@mpm{\amname}%
+ \fi
+ \else
+ \ifnum\time<721\relax% noon or earlier
+ \def\@mpm{\amname}%
+ \else
+ \ifnum\time>779\relax% 1300 hrs or later
+ \advance\count2 by -12\relax
+ \fi
+ \fi
+ \fi
+ \number\count2\hmpunct\the\toks1 \number\count4\ \@mpm
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Sequential sheet (page) numbers}
+%
+% \begin{macro}{\c@sheetsequence}
+% Peter Heslin asked for the ability to add a sequential page number
+% (1 for the first page, N for the last page, no matter what value
+% the page counter has) to the trimming marks.
+%
+% \cs{c@sheetsequence} is a new counter for pages starting at the
+% beginning and independent
+% of the standard page counter. This should not be reset by anything.
+% The counter increment has to be added to the output routine.
+%
+% This may also be useful for page N of M numbering.
+% \changes{v1.3}{2002/10/10}{Added sheetsequence counter.}
+% \begin{macrocode}
+\newcounter{sheetsequence}
+ \setcounter{sheetsequence}{1}
+ \renewcommand{\thesheetsequence}{\@arabic\c@sheetsequence}
+\g@addto@macro{\@outputpage}{\stepcounter{sheetsequence}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@lastsheet}
+% \begin{macro}{\c@lastpage}
+% While we're at it, might as well provide for lastpage and lastsheet counters
+% \changes{v1.3}{2002/11/14}{Added lastsheet and lastpage functions.}
+% \begin{macrocode}
+\newcounter{lastsheet}
+ \setcounter{lastsheet}{0}
+\newcounter{lastpage}
+ \setcounter{lastpage}{0}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dol@stsheet}
+% \begin{macro}{\dol@stpage}
+% These two macros write the values of lastsheet and lastpage to the
+% \file{aux} file. They have to be called at the end of the document
+% after a \cs{clearpage} to flush out any floats.
+% \changes{v1.4}{2003/02/27}{In \cs{dol@stpage} use the page counter value,
+% not \cs{thepage} otherwise problems with
+% non-arabic page numbers (patch 1.1)}
+% \changes{v1.61}{2004/03/21}{In \cs{dol@stpage} use the sheet counter value,
+% not \cs{thesheetsequence} otherwise problems
+% if (e.g., hangul.sty) \cs{@arabic} is redefined}
+% \changes{v1.618}{2005/09/02}{Made \cs{dol@stsheet} and \cs{dol@stpage}
+% obey \cs{nofiles}}
+% \changes{v1.61803}{2008/01/30}{Made \cs{dol@stsheet} and \cs{dolastpage}
+% use \cs{memsetcounter} instead of \cs{setcounter}}
+
+% \begin{macrocode}
+\newcommand{\dol@stsheet}{%
+ \if@filesw
+ \addtocounter{sheetsequence}{-1}%
+ \immediate\write\@auxout%
+ {\string\memsetcounter{lastsheet}{\the\c@sheetsequence}}%
+ \stepcounter{sheetsequence}%
+ \fi}
+\newcommand{\dol@stpage}{%
+ \if@filesw
+ \addtocounter{page}{-1}%
+ \immediate\write\@auxout%
+ {\string\memsetcounter{lastpage}{\the\c@page}}%
+ \stepcounter{page}%
+ \fi}
+% \end{macrocode}
+% I originally used this: \\
+% \verb?\AtEndDocument{\clearpage\dol@stsheet\dol@stpage}?
+% but following the CTT thread \textit{AtEndDocument produces unwanted page
+% break}, 2004/03/11, and in particular Dan Luecking's response I now
+% try as hard as possible to do it right at the end, but even this is not
+% 100\% reliable. The only way to ensure reliability is to modify the kernel
+% \verb?\enddocument? which doesn't seem to be a particularly wise thing
+% to do.
+% \changes{v1.61}{2004/03/14}{Changed location of calls to \cs{dol@stsheet}
+% and \cs{dol@stpage}}
+% \begin{macrocode}
+\AtBeginDocument{\AtEndDocument{\clearpage\dol@stsheet\dol@stpage}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Leaves per gathering}
+%
+% Traditionally books are assembled in terms of gatherings, or signatures,
+% with perhaps 8 or 16 pages (or leaves) per grouping (a leaf has two pages,
+% recto and one verso). At the request of Alan Ristow code for this has
+% been included in the class.
+%
+% \begin{macro}{\ifcntrmod}
+% \begin{macro}{\ifnotcntrmod}
+% \begin{macro}{\iscntrmod}
+% \cs{iscntrmod}\marg{counter}\marg{number} returns \cs{cntrmod(true|false)}
+% and \cs{notcntrmod(false|true)} if \meta{counter} is a multiple of
+% \meta{number}.
+% \changes{v1.61803}{2008/01/30}{Added \cs{iscntrmod}}
+% \begin{macrocode}
+\newif\ifcntrmod
+\newif\ifnotcntrmod
+\newcommand*{\iscntrmod}[2]{
+ \@tempcnta=\@nameuse{c@#1}%
+ \@tempcntb=\@tempcnta
+ \divide\@tempcnta #2\relax
+ \multiply\@tempcnta #2\relax
+ \advance\@tempcntb-\@tempcnta
+ \ifnum\@tempcntb=0\relax
+ \cntrmodtrue
+ \notcntrmodfalse
+ \else
+ \cntrmodfalse
+ \notcntrmodtrue
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@memensuresigpages}
+% Ouput enough (empty) pages to make up a complete final signature.
+% \changes{v1.61803}{2008/01/30}{Added \cs{@memensuresigpages}}
+% \begin{macrocode}
+\newcommand*{\@memensuresigpages}{%
+ \ifnum\@mempagespersig<\@ne
+ \else
+ \iscntrmod{sheetsequence}{\@mempagespersig}
+ \ifcntrmod
+ \else
+ \clearpage
+ \pagestyle{empty}
+ \mbox{}
+ \loop
+ \iscntrmod{sheetsequence}{\@mempagespersig}
+ \ifnotcntrmod
+ \clearpage
+ \pagestyle{empty}
+ \mbox{}
+ \repeat
+ \fi
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\leavespergathering}
+% \cs{leavespergathering}\marg{num} is the user command for specifying that
+% there must be \meta{num} leaves per gathering (2\meta{num} pages per
+% gathering). For \meta{num} more than one the total number of pages output
+% is exactly divisible by 2\meta{num}. \meta{num} less than two (the default)
+% has no effect.
+% \changes{v1.61803}{2008/01/30}{Added \cs{leavespergathering}}
+% \begin{macrocode}
+\newcommand*{\leavespergathering}[1]{\@memcnta=#1\relax
+ \ifnum\@memcnta<\tw@
+ \def\@mempagespersig{-1}%
+ \else
+ \multiply\@memcnta \tw@
+ \edef\@mempagespersig{\@memcnta}%
+ \fi}
+\leavespergathering{0}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Finally, make sure that the requested number of pages is output.
+% \begin{macrocode}
+\AtEndDocument{\@memensuresigpages}
+
+% \end{macrocode}
+%
+% \subsection{Text case}
+% \changes{v3.6k}{2012/09/13}{Included a copy of the \texttt{textcase}
+% package.}
+%
+% Since, say, \cs{MakeUppercase} does too much, i.e.\ also upper case
+% math and arguments to, say, \cs{ref}, we provide a version that does
+% not. David Carlisle wrote the simple package ---
+% \Lpack{textcase}~\cite{TEXTCASE} which we simply present as a carbon
+% copy including Davids explanations. We do \emph{not} mark this
+% package as have been emulated. Loading \texttt{textcase} just
+% overwrites the macros if they exist.
+%
+% \MakeShortVerb{\|}
+% \begin{macrocode}
+%%%% Nearly a carbon copy from textcase.dtx by David Carlisle
+% \end{macrocode}
+% \begin{macro}{\@uclcnotmath}
+% This is the main macro from \texttt{textcase}. It is basically
+% a copy of |\MakeUppercase| and |\MakeLowercase|
+% from the \LaTeX\ kernel, modified slightly so that they
+% can share code (that modification could be done to the
+% standard versions as well) and then further changed to
+% skip certain features like math mode and |\label| arguments.
+%
+% The arguments are:\\
+% |#1|: Extra commands to apply for case changing.
+% Used to locally redefine |\i| and |\j| for uppercasing.\\
+% |#2|: Either |##1##2| or |##2##1| to control the order
+% in which |\let| is applied to the pairs of control
+% sequences in |\@uclclist|.\\
+% |#3|: |\uppercase| or |\lowercase|.\\
+% |#4|: The text to be upper (or lower) cased.
+% \begin{macrocode}
+\def\@uclcnotmath#1#2#3#4{\begingroup
+% \end{macrocode}
+% Run extra commands (currently just to redefine |\i| and |\j|).
+% \begin{macrocode}
+ #1%
+% \end{macrocode}
+%
+% Locally set |\( \)| to be just |$ $|, so that the math skipping
+% code can be simplified, just to look for |$|.
+% \begin{macrocode}
+ \def\({$}\let\)\(% $ for emacs :-)
+% \end{macrocode}
+%
+% Set up the `non-math' things that also have to be skipped.
+% \begin{macrocode}
+ \def\NoCaseChange##1{\noexpand\NoCaseChange{\noexpand##1}}%
+ \@nonchangecase\label
+ \@nonchangecase\ref
+ \@nonchangecase\ensuremath
+% \end{macrocode}
+%
+% |\cite| a bit trickier, as we want to uppercase any optional argument.
+% This will fail if the optional argument contains a brace group, but
+% should catch most cases.
+%
+% |text \cite[page 1]{foo} more text| ends up as
+%\begin{verbatim}
+% \uppercase{text \toks@{\cite[page1]}%
+% \the\toks@{foo}%
+% \uppercase{ more text}
+%\end{verbatim}
+% \begin{macrocode}
+ \def\cite##1##{\toks@{\noexpand\cite##1}\@citex}%
+ \def\@citex##1{\NoCaseChange{\the\toks@{##1}}}%
+% \end{macrocode}
+% (|\@citex| is a scratch macro here, not a redefinition of the existing
+% |\@citex|.)
+%
+% The following is essentially taken from |\MakeUppercase|.
+% Recursively execute |\reserved@a| to |\let| the pairs in |\@uclclist|.
+% The strange construction with |\@gobble| at the end just gobbles the
+% final recursive call.
+%
+% Incidentally, packages should not use the |\reserved@|\ldots\ scratch
+% macros, which are `reserved' for use within the \LaTeX\ kernel, but
+% (a) this code is essentially a copy from the kernel, and
+% (b) I'm allowed to break the rules, so there.
+% \begin{macrocode}
+ \def\reserved@a##1##2{\let#2\reserved@a}%
+ \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
+% \end{macrocode}
+%
+% Expand everything first so that the `skipping' code can see what to
+% skip and so that tokens are revealed to |\uppercase|.
+% This makes the argument `moving'.
+% The |$\valign$| is just a fake math expression used to terminate
+% the parsing done by |\@skipmath|.
+% \begin{macrocode}
+ \protected@edef\reserved@a{\endgroup
+ \noexpand\@skipmath#3#4$\valign$}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \reserved@a}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nonchangecase}
+% \begin{macrocode}
+\def\@nonchangecase#1{\def#1##1{\NoCaseChange{#1{##1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NoCaseChange}
+% For hiding arbitrary text from |\uppercase|. This innocuous
+% definition is used for any occurrence of |\NoCaseChange|
+% in text that is not passed to |\MakeTextUppercase|. For example a
+% section heading may be uppercased, but the toc entry may not.
+% It is also used for nested definitions of |\cite| etc, where the
+% |\NoCaseChange| is inserted by expansion, but not removed as it is
+% hidden by the brace group.
+% \begin{macrocode}
+\let\NoCaseChange\@firstofone
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\@skipmath}
+% |#1|: operation |\uppercase| / |\lowercase|\\
+% |#2|: text up to first (next) |$|\\
+% |#3|: first math mode material (or |\valign| sentinel)
+% \begin{macrocode}
+\def\@skipmath#1#2$#3${%
+ \@skip@nonchangecase#1#2\NoCaseChange\valign
+ \ifx\valign#3%
+ \else
+ $#3$%
+ \expandafter\@skipmath\expandafter#1%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\@skip@nonchangecase}
+% |#1|: |\uppercase| or |\lowercase|\\
+% |#2|: Text up to the first command (such as |\cite|) made `safe'.
+% or the first use of |\NoCaseChange|.
+% \begin{macrocode}
+\def\@skip@nonchangecase#1#2\NoCaseChange#3{%
+ #1{#2}%
+ \ifx\valign#3%
+ \else
+ #3%
+ \expandafter\@skip@nonchangecase\expandafter#1%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MakeTextUppercase}
+% Put it all together. Arrange for \i\ and \j\ to uppercase, and
+% to read the pairs in the ucase list `forwards'.
+% \begin{macrocode}
+\DeclareRobustCommand\MakeTextUppercase{%
+ \@uclcnotmath{\def\i{I}\def\j{J}}{##1##2}\uppercase}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\protected@edef\MakeTextUppercase#1{\MakeTextUppercase{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MakeTextLowercase}
+% Use |\lowercase| and read the pairs in the uppercase list `backwards'.
+% \begin{macrocode}
+\DeclareRobustCommand\MakeTextLowercase{%
+ \@uclcnotmath{}{##2##1}\lowercase}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\protected@edef\MakeTextLowercase#1{\MakeTextLowercase{#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%%%% End copy from textcase.dtx
+% \end{macrocode}
+% \DeleteShortVerb{\|}
+%
+%
+% \section{Initialization} \label{sec:init}
+%
+% \subsection{Words and phrases}
+%
+% This document class is for documents prepared in the English language.
+% To prepare a version for another language, various English words
+% and phrases must
+% be replaced. The English elements that require replacement are
+% defined below in command names.
+%
+% \begin{macro}{\abstractname}
+% \begin{macro}{\contentsname}
+% \begin{macro}{\listfigurename}
+% \begin{macro}{\listtablename}
+% \begin{macro}{\bookname}
+% \begin{macro}{\partname}
+% \begin{macro}{\chaptername}
+% \begin{macro}{\appendixname}
+% \begin{macro}{\appendixtocname}
+% \begin{macro}{\appendixpagename}
+% \begin{macro}{\bibname}
+% \begin{macro}{\indexname}
+% \begin{macro}{\glossaryname}
+%
+% This list is for titles of document sections.
+%
+% \begin{macrocode}
+\newcommand*{\abstractname}{Abstract}
+\newcommand*{\contentsname}{Contents}
+\newcommand*{\listfigurename}{List of Figures}
+\newcommand*{\listtablename}{List of Tables}
+\newcommand*{\bookname}{Book}
+\newcommand*{\partname}{Part}
+\newcommand*{\chaptername}{Chapter}
+\newcommand*{\appendixname}{Appendix}
+\newcommand*{\appendixtocname}{Appendices}
+\newcommand*{\appendixpagename}{Appendices}
+\newcommand*{\bibname}{Bibliography}
+\newcommand*{\indexname}{Index}
+\newcommand*{\glossaryname}{Glossary}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\figurename}
+% \begin{macro}{\tablename}
+% \begin{macro}{\figurerefname}
+% \begin{macro}{\tablerefname}
+% \begin{macro}{\pagename}
+% \begin{macro}{\pagrefename}
+%
+% These are the names and phrases used for general elements.
+%
+% \begin{macrocode}
+\newcommand*{\figurename}{Figure}
+\newcommand*{\tablename}{Table}
+\newcommand*{\figurerefname}{Figure}
+\newcommand*{\tablerefname}{Table}
+\newcommand*{\pagename}{page}
+\newcommand*{\pagerefname}{page}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bookrefname}
+% \begin{macro}{\partrefname}
+% \begin{macro}{\chapterrefname}
+% \begin{macro}{\sectionrefname}
+% \begin{macro}{\appendixrefname}
+% More names for referencing.
+% \changes{v1.2}{2002/07/27}{Added \cs{partrefname}, \cs{chapterrefname}
+% and \cs{sectionrefname}}
+% \changes{v1.61803}{2008/01/30}{Added \cs{bookrefname} (mempatch v4.9+)}
+% \changes{v1.61803}{2008/05/17}{Added \cs{appendixrefname}}
+% \begin{macrocode}
+\newcommand*{\bookrefname}{Book~}
+\newcommand*{\partrefname}{Part~}
+\newcommand*{\chapterrefname}{Chapter~}
+\newcommand*{\sectionrefname}{\S}
+\newcommand*{\appendixrefname}{Appendix~}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Date}
+%
+% \begin{macro}{\today}
+% This macro uses the \TeX\ primitives \cs{month}, \cs{day} and \cs{year}
+% to provide the date of the \LaTeX-run.
+% \begin{macrocode}
+\newcommand{\today}{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\day, \number\year}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Two column mode}
+%
+% \begin{macro}{\columnsep}
+% This gives the distance between two columns in two column mode.
+% \begin{macrocode}
+\setlength\columnsep{10\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\columnseprule}
+% This gives the width of the rule between two columns in two
+% column mode. We have no visible rule.
+% \begin{macrocode}
+\setlength\columnseprule{0\p@}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The page style and counters}
+% We use the page style \pstyle{headings} by
+% default and arabic page numbering. But if the \verb?article?
+% class option is in effect, we will use the \pstyle{plain} style
+% which is the default in the \verb?article? class.
+% \changes{v3.6d}{2010/05/13}{When emulating the article class the
+% plain page style should used instead of headings}
+% \begin{macrocode}
+\ifartopt
+\pagestyle{plain}
+\else
+\pagestyle{headings}
+\fi
+\pagenumbering{arabic}
+
+% \end{macrocode}
+% We set the sectional counters to zero, the \verb?tocdepth? to
+% one (sections and above listed), the \verb?secnumdepth? to
+% two (sections and above numbered), and \cs{maxsecnumdepth} to
+% the same.
+% \changes{v1.1a}{2002/04/28}{Added initialisation of \cs{maxsecnumdepth}}
+% \begin{macrocode}
+\setcounter{part}{0}
+\setcounter{chapter}{0}
+\setcounter{tocdepth}{1}
+\setcounter{secnumdepth}{2}
+\maxsecnumdepth{section}
+
+% \end{macrocode}
+%
+% Set the \cs{linenumberfrequency} to zero to prohibit line numbering
+% and also set the font for line numbers. Can now set the final space
+% for boxed verbatim line numbers.
+% \begin{macrocode}
+\linenumberfrequency{0}
+\linenumberfont{\small\rmfamily}
+\settowidth{\bvnumlength}{\vlvnumfont 9999}
+
+% \end{macrocode}
+%
+%
+% \subsection{Single or double sided printing}
+%
+%
+% Unless the \Lopt{twoside} wasn't specified, We do not try to make
+% each page of equal height.
+% \begin{macrocode}
+\if@twoside
+\else
+ \raggedbottom
+\fi
+% \end{macrocode}
+% When the \Lopt{twocolumn} option was specified we call
+% \cs{twocolumn} to activate this mode. We try to make each column as
+% long as the others, but call \cs{sloppy} to make our life easier.
+% \begin{macrocode}
+\if@twocolumn
+ \twocolumn
+ \sloppy
+ \flushbottom
+% \end{macrocode}
+% Normally we call \cs{onecolumn} to initiate typesetting in one
+% column.
+% \begin{macrocode}
+\else
+ \onecolumn
+\fi
+
+% \end{macrocode}
+%
+% \subsection{Floats}
+%
+% Here are the implementations of the figure and table environments
+% and their accompanying List of\ldots
+%
+% \begin{environment}{figure}
+% \begin{environment}{figure*}
+% This is the definition of the actual environment. The form with the
+% \verb?*? is used for double column figures. We use \cs{newfloat} to set it.
+% In this class figures are numbered per chapter, but we need to change
+% the default definition of \cs{thefigure} if a figure
+% is in a pre-numbered chapter.
+% \changes{v1.3a}{2002/11/22}{Added \cs{kill@lastcounter} after new
+% figure float}
+% \changes{v1.61803}{2008/01/30}{Killed \cs{kill@lastcounter} after new
+% figure float}
+% \begin{macrocode}
+\newfloat[chapter]{figure}{lof}{\figurename}
+%%% \kill@lastcounter{lofdepth}
+\renewcommand{\thefigure}{\thechapter.\@arabic\c@figure}
+
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\listoffigures}
+% \begin{macro}{\listoffigures*}
+% These macros request that LaTeX produces a list of figures.
+% The LoF heading is added to the ToC unless the starred
+% version is used.
+% \changes{v1.3}{2002/11/14}{Added \cs{kill@lastcounter} after new
+% list of figures}
+% \changes{v1.61803}{2008/01/30}{Killed \cs{kill@lastcounter} after new
+% listoffigures}
+% \begin{macrocode}
+\newlistof{listoffigures}{lof}{\listfigurename}
+%%% \kill@lastcounter{lofdepth}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\l@figure}
+% \cs{l@figure}\marg{title}\marg{page} typesets the LoF entry for
+% a \cs{figure} caption heading.
+% \changes{v1.3a}{2002/11/22}{Deleted \cs{kill@lastcounter} after new
+% figure listentry}
+% \begin{macrocode}
+\newlistentry[chapter]{figure}{lof}{0}
+ \cftsetindents{figure}{0em}{2.3em}
+%% \kill@lastcounter{lofdepth}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{table}
+% \begin{environment}{table*}
+% The definition for tables is almost identical.
+% \changes{v1.3a}{2002/11/22}{Added \cs{kill@lastcounter} after new
+% table float}
+% \changes{v1.61803}{2008/01/30}{Killed \cs{kill@lastcounter} after new
+% table float}
+% \begin{macrocode}
+\newfloat[chapter]{table}{lot}{\tablename}
+%%% \kill@lastcounter{lotdepth}
+\renewcommand{\thetable}{\thechapter.\@arabic\c@table}
+
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\listoftables}
+% \begin{macro}{\listoftables*}
+% These macros request that LaTeX produces a list of tables.
+% The LoT heading is added to the ToC unless the starred
+% version is used.
+% \changes{v1.3}{2002/11/14}{Added \cs{kill@lastcounter} after new
+% list of tables}
+% \changes{v1.61803}{2008/01/30}{Killed \cs{kill@lastcounter} after new
+% list of tables}
+% \begin{macrocode}
+\newlistof{listoftables}{lot}{\listtablename}
+%%% \kill@lastcounter{lotdepth}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\l@table}
+% \cs{l@table}\marg{title}\marg{page} typesets the LoT entry for
+% a \cs{table} caption heading.
+% \changes{v1.3a}{2002/11/22}{Deleted \cs{kill@lastcounter} after new
+% table listentry}
+% \begin{macrocode}
+\newlistentry[chapter]{table}{lot}{0}
+ \cftsetindents{table}{0em}{2.3em}
+%% \kill@lastcounter{lotdepth}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The \Lpack{subfigure} package defines \verb?lofdepth? and \verb?lotdepth?
+% counters. If is not used, then we have to define them. The \Lpack{subfig}
+% package replaced \Lpack{subfigure} in 2005, and this only defined
+% the counters if they were not previously defined. It now seems sensible
+% to ignore any use of the \Lpack{subfigure} package. This makes life a lot
+% simpler.
+% \changes{v1.61803}{2008/01/30}{Ignore subfig(ure) package re \cs{lofdepth}
+% and \cs{lotdepth}}
+% \begin{macrocode}
+%%%\AtBeginDocument{%
+%%% \@ifundefined{c@lofdepth}%
+%%% {\newcounter{lofdepth}\setcounter{lofdepth}{1}}{}
+%%% \@ifundefined{c@lotdepth}%
+%%% {\newcounter{lotdepth}\setcounter{lotdepth}{1}}{}}
+
+% \end{macrocode}
+%
+% \subsection{The \Lopt{article} option}
+%
+% The \Lopt{article} option requires changes to the default chapterstyle,
+% and the numbering of floats, etc.
+%
+% Emanuele Vicentini (2003/07/21) suggested making \cs{maketitle} more
+% closely match the real article's appearance.
+% Alan Budden\footnote{\texttt{alan.s.budden@bristol.ac.uk}} commented
+% on 2003/12/18 that the equation counter should be continuous.
+% \changes{v1.0a}{2001/12/07}{Added footnote and chaptername changes to the article option}
+% \changes{v1.4}{2003/11/22}{Added some resets of maketitle macros to
+% the article option (from patch v1.7)}
+% \changes{v1.4}{2003/12/18}{Added equation counter to article resets}
+%
+% Victor Ivrii\footnote{\texttt{vivrii@gmail.com}} (October 2014)
+% noted that adding \pstyle{headings} and english \Lpack{babel}
+% produce unexpected headers containing the frase ``Chapter''.
+% \begin{macrocode}
+\ifartopt
+ \chapterstyle{article}
+ \counterwithout{figure}{chapter}
+ \counterwithout{table}{chapter}
+ \counterwithout{footnote}{chapter}
+ \counterwithout{equation}{chapter}
+% \end{macrocode}
+% Setting \cs{chaptername} empty was added in v1.0a, with no
+% indication why. Because of \Lpack{babel} (and others) this is
+% clearly not a good idea. We will adjust \pstyle{headings} in a
+% different manner, but leave all the other page styles alone as using
+% the \Lopt{article} as the basis of design work might not be
+% recommended.
+% \changes{v3.7d}{2014/11/05}{Redone \cs{chaptername} adjustment plus
+% \pstyle{headings} under \Lopt{article} option}
+% \begin{macrocode}
+ %\renewcommand{\chaptername}{}
+ \if@twoside
+ \addtopsmarks{headings}{}{%
+ \createmark{chapter}{left}{shownumber}{}{. \ }
+ }
+ \else
+ \addtopsmarks{headings}{}{%
+ \createmark{chapter}{right}{shownumber}{}{. \ }
+ }
+ \fi
+ \renewcommand{\maketitlehookb}{%
+ \vskip -1.5\topsep\vskip -1.5\partopsep}
+ \renewcommand{\maketitlehookc}{%
+ \vskip -1.5\topsep\vskip -1.5\partopsep}
+\fi
+
+% \end{macrocode}
+%
+%
+% \subsection{The \Lopt{ms} option}
+%
+% This should be done last as it makes various changes to the defaults.
+%
+% \begin{macro}{\msdoublespacing}
+% \begin{macro}{\mssinglespacing}
+% These do nothing unless the \Lopt{ms} option is used; then they change
+% the \cs{baselinestretch}.
+% \begin{macrocode}
+\newcommand{\msdoublespacing}{}
+\newcommand{\mssinglespacing}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\ifmsdoc
+ \renewcommand{\msdoublespacing}{%
+ \renewcommand{\baselinestretch}{1.6}\large\normalsize}
+ \renewcommand{\mssinglespacing}{%
+ \renewcommand{\baselinestretch}{1.0}\large\normalsize}
+ \renewcommand{\familydefault}{cmtt}
+ \renewcommand{\rmdefault}{cmtt}
+ \renewcommand{\sfdefault}{cmtt}
+ \renewcommand{\bfdefault}{m}
+ \renewcommand{\itdefault}{n}
+ \renewcommand{\sldefault}{n}
+ \renewcommand{\scdefault}{n}
+ \renewcommand{\baselinestretch}{1.6}
+ \@twocolumnfalse
+ \onecolumn
+ \sloppy
+ \@twosidefalse
+ \raggedbottom
+ \pagestyle{plain}
+\fi
+
+% \end{macrocode}
+%
+% \subsection{Emulated packages}
+%
+% Many of the `emulations' are extensions and integration of package
+% facilities. In some cases an `emulated' package just won't work with the
+% class, so I've added it here to prevent it from being loaded. In any case,
+% most of the packages are mine.
+% \changes{v1.6180339}{2008/07/23}{Added dates to emulated packages}
+% \changes{v1.61803398d}{2010/02/13}{Emulated tocvsec2, used the date
+% from the other lines, tocvsec2 provides the same macros as memoir}
+% \begin{macrocode}
+\EmulatedPackage{abstract}[2008/07/23]
+\EmulatedPackage{appendix}[2008/07/23]
+% \end{macrocode}
+% \changes{v3.6k}{2012/07/19}{Changed the enumated date for the
+% \Lpack{array} package. Apparently the only thing changed between
+% v2.4b (2005) and c (2008) are some copyright years.}
+% \changes{v3.7g}{2018/03/05}{Embedded the latest version of the
+% \Lpack{array} package}
+% \changes{v3.7h}{2018/09/06}{\Lpack{array} no longer embedded,
+% required instead}
+% \begin{macrocode}
+ % \EmulatedPackage{array}[2016/10/06]
+\EmulatedPackage{booktabs}[2016/05/16]
+\EmulatedPackage{ccaption}[2008/07/23]
+\EmulatedPackage{changepage}[2008/07/23]
+\EmulatedPackage{chngcntr}[2008/07/23]
+\EmulatedPackage{chngpage}[2008/07/23]
+\EmulatedPackage{crop}
+% \end{macrocode}
+% \changes{v3.7h}{2018/09/06}{\Lpack{dcolumn} is no longer embedded,
+% emulation removed. We require it instead}
+% \begin{macrocode}
+ % \EmulatedPackage{dcolumn}[2008/07/23]
+% \end{macrocode}
+% \changes{v3.7g}{2018/03/06}{Adjusted the date for \Lpack{delarray},
+% the code is the same}
+% \changes{v3.7h}{2018/09/06}{\Lpack{delarray} is no longer embedded,
+% emulation removed. We require it instead}
+% \begin{macrocode}
+ % \EmulatedPackage{delarray}[2014/10/28]
+\EmulatedPackage{enumerate}[2008/07/23]
+\EmulatedPackage{epigraph}[2008/07/23]
+%%%%%\EmulatedPackage{framed}[2008/07/23]
+\EmulatedPackage{ifmtarg}[2008/07/23]
+% \end{macrocode}
+% \changes{v3.7g}{2018/03/08}{Removed if\meta{engine} emulation}
+% \begin{macrocode}
+ %\ifm@mifetex\EmulatedPackage{ifetex}[2008/07/23]\fi
+ %\ifm@mifluatex\EmulatedPackage{ifluatex}[2008/07/23]\fi
+ %\ifm@mifpdf\EmulatedPackage{ifpdf}[2008/07/23]\fi
+ %\ifm@mifxetex\EmulatedPackage{ifxetex}[2008/07/23]\fi
+\EmulatedPackage{index}[2008/07/23]
+\EmulatedPackage{makeidx}[2008/07/23]
+\EmulatedPackage{moreverb}[2008/07/23]
+\EmulatedPackage{mparhack}[2008/07/23]
+\EmulatedPackage{needspace}[2008/07/23]
+\EmulatedPackage{newfile}[2008/07/23]
+\EmulatedPackage{nextpage}[2008/07/23]
+\EmulatedPackage{pagenote}[2008/07/23]
+\EmulatedPackage{parskip}[2008/07/23]
+\EmulatedPackage{patchcmd}[2008/07/23]
+\EmulatedPackage{setspace}[2008/07/23]
+\EmulatedPackage{shortvrb}[2008/07/23]
+\EmulatedPackage{showidx}[2008/07/23]
+% \end{macrocode}
+% \changes{v3.7g}{2018/03/02}{Updated the embedded version of \Lpack{tabularx} to v2.11 2016/02/03}
+% \changes{v3.7h}{2018/09/08}{\Lpack{tabularx} is no longer emulated,
+% but a required package}
+% \begin{macrocode}
+ % \EmulatedPackage{tabularx}[2016/02/03]
+\EmulatedPackage{titleref}[2008/07/23]
+\EmulatedPackage{titling}[2008/07/23]
+\EmulatedPackage{tocbibind}[2008/07/23]
+\EmulatedPackage{tocloft}[2008/07/23]
+\EmulatedPackage{tocvsec2}[2008/07/23]
+\EmulatedPackage{verbatim}[2008/07/23]
+\EmulatedPackage{verse}[2008/07/23]
+
+% \end{macrocode}
+%
+% \subsection{Interaction with the \Lpack{caption} package}
+%
+% Although the author of the \Lpack{caption} package has, over the
+% years, made it work with many other classes he has not extended it
+% to either recognise or work with the memoir class. Some authors want
+% to use the \Lpack{caption} package, hence\ldots
+%
+% The easiest manner in which to make the \Lpack{caption} package to
+% work with the class, is to restore the kernel defaults for the main
+% captioning macros.
+%
+% Kill changes to the caption macros when the \Lpack{caption} package
+% is used. The \Lpack{caption} package checks the definitions of the
+% \cs{@makecaption}, \cs{caption} and \cs{@caption} macros. These need
+% to be identical to the definitions in the standard classes for the
+% package to disbelieve that the \Lpack{memoir} class is being used.
+%
+% \begin{macro}{\@makecaption}
+% \begin{macro}{\caption}
+% \begin{macro}{\@caption}
+% \changes{v1.61803}{2008/01/30}{Killed memoir's captioning when the caption
+% package is used (mempatch v4.9).}
+% \changes{v3.6k}{2012/05/04}{Changed the warning text to be more informative.}
+% \begin{macrocode}
+%%% revert changes to captioning macros if the caption package is used.
+\AtBeginPackage{caption}{
+ \ClassWarningNoLine{memoir}{%
+ You are using the caption package with the memoir class.
+ To prepare we will now reset all captioning macros and
+ configurations to kernel defaults, and then let the
+ caption package take over. Please remember to use^^J
+ the caption package interfaces in order to^^J
+ configure your captions}
+
+ \long\def\@makecaption##1##2{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{##1: ##2}%
+ \ifdim \wd\@tempboxa >\hsize
+ ##1: ##2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip}
+
+ \def\caption{%
+ \ifx\@captype\@undefined
+ \@latex@error{\noexpand\caption outside float}\@ehd
+ \expandafter\@gobble
+ \else
+ \refstepcounter\@captype
+ \expandafter\@firstofone
+ \fi
+ {\@dblarg{\@caption\@captype}}%
+ }
+
+ \long\def\@caption##1[##2]##3{%
+ \par
+ \addcontentsline{\csname ext@##1\endcsname}{##1}%
+ {\protect\numberline{\csname the##1\endcsname}{\ignorespaces ##2}}%
+ \begingroup
+ \@parboxrestore
+ \if@minipage
+ \@setminipage
+ \fi
+ \normalsize
+ \@makecaption{\csname fnum@##1\endcsname}{\ignorespaces ##3}\par
+ \endgroup}
+
+% \end{macrocode}
+% By request of the \Lpack{caption} package author (Axel Sommerfeldt),
+% we also restore the caption skips to the kernel defaults. The class
+% sets both to be 0.5\cs{onelineskip}, which may cause confusion when
+% using certain features in the \Lpack{caption} package.
+% \changes{v3.6k}{2012/05/04}{Added \cs{captionXskip} reset to default
+% values.}
+% \begin{macrocode}
+
+ \setlength\abovecaptionskip{10\p@}
+ \setlength\belowcaptionskip{0\p@}
+
+} % end \AtBeginPackage
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Interaction with the \Lpack{float} package}
+%
+% The \Lpack{float} package also defines \cs{newfloat}, so kill memoir's
+% version when the \Lpack{float} package gets used.
+% \changes{v1.61803}{2008/01/30}{Killed \cs{newfloat} when float package is
+% used (mempatch v4.9)}
+% \begin{macrocode}
+\AtBeginPackage{float}{\let\newfloat\relax}
+
+% \end{macrocode}
+%
+% ^^A\subsection{Patch file}
+% ^^A
+% ^^A At the suggestion of Danie Els (\texttt{DanieEls@sun.ac.za}), Dan Leucking
+% ^^A (\texttt{luecking@uark.edu}) and others, input a patch file, if one exists,
+% ^^A as the final act. (This is preferable to my series of \file{memfixa.sty},
+% ^^A \file{memfixb.sty} packages, and so on, for each release of the class.)
+% ^^A \changes{v1.3}{2002/11/14}{Added input of mempatch.sty}
+% ^^A \changes{v1.6180339c}{2008/12/26}{Added the two missing arguments when inputting
+% ^^A mempatch.sty (courtesy of Wilhelm Muller)}
+% ^^A \changes{v1.61803398}{2009/07/27}{PW: changed call to mempatch, which I think
+% ^^A restores Lars' v1.6180339h change}
+% ^^A \changes{v3.7g}{2018/03/08}{mempatch have been empty for almost
+% ^^A 10years, we will no longer load it.}
+% ^^A \begin{macrocode}
+% ^^A\IfFileExists{mempatch.sty}{%
+% ^^A \RequirePackage{mempatch}}{}
+% ^^A
+% ^^A \end{macrocode}
+% ^^A
+% The end of the class definitions.
+% \begin{macrocode}
+%</class>
+% \end{macrocode}
+%
+% \section{Glossary Makeindex style file}
+%
+% Here is the basic style (configuration) file for Makeindex
+% for use with the default glossary setup.
+% \changes{v1.618}{2005/09/25}{Added basic.gst file}
+%
+% \begin{macrocode}
+%<*gst>
+%%%%% basic.gst basic makeindex glossary configuration file for memoir
+%%%%% Output style parameters
+preamble "\\begin{theglossary}"
+postamble "\n\\end{theglossary}\n"
+group_skip "\n\\glossaryspace\n"
+item_0 "\n\\glossitem"
+delim_0 "{\\memglonum{"
+encap_suffix "}}}"
+%%% Input style parameters
+keyword "\\glossaryentry"
+
+%</gst>
+% \end{macrocode}
+%
+% The end of the configuration file code
+%
+% \bibliographystyle{alpha}
+% \begingroup
+% \raggedright
+% \begin{thebibliography}{GMSN94A}
+%
+%
+% \bibitem[ABH90]{bk:Impatient}
+% Paul W.~Abrahams, Karl Berry and Kathryn A.~Hargreaves.
+% \newblock \emph{TeX{} for the Impatient}.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1990.
+% \newblock (Available from CTAN in \texttt{info/impatient})
+%
+% \bibitem[Ars01a]{TITLEREF}
+% Donald Arseneau.
+% \newblock \emph{\Lpack{Titleref} package (version 3.1)}.
+% \newblock April 2001.
+% \newblock (Available from CTN as
+% \texttt{macros/latex/contrib/misc/titleref.sty})
+%
+% \bibitem[Ars01b]{CHAPTERBIB}
+% Donald Arseneau.
+% \newblock \emph{\Lpack{Chapterbib} package (version 1.9)}.
+% \newblock September 2001.
+% \newblock (Available from CTN as
+% \texttt{macros/latex/contrib/misc/chapterbib.sty})
+%
+% \bibitem[Ars03]{FRAMED}
+% Donald Arseneau.
+% \newblock \emph{\Lpack{Framed} package (version 0.8a)}.
+% \newblock July 2003.
+% \newblock (Available from CTAN as
+% \texttt{macros/latex/contrib/misc/framed.sty})
+%
+% \bibitem[Ars05]{PLACEINS}
+% Donald Arseneau.
+% \newblock \emph{\Lpack{Placeins} package (version 2.2)}.
+% \newblock May 2005.
+% \newblock (Available from CTN as
+% \texttt{macros/latex/contrib/placeins/placeins.sty})
+%
+%
+% \bibitem[ArWi00]{IFMTARG}
+% Donald Arseneau and Peter Wilson.
+% \newblock \emph{The ifmtarg package}.
+% \newblock March, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/misc})
+%
+%
+% \bibitem[Car94]{DELARRAY}
+% David Carlisle.
+% \newblock \emph{The \Lpack{delarray} package}.
+% \newblock March 1994.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+%
+% \bibitem[Car98a]{ENUMERATE}
+% David Carlisle.
+% \newblock \emph{The enumerate package}.
+% \newblock August, 1998.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+% \bibitem[Car98b]{REMRESET}
+% David Carlisle.
+% \newblock \emph{The remreset package}.
+% \newblock August, 1998.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/carlisle})
+%
+% \bibitem[Car99]{TABULARX}
+% David Carlisle.
+% \newblock \emph{The \Lpack{tabularx} package}.
+% \newblock February 2016.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+% \bibitem[Car01]{DCOLUMN}
+% David Carlisle.
+% \newblock \emph{The \Lpack{dcolumn} package}.
+% \newblock May, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+% \bibitem[Car04]{TEXTCASE}
+% David Carlisle.
+% \newblock \emph{The \Lpack{textcase} package}.
+% \newblock October, 2004.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/textcase})
+%
+% \bibitem[Coc02]{SUBFIGURE}
+% Steven Douglas Cochran.
+% \newblock \emph{The subfigure package}.
+% \newblock March, 2002.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/subfigure})
+%
+% \bibitem[Dal99]{NATBIB}
+% Patrick W. Daly.
+% \newblock \emph{Natural Sciences Citations and References}.
+% \newblock May, 1999.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/natbib})
+%
+% \bibitem[Dow00]{PATCHCMD}
+% Michael J. Downes
+% \newblock \emph{The patchcmd package}.
+% \newblock July 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/patchcmd})
+%
+% \bibitem[Fai98]{MOREVERB}
+% Robin Fairbairns.
+% \newblock \emph{The moreverb package}.
+% \newblock December, 1998.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/moreverb})
+%
+% \bibitem[Fai03]{FOOTMISC}
+% Robin Fairbairns.
+% \newblock \emph{\Lpack{footmisc} --- a portmanteau package for
+% customising footnotes in LaTeX}.
+% \newblock February 2003.
+% \newblock (Available from CTAN in
+% \texttt{macros/latex/contrib/footmisc})
+%
+%
+% \bibitem[Fea03]{BOOKTABS}
+% Simon Fear.
+% \newblock \emph{Publication quality tables in \LaTeX}.
+% \newblock March, 2003.
+% \newblock (Available from CTAN in
+% \texttt{macros/latex/contrib/booktabs})
+%
+% \bibitem[Fra00]{CROP}
+% Melchior Franz.
+% \newblock \emph{The crop package}.
+% \newblock February, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/crop})
+%
+%
+% \bibitem[GMS94]{GOOSSENS94}
+% Michel Goossens, Frank Mittelbach, and Alexander Samarin.
+% \newblock {\em The LaTeX Companion}.
+% \newblock Addison-Wesley Publishing Company, 1994.
+%
+%
+%
+% \bibitem[Knu84]{bk:knuth}
+% Donald E. Knuth.
+% \newblock \emph{The \TeX{}book}.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1984.
+%
+%
+% \bibitem[KWG]{TUFTE}
+% Bil Kleb, Bill Wood, and Kevin Godby.
+% \newblock \emph{Tufte LaTeX}.
+% \newblock December 2009.
+% \newblock (Available from CTAN in \texttt{macros/latex/contrib/tufte-latex/})
+%
+% \bibitem[Lam94]{bk:lamport}
+% Leslie Lamport.
+% \newblock \emph{\LaTeX\ --- A Document Preparation System}.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1994.
+%
+% \bibitem[LMB99]{CLASSES}
+% Leslie Lamport, Frank Mittelbach and Johannes Braams.
+% \newblock \emph{Standard Document Classes for LaTeX version 2e}.
+% \newblock September, 1999.
+% \newblock (Available from CTAN as
+% \texttt{/macros/latex/base/classes.dtx})
+%
+% \bibitem[MC98]{ARRAY}
+% Frank Mittelbach and David Carlisle.
+% \newblock \emph{A new implementation of LaTeX's tabular and array
+% environment}
+% \newblock April 2017.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+% \bibitem[Oos96]{FANCYHDR}
+% Piet van Oostrum.
+% \newblock \emph{Page layout in LaTeX}.
+% \newblock June, 1996.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/fancyhdr})
+%
+%
+% \bibitem[Rah01]{NAMEREF}
+% Sebastian Rahtz.
+% \newblock \emph{Section name references in LaTeX}.
+% \newblock January 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/hyperref})
+%
+% \bibitem[Rah02]{HYPERREF}
+% Sebastian Rahtz.
+% \newblock \emph{Hypertext marks in LaTeX}.
+% \newblock March 2002.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/hyperref})
+%
+%
+% \bibitem[Sch98]{EVERYSHI}
+% Martin Schr\"{o}der.
+% \newblock \emph{The everyshi package}.
+% \newblock August, 1998.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/ms})
+%
+% \bibitem[SRR01]{VERBATIM}
+% Rainer Sch\"{o}pf, Bernd Raichle and Chris Rowley.
+% \newblock \emph{A new implementation of LaTeX's verbatim and verbatim*
+% environments}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/required/tools})
+%
+% \bibitem[Wil99]{TOCVSEC2}
+% Peter Wilson.
+% \newblock \emph{The tocvsec2 package}.
+% \newblock January, 1999.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/tocvsec2})
+%
+% \bibitem[Wil00a]{EPIGRAPH}
+% Peter Wilson.
+% \newblock \emph{The epigraph package}.
+% \newblock February, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/epigraph})
+%
+% \bibitem[Wil00b]{ISOCLASS}
+% Peter Wilson.
+% \newblock \emph{LaTeX files for typesetting ISO standards}.
+% \newblock February, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/isostds/iso})
+%
+% \bibitem[Wil00c]{NEXTPAGE}
+% Peter Wilson.
+% \newblock \emph{The nextpage package}.
+% \newblock February, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/misc})
+%
+% \bibitem[Wil00d]{NEEDSPACE}
+% Peter Wilson.
+% \newblock \emph{The needspace package}.
+% \newblock March, 2000.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/misc})
+%
+% \bibitem[Wil01a]{ABSTRACT}
+% Peter Wilson.
+% \newblock \emph{The abstract package}.
+% \newblock February, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/abstract})
+%
+% \bibitem[Wil01b]{CHNGPAGE}
+% Peter Wilson.
+% \newblock \emph{The chngpage package}.
+% \newblock February, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/misc})
+%
+% \bibitem[Wil01c]{APPENDIX}
+% Peter Wilson.
+% \newblock \emph{The appendix package}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/appendix})
+%
+% \bibitem[Wil01d]{CCAPTION}
+% Peter Wilson.
+% \newblock \emph{The ccaption package}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/ccaption})
+%
+% \bibitem[Wil01e]{CHNGCNTR}
+% Peter Wilson.
+% \newblock \emph{The chngcntr package}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/misc})
+%
+% \bibitem[Wil01f]{HANGING}
+% Peter Wilson.
+% \newblock \emph{The hanging package}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/hanging})
+%
+% \bibitem[Wil01g]{TITLING}
+% Peter Wilson.
+% \newblock \emph{The titling package}.
+% \newblock March, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/titling})
+%
+% \bibitem[Wil01h]{TOCBIBIND}
+% Peter Wilson.
+% \newblock \emph{The tocbibind package}.
+% \newblock April, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/tocbibind})
+%
+% \bibitem[Wil01i]{TOCLOFT}
+% Peter Wilson.
+% \newblock \emph{The tocloft package}.
+% \newblock April, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/tocloft})
+%
+% \bibitem[Wil01j]{VERSE}
+% Peter Wilson.
+% \newblock \emph{Typesetting simple verse with LaTeX}.
+% \newblock August, 2001.
+% \newblock (Available from CTAN in
+% \texttt{/macros/latex/contrib/verse})
+%
+%
+% \bibitem[Wil03]{LEDMAC}
+% Peter Wilson.
+% \newblock \emph{\Lpack{ledmac}: A presumptuous attempt to port EDMAC and
+% TABMAC to LaTeX}.
+% \newblock August 2003.
+% \newblock (Available from CTAN in
+% \texttt{macros/latex/contrib/ledmac})
+%
+% \bibitem[Wil07]{GLISTER07}
+% Peter Wilson.
+% \newblock `Glisterings' \emph{TUGboat}, 28(2):229--232,
+% \newblock 2007.
+%
+% \bibitem[Wil08]{GLISTER08}
+% Peter Wilson.
+% \newblock `Glisterings' \emph{TUGboat}, 29(2):324--327,
+% \newblock 2008.
+%
+%
+%
+%
+%
+% \end{thebibliography}
+% \endgroup
+%
+%
+% \Finale
+%
+\endinput
+
+%% \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 \~}
+%%
+