% \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.3c 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.3c or later is part of all distributions of % LaTeX version 2008/05/04 or later. % % This work has the LPPL maintenance status "maintained". % % This work consists of the files listed in the README file. % % \fi % \CheckSum{28075} % % \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} % \changes{v3.7i}{2019/11/15}{Maintenance, various edits} % \changes{v3.7j}{2019/11/21}{Typo in embeded textcase, now that it is % inside \cs{IfFileExists} \# needs to be doubled} % \changes{v3.7k}{2020/03/25}{Maintenance} % \changes{v3.7l}{2020/06/02}{Small preparation for october kernel update} % \changes{v3.7m}{2020/09/10}{More preparations for october kernel update} % \changes{v3.7n}{2020/10/04}{Foced # doubling in AtBegin/EndX macros % to ensure backwards compatability} % \changes{v3.7o}{2021/03/23}{Maintenance and a provide for the kernel} % \changes{v3.7p}{2021/06/16}{Small adjustments of memoir vs memhfixc} % \changes{v3.7q}{2022/02/20}{Maintenance} % \changes{v3.7r}{2022/07/29}{Maintenance} % \changes{v3.7.19}{2022/11/17}{Maintenance} % \changes{v3.8}{2023/08/08}{Maintenance, see the README for details} % \changes{v3.8a}{2023/08/14}{Forgot to enable stopping if the LaTeX % format is too old} % \changes{v3.8.1}{2023/08/21}{Moved AddToHook from \@xfloat to % \@floatboxreset as the float package causes issues} % % \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} % \def\fileversion{v3.7i} \def\filedate{2019/11/15} % \def\fileversion{v3.7j} \def\filedate{2019/11/21} % \def\fileversion{v3.7k} \def\filedate{2020/03/25} % \def\fileversion{v3.7l} \def\filedate{2020/06/02} % \def\fileversion{v3.7m} \def\filedate{2020/09/10} % \def\fileversion{v3.7n} \def\filedate{2020/10/04} % \def\fileversion{v3.7o} \def\filedate{2021/03/23} % \def\fileversion{v3.7p} \def\filedate{2021/06/16} % \def\fileversion{v3.7q} \def\filedate{2022/02/20} % \def\fileversion{v3.7r} \def\filedate{2022/07/29} % \def\fileversion{v3.7.19} \def\filedate{2022/11/17} % \def\fileversion{v3.8} \def\filedate{2023/08/08} % \def\fileversion{v3.8.1} \def\filedate{2023/08/21} % \def\fileversion{v3.8.2} \def\filedate{2024/01/26} % \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 \newcommand*{\Lhook}[1]{\meta{#1}} % name of a hook \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} % % \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. % \changes{v3.8}{2023/08/02}{Added requirement on the kernel} % \begin{macrocode} %\def\mem@atleast@kernel{2021/06/01} %\NeedsTeXFormat{LaTeX2e}[\mem@atleast@kernel] % \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} %\ProvidesClass{memoir}% % [2024/01/26 v3.8.2 configurable book, report, article document class] %\newcommand\memversion{v3.8.2, 2024/01/26} % \end{macrocode} % % \changes{v3.7m}{2020/08/05}{Added \cs{IfFormatAtLeastTF}} % \changes{v3.8}{2023/08/02}{Moved up earlier so we can use it to % issue an error if the kernel is too old.} % \begin{macro}{\IfFormatAtLeastTF} % Credit to Frank Mittelbach. Using % \cs{IfFormatAtLeastTF}\marg{date}\marg{true}\marg{false} we can % execute \meta{true} if the format is dated after the given % \meta{date} (in {\scriptsize\ttfamily YYYY/MM/DD} format) and % \meta{false} otherwise. The main use is for when we get info that % certain features are being added to the \LaTeX\ format, features % that we want to base class features on. Then this is an easy method % for providing the code only avaiable on newer formats and code left % over for those still using the older \LaTeX\ formats.\footnote{The \dots TF is a % nice \LaTeX3 convention.} % \begin{macrocode} %\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} % \end{macrocode} % \end{macro} % % Stop the loading if the kernel is too old (as \cs{NeedsTeXFormat} % only issues a warning). Though we cannot do much about nonstopmode. % \changes{v3.8a}{2023/08/14}{Forgot to enable the stop mode} % \begin{macrocode} %\IfFormatAtLeastTF{\mem@atleast@kernel}{}{ % \ClassError{memoir}{% % Your LaTeX release is too old.\MessageBreak % The memoir class requires at LaTeX format\MessageBreak % from at least \mem@atleast@kernel\space onwards. Please update your\MessageBreak % entire LaTeX installation instead of manually updating\MessageBreak % just memoir}{} % \batchmode\read-1to\@tempa% evil mode engaged %} % \end{macrocode} % % \begin{macrocode} %<9pt> \ProvidesFile{mem9.clo}% %<9pt> [2022/07/29 v0.5 memoir class 9pt size option] %<10pt>\ProvidesFile{mem10.clo}% %<10pt> [2022/07/29 v0.5 memoir class 10pt size option] %<11pt>\ProvidesFile{mem11.clo}% %<11pt> [2022/07/29 v0.5 memoir class 11pt size option] %<12pt>\ProvidesFile{mem12.clo}% %<12pt> [2022/07/29 v0.5 memoir class 12pt size option] %<14pt>\ProvidesFile{mem14.clo}% %<14pt> [2022/07/29 v0.5 memoir class 14pt size option] %<17pt>\ProvidesFile{mem17.clo}% %<17pt> [2022/07/29 v0.5 memoir class 17pt size option] %<20pt>\ProvidesFile{mem20.clo}% %<20pt> [2022/07/29 v0.5 memoir class 20pt size option] %<25pt>\ProvidesFile{mem25.clo}% %<25pt> [2022/07/29 v0.5 memoir class 25pt size option] %<30pt>\ProvidesFile{mem30.clo}% %<30pt> [2022/07/29 v0.5 memoir class 30pt size option] %<36pt>\ProvidesFile{mem36.clo}% %<36pt> [2022/07/29 v0.5 memoir class 36pt size option] %<48pt>\ProvidesFile{mem48.clo}% %<48pt> [2022/07/29 v0.5 memoir class 48pt size option] %<60pt>\ProvidesFile{mem60.clo}% %<60pt> [2022/07/29 v0.5 memoir class 60pt size option] % \end{macrocode} % % % \section{Initial Code} \label{sec:ic} % % \begin{macrocode} %<*class> % \end{macrocode} % % (2022/02/20): In order to be able to use a patching approach instead % of overwriting kernel macros, we will now require the % \Lpack{etoolbox} package. (2023/07/28) changed to \Lpack{xpatch} as % it supports a little more. % \changes{v3.8}{2023/07/28}{replaced etoolbox by xpatch} % \begin{macrocode} \RequirePackage{xpatch} % \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. % % \medskip\noindent % 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{Hooks and provided kernel commands} % % \changes{v3.8}{2023/07/28}{Section added} % % First we make sure a few kernel commands are present, providing variants if needed. % \begin{macro}{\ExpandArgs} % The macro \cs{ExpandArgs}\marg{list} is an alias for % \verb|\exp_args:Nlist|, can for example be used as % \begin{verbatim} % \ExpandArgs{c}\newcommand{\foo bar} % \end{verbatim} % to do argument manipulation to the argument \emph{after} % \cs{newcommand}, \emph{before} \cs{newcommand} gets access to it. % The \meta{list} arg specification need to comply with expl3 % standards, see \cite{LTX3}. % \begin{macrocode} \ExplSyntaxOn \IfFormatAtLeastTF{ 2022-06-01 } {} { \RequirePackage { xparse } \providecommand \ExpandArgs [1] { \cs_if_exist_use:c { exp_args:N #1 } } } \ExplSyntaxOff % \end{macrocode} % \end{macro} % \begin{macro}{\NewHookWithArguments} % \begin{macro}{\UseHookWithArguments} % These is a fairly new addition to \cite{LTHOOKS}, but it will % become super usefull in the future. If not already in the kernel, % we provide it and have it do nothing at all. Credit to % Phelype Oleinik. The various hooks the class has will over time be % supplemented by \cs{UseHookWithArguments} and the older non-Hook % ones will then slowly be phased out. % \begin{macrocode} \providecommand\NewHookWithArguments[2]{} \ExplSyntaxOn \@ifundefined{UseHookWithArguments}{ \cs_new:Npn \UseHookWithArguments #1 #2 { \cs:w use_none: \prg_replicate:nn {#2} { n } \cs_end: } }{} \ExplSyntaxOff % \end{macrocode} % \end{macro} % \end{macro} % % As we now require a kernel that have support for the new kernel % hooks, we'll use this area to define the hooks and provide commands % that are useful in even newer kernels, but might not be in the % kernels we'd like to support. % % The \Lhook{memoir/subcaption} hook is executed after % \cs{refstepcounter} in \cs{subcaption}, \cs{subbottom}, \cs{subtop} % and similar. % \begin{macrocode} \NewHook{memoir/subcaption/aftercounter} % \end{macrocode} % % % \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} % % \noindent % From 2020/10/01 format onwards we will implement file hooks via the % features provided by the \LaTeX\ kernel. This makes our code easier % to do (actually, users really ought to use these hook macros instead % of the ones the class provides) and it eliminates the need for us to % redefine \cmd{\InputIfFileExists}. % \changes{v3.7m}{2020/08/06}{Reimplemented file/package/class hooks} % \begin{macrocode} \IfFormatAtLeastTF{2020/10/01}{ % \end{macrocode} % As mentioned in \cite{LTHOOKS,LTFILEHOOK} the kernel provides hooks % at the start of files, packages and classes. The class you implement % the latter via our definition of the file hook. We will now instead % use the separate hooks. Note that we will \emph{not} be adding any % extra labels to these hooks and will provide no interface to do % so. If more control is needed, please use the kerel interface directly. % \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. % % \medskip\noindent % \textbf{Breaking change:} In the old implemenation % \verb!\AtEndFile{file}! worked for \texttt{file.tex} even if one % did not speficy the extension. Now you will need to use % \verb!\AtEndFile{file.tex}! explicitly. % \changes{v3.7n}{2020/10/04}{The old AtXFile code required \#\ % doubling. The new does not, and this is not backwards compatible. By % suggestion from David Carlisle we change the code a little such that % \#\ is needed} % We add a \cs{temp} trick suggested by David Carlisle as the old code % required \#\ doubling and the new does not. To be backwards % compatible we force required \#\ doubling. % \changes{v3.7q}{2022/01/07}{The LaTeX team reversed the order of the % hook name} % \begin{macrocode} \newcommand\AtBeginFile[2]{\def\temp{\AddToHook{file/#1/before}{#2}}\temp} \newcommand\AtEndFile[2]{\def\temp{\AddToHook{file/#1/after}{#2}}\temp} % \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. % \changes{v3.7n}{2020/10/04}{The old AtXPackage code required \#\ % doubling. The new does not, and this is not backwards compatible. By % suggestion from David Carlisle we change the code a little such that % \#\ is needed} % We add a \cs{temp} trick suggested by David Carlisle as the old code % required \#\ doubling and the new does not. To be backwards % compatible we force required \#\ doubling. % \changes{v3.7q}{2022/01/07}{The LaTeX team reversed the order of the % hook name} % \begin{macrocode} \newcommand\AtBeginPackage[2]{\def\temp{\AddToHook{package/#1/before}{#2}}\temp} \newcommand\AtEndPackage[2]{\def\temp{\AddToHook{package/#1/after}{#2}}\temp} \newcommand{\RequireAtEndPackage}[2]{% \@ifpackageloaded{#1}{#2}{\AtEndPackage{#1}{#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. % \changes{v3.7n}{2020/10/04}{The old AtXPackage code required \#\ % doubling. The new does not, and this is not backwards compatible. By % suggestion from David Carlisle we change the code a little such that % \#\ is needed} % We add a \cs{temp} trick suggested by David Carlisle as the old code % required \#\ doubling and the new does not. To be backwards % compatible we force required \#\ doubling. % \changes{v3.7q}{2022/01/07}{The LaTeX team reversed the order of the % hook name} % \begin{macrocode} \newcommand\AtBeginClass[2]{\def\temp{\AddToHook{class/#1/before}{#2}}\temp} \newcommand\AtEndClass[2]{\def\temp{\AddToHook{class/#1/after}{#2}}\temp} \newcommand{\RequireAtEndClass}[2]{% \@ifclassloaded{#1}{#2}{\AtEndClass{#1}{#2}}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \begin{macrocode} }{% back to the code for older formats % \end{macrocode} % \noindent % Here follows the old code, which will still be used on older formats: % % 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} % and as of 2019/10/01: % \begin{verbatim} % \DeclareRobustCommand \InputIfFileExists[2]{% % \IfFileExists{#1}% % {\expandafter\@swaptwoargs\expandafter % {\@filef@und}{#2\@addtofilelist{#1}\@@input}}} % \end{verbatim} % Just to make sure we still work on formats prior and after % 2019/10/01 we `redefine' both % % \begin{macro}{\InputIfFileExists} % Effectively all file input is handled by this macro. Extend it % by adding pre- and post- input hooks. % % \changes{3.7i}{2019/10/22}{Added latest kernel changes, special % thanks to Phelype Oleinik} % \begin{macrocode} \ifcsname InputIfFileExists \endcsname% looking for an explicit space % here aka the robust version \DeclareRobustCommand \InputIfFileExists[2]{% \IfFileExists{#1}% {% \expandafter\@swaptwoargs\expandafter {\@filef@und\m@matendf{#1}\killm@matf{#1}}{% #2\@addtofilelist{#1}\m@matbeginf{#1}\@@input% }% }% } \else % Old definition \renewcommand{\InputIfFileExists}[2]{% \IfFileExists{#1}% {#2\@addtofilelist{#1}\m@matbeginf{#1}% \@@input \@filef@und \m@matendf{#1}% \killm@matf{#1}}} \fi % \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. % ^^A \begin{macrocode} % ^^A we use the better defintion below % ^^A % \newcommand*{\killm@matf}[1]{% % ^^A % \@namelet{#1-m@mfb}\relax % ^^A % \@namelet{#1-m@mfe}\relax} % ^^A % ^^A \end{macrocode} % % ^^A \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 \newcommand*{\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} % \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{macrocode} % end of else part of format check } % \end{macrocode} % % % % \begin{macro}{\phantomsection} % Whenever \Lpack{hyperref} is used and one uses fx % \cs{addcontentsline} at a place that has to hypertarget (e.g. a % counter being stepped) one adds \cs{phantomsection}. % \begin{macrocode} \newcommand{\phantomsection}{} % \end{macrocode} % \end{macro} % % ^^A dlf note: kernal macro redefinition % \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} % % As of November 2019, we load the \Lpack{iftex} package in order to % the the various processor tests. The package was updated in 2019 to % cover the functionality of the \Lpack{ifpdf}, \Lpack{ifetex}, % \Lpack{ifxetex} and \Lpack{ifluatex} packages. You can find details % about its use in \cite{IFTEX}. % \changes{v3.7i}{2019/11/11}{Changed % ifX package loading to just loading the new \Lpack{iftex} % package. At the request of the LaTeX Project Team.} % \begin{macrocode} \RequirePackage{iftex}[2019/11/07] % \end{macrocode} % The \Lpack{iftex} provides the following tests % (and several more): % \begin{macro}{\ifpdf} % True if the output mode is PDF. Useful if for example you are % working in an environment where you need to provide explicit code % for the LaTeX+dvips route. % \end{macro} % \begin{macro}{\ifxetex} % True if the XeTeX engine is being used. % \end{macro} % \begin{macro}{\ifluatex} % True if the LuaTeX engine is being used. Useful if you want to add % code that only apply under the LuaTeX based engines. % \end{macro} % % % % ^^A % Prior to 2008/07/22 the \Lpack{hyperref} package was modified in such a % ^^A % way as to produce warnings about versions of the \Lpack{ifpdf} and % ^^A % \Lpack{ifxetex} packages when \Lpack{hyperref} was used with versions % ^^A % v1.618033, % ^^A % v1.61803, or v1.618 mempatch v4.9 of the class. % ^^A % \Lpack{hyperref}'s author refused to % ^^A % make any changes to his package, insisting that emulating a package was % ^^A % `ugly hacking'. He did, though, provide an example code that could be % ^^A % added to memoir % ^^A % to use a package if it was available. I have used it for the emulations % ^^A % in this section. There will be no further changes to the class to accomodate % ^^A % any further changes to \Lpack{hyperref} --- it's easy for a package to % ^^A % determine what class is being used and make arrangements accordingly, % ^^A % especially as there are not all that many classes. There are hundreds % ^^A % of packages that might be used with a particular class and it would be % ^^A % senseless for a class to attempt to take account of everything that might % ^^A % be used with it. % ^^A % % ^^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. % ^^A % \changes{v3.7f}{2016/05/16}{Temp measure to make the class work with % ^^A % updated luatex} % ^^A % \changes{v3.7g}{2018/03/09}{\Lpack{luatex85} removed again, now % ^^A % relying on external \cs{if} packages and have rewritten the % ^^A % macros that use \cs{pdf...}} % ^^A % ^^A % \begin{macrocode} % ^^A % ^^A \ifx\pdfextension\@undefined\else % ^^A % ^^A \RequirePackage{luatex85} % ^^A % ^^A \fi % ^^A % ^^A % ^^A % ^^A % \end{macrocode} % ^^A % % ^^A % % ^^A % \begin{macro}{\ifpdf} % ^^A % This can be used to check whether or not a document is being processed % ^^A % by \LaTeX{} or pdf\LaTeX. We will simply require the \Lpack{ifpdf} package. % ^^A % \changes{v1.0}{2001/09/21}{Made checking of \cs{pdfouput} more robust} % ^^A % \changes{v1.618}{2005/09/03}{Prohibit loading the ifpdf package (mempatch v3.9)} % ^^A % \changes{v1.618033}{2008/06/02}{Further improved pdf checking} % ^^A % \changes{v1.6180339}{2008/07/23}{Use ifpdf package if available} % ^^A % \changes{v1.61803398d}{2009/12/01}{if \cs{ifpdf} is already % ^^A % defined, e.g. using \cs{RequirePackage} before \cs{documentclass}, % ^^A % then using \cs{newif}\cs{ifpdf} will cause TeX to eat up a lot of % ^^A % code. We fix this using a hint by Will Robertson.} % ^^A % \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be % ^^A % emulating \cs{if}\meta{engine} packages, you'll get an error if you % ^^A % do not have them} % ^^A % \begin{macrocode} % ^^A % \RequirePackage{ifpdf}[2017/03/15] % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\ifetex} % ^^A % Check if \texttt{etex} is being used. We will simply require the \Lpack{ifetex} package. % ^^A % \changes{v1.61803}{2008/01/30}{Added check for etex (mempatch v4.9)} % ^^A % \changes{v1.618033}{2008/06/02}{Improved check for etex} % ^^A % \changes{v1.6180339}{2008/07/23}{Use an ifetex package if available} % ^^A % \changes{v1.6180339c}{2008/12/27}{Changed ifetex message from Warning to Info} % ^^A % \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be % ^^A % emulating \cs{if}\meta{engine} packages, you'll get an error if you % ^^A % do not have them} % ^^A % \begin{macrocode} % ^^A % \RequirePackage{ifetex} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % Having supplied an \cs{ifpdf} to check if pdfLaTeX is being used, % ^^A % here's one for XeTeX. % ^^A % % ^^A % \begin{macro}{\ifxetex} % ^^A % Checks if XeTeX is being used. We will simply require the \Lpack{ifxetex} package. % ^^A % \changes{v1.61803}{2008/01/30}{Added checks for XeTeX (mempatch v4.9)} % ^^A % \changes{v1.6180339}{2008/07/23}{Use ifxetex package if available} % ^^A % \changes{v1.61803398d}{2009/12/01}{if \cs{ifxetex} is already % ^^A % defined, e.g. using \cs{RequirePackage} before \cs{documentclass}, % ^^A % then using \cs{newif}\cs{ifxetex} will cause TeX to eat up a lot of % ^^A % code. We fix this using a hint by Will Robertson.} % ^^A % \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be % ^^A % emulating \cs{if}\meta{engine} packages, you'll get an error if you % ^^A % do not have them} % ^^A % \begin{macrocode} % ^^A % \RequirePackage{ifxetex}[2010/09/12] % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\ifluatex} % ^^A % Check if \texttt{luatex} is being used. We will simply require the \Lpack{ifluatex} package. % ^^A % \changes{v1.61803}{2008/01/30}{Added check for luatex} % ^^A % \changes{v1.6180339}{2008/07/23}{Use an ifluatex package if available} % ^^A % \changes{v1.6180339c}{2008/12/31}{It seems that Heiko Oberdiek has created an % ^^A % ifluatex package.} % ^^A % \changes{v1.61803398d}{2009/12/01}{if \cs{ifluatex} is already % ^^A % defined, e.g. using \cs{RequirePackage} before \cs{documentclass}, % ^^A % then using \cs{newif}\cs{ifluatex} will cause TeX to eat up a lot of % ^^A % code. We fix this using a hint by Will Robertson.} % ^^A % \changes{v3.7g}{2018/03/08}{As of 2018, we will no longer be % ^^A % emulating \cs{if}\meta{engine} packages, you'll get an error if you % ^^A % do not have them} % ^^A % \begin{macrocode} % ^^A % \RequirePackage{ifluatex}[2016/05/16] % ^^A % % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % % % % \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} % % \changes{v3.8}{2023/08/03}{Added secret option} % \begin{macrocode} % secret extra option for testing stuff in the wild % caution 1: patching inside \ifmem@devmode ... \fi requires that all % if statements in the patch are blanced % caution 2: pathing inside \mem@devmode@run{ ... }{} does not work % if the search pattern contains # % thus added both variants \newif\ifmem@devmode \let\mem@devmode@run\@secondoftwo \DeclareOption{dev-mode}{\let\mem@devmode@run\@firstoftwo\mem@devmodetrue} % \end{macrocode} % % \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. % \changes{v3.7.19}{2022/10/28}{\cs{stockheight} and \cs{stockwidth} % may now be defined in the kernel, so we test for that} % \begin{macrocode} \@ifundefined{stockwidth}{\newdimen{\stockheight}}{} \@ifundefined{stockwidth}{\newdimen{\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} % \begin{macro}{\stockavii} % The A series, A0 --- A7. % \changes{v1.6180339c}{2008/12/26}{Extended the A and B stock/paper size % seies with A/B0 through A/B6} % \changes{v3.7i}{2019/11/04}{Added A7 stock} % \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} \newcommand*{\stockavii}{\stockheight=105mm \stockwidth=74mm} % \end{macrocode} % \end{macro} % \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} % \begin{macro}{\stockbvii} % The B series, B0 --- B7. % \changes{v3.7i}{2019/11/04}{added B7 stock} % \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} \newcommand*{\stockbvii}{\stockheight=125mm \stockwidth=88mm} % \end{macrocode} % \end{macro} % \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} % \begin{macro}{\pageavii} % The A series, A0 --- A7. % \changes{v3.7i}{2019/11/04}{added A7 paper} % \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} \newcommand*{\pageavii}{\paperheight=105mm \paperwidth=74mm} % \end{macrocode} % \end{macro} % \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} % \begin{macro}{\pagebvii} % The B series, B0 --- B7. % \changes{v3.7i}{2019/11/04}{Added B7 paper} % \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} \newcommand*{\pagebvii}{\paperheight=125mm \paperwidth=88mm} % \end{macrocode} % \end{macro} % \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} % \changes{v3.7i}{2019/11/04}{Added a7paper and b7paper options} % \begin{macrocode} \DeclareOption{a0paper}{\stockao} \DeclareOption{a1paper}{\stockai} \DeclareOption{a2paper}{\stockaii} \DeclareOption{a3paper}{\stockaiii} \DeclareOption{a4paper}{\stockaiv} \DeclareOption{a5paper}{\stockav} \DeclareOption{a6paper}{\stockavi} \DeclareOption{a7paper}{\stockavii} \DeclareOption{b0paper}{\stockbo} \DeclareOption{b1paper}{\stockbi} \DeclareOption{b2paper}{\stockbii} \DeclareOption{b3paper}{\stockbiii} \DeclareOption{b4paper}{\stockbiv} \DeclareOption{b5paper}{\stockbv} \DeclareOption{b6paper}{\stockbvi} \DeclareOption{b7paper}{\stockbvii} \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 \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} % % % % \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* % \end{macrocode} % Execute the delayed landscape switch if given % \begin{macrocode} \ifmemlandscape \setlength\@tempdima {\stockheight} \setlength\stockheight{\stockwidth} \setlength\stockwidth {\@tempdima} \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 the macro \cs{clearforchapter} according to the options (via % \cs{openleft}, \cs{openright} or \cs{openany} defined % earlier) % \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 % % \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@ % %<*10pt> \@setfontsize\normalsize\@xpt\@xiipt \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ \abovedisplayshortskip \z@ \@plus3\p@ \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ % %<*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@ % %<*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@ % %<*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@ % %<*17pt> \@setfontsize\normalsize\@xviipt{22}% \abovedisplayskip 15\p@ \@plus4\p@ \@minus8\p@ \abovedisplayshortskip \z@ \@plus4\p@ \belowdisplayshortskip 8\p@ \@plus4\p@ \@minus3\p@ % %<*20pt> \@setfontsize\normalsize\@xxpt{25}% \abovedisplayskip 20\p@ \@plus5\p@ \@minus9\p@ \abovedisplayshortskip \z@ \@plus5\p@ \belowdisplayshortskip 12.5\p@ \@plus6\p@ \@minus3\p@ % %<*25pt> \@setfontsize\normalsize\@xxvpt{30}% \abovedisplayskip 25\p@ \@plus6\p@ \@minus10\p@ \abovedisplayshortskip \z@ \@plus6\p@ \belowdisplayshortskip 15\p@ \@plus7.5\p@ \@minus4\p@ % %<*30pt> \@setfontsize\normalsize\@xxxpt{37}% \abovedisplayskip 30\p@ \@plus7\p@ \@minus11\p@ \abovedisplayshortskip \z@ \@plus7\p@ \belowdisplayshortskip 18\p@ \@plus9\p@ \@minus4\p@ % %<*36pt> \@setfontsize\normalsize\@xxxvipt{45}% \abovedisplayskip 36\p@ \@plus8\p@ \@minus12\p@ \abovedisplayshortskip \z@ \@plus8\p@ \belowdisplayshortskip 22\p@ \@plus11\p@ \@minus5\p@ % %<*48pt> \@setfontsize\normalsize\@xlviiipt{60}% \abovedisplayskip 48\p@ \@plus9\p@ \@minus13\p@ \abovedisplayshortskip \z@ \@plus9\p@ \belowdisplayshortskip 30\p@ \@plus15\p@ \@minus7\p@ % %<*60pt> \@setfontsize\normalsize\@lxpt{72}% \abovedisplayskip 60\p@ \@plus10\p@ \@minus14\p@ \abovedisplayshortskip \z@ \@plus10\p@ \belowdisplayshortskip 36\p@ \@plus18\p@ \@minus9\p@ % % \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} % \changes{v3.7r}{2022/07/26}{Make \cs{normalsize} robust in the same % manner as in \file{size10.clo}} % \begin{macrocode} \ifx\MakeRobust\@undefined \else \MakeRobust\normalsize \fi % \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}} % \changes{v3.7r}{2022/07/26}{Make robust} % \begin{macrocode} \DeclareRobustCommand{\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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % \belowdisplayskip \abovedisplayskip } % \end{macrocode} % \end{macro} % % \begin{macro}{\footnotesize} % This code is similar to that for \cs{small}. % \changes{v3.7r}{2022/07/26}{Make robust} % \begin{macrocode} \DeclareRobustCommand{\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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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@ }% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % %<*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}% % \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} % \changes{v3.7r}{2022/07/26}{Make robust} % \begin{macrocode} %<*9pt> \ifextrafontsizes \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@ivpt{5}} \else \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@vpt{6}} \fi \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@vpt{6}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@vipt{7}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xpt{12}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xipt{13.6}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xiipt{14.5}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xivpt{18}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xviipt{22}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xxpt{25}} % %<*10pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@vpt{6}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@vipt{7}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@viipt{8}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xipt{13.6}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xiipt{14.5}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xivpt{18}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xviipt{22}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xxpt{25}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xxvpt{30}} % %<*11pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@vipt{7}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@viipt{8}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@viiipt{9.5}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xiipt{14.5}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xivpt{18}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xviipt{22}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xxpt{25}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xxvpt{30}} \ifextrafontsizes \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xxxpt{37}} \else \let\HUGE=\Huge \fi % %<*12pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@viipt{8}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@viiipt{9.5}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@ixpt\@xpt} \DeclareRobustCommand{\large}{\@setfontsize\large\@xivpt{18}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xviipt{22}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xxpt{25}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xxvpt{30}} \ifextrafontsizes \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xxxpt{37}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xxxvipt{45}} \else \let\Huge=\huge \let\HUGE=\huge \fi % %<*14pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@viiipt{9.5}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@ixpt{10}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xpt{12}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xviipt{22}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xxpt{25}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xxvpt{30}} \ifextrafontsizes \DeclareRobustCommand{\huge}{\@setfontsize\Huge\@xxxpt{37}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xxxvipt{45}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xlviiipt{60}} \else \let\huge=\LARGE \let\Huge=\LARGE \let\HUGE=\LARGE \fi % %<*17pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@ixpt{10}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xpt{12}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xipt{13.6}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xxpt{25}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xxvpt{30}} \ifextrafontsizes \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xxxpt{37}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xxxvipt{45}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xlviiipt{60}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@lxpt{72}} \else \let\LARGE=\Large \let\huge=\Large \let\Huge=\Large \let\HUGE=\Large \fi % %<*20pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xpt{12}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xipt{13.6}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xiipt{14.5}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xxvpt{30}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xxxpt{37}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xxxvipt{45}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xlviiipt{60}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@lxpt{72}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@lxxiipt{86}} % %<*25pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xipt{13.6}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xiipt{14.5}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xivpt{17.5}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xxxpt{37}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xxxvipt{45}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xlviiipt{60}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@lxpt{72}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@lxxiipt{86}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@lxxxivpt{100}} % %<*30pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xiipt{14.5}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xivpt{17.5}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xviipt{22}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xxxvipt{45}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@xlviiipt{60}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@lxpt{72}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@lxxiipt{86}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@lxxxivpt{100}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@xcvipt{116}} % %<*36pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xivpt{17.5}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xviipt{22}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xxpt{25}} \DeclareRobustCommand{\large}{\@setfontsize\large\@xlviiipt{60}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@lxpt{72}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@lxxiipt{86}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@lxxxivpt{100}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@xcvipt{116}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@cviiipt{132}} % %<*48pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xviipt{22}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xxpt{25}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xxvpt{30}} \DeclareRobustCommand{\large}{\@setfontsize\large\@lxpt{72}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@lxxiipt{86}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@lxxxivpt{100}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@xcvipt{116}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@cviiipt{132}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@cxxpt{144}} % %<*60pt> \DeclareRobustCommand{\miniscule}{\@setfontsize\miniscule\@xxpt{25}} \DeclareRobustCommand{\tiny}{\@setfontsize\tiny\@xxvpt{30}} \DeclareRobustCommand{\scriptsize}{\@setfontsize\scriptsize\@xxxpt{37}} \DeclareRobustCommand{\large}{\@setfontsize\large\@lxxiipt{86}} \DeclareRobustCommand{\Large}{\@setfontsize\Large\@lxxxivpt{100}} \DeclareRobustCommand{\LARGE}{\@setfontsize\LARGE\@xcvipt{116}} \DeclareRobustCommand{\huge}{\@setfontsize\huge\@cviiipt{132}} \DeclareRobustCommand{\Huge}{\@setfontsize\Huge\@cxxpt{144}} \DeclareRobustCommand{\HUGE}{\@setfontsize\HUGE\@cxxxiipt{162}} % % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macrocode} % %<*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@} % %<*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 % % \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@} % %<*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@} % %<*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@} % %<*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@} % %<*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@} % %<*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@} % %<*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@} % %<*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@} % % % \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. Using % the kernel default and here just showing it. % \begin{macrocode} % \interlinepenalty 0 % \end{macrocode} % \end{macro} % % % \begin{macro}{\brokenpenalty} % We allow the breaking of a page after a hyphenated line. Using % the kernel default and here just showing it. % \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 larger 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} % %<*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} % %<*10pt> \setlength\headheight{12\p@} \setlength\headsep{.25in} \setlength\topskip{10\p@} \setlength\footskip{.35in} % %<*11pt> \setlength\headheight{13.6\p@} \setlength\headsep{.275in} \setlength\topskip{11\p@} \setlength\footskip{.38in} % %<*12pt> \setlength\headheight{14.5\p@} \setlength\headsep{.275in} \setlength\topskip{12\p@} \setlength\footskip{30\p@} % %<*14pt> \setlength\headheight{17.5\p@} \setlength\headsep{.30in} \setlength\topskip{14.4\p@} \setlength\footskip{.4in} % %<*17pt> \setlength\headheight{22\p@} \setlength\headsep{.30in} \setlength\topskip{14.4\p@} \setlength\footskip{.4in} % %<*20pt> \setlength\headheight{25\p@} \setlength\headsep{36\p@} \setlength\topskip{20\p@} \setlength\footskip{50\p@} % %<*25pt> \setlength\headheight{30\p@} \setlength\headsep{45\p@} \setlength\topskip{25\p@} \setlength\footskip{62\p@} % %<*30pt> \setlength\headheight{37\p@} \setlength\headsep{54\p@} \setlength\topskip{30\p@} \setlength\footskip{75\p@} % %<*36pt> \setlength\headheight{45\p@} \setlength\headsep{65\p@} \setlength\topskip{36\p@} \setlength\footskip{90\p@} % %<*48pt> \setlength\headheight{60\p@} \setlength\headsep{86\p@} \setlength\topskip{48\p@} \setlength\footskip{120\p@} % %<*60pt> \setlength\headheight{72\p@} \setlength\headsep{108\p@} \setlength\topskip{60\p@} \setlength\footskip{150\p@} % % \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@} % %<*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@} % %<*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@} % %<*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@} % %<*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@} % %<*17pt> \setlength\floatsep {15\p@ \@plus 4\p@ \@minus 4\p@} \setlength\textfloatsep{25\p@ \@plus 4\p@ \@minus 5\p@} \intextsep \floatsep % %<*20pt> \setlength\floatsep {20\p@ \@plus 4\p@ \@minus 4\p@} \setlength\textfloatsep{36\p@ \@plus 4\p@ \@minus 8\p@} \intextsep \floatsep % %<*25pt> \setlength\floatsep {24\p@ \@plus 4\p@ \@minus 4\p@} \setlength\textfloatsep{43\p@ \@plus 4\p@ \@minus 8\p@} \intextsep \floatsep % %<*30pt> \setlength\floatsep {30\p@ \@plus 6\p@ \@minus 6\p@} \setlength\textfloatsep{54\p@ \@plus 6\p@ \@minus 12\p@} \intextsep \floatsep % %<*36pt> \setlength\floatsep {36\p@ \@plus 8\p@ \@minus 8\p@} \setlength\textfloatsep{65\p@ \@plus 8\p@ \@minus 16\p@} \intextsep \floatsep % %<*48pt> \setlength\floatsep {48\p@ \@plus 12\p@ \@minus 12\p@} \setlength\textfloatsep{87\p@ \@plus 12\p@ \@minus 24\p@} \intextsep \floatsep % %<*60pt> \setlength\floatsep {60\p@ \@plus 16\p@ \@minus 16\p@} \setlength\textfloatsep{104\p@ \@plus 16\p@ \@minus 32\p@} \intextsep \floatsep % % \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@} % %<*10pt> \setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} \setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} % %<*11pt> \setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} \setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} % %<*12pt> \setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@} \setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} % %<*14pt> \setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@} \setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} % %<*17pt> \setlength\dblfloatsep {15\p@ \@plus 4\p@ \@minus 4\p@} \setlength\dbltextfloatsep{25\p@ \@plus 5\p@ \@minus 5\p@} % %<*20pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % %<*25pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % %<*30pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % %<*36pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % %<*48pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % %<*60pt> \dblfloatsep \floatsep \dbltextfloatsep \textfloatsep % % \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} % %<*10pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{8\p@ \@plus 2fil} \setlength\@fpbot{0\p@ \@plus 1fil} % %<*11pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{8\p@ \@plus 2fil} \setlength\@fpbot{0\p@ \@plus 1fil} % %<*12pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{10\p@ \@plus 2fil} \setlength\@fpbot{0\p@ \@plus 1fil} % %<*14pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{10\p@ \@plus 2fil} \setlength\@fpbot{0\p@ \@plus 1fil} % %<*17pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{12\p@ \@plus 2fil} \setlength\@fpbot{0\p@ \@plus 1fil} % %<*20pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{17\p@ \@plus 2fil} \@fpbot \@fptop % %<*25pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{21\p@ \@plus 2fil} \@fpbot \@fptop % %<*30pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{26\p@ \@plus 2fil} \@fpbot \@fptop % %<*36pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{31\p@ \@plus 2fil} \@fpbot \@fptop % %<*48pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{42\p@ \@plus 2fil} \@fpbot \@fptop % %<*60pt> \setlength\@fptop{0\p@ \@plus 1fil} \setlength\@fpsep{50\p@ \@plus 2fil} \@fpbot \@fptop % % \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} % %<*10pt> \setlength\@dblfptop{0\p@ \@plus 1fil} \setlength\@dblfpsep{8\p@ \@plus 2fil} \setlength\@dblfpbot{0\p@ \@plus 1fil} % %<*11pt> \setlength\@dblfptop{0\p@ \@plus 1fil} \setlength\@dblfpsep{8\p@ \@plus 2fil} \setlength\@dblfpbot{0\p@ \@plus 1fil} % %<*12pt> \setlength\@dblfptop{0\p@ \@plus 1fil} \setlength\@dblfpsep{10\p@ \@plus 2fil} \setlength\@dblfpbot{0\p@ \@plus 1fil} % %<*14pt> \setlength\@dblfptop{0\p@ \@plus 1fil} \setlength\@dblfpsep{12\p@ \@plus 2fil} \setlength\@dblfpbot{0\p@ \@plus 1fil} % %<*17pt> \setlength\@dblfptop{0\p@ \@plus 1fil} \setlength\@dblfpsep{12\p@ \@plus 2fil} \setlength\@dblfpbot{0\p@ \@plus 1fil} % %<*20pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % %<*25pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % %<*30pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % %<*36pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % %<*48pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % %<*60pt> \@dblfptop \@fptop \@dblfpsep \@fpsep \@dblfpbot \@dblfptop % % \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@} % %<*17pt|20pt|25pt|30pt|36pt|48pt|60pt> \setlength\marginparsep{1em} % \else %<*9pt|10pt|11pt|12pt|14pt> \setlength\marginparsep{7\p@} % %<*17pt|20pt|25pt|30pt|36pt|48pt|60pt> \setlength\marginparsep{0.7em} % \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} % % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macrocode} % %<*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 in case 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} % % \changes{v3.7k}{2020/03/25}{Added a link to \cs{mem@fixpagelayout}} % \begin{macrocode} \let\refixpagelayout\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 <> % ^^A % setpagedevice end} % duplex % ^^A % \special{!TeXDict begin <> % ^^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. % 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}} % \changes{v3.7k}{2020/03/15}{Added \cs{setpagemm} as an alias to \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} \let\setpagemm\setpagecc % \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}, \texttt{nonumber} or \texttt{notitle}) 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/notitle}. % \changes{v3.7i}{2019/11/07}{Added notitle show option and % reimplemented its checking a bit} % \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 \def\@tempa{1} \nametest{#3}{nonumber}% \ifsamename \def\@tempa{0} \else \nametest{#3}{shownumber} \ifsamename \def\@tempa{1} \else \nametest{#3}{notitle} \ifsamename \def\@tempa{2} \else \@memerror{Unknown numbering value `#3' for #1mark,\MessageBreak please use one of 'shownumber', 'nonumber' or 'notitle'}% {I expected `shownumber', `nonumber' or 'notitle'.\MessageBreak I will assume you meant `shownumber'}% \fi \fi \fi \@namedef{#1markst}##1{##1} \ifcase\@tempa\relax % nonumber \@namedef{#1marksn}{\@gobble}% \or % 1 % shownumber \@namedef{#1marksn}##1{##1} \or % 2, 2 implies shownumber % shownumber \@namedef{#1marksn}##1{##1} \@namedef{#1markst}{\@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 % \end{macrocode} % \changes{v3.7i}{2019/11/07}{Added macro to get rid of the title if needed} % \begin{macrocode} \@nameuse{#1markst}{##1}% }% }% {}% just left }% \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% % \end{macrocode} % \changes{v3.7i}{2019/11/07}{Added macro to get rid of the title if needed} % \begin{macrocode} \@nameuse{#1markst}{##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 % \end{macrocode} % \changes{v3.7i}{2019/11/07}{Added macro to get rid of the title if needed} % \begin{macrocode} \@nameuse{#1markst}{##1}% }% }{% \memUChead{% \ifnum \c@secnumdepth > \c@@memmarkcntra \if@mainmatter \@nameuse{#1marksn}{#4\@nameuse{the#1}#5}% \fi \fi % \end{macrocode} % \changes{v3.7i}{2019/11/07}{Added macro to get rid of the title if needed} % \begin{macrocode} \@nameuse{#1markst}{##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*} } % \changes{v3.8}{2023/05/08}{Reimplemented as a single macro via \RenewDocumentCommand} % \begin{macrocode} \RenewDocumentCommand\pagenumbering{sm}{% \gdef\thepage{\csname @#2\endcsname \c@page}% \IfBooleanF{#1}{\global\c@page \@ne}% reset counter unless starred } % \end{macrocode} % \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. % \changes{v3.8}{2023/08/08}{\cs{@setsize} redef removed. It came from % setspace.sty which note that it was needed for some 209 packages. In % the kernel it is just defined to use \cs{@setfontsize}. We remove it} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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. If the format version % supports it we add it via a cmd hook, if not, we delay until the % start of the document and use the older definition. Note that the % hook cannot access the arguments given to \cs{@xfloat}, luckily it % stores \#1 in \cs{@captype}. % \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}} % \changes{v3.8}{2023/05/08}{Additions to \cs{@xfloat} now added % via a cmd/after hook if the format supports it} % \changes{v3.8.1}{2023/08/21}{Changed the hook to add to % \cs{@floatboxreset} as the \Lpack{float} package redefines % \cs{@xfloat} so the Hook cannot access it.} % \begin{macrocode} \IfFormatAtLeastTF{2021/04/20}{% \AddToHook{cmd/@floatboxreset/after}{% \def\baselinestretch{\m@m@float@spacing}% \normalsize% \@nameuse{\@captype adjustment}% } }{% \AtBeginDocument{% % \typeout{Old kernel, redefining \string\@xfloat\ instead of using a hook} \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. The hooks are placed before title, before author, before % date and after date respectively. % \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 \memRTLleftskip\thanksmarksep\relax \advance\memRTLleftskip\thanksmarkwidth \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} % and as a default sets \pstyle{title} to point to \pstyle{plain}. % \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} % \medskip % \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 % French 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. % \changes{v3.7.19}{2022/10/25}{Changing \cs{theH...} definitions to % \cs{def} for better compability with future hyperref} % \changes{v3.8}{2023/06/20}{Changed \cs{theHbook} to use % \cs{the}\cs{value\{counter\}} as packages can mess up \cs{arabic} % advise from Ulrike} % \begin{macrocode} \def\theHbook{\the\value{book}} \def\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} % Hooks. Arguments given for \cs{membookinfo} will be \cs{thebook} % (unless secnumdepth), the data for the toc and the title. The % argument for \cs{membookstarinfo} (starred version) will just be % the title. % \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} % Hooks for the part data. Arguments as listed. Though first arg for % \cs{mempartinfo} might be empty if secnumdepth say so. % % \medskip\noindent % \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}. % \changes{v3.70.20}{2023/07/24}{Redef of \cs{M@gettitle} requires % expansion for macro arguments} % \begin{macrocode} \ifheadnameref\ExpandArgs{V}\M@gettitle\f@rhdr\else\ExpandArgs{V}\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% {% \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 % \else \printchapternonum \fi % \end{macrocode} % Typeset the title. % \begin{macrocode} \interlinepenalty\@M \printchaptertitle{#1} % \afterchaptertitle % }} % \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. % \changes{v3.70.20}{2023/07/24}{Redef of \cs{M@gettitle} requires % expansion for macro arguments} % \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\ExpandArgs\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 {% \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. % % \medskip\noindent % \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\memRTLraggedright}% \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]{% \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\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\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} % \item store the name of the type in \cs{m@msecn@me} % \end{itemize} % The original is in \file{latex.ltx}. \\ % \cs{@startsection}\marg{name}\marg{level}\marg{indent} \\ % \hspace*{1.5in} \marg{beforeskip}\marg{afterskip}\marg{style} % % In order to make experiments with the tagging code, we only make the % redefinition, if \textsf{dev-mode} is not active. Otherwise we % patch. It is intentional that the patches are ``talkative''. % \changes{v3.8.2}{2023/08/24}{Forgot to add this patching branch in 3.8} % \begin{macrocode} \ifmem@devmode % \end{macrocode} % The first patch add the block hook, the raggedbottom secton code, % and the storing of the name of the section type. % \begin{macrocode} \patchcmd\@startsection{% \if@noskipsec \leavevmode \fi% }{% \@nameuse{#1block}% \ifraggedbottomsection\if@nobreak\else \vskip\z@\@plus\bottomsectionskip \penalty\bottomsectionpenalty \vskip\z@\@plus -\bottomsectionskip \fi\fi \def\m@msecn@me{#1}% \if@noskipsec \leavevmode \fi% }% {\typeout{\string\@startsection\space patch 1 success}} {\typeout{\string\@startsection\space patch 1 failed}} % \end{macrocode} % The second patch adds a small adjustment that help counter the % effect of a non-zero \cs{parskip} % \begin{macrocode} \patchcmd\@startsection{% \addpenalty\@secpenalty\addvspace\@tempskipa% }{% \addpenalty\@secpenalty\addvspace\@tempskipa \addvspace{-\parskip}% <--- added 2011/03/02 }% {\typeout{\string\@startsection\space patch 2 success}} {\typeout{\string\@startsection\space patch 2 failed}} % \end{macrocode} % The third patch completely replaces % \begin{verbatim} % \@ifstar % {\@ssect{#3}{#4}{#5}{#6}}% % {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}} % \end{verbatim} % as we need to handle two optional args not just the normal % 1. Perhaps there are better ways. % \begin{macrocode} \patchcmd\@startsection{% \@ifstar% {\@ssect{#3}{#4}{#5}{#6}}% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% }{% \@ifstar% {\@ssect{#3}{#4}{#5}{#6}}% {\@trplargoom{\M@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% }% {\typeout{\string\@startsection\space patch 3 success}} {\typeout{\string\@startsection\space patch 3 failed}} \else % standard branch for dev-mode false % \end{macrocode} % Then the normal redefinition % \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 dev-mode-else branch for \cs{@startsection}: % \begin{macrocode} \fi % en dev-mode else branch % \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}{\@sect} % \changes{v3.8}{2023/07/24}{Added patch.} % The \Lpack{pdfpages} package assumes \cs{@sect} in order to add % stuff to say \cs{@currentlabelname}. So in case others use it we map \cs{@sect}. % \begin{macrocode} \def\@sect#1#2#3#4#5#6[#7]#8{\M@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}][{#7}]{#8}} % \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\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\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\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\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\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\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\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\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\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\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\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\memRTLraggedright}% % subsection \setbeforesubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}% \setaftersubsecskip{1.5ex \@plus .2ex}% \setsubsecheadstyle{\normalfont\large\sffamily\bfseries\memRTLraggedright}% % subsubsection \setbeforesubsubsecskip{-3.25ex \@plus -1ex \@minus -.2ex}% \setaftersubsubsecskip{1.5ex \@plus .2ex}% \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\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\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\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\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\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\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} % \changes{v3.7p}{2021/06/16}{Moved \cs{theHchapter} def here from % \Lpack{memhfixc}. (discovered by Lars Hoemke, private email 20 Feb 2003)} \newcommand{\@resets@pp}{% \par \@ppsavesec \setcounter{section}{0}% \setcounter{chapter}{0}% \renewcommand\@chapapp{\appendixname}% \renewcommand\thechapter{\@Alph\c@chapter}% \restoreapp \def\theHchapter{\Alph{chapter}} } % \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. % \changes{v3.7p}{2021/06/16}{Moved \cs{theHsection} def here instead % of in \Lpack{memhfixc}, Problem reported by Ignasi Furio, private email 13 May 2004} % \begin{macrocode} \newcommand{\@resets@ppsub}{ \par \setcounter{section}{0} \renewcommand{\thesection}{\setthesection} \def\theHsection{\theHchapter.\Alph{section}} } % \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} % We end by redefining \cs{theHsection} introduced in \cs{@resets@ppsub} % \changes{v3.7p}{2021/06/16}{Moved redef of \cs{theHsection} here instead % of in \Lpack{memhfixc}} % \changes{v3.8}{2023/06/20}{Changed \cs{theHsection} to use % \cs{the}\cs{value\{counter\}} as packages can mess up \cs{arabic} % advise from Ulrike} % \begin{macrocode} }{% \def\theHsection{\theHchapter.\the\value{section}} } % \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[]{}{}? 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}{% \memRTLleftskip\@flushglue \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 \memRTLrightskip\@rightskip \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}{% \memRTLleftskip\@flushglue \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@ \memRTLleftskip \z@ \@plus 1fill \memRTLrightskip\@flushglue \parfillskip \z@ \everypar{\hskip \z@ \@plus -1fill}} % \end{macrocode} % \end{macro} % % \begin{macro}{\raggedwrap} % % \changes{v3.8.2}{2024/01/25}{Code moved here from the verbatim % section. The code where it was uses has been removed, but the % macro might still be interesting.} % % \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} % \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}} % \changes{v3.7.19}{2022/10/25}{Changing \cs{theH...} definitions to % \cs{def} for better compability with future hyperref} % \begin{macrocode} \newcounter{verse} \setcounter{verse}{0} \def\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. % \changes{v3.8}{2023/06/20}{Changed \cs{theHpoem} to % \cs{providecommand} per request of the kernel team} % \begin{macrocode} \newcounter{poem}\setcounter{poem}{0} \renewcommand*{\thepoem}{\@arabic\c@poem} \providecommand*{\theHpoem}{\the\value{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. % \changes{v3.70.20}{2023/07/24}{Redef of \cs{M@gettitle} requires % expansion for macro arguments} % \begin{macrocode} \ifheadnameref\ExpandArgs{V}\M@gettitle\poemf@rhdr\else\ExpandArgs{V}\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} % % \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} % % \changes{v3.7r}{2022/06/20}{Fixed sporious spaces} % \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.} % % % % \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. % % % % \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} % % \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} % % As of Summer 2023 we instead load \Lpack{booktabs} directly and % remove it from emulation. The only change from the class code and % the current \Lpack{booktabs} code was using \cmd{\bktabrule} which % never seem to be changed at all. % \changes{v3.8}{2023/07/28}{Replaced booktabs embedding by loading % \Lpack{booktabs}} % \begin{macrocode} \RequirePackage{booktabs}[2020/01/12] % \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 increase % 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} % % \begin{macro}{\@xfloat} % Was adjusted earlier. % \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. % % \changes{v3.7i}{2019/10/24}{Added a \cs{par} to the start. This can % get rid of sporadic spaces caused by hyperref changing \cs{refstepcounter}} % \changes{v3.8}{2023/08/02}{Added \cs{mem@step@subcounter} instead % of refstep} % \begin{macrocode} \newcommand{\subcaption}{% \par \bgroup \let\label=\memsub@label \ifdonemaincaption\else \advance\csname c@\@captype\endcsname\@ne \fi \mem@step@subcounter% \@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}. % \changes{v3.8}{2023/08/02}{Added \cs{mem@step@subcounter} instead % of refstep} % \begin{macrocode} \newcommand{\contsubcaption}{% \bgroup% \let\label=\memsub@label \@contset% \mem@step@subcounter% \@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}{\mem@step@subcounter} % \changes{v3.7i}{2019/10/24}{Added} % Utility macro to save some typing. % \changes{v3.8}{2023/08/02}{Added % \Lhook{memoir/subcaption/aftercounter} hook} % \begin{macrocode} \newcommand\mem@step@subcounter{% \refstepcounter{sub\@captype}\@contkeep% \UseHook{memoir/subcaption/aftercounter}% } % \end{macrocode} % \end{macro} % % \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 % \end{macrocode} % To help with hyperref target placement (hyperref usually uses % \cs{refstepcounter} to make the anchors) we move the counter % business into \cs{@memsubfloat} instead. This way they come right at % the top. % \begin{macrocode} % \changes{v3.7i}{2019/10/24}{Moved \cs{refstepcounter}} % \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 % To help with hyperref target placement (hyperref usually uses % \cs{refstepcounter} to make the anchors) we move the counter % business into \cs{@memsubfloat} instead. This way they come right at % the top. % \begin{macrocode} % \changes{v3.7i}{2019/10/24}{Moved \cs{refstepcounter}} % \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 % \end{macrocode} % We move the refstep business here to help \Lpack{hyperref} get % better anchors. % \changes{v3.7i}{2019/10/24}{moved counter stepping, additionally % changed \cs{vtop} to \cs{vbox}, otherwise we align the images at the % top} % \begin{macrocode} \vbox\bgroup% \mem@step@subcounter% \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} % Basically we want a \cmd{\label} inside the caption to set % \emph{two} labels with different values of % \cmd{\@currentlabel}. First locally \cmd{\label} is set to % \cmd{\mem@sublabel} defined as % \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} % % As of summer 2023 we are autoloading \Lpack{nameref}, thus the code % for \cmd{\sf@@memsub@label} can be greatly reduced plus we can use % the \cmd{\label} that has the \Lpack{nameref} extensions, then we % don't have to look out for changes in say \Lpack{hyperref} etc. % % \begin{macro}{\sf@memsub@label} % \changes{v3.8}{2023/07/31}{Set \cs{@currentlabelname} directly % instad of using \cs{mem@currentlabelname}} % \begin{macrocode} \def\sf@memsub@label(#1)#2{% \protected@edef\@currentlabelname{#1}% % if available we can also use % \ExpandArgs{x}\mem@set@cln{#1} \sf@@memsub@label{#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\sf@@memsub@label} % \changes{v3.8}{2023/07/31}{reimplemented} % This sets two labels, the user given one an one prefixed by % \verb?sub@?. The difference between them is the value of % \cmd{\@currentlabel}. For the latter we will aditionally locally % disable showkeys. % % First we'd like to have a copy of the ``kernel'' \cmd{\label} % command. Packages may have added stuff to make a copy at begin doc. % \begin{macro}{\mem@kernel@label} % \begin{macrocode} \AtBeginDocument{ \let\mem@kernel@label\label } % \end{macrocode} % Next we define the macro it self in terms of this % \begin{macrocode} \newcommand\sf@@memsub@label[1]{% \@bsphack% \mem@kernel@label{#1}% normal label % \end{macrocode} % Next locally redefine \cmd{\@currentlabel} so the next label only % gets the sub number. TODO: make the format % configurable. Additionally disable showkeys for this extra % label. This way we do not need a hook into the construction to % support \Lpack{showkeys} that just comes from the normal \cmd{\label}. % \begin{macrocode} \begingroup% % \ExpandArgs{x}\mem@set@cln{\@nameuse{@@thesub\@captype}} \protected@edef\@currentlabel{\@nameuse{@@thesub\@captype}}% sub@label \def\showkeyslabelformat##1{}% disable showkeys for this extra label \mem@kernel@label{sub@#1}% internally generated sub@label \endgroup% \@esphack% } % \end{macrocode} % \end{macro} % \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}{% \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} % \begin{macro}{\endsidecaption@refstepcounter} % \cs{endsidecaption} does the work for % \verb?\end{sidecaption}?. % First we define a helper macro that others can hook into. Here is % the default definition. The two arguments are either two copies of % \cs{@captype} or for the cont version, \cs{@captype} and % \texttt{memhycontfloat}. Then this macro is redefined whenever % \Lpack{hyperref} is loaded (via \Lpack{memhfixc}). The addition % eliminates the need for a full macro redef in \Lpack{memhfixc}. % \changes{v3.8.2}{2023/09/10}{Added macro at the suggestion of Axel Sommerfelt} % \begin{macrocode} \newcommand*\sidecaption@refstepcounter[2]{\refstepcounter{#1}} % \end{macrocode} % % Finish the float minipage, then increment the caption counter and % call \cs{label} via \cs{m@mscaplabel}. % \begin{macrocode} \def\endsidecaption{% \m@mscapend@fbox % \end{macrocode} % % \changes{v3.8.2}{2023/09/10}{Added macro call at the suggestion of Axel Sommerfelt} % \begin{macrocode} \sidecaption@refstepcounter\@captype\@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% % \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} % \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} % \end{macrocode} % \changes{3.8.2}{2023/09/10}{factor refstep counter as in \cs{endsidecaption}} % \begin{macrocode} \sidecaption@refstepcounter\@captype{memhycontfloat} %\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}). % \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} % % \changes{v3.8}{2023/07/25}{Entire section rewritten} % As of Summer 2023 this has been redone by directly loading the % \Lpack{nameref} package instead. It is loaded without changing the % sectional macros, which are in turn updated to set % \cs{@currentlabelname} for the new kernel label system to % pickup. The new kernel label system also requires us not to modify % \cs{label} so the switch was required. % % \begin{macro}{\titleref} % Instead of defining our own macro we now let \cs{titleref} be an % alias for \cs{nameref}. Do remember that it also have a starred % version. % \begin{macrocode} % disable nameref sectional patches (the macro just needs to be defined) \def\NR@nopatch@sectioning{set} \def\NR@nopatch@caption{set} \RequirePackage{nameref} \newcommand\titleref{\nameref} % \end{macrocode} % \end{macro} % \begin{macro}{\mem@set@cln} % We'll need to set \cs{@currentlabelname} in various places. The % title may need to be cleaned. \Lpack{nameref} provides % \cs{NR@gettitle} and we just use our own name for it. % \begin{macrocode} \def\mem@set@cln{\NR@gettitle} % \end{macrocode} % \end{macro} % % \begin{macro}{\M@gettitle} % All the sectional macros in memoir has been using \cs{M@gettitle} % for years to access the title to use for \cs{titleref}. We simply % change its definition to use our simpler case. Do remember that if % the argument for \cs{M@gettitle} is a macro, it needs to be % expanded once. % \begin{macrocode} \newcommand\M@gettitle[1]{\mem@set@cln{#1}} % \end{macrocode} % \end{macro} % % In the sectional macros the title we will be giving to % \cs{@currentlabelname} will be the title for the toc or if requested % (and avaiable) the title for the header. That is % \begin{verbatim} % \chapter{title} % sends title to toc and header, so use title % \chapter[toc]{title} % sends toc to toc and header, so use toc % \chapter[toc][header]{title} % data depends on \headnameref and % % \tocnameref (default) % \end{verbatim} % \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. Used % inside the sectional macros that support two optional arguments. % \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} % % Following the 2023 reimplementation of \cmd{\titleref} the following % public macros are no longer used and are redefined to either do % nothing or give an error. % \begin{macro}{\namerefon} % \begin{macro}{\namerefoff} % Was used to enable (default) or disable support for % \cmd{\titleref}. Now does nothing. % \begin{macrocode} \providecommand\namerefon{\@memwarn{\protect\namerefon\space no longer does anything}} \providecommand\namerefoff{\@memwarn{\protect\namerefoff\space no longer does anything}} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\currenttitle} % \cmd{\currenttitle} was advertised to give the most recent % sectional title. It is better to be more specific and use a label % and \cmd{\titleref}. Now defined to give an error. % \begin{macrocode} \providecommand\currenttitle{% \@memerror{The \protect\currenttitle\space command is no longer\MessageBreak available}{% Place a label and use \protect\titleref{label} instead } } % \end{macrocode} % \end{macro} % \begin{macro}{\theTitleReference} % Was used to define the output of \cmd{\titleref}. Now just gives a % warning. % \begin{macrocode} \providecommand\theTitleReference[2]{% \@memwarn{\protect\theTitleReference\space is no longer available} } % \end{macrocode} % \end{macro} % \begin{macro}{\M@TitleReference} % This was used in the old implementation as a part of the data inside % \verb|\newlabel| in the \verb|.aux|-files. Deleting it will cause % the first compilation after a memoir update to fail. We'll % just define it to gobble two args. % \begin{macrocode} \let\M@TitleReference\@gobbletwo % \end{macrocode} % \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. Additionally we have added a hook before the % title is being executed, it comes after \cs{phantomsection} but % before any \cs{addcontentsline} % \changes{v1.61803398d}{2010/02/14}{added the before and after hooks} % \changes{v3.7i}{2019/10/25}{moved the @\#2maketitle until after the % \cs{addcontentsline}, that way the hyperref anchor is above the % title, not below it. } % \begin{macrocode} \@namedef{cft#2beforelisthook}{}% \@namedef{cft#2afterlisthook}{}% \@namedef{mem@#1}##1{% \ensureonecol \par \begingroup \phantomsection \if##1 \ifmem@em@starred@listof\else \addcontentsline{toc}{chapter}{#3} \fi \fi \@nameuse{@#2maketitle} \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)} % \changes{v3.7.19}{2022/10/25}{Changing \cs{toclevel@part} definition to % \cs{def} for better compability with future hyperref} % \begin{macrocode} \def\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)} % \changes{v3.7.19}{2022/10/25}{Changing \cs{toclevel@chapter} definitions to % \cs{def} for better compability with future hyperref} % \begin{macrocode} \def\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)} % \changes{v3.7.19}{2022/10/25}{Changing \cs{toclevel@appendix} definitions to % \cs{def} for better compability with future hyperref} % \begin{macrocode} \newcommand*{\l@appendix}[2]{% \l@chapapp{#1}{#2}{\cftappendixname}} \def\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} % \paragraph{Caveat:} In certain cases an immediate verson of % \cs{cftinserthook} might be needed due to race conditions. We might % add such a version at some point. % % % \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)} % \changes{v3.7.19}{2022/10/25}{Changing \cs{toclevel@...} definitions to % \cs{def} for better compability with future hyperref} % \begin{macrocode} \def\toclevel@none{-10} \def\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} % \changes{v3.7i}{2019/11/15}{Changed the writing to protected} % \begin{macrocode} \newcommand{\@@@wrindexm@m}[2]{\endgroup} \AtBeginDocument{% \def\@@@wrindexm@m#1#2{% \if@filesw %\immediate\write \@idxfile{\string\indexentry{#1}{#2}}% \immediate@protected@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} % \changes{v3.8}{2023/08/08}{The kernel defined these as robust, we'd % better too} % \begin{macrocode} \DeclareRobustCommand{\raggedbottom}{% \def\mem@flshbot{01}% \def\@textbottom{\vskip\z@ plus.0001fil}% \let\@texttop\@mkidx} \DeclareRobustCommand{\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). % % % \changes{v3.7k}{2020/02/24}{Rewritten to use % \cs{immediate@protected@write} instead, otherwise UTF8 may get % written as latin1} % \begin{macrocode} \newcommand{\memwritetoglo}[5]{\endgroup} \newcommand{\@ctualm@mwritetoglo}[5]{% %\immediate\write \memglofile% \immediate@protected@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 % \def\@currentcounter{footnote}% added later % \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 % \def\@currentcounter{mpfootnote}% forgotten % \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} % \changes{v3.7o}{2021/02/24}{in 2021/05 \cs{footref} will be in the % kernel, thus we make it provide} \providecommand{\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)} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{replaced hardcoded \cs{foornotesize} % by \cs{foottextfont}} % \begin{macrocode} \long\def\@verbfootnotetext{% \insert\footins\bgroup \foottextfont% \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore \def\@currentcounter{footnote}% \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}. % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{replaced hardcoded \cs{foornotesize} % by \cs{foottextfont}} % \begin{macrocode} \long\def\@verbmpfootnotetext{% \global\setbox\@mpfootins\vbox{% \reset@font\foottextfont \unvbox\@mpfootins \bgroup \hsize\columnwidth \@parboxrestore \def\@currentcounter{mpfootnote}% \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'} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \begin{macrocode} \renewcommand{\@mpfootnotetext}[1]{% \global\setbox\@mpfootins\vbox{% \unvbox\@mpfootins \def\baselinestretch{\m@m@footnote@spacing}% \foottextfont \hsize\columnwidth \@parboxrestore \def\@currentcounter{mpfootnote}% \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 % \end{macrocode} % \changes{3.7i}{2019/05/24}{@makefntext\#1 should of course be % long. Reported on TSE by meide, https://tex.stackexchange.com/q/491303/3929} % \begin{macrocode} \@namelongdef{@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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetextX}} % \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 \def\@currentcounter{footnote}% \protected@edef\@currentlabel{% \csname p@footnote#1\endcsname\@nameuse{@thefnmark#1}}% \color@begingroup \@nameuse{@makefntext#1}{% % \end{macrocode} % \changes{v3.8.2}{2024/01/03}{Bug: \#\#1 needs to be outside of \cs{@nameuse}, reported in \url{https://tex.stackexchange.com/questions/706033/footnotes-defined-with-newfootnoteseries-dont-work/}} % \begin{macrocode} \rule\z@\footnotesep\ignorespaces\@nameuse{foottextfont#1}##1% \@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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetextX}} % \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 \def\@currentcounter{mpfootnote}% \protected@edef\@currentlabel{% \csname p@mpfootnote#1\endcsname\@nameuse{@thefnmark#1}}% \color@begingroup \@nameuse{@makefntext#1}{% \rule\z@\footnotesep\ignorespaces\@nameuse{foottextfont#1}##1% \@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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \begin{macrocode} \newcommand{\@twocolfootnotetext}[1]{\insert\footinsv@r{% \def\baselinestretch{\m@m@footnote@spacing}% \reset@font\foottextfont \@preamfntext \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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]} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetextX}} % \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \begin{macrocode} \newcommand{\@threecolfootnotetext}[1]{\insert\footinsv@r{% \def\baselinestretch{\m@m@footnote@spacing}% \reset@font\foottextfont \@preamfntext \def\@currentcounter{footnote}% \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} % % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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]} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \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 % \end{macrocode} % Multiplying \cs{dimen0} by 1024 can lead to arithmetic overflow if % \cs{baselineskip} is too large, for example under % \cs{DoubleSpacing}. Instead we only multiply by 256 and then % multiply again by 4 after the division by \cs{hsize}. % \changes{v3.7r}{2022/07/28}{Changed calculation} % \begin{macrocode} %\multiply\dimen0 by 1024 \multiply\dimen0 by 256 \divide\dimen0 by \hsize \multiply\dimen0 by 4 \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \begin{macrocode} \newcommand{\@parafootnotetext}[1]{\insert\footinsv@r{ \def\baselinestretch{\m@m@footnote@spacing}% \reset@font\foottextfont \@preamfntext \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \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} % \changes{v3.8}{2023/07/26}{adding the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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 % \end{macrocode} % Similar issue with arithmetic overflow as mentioned with \cs{paragraphfootnotes}. % \changes{v3.7r}{2022/07/28}{Changed calculation} % \begin{macrocode} %\multiply\dimen0 by 1024 \multiply\dimen0 by 256 \divide\dimen0 by \hsize \multiply\dimen0 by 4 % \end{macrocode} % \changes{v3.7r}{2022/07/28}{Changed 64 to \cs{footfudgefiddle}} % \begin{macrocode} \multiply\dimen0 by \footfudgefiddle \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{mpfootnote}% \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]} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetextX}} % \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} % \changes{v3.7q}{2022/02/20}{Added the \cs{@elt} line from the kernel} % \begin{macrocode} \newcommand*{\m@m@makecolfloats}{% \let\@elt\relax% \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. % TODO: remove this code it is not used % \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \begin{macrocode} \marginpar{% \def\baselinestretch{\m@m@footnote@spacing}% \reset@font \foottextfont \def\@currentcounter{footnote}% \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \changes{v3.8}{2023/07/27}{removed group around \cs{footnotetext}} % \begin{macrocode} \insert\footins{% \def\baselinestretch{\m@m@footnote@spacing}% \reset@font \foottextfont \@preamfntext \hsize\columnwidth \def\@currentcounter{footnote}% \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} % % If the \Lpack{footmisc} package is loaded all of our additions of % extra footnotes, side footnotes, sidebar are lost. So we add them to % their collection macro. This is especially important when % \Lpack{footmisc} \emph{and} \Lpack{reledmac} are loaded with % memoir. To play nice, we use the command hooks introduced in june 2021. % \changes{v3.7q}{2022/02/17}{Added this fix for \Lpack{footmisc}} % \begin{macrocode} \IfFormatAtLeastTF{2021-06-01}{ % adding to "hook" in footmisc \AddToHook{cmd/@makecol@appendblocks/after}{\m@mdoextrafeet\m@mopsidefoot\m@mopsidebar} }{ \AtBeginDocument{ \@ifpackagelater{footmisc}{2011/06/07}{ \@memerror{You seem to have manually updated both memoir and^^J footmisc on an older LaTeX kernel. Memoir is not compatible with footmisc^^J version 2022/02/14 v6.0b on LaTeX kernels from before 2021/06/01. Please^^J update your LaTeX installation instead of manually updating classes^^J or packages}{Update your LaTeX installation} }{} } } % \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} % \changes{v3.8}{2023/07/26}{added the missing \cs{@currentcounter}} % \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 \def\@currentcounter{sidefootnote}% \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}. % \changes{v3.7i}{2019/11/15}{changed to \cs{providecommand} and % removed the \cs{if@nobreak} line, also removed the edef part, % suggested by Davis Carlisle} % \begin{macrocode} \providecommand{\immediate@protected@write}[3]{% \begingroup #2% \let\protect\@unexpandable@protect %\edef\reserved@a{\immediate\write#1{#3}}% %\reserved@a \immediate\write#1{#3}% \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). We also add a \% at the end of the \cs{m@m@pnwrited} % process (don't think \cs{m@m@pnwrite} needs it). This is handy in % those cases where the user is using a design which rely on there not % being any spaces after the note text. % \changes{v3.6k}{2011/04/06}{Added the version with \cs{detokenize}} % \begin{macrocode} % \changes{v3.7i}{2019/06/07}{Added \cs{@percentchar} to % \cs{m@m@pnwrited}} \newcommand{\m@m@pnwrite}[3]{\immediate\write#1{#3}} \newcommand{\m@m@pnwrited}[3]{\immediate\write#1{\detokenize{#3}\@percentchar}} % \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}}% % \end{macrocode} % \changes{3.7i}{2019/05/28}{Added the special kern also if the % optional arg is empty. Otherwise the multiple marker might not work % under hyperref. Reported in private email} % \begin{macrocode} }{\m@mmf@prepare}% \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}} % \changes{v3.8}{2023/07/26}{added \cs{@currentcounter} and % defined that \cs{@currentlabel} points to} % \begin{macrocode} \newcommand\startnoteentrystart[4]{% number; manual id; auto label; href anchor \prenoteinnotes% \noteidinnotes{#1}{#2}% \phantomsection% \@ifmtarg{#2}{\def\@currentlabel{#1}}{\def\@currentlabel{#2}}% \def\@currentcounter{pagenote}% \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}} % \changes{v3.7m}{2020/08/05}{From the 2020/10/01 format, we don't % need the \cs{vskip}\texttt{-1in} and \cs{hskip}\texttt{-1in} as the % trimmarks are added in a different manner} % \begin{macrocode} \newcommand*\trimmarkscolor{} % \end{macrocode} % \changes{v3.7m}{2020/08/05}{Factored out two skips} % Factoring out two skips to make it easy to remove them in the % 2020/10/01 onwards. % \begin{macrocode} \newcommand\mem@trimmarks@initial@vskip{\vskip-1in} \newcommand\mem@trimmarks@initial@hskip{\hskip-1in} \newcommand*{\trimmarks}{% \vbox to \z@{% \mem@trimmarks@initial@vskip% \vskip\trimtop % top of logical page \hb@xt@\z@{% \mem@trimmarks@initial@hskip% \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}}} % \end{macrocode} % % \changes{v3.7m}{2020/08/05}{Removed redefinition of \cs{trimmarks} % inside \cs{quarkmarks}, it only adds an extra group compared to the % normal \cs{trimmarks}} % Removed redefintion of \cmd{\trimmarks}, seemingly no need for it. % \begin{macrocode} %% \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} % % % As of the format update 2020/10/01 a hooking mechanism was added % to the kernel. One of these provides a hook into the background of % the shipped out pages, ideal for adding trimmarks. This hooking % system saves us from messing with \cmd{\shipout} direction (in % potentially incompatible ways). % % \changes{v3.7m}{2020/08/05}{Applying a format check and adding % trimmarks via hook if available} % % Note that the hook will be named \texttt{memoir/trimmarks} of easy % reference if one ever need to do some order readjustments. See % \cite{LTHOOKS,LTSHIPOUT} for more details on the hooking system. The % extra \cmd{\ifshowtrims} inside the hook is to accommodate for the % \cmd{\showtrimson}/\cmd{\showtrimsoff} commands. % \begin{macrocode} \IfFormatAtLeastTF{2020/10/01}{ \renewcommand\mem@trimmarks@initial@vskip{} \renewcommand\mem@trimmarks@initial@hskip{} \ifshowtrims \AddToHook{shipout/background}[./trimmarks]{\ifshowtrims\put(0,0){\trimmarks}\fi} \fi }{ % \end{macrocode} % Here follows then the old code where 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} % \begin{macrocode} } % end format check, else part % \end{macrocode} % % % \section{Verbatims, boxes, and files} % % % Until January 2024 the class contained an embedded and modified % version of the \Lpack{verbatim} package where PW had added some % extra features to the verbatim system. As time have progressed the % LaTeX team has taken all the required tool packages under their wing % and continuously update them. Thus is it unfeasible to embed a % package like \Lpack{verbatim} anymore. The embeded copy have % therefore been replaced by simply loading the \Lpack{verbatim} % package. % % Eventhough we could patch in the changed PW made to \Lpack{verbatim} % we've decided against it. The two features he added was marking tabs % using a number of spaces (turned off by default) and enabling line % breaks at white space (turned off by default). It simply gets to % messy trying to patch in both features, given that the number of % users using it is probably very low. % % Note that our modified copy of \Lpack{verbatim} had all references % to \cs{leftskip} and \cs{rightskip} replaced by \cs{memRTLleftskip} % and \cs{memRTLrightskip}. For now we have no intention of patching % these into the \Lpack{verbatim} code, but it should be straight % forward if needed. % % \subsection{Additions to the verbatim package} % % \changes{v3.8.2}{2024/01/24}{Replaced embedded altered copy of % \Lpack{verbatim} with loading the package} % Load the package instead of embedding it. % \begin{macrocode} \RequirePackage{verbatim} % \end{macrocode} % % A future update (\verb|github #1245|) to \Lpack{verbatim} will enable % \cs{verbatiminput*} to mark tabs as if it was spaces. If that % version has not been released yet, we add the patch % \begin{macrocode} \@ifpackagelater{verbatim}{2024/01/21}{}{ \def\verbatiminput{\begingroup \@ifstar{\verbatim@input{\@setupverbvisiblespace\@vobeyspaces}}% {\verbatim@input{\frenchspacing\@vobeyspaces}}} } % \end{macrocode} % it of course requires an updated kernel. % % \begin{macro}{\setverbatimfont} % \begin{macro}{\m@mverbfont} % We do provide an interface to set the font used in % verbatims. Internally in \Lpack{verbatim} this is done via \cs{verbatim@font}. % \begin{macrocode} \newcommand{\setverbatimfont}[1]{\def\m@mverbfont{#1}} \setverbatimfont{\normalfont\ttfamily} \patchcmd\verbatim@font{\normalfont\ttfamily}% {\m@mverbfont}% {}% {\typeout{Paching \string\verbatim@font\space failed}} % \end{macrocode} % \end{macro} % \end{macro} % % % \subsubsection{The \texttt{comment} environment} % % The \Lpack{verbatim} package provides the \Lenv{comment} environment % that ignores its contents. This is a very useful feature, and we % would like users to be able todefine their own \Lenv{comment} like % envs. The following code is PWs original code, only difference is % that we do not define \Lenv{comment} using the code. We leave the % \Lpack{verbatim} alone. % % \begin{macro}{\setupcomment} % \cs{setupcomment} does all the \cs{let}s in the original \cs{comment} code. For reference see the \cite{VERBATIM} sources. % \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} % % % % \subsubsection{Disabled interface macros} % % These are macros that via the un-embedding are no longer % used. Relevant macros are defined to to issue a warning, others just % does not do anything. % % \changes{v3.8.2}{2024/01/24}{Added defaults for disabled macros} % Macros for enabling marking tabs in verbatim, have been % discontinued. % \begin{macrocode} \newcommand*\tabsoff{} % defined to do nothing \newcommand*\tabson{ \@memwarn{As of January 2024, \string\tabson\space has been discontinued.} } % \end{macrocode} % % Code for automatic line breaking in verbatim has been discontinued. % \begin{macrocode} \newlength\verbatimindent \newcommand*\verbatimbreakchar{} % silently does nothing as it % needs \wrappingon to be enabled \newcommand*\setverbatimbreak{} % never used \newcommand*\wrappingon{ \@memwarn{As of January 2024, \string\wrappingon\space has been discontinued.} } \newcommand*\wrappingoff{} % defined to do nothing \def\wrapright{} % internal macro no longer used % \end{macrocode} % % % \subsubsection{About the \texttt{verbatim} adjustments that have been removed} % % The adjustments PW made that we removed (in January 2024) can % actually be patched back in using the following code and % patches. Left here for reference. Will probably be removed at some % point. % % First the code needed by the patches % \begin{verbatim} % % extra hook to be added at the end of verbatims % \newtoks\afterevery@verbatim % \afterevery@verbatim={} % % code for marking tabs using a number of spaces % \newcount\tab@position % \def\mem@xobeytab{% % \typeout{\the\tab@position} % \loop % \toks@\expandafter{\the\toks@\@xobeysp}% % \advance\tab@position-1 % \ifnum\tab@position>-1 \repeat% was 0, but that never gave 4 spaces % } % \def\verbatim@tabexpand#1{% % \ifx#1\@nil % \the\toks@ % \expandafter\par % \else % \ifx#1\@xobeytab % \@xobeytab % \else % \toks@\expandafter{\the\toks@#1}% % \advance\tab@position\m@ne % \fi % \ifnum\tab@position=0 \tab@position\tab@size \fi % \expandafter\verbatim@tabexpand % \fi % } % \newif\ift@bs % \def\@maybeobeytabs{}% % % The code to enable marking tabs % \newcommand{\tabson}[1][4]{% % % firstly, has to be at least 1, so if less than one, we disable visible tabs % \ifnum\@ne > #1\relax % \typeout{#1 gives tabs off} % \tabsoff % \else % \t@bstrue % \let\@xobeytab\mem@xobeytab % \def\tab@size{#1\relax}% % \def\@maybeobeytabs{\@vobeytabs}% % \fi % } % \newcommand{\tabsoff}{% % \t@bsfalse % \def\tab@size{\z@}% % \def\@maybeobeytabs{}% % } % % default is off % \tabsoff % % \verbatim@processline is redefined to this in certain places if tabs are on % \def\tabverbatim@processline{\tab@position\tab@size% % \toks@{}% % \expandafter\verbatim@tabexpand\the\verbatim@line\@nil} % % Code for the wrapping system, \cs{raggedwrap} was moved % % elsewhere in the code so is still there. % \newcommand*{\wrappingon}{% % \def\@xobeysp{~\discretionary{\verbatimbreakchar}% % {\kern\verbatimindent}{}}% % \def\wrapright{\raggedwrap}} % \newcommand*{\wrappingoff}{% % \def\@xobeysp{\leavevmode\penalty\@M\ }% % \def\wrapright{}} % \wrappingoff % \end{verbatim} % % Next the actual patching % \begin{verbatim} % % % patch \@verbatim, two changes % % firstly change leftskip into the memoir aliases % \patchcmd\@verbatim{% % \leftskip\@totalleftmargin\rightskip\z@% % }{% % \memRTLleftskip\@totalleftmargin\memRTLrightskip\z@% % }{}{\typeout{first patch for \string\@verbatim\space failed}} % % secondly add the wrapping code at the very end, we could probably % % use the macro hook here % \patchcmd\@verbatim{% % \everypar \expandafter{\the\everypar \unpenalty}% % }{% % \everypar \expandafter{\the\everypar \unpenalty}% % \wrapright\the\afterevery@verbatim% % }{}{\typeout{second patch for \string\@verbatim\space failed}} % % % add tabs support for \verbatim % \patchcmd\verbatim{\begingroup\@verbatim}{% % \begingroup% % \ift@bs% % \def\verbatim@processline{\tabverbatim@processline}% % \fi% % \@verbatim% % }{}{\typeout{Patch 1 for \string\verbatim\space failed}} % % add tab support % \patchcmd\verbatim{\@vobeyspaces}{% % \@vobeyspaces\@maybeobeytabs% % }{}{\typeout{Patch 2 for \string\verbatim\space failed}} % % \expandafter\patchcmd\expandafter{\csname verbatim*\endcsname}% % {\begingroup\@verbatim}{% % \begingroup% % \ift@bs% % \def\verbatim@processline{\tabverbatim@processline}% % \def\@setupverbvisibletab{}% remove redef of \@xobeytab % \fi% % \@verbatim% % }{}{\typeout{Patch 1 for \string\verbatim*\space failed}} % \expandafter\patchcmd\expandafter{\csname verbatim*\endcsname}% % {\@vobeyspaces}{% % \@vobeyspaces\@maybeobeytabs% % }{}{\typeout{Patch 2 for \string\verbatim*\space failed}} % % patches for \verbatiminput, there are 3 % \patchcmd\verbatiminput{\begingroup\@ifstar}{% % \begingroup% % \ift@bs% % \def\verbatim@processline{\tabverbatim@processline}% % \fi% % \@ifstar% % }{}{\typeout{Patch 1 for \string\verbatiminput\space failed}} % % \patchcmd\verbatiminput{\@ifstar{\verbatim@input\relax}}{% % \@ifstar{\verbatim@input{\@maybeobeytabs}}% % }{}{\typeout{Patch 2 for \string\verbatiminput\space failed}} % % \patchcmd\verbatiminput{\frenchspacing\@vobeyspaces}{% % \frenchspacing\@vobeyspaces\@maybeobeytabs% % }{}{\typeout{Patch 3 for \string\verbatiminput\space failed}} % % \end{verbatim} % % % % % ^^A % All the code in this section was added for version 1.2 of the class. % ^^A % \changes{v1.2}{2002/07/27}{Section `Verbatims, boxes and files' added} % ^^A % % ^^A % \subsection{Modified version of the verbatim package} % ^^A % % ^^A % \noindent{\color{red}\rule\textwidth{5mm}} % ^^A % % ^^A % Much of this is from the \Lpack{verbatim} package code~\cite{VERBATIM}. % ^^A % Unless indicated otherwise, the code and commentary is from that % ^^A % package. % ^^A % % ^^A % % ^^A % \subsubsection{Preliminaries} % ^^A % % ^^A % \begin{macro}{\every@verbatim} % ^^A % \begin{macro}{\afterevery@verbatim} % ^^A % The hook (i.e., token register) \cs{every@verbatim} % ^^A % is initialized to \meta{empty}. % ^^A % % ^^A % PW added the \cs{afterevery@verbatim} hook. % ^^A % \begin{macrocode} % ^^A \newtoks\every@verbatim % ^^A \every@verbatim={} % ^^A \newtoks\afterevery@verbatim % ^^A \afterevery@verbatim={} % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\@makeother} % ^^A % \cs{@makeother} takes as argument a character and changes % ^^A % its category code to $12$ (other). % ^^A % \begin{macrocode} % ^^A \def\@makeother#1{\catcode`#112\relax} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\@vobeyspaces} % ^^A % The macro \cs{@vobeyspaces} causes spaces in the input % ^^A % to be printed as spaces in the output. % ^^A % % ^^A % In the Nov-2023 kernel update, some changes were made to how % ^^A % \verb|\verb| handles tabs. We need to adjust accordingly. Note % ^^A % that it will be better to just load the \Lpack{verbatim} package % ^^A % and make adjustments to it. The fix comes from \url{https://github.com/latex3/latex2e/issues/1160#issuecomment-1793564381}. % ^^A % \changes{v3.8.2}{2023/11/07}{Added fix for kernel update} % ^^A % \begin{macrocode} % ^^A \begingroup % ^^A \catcode`\ =\active% % ^^A \IfFormatAtLeastTF{2023-11-01}% % ^^A % active spaces at line beginning are absorbed as macro arguments % ^^A {\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp\@vobeytabs}}}% % ^^A {\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}}% % ^^A % was: \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}} % ^^A \expandafter\endgroup\x % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\@xobeysp} % ^^A % The macro \cs{@xobeysp} produces exactly one space in % ^^A % the output, protected against breaking just before it. % ^^A % (\cs{@M} is an abbreviation for the number $10000$.) % ^^A % \begin{macrocode} % ^^A \def\@xobeysp{\leavevmode\penalty\@M\ } % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\verbatim@line} % ^^A % We use a newly defined token register called \cs{verbatim@line} % ^^A % that will be used as the character buffer. % ^^A % \begin{macrocode} % ^^A \newtoks\verbatim@line % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % PW. I have extended the original \Lpack{verbatim} package code to handle % ^^A % TABs within verbatims. Normally TeX replaces a TAB by either a single space or % ^^A % ignores it altogether. For this purpose I have bits of code from the \Lpack{moreverb} % ^^A % package~\cite{MOREVERB} for handling TABs. % ^^A % % ^^A % \textit{Code and commentary from moreverb.} % ^^A % % ^^A % We define a few auxiliary macros and counters for expanding tabs. % ^^A % \begin{macrocode} % ^^A \newcount\tab@position % ^^A % \end{macrocode} % ^^A % % ^^A % \begin{macro}{\@xobeytab} % ^^A % \cs{@xobeytab} puts enough spaces in to get to the next nominal % ^^A % tab stop % ^^A % \begin{macrocode} % ^^A \def\@xobeytab{% % ^^A \loop % ^^A \toks@\expandafter{\the\toks@\@xobeysp}% % ^^A \advance\tab@position-1 % ^^A \ifnum\tab@position>0 \repeat % ^^A } % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\@vobeytabs} % ^^A % \cs{@vobeytabs} initialises use of \cs{@xobeytab}. Needs to be % ^^A % executed within a group, as mustn't be allowed to leak out into the % ^^A % wide world. % ^^A % % ^^A % \begin{macrocode} % ^^A \begingroup % ^^A \catcode`\^^I=\active % ^^A \gdef\@vobeytabs{\catcode`\^^I\active\let^^I\@xobeytab}% % ^^A \endgroup % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@tabexpand} % ^^A % \cs{verbatim@tabexpand}\marg{body of line}\cs{@nil} processes every % ^^A % character of a line by tail recursion, counting the characters and % ^^A % juggling things when a tab is encountered. % ^^A % \begin{macrocode} % ^^A \def\verbatim@tabexpand#1{% % ^^A \ifx#1\@nil % ^^A \the\toks@ % ^^A \expandafter\par % ^^A \else % ^^A \ifx#1\@xobeytab % ^^A \@xobeytab % ^^A \else % ^^A % \end{macrocode} % ^^A % % ^^A % We can safely put \cs{@xobeysp} into the token register, since it % ^^A % does precisely what we need % ^^A % \begin{macrocode} % ^^A \toks@\expandafter{\the\toks@#1}% % ^^A \advance\tab@position\m@ne % ^^A \fi % ^^A \ifnum\tab@position=0 \tab@position\tab@size \fi % ^^A \expandafter\verbatim@tabexpand % ^^A \fi % ^^A } % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \textit{End of code and commentary from moreverb.} % ^^A % % ^^A % PW. Some macros for turning tabbing on and off. % ^^A % % ^^A % \begin{macro}{\tabson} % ^^A % \begin{macro}{\tabsoff} % ^^A % \begin{macro}{\@maybeobeytabs} % ^^A % \cs{tabson} turns tabbing on, and \cs{tabsoff} turns it off. Default % ^^A % is no tabbing. % ^^A % \begin{macrocode} % ^^A \newif\ift@bs % ^^A \newcommand{\tabson}[1][4]{% % ^^A \ifnum\@ne > #1\relax % ^^A \tabsoff % ^^A \else % ^^A \t@bstrue % ^^A \def\tab@size{#1\relax}% % ^^A \def\@maybeobeytabs{\@vobeytabs}% % ^^A \fi % ^^A } % ^^A \newcommand{\tabsoff}{% % ^^A \t@bsfalse % ^^A \def\tab@size{\z@}% % ^^A \def\@maybeobeytabs{}% % ^^A } % ^^A \tabsoff % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\tabverbatim@processline} % ^^A % Process a line with TABs (extracted from \Lpack{moreverb}). % ^^A % \begin{macrocode} % ^^A \def\tabverbatim@processline{\tab@position\tab@size % ^^A \toks@{}% % ^^A \expandafter\verbatim@tabexpand\the\verbatim@line\@nil} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\notabverbatim@processline} % ^^A % Processes a line ignoring TABs (this is the original \Lpack{verbatim} % ^^A % package definition of \cs{verbatim@processline}). % ^^A % \begin{macrocode} % ^^A \def\notabverbatim@processline{\the\verbatim@line\par} % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \textit{We are now back to the \Lpack{verbatim} code.} % ^^A % % ^^A % The following four macros are defined globally in a way suitable for % ^^A % the \texttt{verbatim} and \texttt{verbatim*} environments. % ^^A % \begin{macro}{\verbatim@startline} % ^^A % \begin{macro}{\verbatim@addtoline} % ^^A % \begin{macro}{\verbatim@processline} % ^^A % \cs{verbatim@startline} initializes processing of a line % ^^A % by emptying the character buffer (\cs{verbatim@line}). % ^^A % \begin{macrocode} % ^^A \def\verbatim@startline{\verbatim@line{}} % ^^A % \end{macrocode} % ^^A % \cs{verbatim@addtoline} adds the tokens in its argument % ^^A % to our buffer register \cs{verbatim@line} without expanding % ^^A % them. % ^^A % \begin{macrocode} % ^^A \def\verbatim@addtoline#1{% % ^^A \verbatim@line\expandafter{\the\verbatim@line#1}} % ^^A % \end{macrocode} % ^^A % Processing a line inside a \texttt{verbatim} or \texttt{verbatim*} % ^^A % environment means printing it. % ^^A % Ending the line means that we have to begin a new paragraph. % ^^A % We use \cs{par} for this purpose. Note that \cs{par} % ^^A % is redefined in \cs{@verbatim} to force \TeX{} into horizontal % ^^A % mode and to insert an empty box so that empty lines in the input % ^^A % do appear in the output. % ^^A % (PW changed next line from \\ % ^^A % \verb?\def\verbatim@processline{\the\verbatim@line\par}? % ^^A % \begin{macrocode} % ^^A \def\verbatim@processline{\notabverbatim@processline} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@finish} % ^^A % As a default, \cs{verbatim@finish} processes the remaining % ^^A % characters. % ^^A % When this macro is called we are facing the following problem: % ^^A % when the \verb?\end{verbatim}? % ^^A % command is encountered \cs{verbatim@processline} is called % ^^A % to process the characters preceding the command on the same % ^^A % line. If there are none, an empty line would be output if we % ^^A % did not check for this case. % ^^A % % ^^A % If the line is empty \verb?\the\verbatim@line? expands to % ^^A % nothing. To test this we use a trick similar to that on p.\ 376 % ^^A % of the \TeX{}book, but with \verb?$?\ldots\verb?|$? instead of % ^^A % the \verb?!? tokens. These \verb?$? tokens can never have the same % ^^A % category code as a \verb?$? token that might possibly appear in the % ^^A % token register \cs{verbatim@line}, as such a token will always have % ^^A % been read with category code $12$ (other). % ^^A % Note that \cs{ifcat} expands the following tokens so that % ^^A % \verb?\the\verbatim@line? is replaced by the accumulated % ^^A % characters % ^^A % \begin{macrocode} % ^^A \def\verbatim@finish{\ifcat$\the\verbatim@line$\else % ^^A \verbatim@processline\fi} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \subsubsection{The \texttt{verbatim} and \texttt{verbatim*} environments} % ^^A % % ^^A % \begin{macro}{\verbatim@font} % ^^A % We start by defining the macro \cs{verbatim@font} that is % ^^A % to select the font and to set font-dependent parameters. % ^^A % Then we go through \cs{verbatim@nolig@list} to avoid % ^^A % certain ligatures. % ^^A % \cs{verbatim@nolig@list} is a macro defined in the \LaTeXe{} kernel % ^^A % to expand to % ^^A % \begin{verbatim} % ^^A % \do\`\do\<\do\>\do\,\do\'\do\- % ^^A % \end{verbatim} % ^^A % All the characters in this list can be part of a ligature in some % ^^A % font or other. % ^^A % % ^^A % PW. This is the original version which I'm going to replace. % ^^A % \begin{verbatim} % ^^A % \def\verbatim@font{\normalfont\ttfamily % ^^A % \hyphenchar\font\m@ne % ^^A % \let\do\do@noligs % ^^A % \verbatim@nolig@list} % ^^A % \end{verbatim} % ^^A % Actually the kernel defines the macro \verb+\@noligs+ which just % ^^A % runs the last two lines of the \verb+\verbatim@font+ above. As other % ^^A % package may add stuff to \verb+\@noligs+, we will use that instead. % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\setverbatimfont} % ^^A % \begin{macro}{\m@mverbfont} % ^^A % \begin{macro}{\verbatim@font} % ^^A % User level handle for changing the font used for verbatim text. % ^^A % \changes{v1.61803398}{2009/09/10}{Changed the last two lines of % ^^A % \cs{verbatim@font} into using \cs{@noligs} instead. This fixes % ^^A % problem with upquote.} % ^^A % \begin{macrocode} % ^^A \newcommand{\setverbatimfont}[1]{\def\m@mverbfont{#1}} % ^^A \setverbatimfont{\normalfont\ttfamily} % ^^A % ^^A \def\verbatim@font{\m@mverbfont % ^^A \hyphenchar\font\m@ne % ^^A \@noligs} % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\@verbatim} % ^^A % The macro \cs{@verbatim} sets up things properly. % ^^A % First of all, the tokens of the \cs{every@verbatim} hook % ^^A % are inserted. % ^^A % Then a \texttt{trivlist} environment is started and its first % ^^A % \cs{item} command inserted. % ^^A % Each line of the \texttt{verbatim} or \texttt{verbatim*} % ^^A % environment will be treated as a separate paragraph. % ^^A % \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{@verbatim}} % ^^A % \begin{macrocode} % ^^A \def\@verbatim{\the\every@verbatim % ^^A \trivlist \item \relax % ^^A % \end{macrocode} % ^^A % The following extra vertical space is for compatibility with the % ^^A % \LaTeX kernel: otherwise, using the \Lpack{verbatim} package changes % ^^A % the vertical spacing of a \texttt{verbatim} environment nested within a % ^^A % \texttt{quote} environment. % ^^A % \begin{macrocode} % ^^A \if@minipage\else\vskip\parskip\fi % ^^A % \end{macrocode} % ^^A % The paragraph parameters are set appropriately: % ^^A % the penalty at the beginning of the environment, % ^^A % left and right margins, paragraph indentation, the glue to % ^^A % fill the last line, and the vertical space between paragraphs. % ^^A % The latter space has to be zero since we do not want to add % ^^A % extra space between lines. % ^^A % \begin{macrocode} % ^^A \@beginparpenalty \predisplaypenalty % ^^A %%% \leftskip\@totalleftmargin\rightskip\z@ % ^^A \memRTLleftskip\@totalleftmargin\memRTLrightskip\z@ % ^^A \parindent\z@\parfillskip\@flushglue\parskip\z@ % ^^A % \end{macrocode} % ^^A % There's one point to make here: % ^^A % the \texttt{list} environment uses \TeX's \cs{parshape} % ^^A % primitive to get a special indentation for the first line % ^^A % of the list. % ^^A % If the list begins with a \texttt{verbatim} environment % ^^A % this \cs{parshape} is still in effect. % ^^A % Therefore we have to reset this internal parameter explicitly. % ^^A % We could do this by assigning $0$ to \cs{parshape}. % ^^A % However, there is a simpler way to achieve this: % ^^A % we simply tell \TeX{} to start a new paragraph. % ^^A % As is explained on p.~103 of the \TeX{}book, this resets % ^^A % \cs{parshape} to zero. % ^^A % \begin{macrocode} % ^^A \@@par % ^^A % \end{macrocode} % ^^A % We now ensure that \cs{par} has the correct definition, % ^^A % namely to force \TeX{} into horizontal mode % ^^A % and to include an empty box. % ^^A % This is to ensure that empty lines do appear in the output. % ^^A % Afterwards, we insert the \cs{interlinepenalty} since \TeX{} % ^^A % does not add a penalty between paragraphs (here: lines) % ^^A % by its own initiative. Otherwise a \texttt{verbatim} environment % ^^A % could be broken across pages even if a \cs{samepage} % ^^A % declaration were present. % ^^A % % ^^A % However, in a top-aligned minipage, this will result in an extra % ^^A % empty line added at the top. Therefore, a slightly more % ^^A % complicated construct is necessary. % ^^A % One of the important things here is the inclusion of % ^^A % \cs{leavevmode} as the first macro in the first line, for example, % ^^A % a blank verbatim line is the first thing in a list item. % ^^A % \begin{macrocode} % ^^A \def\par{% % ^^A \if@tempswa % ^^A \leavevmode\null\@@par\penalty\interlinepenalty % ^^A \else % ^^A \@tempswatrue % ^^A \ifhmode\@@par\penalty\interlinepenalty\fi % ^^A \fi}% % ^^A % \end{macrocode} % ^^A % But to avoid an error message when the environment % ^^A % doesn't contain any text, we redefine \cs{@noitemerr} % ^^A % which will in this case be called by \cs{endtrivlist}. % ^^A % \begin{macrocode} % ^^A \def\@noitemerr{\@warning{No verbatim text}}% % ^^A % \end{macrocode} % ^^A % Now we call \cs{obeylines} to make the end of line character % ^^A % active, % ^^A % \begin{macrocode} % ^^A \obeylines % ^^A % \end{macrocode} % ^^A % change the category code of all special characters, % ^^A % to $12$ (other). % ^^A % \begin{macrocode} % ^^A \let\do\@makeother \dospecials % ^^A % \end{macrocode} % ^^A % and switch to the font to be used. % ^^A % \begin{macrocode} % ^^A \verbatim@font % ^^A % \end{macrocode} % ^^A % To avoid a breakpoint after the labels box, we remove the penalty % ^^A % put there by the list macros: another use of \cs{unpenalty}! % ^^A % \begin{macrocode} % ^^A \everypar \expandafter{\the\everypar \unpenalty}% % ^^A % \end{macrocode} % ^^A % PW added next code at end of \cs{@verbatim}. % ^^A % \begin{macrocode} % ^^A \wrapright\the\afterevery@verbatim} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\verbatim} % ^^A % \begin{macro}{\verbatim*} % ^^A % Now we define the toplevel macros. % ^^A % \cs{verbatim} is slightly changed: % ^^A % after setting up things properly it calls % ^^A % \cs{verbatim@start}. % ^^A % This is done inside a group, so that \cs{verbatim} can be used % ^^A % directly, without \cs{begin}. % ^^A % % ^^A % PW. The following is the original code, but I want a version of % ^^A % \texttt{verbatim} that recognises TABs. % ^^A % \begin{verbatim} % ^^A % \begin{macrocode} % ^^A % \def\verbatim{% % ^^A % \begingroup\@verbatim \frenchspacing\@vobeyspaces % ^^A % \verbatim@start} % ^^A % \end{macrocode} % ^^A % \cs{verbatim*} is defined accordingly. % ^^A % \begin{macrocode} % ^^A % \@namedef{verbatim*}{\begingroup\@verbatim\verbatim@start} % ^^A % \def\endverbatim{\endtrivlist\endgroup} % ^^A % \expandafter\let\csname endverbatim*\endcsname=\endverbatim % ^^A % \end{macrocode} % ^^A % \end{verbatim} % ^^A % % ^^A % PW. My code for these is a modified version of the original \Lpack{verbatim} % ^^A % code. % ^^A % \begin{macrocode} % ^^A \def\verbatim{\begingroup % ^^A \ift@bs % ^^A \def\verbatim@processline{\tabverbatim@processline}% % ^^A \fi % ^^A \@verbatim \frenchspacing\@vobeyspaces\@maybeobeytabs\verbatim@start} % ^^A \@namedef{verbatim*}{\begingroup % ^^A \ift@bs % ^^A \def\verbatim@processline{\tabverbatim@processline}% % ^^A \fi % ^^A \@verbatim\@maybeobeytabs\verbatim@start} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\endverbatim} % ^^A % \begin{macro}{\endverbatim*} % ^^A % To end the \texttt{verbatim} and \texttt{verbatim*} % ^^A % environments it is only necessary to finish the % ^^A % \texttt{trivlist} environment started in \cs{@verbatim} and % ^^A % close the corresponding group, and handle\footnote{Noted by % ^^A % Zarko Cucej (\url{zarko.cucej@uni-mb.si}).} following (non-) paragraph, % ^^A % by using \cs{@doendpe}. % ^^A % \changes{v1.4}{2003/11/22}{Added \cs{@doendpe} to \cs{endverbatim} % ^^A % (from patch v1.8)} % ^^A % \changes{v2.0a}{2004/03/01}{Refixed \cs{endverbatim}} % ^^A % \begin{macrocode} % ^^A \def\endverbatim{\endtrivlist\endgroup\@doendpe} % ^^A \@namelet{endverbatim*}\endverbatim % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % For abnormal \cs{parskip}s the NTG class included the following, but I'm % ^^A % not sure if it is relevant here, but if it is just how it should be included. % ^^A % \begin{verbatim} % ^^A % From NTG, where it is a \cs{def} % ^^A % \providecommand*{\verbatim}{% % ^^A % \topsep=-0.5\parskip % ^^A % \@verbatim % ^^A % \frenchspacing\@vobeyspaces \@xverbatim} % ^^A % \end{verbatim} % ^^A % % ^^A % % ^^A % \subsubsection{The \texttt{comment} environment} % ^^A % % ^^A % The \cs{comment} macro is similar to \cs{verbatim*}. % ^^A % However, we do not need to switch fonts or set special % ^^A % formatting parameters such as \cs{parindent} or \cs{parskip}. % ^^A % We need only set the category code of all special characters % ^^A % to $12$ (other) and that of \verb?^^M? (the end of line character) % ^^A % to $13$ (active). % ^^A % The latter is needed for macro parameter delimiter matching in % ^^A % the internal macros defined below. % ^^A % In contrast to the default definitions used by the % ^^A % \cs{verbatim} and \cs{verbatim*} macros, % ^^A % we define \cs{verbatim@addtoline} to throw away its argument % ^^A % and \cs{verbatim@processline}, \cs{verbatim@startline}, % ^^A % and \cs{verbatim@finish} to act as no-ops. % ^^A % Then we call \cs{verbatim@}. % ^^A % But the first thing we do is to call \cs{@bsphack} so that % ^^A % this environment has no influence whatsoever upon the spacing. % ^^A % % ^^A % PW: This is the original code for the \texttt{comment} environment, % ^^A % which I'm going to change. % ^^A % \begin{verbatim} % ^^A % \def\comment{\@bsphack % ^^A % \let\do\@makeother\dospecials\catcode`\^^M\active % ^^A % \let\verbatim@startline\relax % ^^A % \let\verbatim@addtoline\@gobble % ^^A % \let\verbatim@processline\relax % ^^A % \let\verbatim@finish\relax % ^^A % \verbatim@} % ^^A % \end{verbatim} % ^^A % \cs{endcomment} is very simple: it only calls % ^^A % \cs{@esphack} to take care of the spacing. % ^^A % The \cs{end} macro closes the group and therefore takes care % ^^A % of restoring everything we changed. % ^^A % \begin{verbatim} % ^^A % \let\endcomment=\@esphack % ^^A % \end{verbatim} % ^^A % % ^^A % PW: The remainder of this section is my code. % ^^A % % ^^A % \begin{macro}{\setupcomment} % ^^A % \cs{setupcomment} does all the \cs{let}s in the original \cs{comment} code. % ^^A % \begin{macrocode} % ^^A \newcommand{\setupcomment}{% % ^^A \let\do\@makeother\dospecials\catcode`\^^M\active % ^^A \let\verbatim@startline\relax % ^^A \let\verbatim@addtoline\@gobble % ^^A \let\verbatim@processline\relax % ^^A \let\verbatim@finish\relax} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % The macros below do no checking to see if something has (not) been defined % ^^A % previously. It's `user beware' time. % ^^A % % ^^A % \begin{macro}{\newcomment} % ^^A % \cs{newcomment}\marg{name} creates a new comment environment called % ^^A % \meta{name}. This is a generalisation of the original comment code. % ^^A % \begin{macrocode} % ^^A \newcommand{\newcomment}[1]{% % ^^A \expandafter\def\csname #1\endcsname{\@bsphack\setupcomment\verbatim@}% % ^^A \expandafter\let\csname end#1\endcsname=\@esphack} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\commentsoff} % ^^A % \cs{commentsoff}\marg{name} switches off the \meta{name} comment % ^^A % environment by defining the relevent macros to do nothing. % ^^A % \begin{macrocode} % ^^A \newcommand{\commentsoff}[1]{% % ^^A \expandafter\def\csname #1\endcsname{}% % ^^A \expandafter\def\csname end#1\endcsname{}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\commentson} % ^^A % \cs{commentson}\marg{name} switches on the \meta{name} comment % ^^A % environment. It has to do the same things as \cs{newcomment} does, % ^^A % so let \cs{newcomment} do the work. % ^^A % \begin{macrocode} % ^^A \newcommand{\commentson}[1]{\newcomment{#1}} % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % We had better supply the \texttt{comment} environment, as promised. % ^^A % \begin{macrocode} % ^^A \newcomment{comment} % ^^A % ^^A % \end{macrocode} % ^^A % % ^^A % PW: That is the end of my changes and extensions to the original % ^^A % \texttt{comment} environment code. % ^^A % % ^^A % % ^^A % \subsubsection{The main loop} % ^^A % % ^^A % Here comes the tricky part: % ^^A % During the definition of the macros we need to use the special % ^^A % characters \verb?\?, \verb?{?, and \verb?}? not only with their % ^^A % normal category codes, % ^^A % but also with category code $12$ (other). % ^^A % We achieve this by the following trick: % ^^A % first we tell \TeX{} that \verb?\?, \verb?{?, and \verb?}? % ^^A % are the lowercase versions of \verb?!?, \verb?[?, and \verb?]?. % ^^A % Then we replace every occurrence of \verb?\?, \verb?{?, and \verb?}? % ^^A % that should be read with category code $12$ by \verb?!?, \verb?[?, % ^^A % and \verb?]?, respectively, % ^^A % and give the whole list of tokens to \cs{lowercase}, % ^^A % knowing that category codes are not altered by this primitive! % ^^A % % ^^A % But first we have ensure that % ^^A % \verb?!?, \verb?[?, and \verb?]? themselves have % ^^A % the correct category code! % ^^A % To allow special settings of these codes we hide their setting in % ^^A % the macro \cs{vrb@catcodes}. If it is already defined our new % ^^A % definition is skipped. % ^^A % \begin{macrocode} % ^^A \@ifundefined{vrb@catcodes}% % ^^A {\def\vrb@catcodes{% % ^^A \catcode`\!12\catcode`\[12\catcode`\]12}}{} % ^^A % \end{macrocode} % ^^A % This trick allows us to use this code for applications where other % ^^A % category codes are in effect. % ^^A % % ^^A % We start a group to keep the category code changes local. % ^^A % \begin{macrocode} % ^^A \begingroup % ^^A \vrb@catcodes % ^^A \lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\} % ^^A % \end{macrocode} % ^^A % We also need the end-of-line character \verb?^^M?, % ^^A % as an active character. % ^^A % If we were to simply write \verb?\catcode`\^^M=\active? % ^^A % then we would get an unwanted active end of line character % ^^A % at the end of every line of the following macro definitions. % ^^A % Therefore we use the same trick as above: % ^^A % we write a tilde \verb?~? instead of \verb?^^M? and % ^^A % pretend that the % ^^A % latter is the lowercase variant of the former. % ^^A % Thus we have to ensure now that the tilde character has % ^^A % category code $13$ (active). % ^^A % \begin{macrocode} % ^^A \catcode`\~=\active \lccode`\~=`\^^M % ^^A % \end{macrocode} % ^^A % The use of the \cs{lowercase} primitive leads to one problem: % ^^A % the uppercase character `\texttt{C}' needs to be used in the % ^^A % code below and its case must be preserved. % ^^A % So we add the command: % ^^A % \begin{macrocode} % ^^A \lccode`\C=`\C % ^^A % \end{macrocode} % ^^A % Now we start the token list passed to \cs{lowercase}. % ^^A % We use the following little trick (proposed by Bernd Raichle): % ^^A % The very first token in the token list we give to \cs{lowercase} is % ^^A % the \cs{endgroup} primitive. This means that it is processed by % ^^A % \TeX{} immediately after \cs{lowercase} has finished its operation, % ^^A % thus ending the group started by \cs{begingroup} above. This avoids % ^^A % the global definition of all macros. % ^^A % \begin{macrocode} % ^^A \lowercase{\endgroup % ^^A % \end{macrocode} % ^^A % \begin{macro}{\verbatim@start} % ^^A % The purpose of \cs{verbatim@start} is to check whether there % ^^A % are any characters on the same line as the \verb?\begin{verbatim}? % ^^A % and to pretend that they were on a line by themselves. % ^^A % On the other hand, if there are no characters remaining % ^^A % on the current line we shall just find an end of line character. % ^^A % \cs{verbatim@start} performs its task by first grabbing the % ^^A % following character (its argument). % ^^A % This argument is then compared to an active \verb?^^M?, % ^^A % the end of line character. % ^^A % \begin{macrocode} % ^^A \def\verbatim@start#1{% % ^^A \verbatim@startline % ^^A \if\noexpand#1\noexpand~% % ^^A % \end{macrocode} % ^^A % If this is true we transfer control to \cs{verbatim@} % ^^A % to process the next line. We use % ^^A % \cs{next} as the macro which will continue the work. % ^^A % \begin{macrocode} % ^^A \let\next\verbatim@ % ^^A % \end{macrocode} % ^^A % Otherwise, we define \cs{next} to expand to a call % ^^A % to \cs{verbatim@} followed by the character just % ^^A % read so that it is reinserted into the text. % ^^A % This means that those characters remaining on this line % ^^A % are handled as if they formed a line by themselves. % ^^A % \begin{macrocode} % ^^A \else \def\next{\verbatim@#1}\fi % ^^A % \end{macrocode} % ^^A % Finally we call \cs{next}. % ^^A % \begin{macrocode} % ^^A \next}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@} % ^^A % The three macros \cs{verbatim@}, \cs{verbatim@@}, % ^^A % and \cs{verbatim@@@} form the ``main loop'' of the % ^^A % \texttt{verbatim} environment. % ^^A % The purpose of \cs{verbatim@} is to read exactly one line % ^^A % of input. % ^^A % \cs{verbatim@@} and \cs{verbatim@@@} work together to % ^^A % find out whether the four characters % ^^A % \cs{end} (all with category code $12$ (other)) occur in that % ^^A % line. % ^^A % If so, \cs{verbatim@@@} will call % ^^A % \cs{verbatim@test} to check whether this \cs{end} is % ^^A % part of \verb?\end{verbatim}? and will terminate the environment % ^^A % if this is the case. % ^^A % Otherwise we continue as if nothing had happened. % ^^A % So let's have a look at the definition of \cs{verbatim@}: % ^^A % \begin{macrocode} % ^^A \def\verbatim@#1~{\verbatim@@#1!end\@nil}% % ^^A % \end{macrocode} % ^^A % Note that the \verb?!? character will have been replaced by a % ^^A % \verb?\? with category code $12$ (other) by the \cs{lowercase} % ^^A % primitive governing this code before the definition of this % ^^A % macro actually takes place. % ^^A % That means that % ^^A % it takes the line, puts \cs{end} (four character tokens) % ^^A % and \cs{@nil} (one control sequence token) as a % ^^A % delimiter behind it, and % ^^A % then calls \cs{verbatim@@}. % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@@} % ^^A % \cs{verbatim@@} takes everything up to the next occurrence of % ^^A % the four characters \cs{end} as its argument. % ^^A % \begin{macrocode} % ^^A \def\verbatim@@#1!end{% % ^^A % \end{macrocode} % ^^A % That means: if they do not occur in the original line, then % ^^A % argument \verb?#1? is the % ^^A % whole input line, and \cs{@nil} is the next token % ^^A % to be processed. % ^^A % However, if the four characters \cs{end} are part of the % ^^A % original line, then % ^^A % \verb?#1? consists of the characters in front of \cs{end}, % ^^A % and the next token is the following character (always remember % ^^A % that the line was lengthened by five tokens). % ^^A % Whatever \verb?#1? may be, it is verbatim text, % ^^A % so \verb?#1? is added to the line currently built. % ^^A % \begin{macrocode} % ^^A \verbatim@addtoline{#1}% % ^^A % \end{macrocode} % ^^A % The next token in the input stream % ^^A % is of special interest to us. % ^^A % Therefore \cs{futurelet} defines \cs{next} to be equal % ^^A % to it before calling \cs{verbatim@@@}. % ^^A % \begin{macrocode} % ^^A \futurelet\next\verbatim@@@}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@@@} % ^^A % \cs{verbatim@@@} will now read the rest of the tokens on % ^^A % the current line, % ^^A % up to the final \cs{@nil} token. % ^^A % \begin{macrocode} % ^^A \def\verbatim@@@#1\@nil{% % ^^A % \end{macrocode} % ^^A % If the first of the above two cases occurred, i.e.\ no % ^^A % \cs{end} characters were on that line, \verb?#1? is empty % ^^A % and \cs{next} is equal to \cs{@nil}. % ^^A % This is easily checked. % ^^A % \begin{macrocode} % ^^A \ifx\next\@nil % ^^A % \end{macrocode} % ^^A % If so, this was a simple line. % ^^A % We finish it by processing the line we accumulated so far. % ^^A % Then we prepare to read the next line. % ^^A % \begin{macrocode} % ^^A \verbatim@processline % ^^A \verbatim@startline % ^^A \let\next\verbatim@ % ^^A % \end{macrocode} % ^^A % Otherwise we have to check what follows these \cs{end} % ^^A % tokens. % ^^A % \begin{macrocode} % ^^A \else % ^^A % \end{macrocode} % ^^A % Before we continue, it's a good idea to stop for a moment % ^^A % and remember where we are: % ^^A % We have just read the four character tokens \cs{end} % ^^A % and must now check whether the name of the environment (surrounded % ^^A % by braces) follows. % ^^A % To this end we define a macro called \cs{@tempa} % ^^A % that reads exactly one character and decides what to do next. % ^^A % This macro should do the following: skip spaces until % ^^A % it encounters either a left brace or the end of the line. % ^^A % But it is important to remember which characters are skipped. % ^^A % The \cs{end}\meta{optional spaces}\verb?{? characters % ^^A % may be part of the verbatim text, i.e.\ these characters % ^^A % must be printed. % ^^A % % ^^A % Assume for example that the current line contains % ^^A % \begin{verbatim*} % ^^A % \end {AVeryLongEnvironmentName} % ^^A %\end{verbatim*} % ^^A % As we shall soon see, the scanning mechanism implemented here % ^^A % will not find out that this is text to be printed until % ^^A % it has read the right brace. % ^^A % Therefore we need a way to accumulate the characters read % ^^A % so that we can reinsert them if necessary. % ^^A % The token register \cs{@temptokena} is used for this purpose. % ^^A % % ^^A % Before we do this we have to get rid of the superfluous % ^^A % \cs{end} tokens at the end of the line. % ^^A % To this end we define a temporary macro whose argument % ^^A % is delimited by \verb?\end\@nil? (four character tokens % ^^A % and one control sequence token) to be used below % ^^A % on the rest of the line, after appending a \cs{@nil} token to it. % ^^A % (Note that this token can never appear in \verb?#1?.) % ^^A % We use the following definition of % ^^A % \cs{@tempa} to get the rest of the line (after the first % ^^A % \cs{end}). % ^^A % \begin{macrocode} % ^^A \def\@tempa##1!end\@nil{##1}% % ^^A % \end{macrocode} % ^^A % We mentioned already that we use token register % ^^A % \cs{@temptokena} % ^^A % to remember the characters we skip, in case we need them again. % ^^A % We initialize this with the \cs{end} we have thrown away % ^^A % in the call to \cs{@tempa}. % ^^A % \begin{macrocode} % ^^A \@temptokena{!end}% % ^^A % \end{macrocode} % ^^A % We shall now call \cs{verbatim@test} % ^^A % to process the characters % ^^A % remaining on the current line. % ^^A % But wait a moment: we cannot simply call this macro % ^^A % since we have already read the whole line. % ^^A % Therefore we have to first expand the macro \cs{@tempa} to insert % ^^A % them again after the \cs{verbatim@test} token. % ^^A % A \verb?^^M? character is appended to denote the end of the line. % ^^A % (Remember that this character comes disguised as a tilde.) % ^^A % \begin{macrocode} % ^^A \def\next{\expandafter\verbatim@test\@tempa#1\@nil~}% % ^^A % \end{macrocode} % ^^A % That's almost all, but we still have to % ^^A % now call \cs{next} to do the work. % ^^A % \begin{macrocode} % ^^A \fi \next}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\verbatim@test} % ^^A % We define \cs{verbatim@test} to investigate every token % ^^A % in turn. % ^^A % \begin{macrocode} % ^^A \def\verbatim@test#1{% % ^^A % \end{macrocode} % ^^A % First of all we set \cs{next} equal to \cs{verbatim@test} % ^^A % in case this macro must call itself recursively in order to % ^^A % skip spaces. % ^^A % \begin{macrocode} % ^^A \let\next\verbatim@test % ^^A % \end{macrocode} % ^^A % We have to distinguish four cases: % ^^A % \begin{enumerate} % ^^A % \item The next token is a \verb?^^M?, i.e.\ we reached % ^^A % the end of the line. That means that nothing % ^^A % special was found. % ^^A % Note that we use \cs{if} for the following % ^^A % comparisons so that the category code of the % ^^A % characters is irrelevant. % ^^A % \begin{macrocode} % ^^A \if\noexpand#1\noexpand~% % ^^A % \end{macrocode} % ^^A % We add the characters accumulated in token register % ^^A % \cs{@temptokena} to the current line. Since % ^^A % \cs{verbatim@addtoline} does not expand its argument, % ^^A % we have to do the expansion at this point. Then we % ^^A % \cs{let} \cs{next} equal to \cs{verbatim@} % ^^A % to prepare to read the next line. % ^^A % \begin{macrocode} % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\the\@temptokena}% % ^^A \verbatim@processline % ^^A \verbatim@startline % ^^A \let\next\verbatim@ % ^^A % \end{macrocode} % ^^A % \item A space character follows. % ^^A % This is allowed, so we add it to \cs{@temptokena} % ^^A % and continue. % ^^A % \begin{macrocode} % ^^A \else \if\noexpand#1 % ^^A \@temptokena\expandafter{\the\@temptokena#1}% % ^^A % \end{macrocode} % ^^A % \item An open brace follows. % ^^A % This is the most interesting case. % ^^A % We must now collect characters until we read the closing % ^^A % brace and check whether they form the environment name. % ^^A % This will be done by \cs{verbatim@testend}, so here % ^^A % we let \cs{next} equal this macro. % ^^A % Again we will process the rest of the line, character % ^^A % by character. % ^^A % The characters forming the name of the environment will % ^^A % be accumulated in \cs{@tempc}. % ^^A % We initialize this macro to expand to nothing. % ^^A % \begin{macrocode} % ^^A \else \if\noexpand#1\noexpand[% % ^^A \let\@tempc\@empty % ^^A \let\next\verbatim@testend % ^^A % \end{macrocode} % ^^A % Note that the \verb?[? character will be a \verb?{? when % ^^A % this macro is defined. % ^^A % \item Any other character means that the \cs{end} was part % ^^A % of the verbatim text. % ^^A % Add the characters to the current line and prepare to call % ^^A % \cs{verbatim@} to process the rest of the line. % ^^A % \begin{macrocode} % ^^A \else % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\the\@temptokena}% % ^^A \def\next{\verbatim@#1}% % ^^A \fi\fi\fi % ^^A % \end{macrocode} % ^^A % \end{enumerate} % ^^A % The last thing this macro does is to call \cs{next} % ^^A % to continue processing. % ^^A % \begin{macrocode} % ^^A \next}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@testend} % ^^A % \cs{verbatim@testend} is called when % ^^A % \cs{end}\meta{optional spaces}\verb?{? was seen. % ^^A % Its task is to scan everything up to the next \verb?}? % ^^A % and to call \cs{verbatim@@testend}. % ^^A % If no \verb?}? is found it must reinsert the characters it read % ^^A % and return to \cs{verbatim@}. % ^^A % The following definition is similar to that of % ^^A % \cs{verbatim@test}: % ^^A % it takes the next character and decides what to do. % ^^A % \begin{macrocode} % ^^A \def\verbatim@testend#1{% % ^^A % \end{macrocode} % ^^A % Again, we have four cases: % ^^A % \begin{enumerate} % ^^A % \item \verb?^^M?: As no \verb?}? is found in the current line, % ^^A % add the characters to the buffer. To avoid a % ^^A % complicated construction for expanding % ^^A % \cs{@temptokena} % ^^A % and \cs{@tempc} we do it in two steps. Then we % ^^A % continue with \cs{verbatim@} to process the % ^^A % next line. % ^^A % \begin{macrocode} % ^^A \if\noexpand#1\noexpand~% % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\the\@temptokena[}% % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\@tempc}% % ^^A \verbatim@processline % ^^A \verbatim@startline % ^^A \let\next\verbatim@ % ^^A % \end{macrocode} % ^^A % \item \verb?}?: Call \cs{verbatim@@testend} to check % ^^A % if this is the right environment name. % ^^A % \begin{macrocode} % ^^A \else\if\noexpand#1\noexpand]% % ^^A \let\next\verbatim@@testend % ^^A % \end{macrocode} % ^^A % \item \verb?\?: This character must not occur in the name of % ^^A % an environment. Thus we stop collecting characters. % ^^A % In principle, the same argument would apply to other % ^^A % characters as well, e.g., \verb?{?. % ^^A % However, \verb?\? is a special case, since it may be % ^^A % the first character of \cs{end}. This means that % ^^A % we have to look again for % ^^A % \cs{end}\marg{environment name} % ^^A % Note that we prefixed the \verb?!? by a \cs{noexpand} % ^^A % primitive, to protect ourselves against it being an % ^^A % active character. % ^^A % \begin{macrocode} % ^^A \else\if\noexpand#1\noexpand!% % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\the\@temptokena[}% % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\@tempc}% % ^^A \def\next{\verbatim@!}% % ^^A % \end{macrocode} % ^^A % \item Any other character: collect it and continue. % ^^A % We cannot use \cs{edef} to define \cs{@tempc} % ^^A % since its replacement text might contain active % ^^A % character tokens. % ^^A % \begin{macrocode} % ^^A \else \expandafter\def\expandafter\@tempc\expandafter % ^^A {\@tempc#1}\fi\fi\fi % ^^A % \end{macrocode} % ^^A % \end{enumerate} % ^^A % As before, the macro ends by calling itself, to % ^^A % process the next character if appropriate. % ^^A % \begin{macrocode} % ^^A \next}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@@testend} % ^^A % Unlike the previous macros \cs{verbatim@@testend} is simple: % ^^A % it has only to check if the \cs{end}\marg{...} % ^^A % matches the corresponding \cs{begin}\marg{...} % ^^A % \begin{macrocode} % ^^A \def\verbatim@@testend{% % ^^A % \end{macrocode} % ^^A % We use \cs{next} again to define the things that are % ^^A % to be done. % ^^A % Remember that the name of the current environment is % ^^A % held in \cs{@currenvir}, the characters accumulated % ^^A % by \cs{verbatim@testend} are in \cs{@tempc}. % ^^A % So we simply compare these and prepare to execute % ^^A % \cs{end}\marg{current environment} % ^^A % macro if they match. % ^^A % Before we do this we call \cs{verbatim@finish} to process % ^^A % the last line. % ^^A % We define \cs{next} via \cs{edef} so that % ^^A % \cs{@currenvir} is replaced by its expansion. % ^^A % Therefore we need \cs{noexpand} to inhibit the expansion % ^^A % of \cs{end} at this point. % ^^A % \begin{macrocode} % ^^A \ifx\@tempc\@currenvir % ^^A \verbatim@finish % ^^A \edef\next{\noexpand\end{\@currenvir}% % ^^A % \end{macrocode} % ^^A % Without this trick the \cs{end} command would not be able % ^^A % to correctly check whether its argument matches the name of % ^^A % the current environment and you'd get an % ^^A % interesting \LaTeX{} error message such as: % ^^A % \begin{verbatim} % ^^A %! \begin{verbatim*} ended by \end{verbatim*}. % ^^A %\end{verbatim} % ^^A % But what do we do with the rest of the characters, those % ^^A % that remain on that line? % ^^A % We call \cs{verbatim@rescan} to take care of that. % ^^A % Its first argument is the name of the environment just % ^^A % ended, in case we need it again. % ^^A % \cs{verbatim@rescan} takes the list of characters to be % ^^A % reprocessed as its second argument. % ^^A % (This token list was inserted after the current macro % ^^A % by \cs{verbatim@@@}.) % ^^A % Since we are still in an \cs{edef} we protect it % ^^A % by means of\cs{noexpand}. % ^^A % \begin{macrocode} % ^^A \noexpand\verbatim@rescan{\@currenvir}}% % ^^A % \end{macrocode} % ^^A % If the names do not match, we reinsert everything read up % ^^A % to now and prepare to call \cs{verbatim@} to process % ^^A % the rest of the line. % ^^A % \begin{macrocode} % ^^A \else % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\the\@temptokena[}% % ^^A \expandafter\verbatim@addtoline % ^^A \expandafter{\@tempc]}% % ^^A \let\next\verbatim@ % ^^A \fi % ^^A % \end{macrocode} % ^^A % Finally we call \cs{next}. % ^^A % \begin{macrocode} % ^^A \next}% % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@rescan} % ^^A % In principle \cs{verbatim@rescan} could be used to % ^^A % analyse the characters remaining after the \verb?\end{...}? % ^^A % command and pretend that these were read % ^^A % ``properly'', assuming ``standard'' category codes are in % ^^A % force.\footnote{Remember that they were all read with % ^^A % category codes $11$ (letter) and $12$ (other) so % ^^A % that control sequences are not recognized as such.} % ^^A % But this is not always possible (when there are unmatched % ^^A % curly braces in the rest of the line). % ^^A % Besides, we think that this is not worth the effort: % ^^A % After a \texttt{verbatim} or \texttt{verbatim*} environment % ^^A % a new line in the output is begun anyway, % ^^A % and an \verb?\end{comment}? can easily be put on a line by itself. % ^^A % So there is no reason why there should be any text here. % ^^A % For the benefit of the user who did put something there % ^^A % (a comment, perhaps) % ^^A % we simply issue a warning and drop them. % ^^A % The method of testing is explained in Appendix~D, p.\ 376 of % ^^A % the \TeX{}book. We use \verb?^^M? instead of the \verb?!? % ^^A % character used there % ^^A % since this is a character that cannot appear in \verb?#1?. % ^^A % The two \cs{noexpand} primitives are necessary to avoid % ^^A % expansion of active characters and macros. % ^^A % % ^^A % One extra subtlety should be noted here: remember that % ^^A % the token list we are currently building will first be % ^^A % processed by the \cs{lowercase} primitive before \TeX{} % ^^A % carries out the definitions. % ^^A % This means that the `\texttt{C}' character in the % ^^A % argument to the \cs{@warning} macro must be protected against % ^^A % being changed to `\texttt{c}'. That's the reason why we added the % ^^A % \verb?\lccode`\C=`\C? assignment above. % ^^A % We can now finish the argument to \cs{lowercase} as well as the % ^^A % group in which the category codes were changed. % ^^A % \begin{macrocode} % ^^A \def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else % ^^A \@warning{Characters dropped after `\string\end{#1}'}\fi}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \subsubsection{The \cs{verbatiminput} command} % ^^A % % ^^A % \begin{macro}{\verbatim@in@stream} % ^^A % We begin by allocating an input stream (out of the 16 available % ^^A % input streams). % ^^A % \begin{macrocode} % ^^A \newread\verbatim@in@stream % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@readfile} % ^^A % The macro \cs{verbatim@readfile} encloses the main loop by calls to % ^^A % the macros \cs{verbatim@startline} and \cs{verbatim@finish}, % ^^A % respectively. This makes sure % ^^A % that the user can initialize and finish the command when the file % ^^A % is empty or doesn't exist. The \texttt{verbatim} environment has a % ^^A % similar behaviour when called with an empty text. % ^^A % \begin{macrocode} % ^^A \def\verbatim@readfile#1{% % ^^A \verbatim@startline % ^^A % \end{macrocode} % ^^A % When the file is not found we issue a warning. % ^^A % \begin{macrocode} % ^^A \openin\verbatim@in@stream #1\relax % ^^A \ifeof\verbatim@in@stream % ^^A \typeout{No file #1.}% % ^^A \else % ^^A % \end{macrocode} % ^^A % At this point we pass the name of the file to \cs{@addtofilelist} % ^^A % so that its appears appears in the output of a \cs{listfiles} % ^^A % command. % ^^A % In addition, we use \cs{ProvidesFile} to make a log entry in the % ^^A % transcript file and to distinguish files read in via % ^^A % \cs{verbatiminput} from others. % ^^A % \begin{macrocode} % ^^A \@addtofilelist{#1}% % ^^A \ProvidesFile{#1}[(verbatim)]% % ^^A % \end{macrocode} % ^^A % While reading from the file it is useful to switch off the % ^^A % recognition of the end-of-line character. This saves us stripping % ^^A % off spaces from the contents of the line. % ^^A % \begin{macrocode} % ^^A \expandafter\endlinechar\expandafter\m@ne % ^^A \expandafter\verbatim@read@file % ^^A \expandafter\endlinechar\the\endlinechar\relax % ^^A \closein\verbatim@in@stream % ^^A \fi % ^^A \verbatim@finish % ^^A } % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@read@file} % ^^A % All the work is done in \cs{verbatim@read@file}. It reads the input % ^^A % file line by line and recursively calls itself until the end of % ^^A % the file. % ^^A % \begin{macrocode} % ^^A \def\verbatim@read@file{% % ^^A \read\verbatim@in@stream to\next % ^^A \ifeof\verbatim@in@stream % ^^A \else % ^^A % \end{macrocode} % ^^A % For each line we call \cs{verbatim@addtoline} with the contents of % ^^A % the line. \hskip0pt plus 3cm\penalty0\hskip0pt plus -3cm % ^^A % \cs{verbatim@processline} is called next. % ^^A % \begin{macrocode} % ^^A \expandafter\verbatim@addtoline\expandafter{\next}% % ^^A \verbatim@processline % ^^A % \end{macrocode} % ^^A % After processing the line we call \cs{verbatim@startline} to % ^^A % initialize all before we read the next line. % ^^A % \begin{macrocode} % ^^A \verbatim@startline % ^^A % \end{macrocode} % ^^A % Without \cs{expandafter} each call of \cs{verbatim@read@file} uses % ^^A % space in \TeX's input stack.\footnote{A standard \TeX\ would % ^^A % report an overflow error if you try to read a file with more than % ^^A % ca.\ 200~lines. The same error occurs if the first line of code % ^^A % in \S 390 of \textsl{``TeX: The Program''\/} is missing.} % ^^A % \begin{macrocode} % ^^A \expandafter\verbatim@read@file % ^^A \fi % ^^A } % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % % ^^A % \begin{macro}{\verbatiminput} % ^^A % \cs{verbatiminput} first starts a group to keep font and category % ^^A % changes local. % ^^A % Then it calls the macro \cs{verbatim@input} with additional % ^^A % arguments, depending on whether an asterisk follows. % ^^A % % ^^A % PW. I added the TAB checking code. % ^^A % \begin{macrocode} % ^^A \def\verbatiminput{\begingroup % ^^A \ift@bs % ^^A \def\verbatim@processline{\tabverbatim@processline}% % ^^A \fi % ^^A \@ifstar{\verbatim@input{\@maybeobeytabs}}% % ^^A {\verbatim@input{\frenchspacing\@vobeyspaces\@maybeobeytabs}}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\verbatim@input} % ^^A % \cs{verbatim@input} first checks whether the file exists, using % ^^A % the standard macro cs{IfFileExists} which leaves the name of the % ^^A % file found in \cs{@filef@und}. % ^^A % Then everything is set up as in the \cs{verbatim} macro. % ^^A % \begin{macrocode} % ^^A \def\verbatim@input#1#2{% % ^^A \IfFileExists {#2}{\@verbatim #1\relax % ^^A % \end{macrocode} % ^^A % Then it reads in the file, finishes off the \texttt{trivlist} % ^^A % environment started by \cs{@verbatim} and closes the group. % ^^A % This restores everything to its normal settings. % ^^A % \begin{macrocode} % ^^A \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}% % ^^A % \end{macrocode} % ^^A % If the file is not found a more or less helpful message is % ^^A % printed. The final \cs{endgroup} is needed to close the group % ^^A % started in \cs{verbatiminput} above. % ^^A % \begin{macrocode} % ^^A {\typeout {No file #2.}\endgroup}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \textit{That completes my borrowings from \Lpack{verbatim}.} % ^^A % % ^^A % ^^A % ^^A end embedded verbatim % ^^A % ^^A % The next bunch of code implements wrapping verbatim lines so they, hopefully, % ^^A % stay within the typeblock. % ^^A % % ^^A % \begin{macro}{\verbatimindent} % ^^A % \begin{macro}{\verbatimbreakchar} % ^^A % \begin{macro}{\setverbatimbreak} % ^^A % The length \cs{verbatimindent} is the distance continuation lines are indented % ^^A % from the left margin. \cs{verbatimbreakchar} is the character to indicate % ^^A % a wrapped line. % ^^A % \begin{macrocode} % ^^A \newlength{\verbatimindent} % ^^A \setlength{\verbatimindent}{3em} % ^^A \newcommand*{\verbatimbreakchar}{\char`\%} % ^^A \newcommand*{\setverbatimbreak}{% % ^^A \vspace*{-\baselineskip}% % ^^A \def\@xobeysp{~\discretionary{\verbatimbreakchar}% % ^^A {\kern\verbatimindent}{}}% % ^^A } % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % % ^^A % ^^A \begin{macro}{\wrappingon} % ^^A % \begin{macro}{\wrapright} % ^^A % \begin{macro}{\wrappingoff} % ^^A % \cs{wrappingon} and \cs{wrappingoff} enable/prohibit wrapping. The % ^^A % default is \cs{wrappingoff}. % ^^A % % ^^A % The macro % ^^A % \cs{wrapright} is used to set paragraph skips; without raggedright the % ^^A % lines % ^^A % may break at the first space \emph{outside} the text area. However, % ^^A % Paul (\url{paulaugust2003@yahoo.com}) found that wrapped verbatims % ^^A % in a list (e.g., \texttt{itemize}) were not indented although regular % ^^A % verbatims were indented. \cs{raggedwrap} is a variation on \cs{raggedright} % ^^A % (\cs{leftskip} is set to \cs{@totalleftmargin} instead of 0pt), and seems % ^^A % to have fixed the problem with the original code which used % ^^A % \cs{raggedright}. % ^^A % \changes{v1.61803}{2008/01/30}{Added \cs{raggedwrap} (mempatch v4.4)} % ^^A % \changes{v1.61803398}{2009/07/18}{Added bidi support to \cs{raggedwrap}} % ^^A % \begin{macrocode} % ^^A % \newcommand*{\raggedwrap}{% % ^^A % \@rightskip\@flushglue % ^^A % %%% \rightskip\@rightskip % ^^A % \memRTLrightskip\@rightskip % ^^A % %%% \leftskip\@totalleftmargin % ^^A % \memRTLleftskip\@totalleftmargin % ^^A % \parindent\ragrparindent} % ^^A \newcommand*{\wrappingon}{% % ^^A \def\@xobeysp{~\discretionary{\verbatimbreakchar}% % ^^A {\kern\verbatimindent}{}}% % ^^A \def\wrapright{\raggedwrap}} % ^^A \newcommand*{\wrappingoff}{% % ^^A \def\@xobeysp{\leavevmode\penalty\@M\ }% % ^^A \def\wrapright{}} % ^^A \wrappingoff % ^^A % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % \end{macro} % ^^A % ^^A \end{macro} % ^^A % % ^^A % \noindent{\color{red}\rule\textwidth{5mm}} % % \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} % % % \changes{v3.8.2}{2024/01/10}{Replaced embedded copy if % \Lpack{shortvrb} with loading the package. The embedded code is just % outcommented for now.} % % In earlier versions of the class we had an embedded copy of the code % from the \Lpack{shortvrb} package, as the functionality is very % useful. % % As of 2024 we load the package instead. This also gives us access to % the starred version of \verb!\MakeShortVerb!. For details see % \cite{SHORTVRB}. % % It adds the following macros % \begin{verbatim} % \MakeShortVerb % \MakeShortVerb* % \DeleteShortVerb % \end{verbatim} % \begin{macrocode} % load shortvrb instead of embedding it \RequirePackage{shortvrb} % \end{macrocode} % % ^^A % The following is the \Lpack{shortvrb} package code (from \texttt{doc.dtx} % ^^A % by Frank Mittelbach). It has been so useful to me that I wanted % ^^A % to include it in the class. % ^^A % % ^^A % CODE AND COMMENTARY IS BY FRANK MITTELBACH % ^^A % start shortvrb code % ^^A % % ^^A % \begin{macro}{\MakeShortVerb} % ^^A % \begin{macrocode} % ^^A \def\MakeShortVerb#1{% % ^^A \expandafter\ifx\csname cc\string#1\endcsname\relax % ^^A % \end{macrocode} % ^^A % \begin{macrocode} % ^^A \@shortvrbinfo{Made }{#1}% % ^^A \add@special{#1}% % ^^A % \end{macrocode} % ^^A % Then the character's current catcode is stored in \verb?\cc\?\meta{c}. % ^^A % \begin{macrocode} % ^^A \expandafter % ^^A \xdef\csname cc\string#1\endcsname{\the\catcode`#1}% % ^^A % \end{macrocode} % ^^A % The character is spliced into the definition using the same trick as % ^^A % used in \cs{verb} (for instance), having activated \verb?~? in a group. % ^^A % \begin{macrocode} % ^^A \begingroup % ^^A \catcode`\~\active \lccode`\~`#1% % ^^A \lowercase{% % ^^A % \end{macrocode} % ^^A % The character's old meaning is recorded in \verb?\ac\?\meta{c} prior to % ^^A % assigning it a new one. % ^^A % \begin{macrocode} % ^^A \global\expandafter\let % ^^A \csname ac\string#1\endcsname~% % ^^A \gdef~{\verb~}}% % ^^A \endgroup % ^^A % \end{macrocode} % ^^A % Finally the character is made active. % ^^A % \begin{macrocode} % ^^A \global\catcode`#1\active % ^^A % \end{macrocode} % ^^A % If we suspect that \meta{c} is already a short reference, we tell % ^^A % the user. Now he or she is responsible if anything goes wrong\,\dots % ^^A % \begin{macrocode} % ^^A \else % ^^A % \end{macrocode} % ^^A % \begin{macrocode} % ^^A \@shortvrbinfo\@empty{#1 already}% % ^^A \fi} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \begin{macro}{\DeleteShortVerb} % ^^A % Here's the means of undoing a \cs{MakeShortVerb}, for instance in a % ^^A % region where you need to use the character outside a verbatim % ^^A % environment. It arranges for \cs{dospecials} and \cs{@sanitize} to be % ^^A % altered appropriately, restores the saved catcode and, if necessary, % ^^A % the character's meaning (as stored by % ^^A % \cs{MakeShortVerb}). If the catcode wasn't stored in % ^^A % \verb?\cc\?\meta{c} (by \cs{MakeShortVerb}) the command is silently % ^^A % ignored. % ^^A % \begin{macrocode} % ^^A \def\DeleteShortVerb#1{% % ^^A \expandafter\ifx\csname cc\string#1\endcsname\relax % ^^A \else % ^^A % \end{macrocode} % ^^A % \begin{macrocode} % ^^A \@shortvrbinfo{Deleted }{#1 as}% % ^^A \rem@special{#1}% % ^^A \global\catcode`#1\csname cc\string#1\endcsname % ^^A % \end{macrocode} % ^^A % We must not forget to reset \verb?\cc\?\meta{c}, otherwise the check in % ^^A % \cs{MakeShortVerb} for a repeated definition will not work. % ^^A % \begin{macrocode} % ^^A \global \expandafter\let \csname cc\string#1\endcsname \relax % ^^A \ifnum\catcode`#1=\active % ^^A \begingroup % ^^A \catcode`\~\active \lccode`\~`#1% % ^^A \lowercase{% % ^^A \global\expandafter\let\expandafter~% % ^^A \csname ac\string#1\endcsname}% % ^^A \endgroup \fi \fi} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\@shortvrbinfo} % ^^A % Helper function for info messages. % ^^A % \begin{macrocode} % ^^A \def\@shortvrbinfo#1#2{% % ^^A \ClassInfo{memoir}{% % ^^A #1\expandafter\@gobble\string#2 a short reference % ^^A for \string\verb}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % \begin{macro}{\add@special} % ^^A % This helper macro adds its argument to the % ^^A % \cs{dospecials} macro which is conventionally used by verbatim macros % ^^A % to alter the catcodes of the currently active characters. We need % ^^A % to add \verb?\do\?\meta{c} to the expansion of \cs{dospecials} after % ^^A % removing the character if it was already there to avoid multiple % ^^A % copies building up should \cs{MakeShortVerb} not be balanced by % ^^A % \cs{DeleteShortVerb} (in case anything that uses \cs{dospecials} cares % ^^A % about repetitions). % ^^A % \begin{macrocode} % ^^A \def\add@special#1{% % ^^A \rem@special{#1}% % ^^A \expandafter\gdef\expandafter\dospecials\expandafter % ^^A {\dospecials \do #1}% % ^^A % \end{macrocode} % ^^A % Similarly we have to add \verb?\@makeother\?\meta{c} to \cs{@sanitize} % ^^A % (which is used in things like \cs{index} to re-catcode all special % ^^A % characters except braces). % ^^A % \begin{macrocode} % ^^A \expandafter\gdef\expandafter\@sanitize\expandafter % ^^A {\@sanitize \@makeother #1}} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % \begin{macro}{\rem@special} % ^^A % The inverse of cs{add@special} is slightly trickier. \cs{do} is % ^^A % re-defined to expand to nothing if its argument is the character of % ^^A % interest, otherwise to expand simply to the argument. We can then % ^^A % re-define \cs{dospecials} to be the expansion of itself. The space % ^^A % after \verb?=`##1? prevents an expansion to \cs{relax}! % ^^A % \begin{macrocode} % ^^A \def\rem@special#1{% % ^^A \def\do##1{% % ^^A \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}% % ^^A \xdef\dospecials{\dospecials}% % ^^A % \end{macrocode} % ^^A % Fixing \cs{@sanitize} is the same except that we need to re-define % ^^A % \cs{@makeother} which obviously needs to be done in a group. % ^^A % \begin{macrocode} % ^^A \begingroup % ^^A \def\@makeother##1{% % ^^A \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}% % ^^A \xdef\@sanitize{\@sanitize}% % ^^A \endgroup} % ^^A % \end{macrocode} % ^^A % \end{macro} % ^^A % % ^^A % end shortvrb code % ^^A % 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} % \changes{v3.8.2}{2024/01/25}{Removed tab support} % \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. % % \changes{v3.8.2}{2024/01/25}{Removed \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. % \changes{v3.8.2}{2024/01/26}{Removed tabs support and added the tab % marking support to the starred version like we did for \cs{verbatiminput}} % \begin{macrocode} \def\readverbatim{\begingroup %\ift@bs % \def\verbatim@processline{\tabverbatim@processline}% %\fi \@ifstar{\stre@mverb@input{\@setupverbvisiblespace\@vobeyspaces}}%{\@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} % \changes{v3.7l}{2020/06/02}{Added kernel wrapper} % As of the kernel/format update for october 2020, these will be moved % to the kernel, so we remove them of you are using that kernel. % \begin{macrocode} \@ifl@t@r\fmtversion{2020-10-01}{ % nothing to do with newer kernel }{% % \end{macrocode} % \begin{macro}{\medspace} % \begin{macro}{\:} % Medium space \verb?\: (\medspace) = 4/18 em? % \changes{v3.7q}{2022/02/17}{use \cs{providecommand} on \cs{medspace}} % \begin{macrocode} \providecommand{\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 kernel version wrapper % \end{macrocode} % \end{macro} % % \subsection{Fractions and subscripts} % % % Styles for fractions like 3/4 (but better). % % \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.} % % \changes{3.7i}{2019/10/22}{Made textcase into a required package instead} % % 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. % % As of October 2019, we will instead load the \texttt{textcase} % package if found. If not we resort to the old version we had % embedded. % % % \begin{macrocode} \expandafter\let\csname MemOrigMakeUppercase \expandafter\endcsname \csname MakeUppercase \endcsname \expandafter\let\csname MemOrigMakeLowercase \expandafter\endcsname \csname MakeLowercase \endcsname \def\MemRestoreOrigMakecase{ \expandafter\let\csname MakeUppercase \expandafter\endcsname \csname MemOrigMakeUppercase \endcsname \expandafter\let\csname MakeLowercase \expandafter\endcsname \csname MemOrigMakeLowercase \endcsname } \IfFileExists{textcase.sty}{ \RequirePackage[overload]{textcase} }{% resort to the % \end{macrocode} % % \MakeShortVerb{\|} % \changes{v3.7j}{2019/11/21}{Forgot to double the \# inside % \cs{IfFileExists}, also added a warning if textcase if not found on % the system} % \begin{macrocode} \@memwarn{Haven't found the textcase package,\MessageBreak resorting to embedded copy of v0.07 (2004/10/07),\MessageBreak consider installing the textcase package} %%%% Nearly a carbon copy from textcase.dtx by David Carlisle %%%% Since we are inside a \IfFileExists we need to double the #/daleif % \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{\|} % % \begin{macrocode} } % end of \IfFileExists % \end{macrocode} % % \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{Some counters} % 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} % \changes{v3.8}{2023/07/28}{booktabs no longer emulated} % \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] % \end{macrocode} % \changes{v3.7o}{2021/03/22}{removed mparhack emulation, as we don't % emulate all of it, especially not the fix for \cs{if@firstcolumn}, % instead load it if twocolumn } % \begin{macrocode} \if@twocolumn \RequirePackage{mparhack} \fi %\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} % % As of 2020, whenever the \Lpack{caption} package is loaded with the % memoir class, it will map relevant memoir captioning macros onto the % corresponding features provided by \Lpack{caption}. As this is now % done automatically, we have removed the code that reset \cs{caption} % to something more friendly to \Lpack{caption} in earler versions of % the class. % % \changes{v3.7o}{2021/03/15}{removed code to reset for the caption package} % % \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} % % % \subsection{Interaction with the \Lpack{hyperref} package} % % Ulrike Fischer has ask that the \Lpack{memhfixc} autoload is moved % from \Lpack{hyperref} to \Lpack{memoir}. % \changes{v3.7q}{2022/02/20}{Added autoloading} % \begin{macrocode} \AtEndPackage{hyperref}{\RequirePackage{memhfixc}} % \end{macrocode} % % \subsection{Default page style} % 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} % \changes{v3.7i}{2019/01/07}{Moved here because % \cs{newlistof}{...}{X}{...} also defines \cs{Xmark}, but using % \cs{markboth}, and thus if \Lopt{oneside} is active \cs{lofmark} % will still be using \cs{mathboth} and not \cs{markright} that the % \pstyle{headings} style dictates} % \begin{macrocode} \ifartopt \pagestyle{plain} \else \pagestyle{headings} \fi \pagenumbering{arabic} % \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[Car19]{TEXTCASE} % David Carlisle. % \newblock \emph{The \Lpack{textcase} package}. % \newblock September, 2019. % \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[LTX3]{LTX3} % The \LaTeX{} Project. % \newblock \emph{The \LaTeX3 sources} % \newblock June, 2023. % \newblock (Available from CTAN in \texttt{/macros/latex/contrib/l3kernel}) % % \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 \emph{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[LPT19]{IFTEX} % The \LaTeX{} Project Team. % \newblock \emph{The iftex package}. % \newblock November, 2019. % \newblock (Available from CTAN in \texttt{/macros/latex/contrib/iftex}) % % \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[Mit2020a]{LTFILEHOOK} % Frank Mittelbach % \newblock \emph{The ltfilehook package} % \newblock July 2020. % % \bibitem[Mit2023a]{LTHOOKS} % Frank Mittelbach % \newblock \emph{\LaTeX's hook management} % \newblock June 2023. % % \bibitem[Mit2020c]{LTSHIPOUT} % Frank Mittelbach % \newblock \emph{The ltshipout package} % \newblock July 2020. % % \bibitem[Mit2023b]{SHORTVRB} % Frank Mittelbach % \newblock \emph{The doc and shortvrb Packages} % \newblock November 2023. % % \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[Rah23]{NAMEREF} % Sebastian Rahtz, Heiko Oberdiek, The \LaTeX{} project. % \newblock \emph{Section name references in LaTeX}. % \newblock 2023. % \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 \~} %%