% \iffalse meta-comment
%
% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
% version 1.28 (2024-02-21) on Tuesday 27 February 2024 at 16:35:35
%
% bookshelf.dtx is copyright © 2020-2024 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 of this license or (at your option) any later
% version. The latest version of this license is in:
%
%     http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status ‘maintained’.
% 
% The current maintainer of this work is Peter Flynn <peter@silmaril.ie>
%
% This work consists of the files bookshelf.dtx and bookshelf.ins,
% and any other ancillary files listed in the MANIFEST.
%
% \fi
% \iffalse
%<*driver>
\ProvidesFile{bookshelf.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
%<class>\ProvidesClass{bookshelf}[2024/01/04 v0.8
%<class>  Package code for the bookshelf class]
%<*driver>
\PassOptionsToPackage{svgnames}{xcolor}% because dependencies dox hypdoc hyperref classpack requires svgnames
\providecommand{\CPKdocname}{bookshelf}
\providecommand{\CPKdoctype}{class}
\PassOptionsToPackage{british}{babel}% use of other (non-en-IE) languages
\documentclass[12pt]{ltxdoc}
%%
%% Packages for documentation
%%
\usepackage{dox}%
  \newcommand{\LabelFont}[2][\relax]{\strut
            {\fontencoding\encodingdefault
             \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}}
  \let\CPKmacro\macro\let\CPKendmacro\endmacro
  \let\CPKenvironment\environment\let\CPKendenvironment\endenvironment
  \doxitem[idxtype=class]{Class}{CPKclass}{classs}
  \def\PrintClassName#1{\LabelFont[\fontfamily{lmss}]{#1}}
  \doxitem[idxtype=counter]{Counter}{CPKcounter}{counters}
  \def\PrintCounterName#1{\LabelFont{#1}}
  \doxitem[idxtype=file]{File}{CPKfile}{files}
  \def\PrintFileName#1{\LabelFont{#1}}
  \doxitem[idxtype=length]{Length}{CPKlength}{lengths}
  \def\PrintLengthName#1{\LabelFont{#1}}
  \doxitem[idxtype=option]{Option}{CPKoption}{options}
  \def\PrintOptionName#1{\LabelFont{#1}}
  \doxitem[idxtype=package]{Package}{CPKpackage}{packages}
  \def\PrintPackageName#1{\LabelFont{#1}}
  \doxitem[idxtype=switch]{Switch}{CPKswitch}{switches}
  \def\PrintSwitchName#1{\LabelFont{#1}}
\usepackage{fontspec}%
  \makeatletter
  \newcommand{\printexternalcurrentfont}{%
  \expandafter\format@externalcurrentfont\fontname\font:\@nil}%
  \def\format@externalcurrentfont[#1]:#2\@nil{%
  \texttt{\@ifnextchar"{\@gobble}{}#1}%
}%	  
  \makeatother
%% fontenc (1.006) omitted in favour of fontspec
%% inputenc (1.009) omitted in favour of fontspec
\usepackage{noto}%
\usepackage{bbding}%
\usepackage{mflogo}%
\usepackage[british]{babel}%
\usepackage[backend=biber,doi=true,
  isbn=true,url=true,uniquename=false,style=apa]{biblatex}%
  \makeatletter
  \AtBeginDocument{%
	    \setlength{\bibitemsep}{1ex}%
	    \setlength{\bibnamesep}{1.5\itemsep}%
	    \defbibheading{shortbib}[References]%
	      {\section{#1}\parindent0pt}}
	  \@ifpackagewith{babel}{british}{%
	    \DeclareLanguageMapping{british}%
	      {british-apa}}{\relax}
  \makeatother
  \makeatletter
  \providetoggle{blx@skipbiblist}
  \makeatother
\usepackage{array}%
\usepackage{calc}%
  \makeatletter
  {\scriptsize
	    \global\advance\@totalleftmargin by1em
	    \global\advance\MacroIndent by.5em}
  \makeatother
\usepackage{ccaption}%
  \captionnamefont{\bfseries}
  \captionstyle{\raggedright}
\usepackage[inline]{enumitem}%
  \setlist[description]{style=unboxed,font=\sffamily\bfseries}
  \setlist[itemize]{leftmargin=2em}
  \setlist[enumerate]{leftmargin=2em}
\usepackage{relsize}%
\usepackage{textcase}%
\usepackage{float}%
  \renewcommand{\topfraction}{.85}
  \renewcommand{\bottomfraction}{.7}
  \renewcommand{\textfraction}{.15}
  \renewcommand{\floatpagefraction}{.66}
  \renewcommand{\dbltopfraction}{.66}
  \renewcommand{\dblfloatpagefraction}{.66}
  \setcounter{topnumber}{9}
  \setcounter{bottomnumber}{9}
  \setcounter{totalnumber}{20}
  \setcounter{dbltopnumber}{9}
\usepackage[level]{fmtcount}%
\usepackage[a4paper,left=35mm,top=25mm,
  textwidth=150mm,textheight=229mm,headheight=15pt]{geometry}%
\usepackage{fancyhdr}%
  \renewcommand{\MakeUppercase}{\relax}
  \pagestyle{fancy}
  \fancyhead[L]{\sffamily\footnotesize\rightmark}
  \fancyhead[R]{\sffamily\footnotesize\thepage}
  \fancyfoot[C]{}
  \fancyfoot[L]{\sffamily\footnotesize\leftmark}
  \fancyfoot[R]{\sffamily\footnotesize The \LaTeX\
    \textrm{\CPKdocname} \CPKdoctype}
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}
\usepackage{graphicx}%
\usepackage{listings}%
  \lstdefinelanguage{dummy}
	    {morekeywords={dummy}}
  \makeatletter
  \lstdefinelanguage{bash}
	    {morestring=[s]{[]},morekeywords={exit,logout,yes,no,@,
	    password,ssh,URL,cd,dvips,latex,ls,makeindex,man,mkdir,
	    pdflatex,sudo,texconfig,texdoc,updmap,xelatex,biber,
	    latexmk,bibtex}} 
	  
  \makeatother
  \lstdefinelanguage{LaTeXe}[LaTeX]{TeX}
	    {morekeywords = {selectlanguage,foreignlanguage,
	    textbrokenbar,textlangle,textrangle,subsection,url,
	    chapter,tableofcontents,part,subsubsection,paragraph,
	    subparagraph,maketitle,setlength,listoffigures,
	    listoftables,color,arraybackslash,includegraphics,
	    textcite,parencite,graphicspath,lstinline,
	    DeclareLanguageMapping,textcolor,definecolor,colorbox,
	    fcolorbox,RequirePackage,PassOptionsToPackage}}
	  
  \lstset{defaultdialect=LaTeXe,frame=single,
	    framesep=.5em,backgroundcolor=\color{AliceBlue},
	    rulecolor=\color{LightSteelBlue},framerule=1pt}
	  
  \lstnewenvironment{listingsdoc}
	    {\lstset{language={[LaTeX]TeX}}}
	    {}
  \newcommand\basicdefault[1]{\footnotesize
	    \color{Black}\ttfamily#1}
	  
  \lstset{basicstyle=\basicdefault{\spaceskip.5em}}
  \lstset{literate=
	    {§}{{\S}}1
	    {©}{{\raisebox{.125ex}{\copyright}\enspace}}1
	    {«}{{\guillemotleft}}1
	    {»}{{\guillemotright}}1
	    {Á}{{\'A}}1
	    {Ä}{{\"A}}1
	    {É}{{\'E}}1
	    {Í}{{\'I}}1
	    {Ó}{{\'O}}1
	    {Ö}{{\"O}}1
	    {Ú}{{\'U}}1
	    {Ü}{{\"U}}1
	    {ß}{{\ss}}2
	    {à}{{\`a}}1
	    {á}{{\'a}}1
	    {ä}{{\"a}}1
	    {é}{{\'e}}1
	    {í}{{\'i}}1
	    {ó}{{\'o}}1
	    {ö}{{\"o}}1
	    {ú}{{\'u}}1
	    {ü}{{\"u}}1
	    {¹}{{\textsuperscript1}}1
            {²}{{\textsuperscript2}}1
            {³}{{\textsuperscript3}}1
	    {ı}{{\i}}1
	    {—}{{---}}1
	    {’}{{'}}1
	    {…}{{\dots}}1
	    {➝}{{$leftarrow$}}1
            {⮠}{{$\hookleftarrow$}}1
	    {␣}{{\textvisiblespace}}1,
	    keywordstyle=\color{DarkCyan}\bfseries,
	    identifierstyle=\color{DarkRed},
	    commentstyle=\color{Gray}\upshape,
	    stringstyle=\color{DarkBlue}\upshape,
	    emphstyle=\color{DarkGreen}\upshape,
	    showstringspaces=false,
	    columns=fullflexible,
	    keepspaces=true}
  \lstloadlanguages{LaTeXe}
  \lstloadlanguages{bash}
  \lstloadlanguages{dummy}
\usepackage{ltxcmds}%
\usepackage{makeidx}%
  \makeindex
\usepackage{parskip}%
\usepackage{sectsty}%
  \allsectionsfont{\sffamily\raggedright}
  \renewcommand*{\descriptionlabel}[1]{\hspace\labelsep
	    \sffamily\bfseries #1}
\usepackage[normalem]{ulem}%
\usepackage{url}%
  \AtBeginDocument{\urlstyle{tt}}
\usepackage{varioref}%
  \vrefwarning
  \labelformat{appendix}{Appendix~#1}
  \makeatletter
  \labelformat{chapter}{\@chapapp~#1}
  \makeatother
  \labelformat{section}{section~#1}
  \labelformat{subsection}{section~#1}
  \labelformat{subsubsection}{section~#1}
  \labelformat{paragraph}{section~#1}
  \labelformat{figure}{Figure~#1}
  \labelformat{table}{Table~#1}
  \labelformat{item}{item~#1}
  \renewcommand{\reftextcurrent}{on this page}
  \def\reftextafter{on the
	    \reftextvario{next}{following} page}
\usepackage{xcolor}% svgnames (1.126)%
  \makeatletter
  \@ifundefined{T}{%
	    \newcommand{\T}[2]{{\fontencoding{T1}%
	      \selectfont#2}}}{}
  \makeatother
\usepackage{classpack}%
\usepackage{hypdoc}%
  \hypersetup{linkcolor=DarkGreen,citecolor=DarkRed,urlcolor=Blue,colorlinks=true}
  \makeatletter
  \@ifpackageloaded{biblatex}{%
  \makeatother
  \ExecuteBibliographyOptions{maxcitenames=1}
  \DeclareFieldFormat{citehyperref}{%
	    \DeclareFieldAlias{bibhyperref}{noformat}% Avoid nested links
	    \bibhyperref{#1}}
  \DeclareFieldFormat{textcitehyperref}{%
	    \DeclareFieldAlias{bibhyperref}{noformat}% Avoid nested links
	    \bibhyperref{%
	    #1%
	    \ifbool{cbx:parens}
	    {\bibcloseparen\global\boolfalse{cbx:parens}}
	    {}}}
  \savebibmacro{cite}
  \savebibmacro{textcite}
  \renewbibmacro*{cite}{%
	    \printtext[citehyperref]{%
	    \restorebibmacro{cite}%
	    \usebibmacro{cite}}}
  \renewbibmacro*{textcite}{%
	    \ifboolexpr{
	    ( not test {\iffieldundef{prenote}} and
	    test {\ifnumequal{\value{citecount}}{1}} )
	    or
	    ( not test {\iffieldundef{postnote}} and
	    test {\ifnumequal{\value{citecount}}{\value{citetotal}}} )
	    }
	    {\DeclareFieldAlias{textcitehyperref}{noformat}}
	    {}%
	    \printtext[textcitehyperref]{%
	    \restorebibmacro{textcite}%
	    \usebibmacro{textcite}}}
  }{\relax}
\usepackage{hyperref}%
  \hypersetup{linkcolor=DarkGreen,citecolor=DarkRed,
  urlcolor=Blue,colorlinks=true}
  \AtBeginDocument{\renewcommand{\UrlFont}{\ttfamily}}
\addbibresource{bookshelf.bib}
\hypersetup{pdfauthor={Peter Flynn},
        pdftitle={The bookshelf LaTeX2e document class},
        pdfsubject={Turn your bibliography into a bookshelf image},
        pdfkeywords={bibliography,bookshelf,background,biblatex,biber,xelatex},
        pdfproducer={XeLateX with hyperref},
        pdfcreator={Emacs/psgml, ClassPack/Saxon, LaTeX/TeX Live}}
\setmonofont[Scale=MatchLowercase]{Luxi Mono}
%
%%
%% Settings for docstrip and ltxdoc 
%%
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}\raggedright
  \DocInput{bookshelf.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{726}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!  Double quote  \"  Hash (number) \#
%   Dollar        \$  Percent       \%  Ampersand     \&
%   Acute accent  \'  Left paren    \(  Right paren   \)
%   Asterisk      \*  Plus          \+  Comma         \,
%   Minus         \-  Point         \.  Solidus       \/
%   Colon         \:  Semicolon     \;  Less than     \<
%   Equals        \=  Greater than  \>  Question mark \?
%   Commercial at \@  Left bracket  \[  Backslash     \\
%   Right bracket \]  Circumflex    \^  Underscore    \_
%   Grave accent  \`  Left brace    \{  Vertical bar  \|
%   Right brace   \}  Tilde         \~}
% 
% \changes{v0.8}{2024/01/04}{Development: Bugfixes and suggested patches from Boris Veytsman.}
% \changes{v0.7}{2020/09/24}{Feedback: Added exclusion for @Comment from bib files in script, and the Braille font on Macs (thanks to Murray Eisenberg on tex.se).}
% \changes{v0.6}{2020/05/29}{More testing: Small bug fixes.}
% \changes{v0.5}{2020/05/24}{Finished initial testing: Replaced hyperref with hypdoc to avoid makeindex bug.}
% \changes{v0.4}{2020/05/19}{Completed documentation: 1) Updated note on bug in biber when processing sgml.bib; 2) Removed sgml.bib as example until problems are resolved; 3) Backtracked on attempt to use the monographic title for articles, chapters, etc; 4) Revised notes on production.}
% \changes{v0.3}{2020/05/14}{Finished first pass on documentation: 1) Done preliminary testing; 2) Script adapted for Mac OS X.}
% \changes{v0.2}{2020/05/12}{Started documentation: Code doc done, user doc still missing.}
% \changes{v0.1}{2020/05/07}{First packaged draft: Done manually from .tex file.}
%
% \GetFileInfo{bookshelf.dtx}
%
% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
% \DoNotIndex{\@flushglue,\@gobble,\@input,\@makefnmark}
% \DoNotIndex{\@makeother,\@maketitle,\@namedef,\@ne}
% \DoNotIndex{\@spaces,\@tempa,\@tempb,\@tempswafalse}
% \DoNotIndex{\@tempswatrue,\@thanks,\@thefnmark,\@topnum}
% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa}
% \DoNotIndex{\@totalleftmargin,\",\/,\@ifundefined,\@nil}
% \DoNotIndex{\@verbatim,\@vobeyspaces,\|,\~,\ ,\active}
% \DoNotIndex{\advance,\aftergroup,\begingroup,\bgroup}
% \DoNotIndex{\mathcal,\csname,\def,\documentstyle}
% \DoNotIndex{\dospecials,\edef,\egroup,\else,\endcsname}
% \DoNotIndex{\endgroup,\endinput,\endtrivlist}
% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef}
% \DoNotIndex{\global,\hbox,\hss,\if,\if@inlabel}
% \DoNotIndex{\if@tempswa,\if@twocolumn,\ifcase,\ifcat}
% \DoNotIndex{\iffalse,\ifx,\ignorespaces,\index,\input}
% \DoNotIndex{\item,\jobname,\kern,\leavevmode,\leftskip}
% \DoNotIndex{\let,\llap,\lower,\m@ne,\next,\newpage}
% \DoNotIndex{\nobreak,\noexpand,\nonfrenchspacing}
% \DoNotIndex{\obeylines,\or,\protect,\raggedleft}
% \DoNotIndex{\rightskip,\rm,\sc,\setbox,\setcounter}
% \DoNotIndex{\small,\space,\string,\strut,\strutbox}
% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin}
% \DoNotIndex{\trivlist,\tt,\twocolumn,\typeout,\vss,\vtop}
% \DoNotIndex{\xdef,\z@,\,,\@bsphack,\@esphack,\@noligs}
% \DoNotIndex{\@vobeyspaces,\@xverbatim,\`,\catcode,\end}
% \DoNotIndex{\escapechar,\frenchspacing,\glossary}
% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht}
% \DoNotIndex{\it,\langle,\leaders,\long,\makelabel}
% \DoNotIndex{\marginpar,\markboth,\mathcode,\mathsurround}
% \DoNotIndex{\mbox,\newcount,\newdimen,\newskip}
% \DoNotIndex{\nopagebreak,\parfillskip,\parindent}
% \DoNotIndex{\parskip,\penalty,\raise,\rangle,\section}
% \DoNotIndex{\setlength,\TeX,\topsep,\underline,\unskip}
% \DoNotIndex{\verb,\vskip,\vspace,\widetilde,\\,\%,\@date}
% \DoNotIndex{\@defpar,\[,\{,\},\],\count@,\ifnum,\loop}
% \DoNotIndex{\today,\uppercase,\uccode,\baselineskip}
% \DoNotIndex{\begin,\tw@,\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k}
% \DoNotIndex{\l,\m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z}
% \DoNotIndex{\A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,\M,\N,\O}
% \DoNotIndex{\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,\1,\2,\3,\4}
% \DoNotIndex{\5,\6,\7,\8,\9,\0,\!,\#,\$,\&,\',\(,\)}
% \DoNotIndex{\+,\.,\:,\;,\<,\=,\>,\?,\_,\discretionary}
% \DoNotIndex{\immediate,\makeatletter,\makeatother}
% \DoNotIndex{\meaning,\newenvironment,\par,\relax}
% \DoNotIndex{\renewenvironment,\repeat,\scriptsize}
% \DoNotIndex{\selectfont,\the,\undefined,\arabic,\do}
% \DoNotIndex{\makeindex,\null,\number,\show,\write,\@ehc}
% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title}
% \DoNotIndex{\everypar,\if@minipage,\if@restonecol,\ifeof}
% \DoNotIndex{\ifmmode,\lccode,\newtoks,\onecolumn,\openin}
% \DoNotIndex{\p@,\SelfDocumenting,\settowidth}
% \DoNotIndex{\@resetonecoltrue,\@resetonecolfalse,\bf}
% \DoNotIndex{\clearpage,\closein,\lowercase,\@tempdima}
% \DoNotIndex{\@inlabelfalse,\selectfont,\mathcode}
% \DoNotIndex{\newmathalphabet,\rmdefault,\bfdefault}
% \DoNotIndex{\DeclareRobustCommand,\@ifpackagewith}
% \DoNotIndex{\#,\%,\&,\*,\-,\^,\_,\|,\~,\$}
% \DoNotIndex{\acro,\addbibresource,\addcontentsline,\addtolength}
% \DoNotIndex{\allowbreak,\alph,\@Alph,\and,\appendix,\arrayrulewidth}
% \DoNotIndex{\ast,\baselinestretch,\bfseries,\bgroup,\Bib,\BibTeX}
% \DoNotIndex{\BiBTeX,\BIBTeX,\bigskip,\box,\caption,\centering,\char}
% \DoNotIndex{\CharacterTable,\CheckSum,\citeyear,\cjktext,\ClassError}
% \DoNotIndex{\classorpackage,\CodelineIndex,\color,\colorbox}
% \DoNotIndex{\columnsep,\columnwidth,\Con,\ConTeXt}
% \DoNotIndex{\CPKannotationindent,\CPKdocname,\CPKdoctype,\CPKmenusep}
% \DoNotIndex{\CPKpoststrut,\CPKprestrut,\CPKrevmarg,\CPKrunningecho}
% \DoNotIndex{\CPKthisjob,\CPKthispackage,\CPKvstrut,\c@section}
% \DoNotIndex{\@currsize,\DeclareOption,\declarepostamble}
% \DoNotIndex{\declarepreamble,\DescribeColor,\DescribeEnv}
% \DoNotIndex{\DescribeError,\DescribeOption,\DescribePackage}
% \DoNotIndex{\DescribeTemplate,\descriptionlabel,\divide,\DoNotIndex}
% \DoNotIndex{\dotfill,\dots,\@dottedtocline,\DoubleperCent,\doxitem}
% \DoNotIndex{\dp,\egroup,\emph,\empty,\EnableCrossrefs}
% \DoNotIndex{\encodingdefault,\endbatchfile,\endpreamble,\enspace}
% \DoNotIndex{\ensuremath,\fa,\fbox,\fboxrule,\fboxsep,\file,\Finale}
% \DoNotIndex{\flushright,\fnote,\font,\fontdimen,\fontencoding}
% \DoNotIndex{\fontfamily,\fontseries,\fontshape,\fontsize,\footnote}
% \DoNotIndex{\footnotesize,\from,\generate,\GetFileInfo,\HandRight}
% \DoNotIndex{\@height,\@@hline,\href,\hrule,\hsize,\huge,\Huge}
% \DoNotIndex{\hyperref,\hypersetup,\hyphenation,\ifdim,\@ifnextchar}
% \DoNotIndex{\itshape,\keepsilent,\keys,\labelenumi,\LabelFont}
% \DoNotIndex{\labelformat,\large,\Large,\LARGE,\LaTeX,\LaTeXe}
% \DoNotIndex{\leftmark,\lfoot,\lhead,\longestline,\lstloadlanguages}
% \DoNotIndex{\l@subsection,\l@subsubsection,\ltx@ifpackageloaded}
% \DoNotIndex{\LyX,\MacroFont,\marginfont,\marginnote,\medskip}
% \DoNotIndex{\menu,\menusep,\message,\MF,\@minus,\MP,\Msg}
% \DoNotIndex{\multirow,\NeedsTeXFormat,\newcommand,\newcounter}
% \DoNotIndex{\newgeometry,\newlength,\newwrite,\nicefrac,\noalign}
% \DoNotIndex{\nocite,\noindent,\nolinkurl,\nopreamble,\normalfont}
% \DoNotIndex{\normalsize,\numberstring,\obeyspaces,\ordinal}
% \DoNotIndex{\PackageError,\pageref,\phantomsection,\@plus}
% \DoNotIndex{\@pnumwidth,\preamble,\PrintChanges}
% \DoNotIndex{\printexternalcurrentfont,\PrintIndex,\Provides}
% \DoNotIndex{\qquad,\quad,\raisebox,\RecordChanges,\reflectbox}
% \DoNotIndex{\refname,\renewcommand,\renewmenumacro,\reserved@a}
% \DoNotIndex{\rightarrow,\rightmark,\rmfamily,\rotatebox,\rule}
% \DoNotIndex{\school,\sloppy,\smallskip,\SMC,\SMC@unknown@warning}
% \DoNotIndex{\Square,\stanza,\star,\@startsection,\stepcounter}
% \DoNotIndex{\StopEventually,\subsubsection,\tableofcontents}
% \DoNotIndex{\textbackslash,\textbf,\textdegree,\texteiad}
% \DoNotIndex{\textheight,\textit,\textlangle,\textrangle,\textsf}
% \DoNotIndex{\textSMC,\textsuperscript,\texttt,\TheSbox}
% \DoNotIndex{\thesection,\thinspace,\tiny,\@tocrmarg}
% \DoNotIndex{\tubhideheight,\tubreflect,\uline,\updefault}
% \DoNotIndex{\upshape,\use@babel,\@usebib,\usedir,\usepostamble}
% \DoNotIndex{\usepreamble,\vbox,\vfill,\vrefrange,\vrule}
% \DoNotIndex{\Xe,\XeLaTeX,\XeTeX,\@xhline}
% \DoNotIndex{\SIL@svgcolname}
% \DoNotIndex{\ifcase}
% \DoNotIndex{\SIL@svgcolval}
% \DoNotIndex{\addbibresource}
% \DoNotIndex{\immediate}
% \DoNotIndex{\input}
% \DoNotIndex{\documentclass}
% \DoNotIndex{\pagewidth}
% \DoNotIndex{\raggedright}
% \DoNotIndex{\name}
% \DoNotIndex{\SIL@topauthor}
% \DoNotIndex{\SIL@titleoneline}
% \DoNotIndex{\makebook}
% \DoNotIndex{\SILmfont}
% \DoNotIndex{\SILmfontname}
% \DoNotIndex{\vbox}
% \DoNotIndex{\fcolorbox}
% \DoNotIndex{\scalebox}
% \setcounter{tocdepth}{5}
% \setcounter{secnumdepth}{5}
% \makeatletter
% \def\@@doxdescribe#1#2{\endgroup \ifdox@noprint\else\marginpar{\raggedleft \@nameuse{PrintDescribe#1}{\LabelFont[\color{DarkRed}]{#2}}}\fi \ifdox@noindex\else \@nameuse{Special#1Index}{#2}\fi \endgroup\@esphack\ignorespaces}
% \makeatother
%
% \def\fileversion{0.8}
% \def\filedate{2024/01/04}
% \title{The  \textsf{bookshelf} \LaTeXe\ document class\thanks{%
% This document corresponds to \textsf{bookshelf}
% \textit{v.}\ \fileversion $\beta$, dated \filedate.}
% \\[1em]\Large 
% Turn your bibliography into a bookshelf image}
% \author{Peter Flynn\\\normalsize Silmaril Consultants\\[-.25ex]\normalsize Instant Textual Gratification Division\\\normalsize(\url{peter@silmaril.ie})}
% \maketitle
% \renewcommand{\abstractname}{Summary}\thispagestyle{empty}
% \begin{abstract}
% \parskip=0.5\baselineskip
% \advance\parskip by 0pt plus 2pt
% \parindent=0pt% \noindent
% The \textsf{bookshelf} package uses
% \textsf{biblatex} and
% \emph{biber} to turn any large \BibTeX{}
% bibliography file into a randomly-coloured, randomly-sized
% shelf of books, with the title and author in a randomly-chosen
% typeface. The image (converted to \textsc{jpeg} from
% \textsc{pdf}) can then be used as a background in
% \emph{Zoom},
% \emph{Teams},
% \emph{WhatsApp} etc video calls. It
% requires a little preliminary work with the supplied script to
% set up a list of all your fonts, a list of colors, and a list
% of the \BibTeX{} entry names in your {\ttfamily{}.bib}
% file, but otherwise should work on any modern \TeX{}
% distribution.\par
% \par\centering
%     \includegraphics[width=.666\columnwidth]{myshelf.jpg}
% \end{abstract}
% \clearpage
% \tableofcontents
% \subsection*{Note on required and optional features}
% In this document, the keywords
%     {\sffamily \textsc{must}}, {\sffamily \textsc{must not}}, {\sffamily \textsc{required}},
%     {\sffamily \textsc{shall}}, {\sffamily \textsc{shall not}}, {\sffamily \textsc{should}},
%     {\sffamily \textsc{should not}},
%     {\sffamily \textsc{recommended}},
%     {\sffamily \textsc{may}}, and
%     {\sffamily \textsc{optional}} have a specific
%     meaning when shown in {\sffamily \textsc{this typestyle}}, and
%     {\sffamily \textsc{must}} be interpreted as described in
%     RFC 2119 \parencite{rfc2119}.\par
% When shown in normal type, these words keep their conventional
%     contextual degree of meaning.\par
% \clearpage
% \subsection*{Typographic representation}\label{typorep}
% In this document, the following information items are shown in
%   this way:\par
% \par\medskip{\sffamily\rmfamily
% \small\sffamily
% \begingroup
% \centering
% \begin{tabular}{@{}%
%   l%
%   >{\renewcommand{\baselinestretch}{0.8}\selectfont{}\raggedright{}\renewcommand{\baselinestretch}{0.8}\selectfont{}\CPKprestrut\arraybackslash}p{12cm}<{}%
%   @{}}
% \multicolumn{1}{@{}>{\renewcommand{\baselinestretch}{0.8}\selectfont{}\raggedright{}\CPKprestrut}b{\widthof{environments}}<{}}{\sffamily\bfseries Item}&
% \multicolumn{1}{>{\renewcommand{\baselinestretch}{0.8}\selectfont{}\raggedright{}\CPKprestrut\arraybackslash}b{12cm}<{}@{}}{\sffamily\bfseries Description}\\[2pt]\hline
% \CPKvstrut 
% \index{class@\textsf{class} (class)}\index{classes:!class@\textsf{class}}\textsf{class}&name of a \LaTeX{} document class\\
% {\ttfamily{}\textbackslash{}command}&name of a \LaTeX{} `command'
%     (\TeX{} macro or control sequence)\\
% {\ttfamily{}filename}\thinspace&name of a file\\
% \textbf{\texttt{option}}&name of an option to a \LaTeX{} command, environment,
%     class, or package\\
% \textsf{package}&name of a \LaTeX{} package\\
% \emph{productname}&a product name\\
% {\ttfamily{}systemitem}\thinspace&a computer system item (eg hostname or data value)\\
% {\ttfamily{}varname}&a variable name in a supported language\\[2pt]\hline
% \end{tabular}
% \par\endgroup
% }
% \par
% \clearpage
% \section*{Latest changes}
% \subsection*{v.0.8 (2024-01-04)}
% \paragraph*{Development}
% \begin{itemize}
% \item Bugfixes and suggested patches from Boris Veytsman.
% \end{itemize}
% \subsection*{v.0.7 (2020-09-24)}
% \paragraph*{Feedback}
% \begin{itemize}
% \item Added exclusion for @Comment from bib files in
% script, and the Braille font on Macs (thanks to Murray
% Eisenberg on tex.se).
% \end{itemize}
% \subsection*{v.0.6 (2020-05-29)}
% \paragraph*{More testing}
% \begin{itemize}
% \item Small bug fixes.
% \end{itemize}
% \subsection*{v.0.5 (2020-05-24)}
% \paragraph*{Finished initial testing}
% \begin{itemize}
% \item Replaced \textsf{hyperref}
% with \textsf{hypdoc} to avoid
% \emph{makeindex} bug.
% \end{itemize}
% \par\bigskip
%     See p.\thinspace\pageref{changehistory} for earlier changes.
% \subsection*{Acknowledgments}
% Thanks to many people for the original suggestion; and to
% Isabel Yorke, Bethan Tovey-Walsh, Nelson Beebe, The \LaTeX{}
% Ninja, Stephan Lukasczyk, and others for their thesis
% bibliographies and testing comments.\par
% \section{Documentation}
% During the period of the early \textsc{covid-19}
% lockdowns (2020–2022), the popularity of group video messaging
% grew rapidly, both for business and domestic use. As people
% sought for what they believed to be more representative
% backgrounds than a messy kitchen, an untidy workroom, or a
% sterile blank wall, a well-populated bookshelf was a frequent
% choice.\par
% This package is for those who cannot use (or don't have,
% or don't want to use) such a bookshelf, but can still lay
% their hands on a bibliography or reference list in \BibTeX{}
% format — perhaps from a recent or long-forgotten thesis, book,
% article, or other document.\par
% \par\begingroup
%   \fboxsep1em\centering
%   \fbox{\begin{minipage}{0.8\columnwidth}\sffamily
%  \raggedright\parindent0pt
%  \parskip=.5\baselineskip
% \subsubsection*{\sffamily \XeLaTeX{} and \textsf{biblatex} and
%   \emph{biber}}
% To avoid problems with accented and other
%   characters, and to make it easier to maintain,
%   this document class uses only \XeLaTeX{} and
%   \textsf{biblatex} and
%   \emph{biber}.\par
% It will not work with the
%   \emph{pdflatex} or
%   \emph{bibtex} programs, and it does not
%   use the {\ttfamily{}.bst} files of old
%   \BibTeX{}.\par
% \end{minipage}}\par\endgroup
% This is a work-in-progress: there are bugs (see \vref{bugs}).\par
% \subsection{What the package does}
% The \textsf{bookshelf} package generates what
%   looks like shelves of book spines from your list of
%   references, using random dimensions (within specified
%   limits) in random but contrasting colors, with a
%   randomly-selected typeface.\par
% It does this by creating a box (rectangle) for each
%   entry in your list, assigning colors to the background and
%   foreground, deciding on the layout and font, and then
%   stacking the boxes side-by-side as if they were letters on a
%   line.\par
% \subsection{Preparation}
% To get things ready for this, you need to install this
%   document class, and provide the following files.\par
% \begin{enumerate}
% \item Your \BibTeX{} file;
% \item A separate list of all the entry values;
% \item A list of all your usable text fonts (TTF or OTF);
% \item A command defining how many such fonts there are;
% \item A list of all the colors to choose from.
% \end{enumerate}
% These are explained in more detail in the subsections
%   below.\par
% All but the first of these can be generated by the
%   supplied shell script {\ttfamily{}prepdata.sh}\thinspace. This
%   works on UNIX/GNU Linux and on Apple Mac OS X, and may work
%   in CygWin, but needs more work for plain Windows.\par
% \subsubsection{Your \BibTeX{} file}
% Your \BibTeX{} ({\ttfamily{}.bib}) file,
%     suitable for use with \emph{biber}
%     rather than \emph{bibtex}.\par
% Old \BibTeX{} files will work, but possibly not
%     optimally: if you want to update them, see \vref{bibchanges} for what to edit; but this is not
%     needed for this class.\par
% One thing that may help is to replace all the
%     old-style symbolic notation for accented characters like
%     \verb|{\"a}| for
%     `ä' and
%     \verb|{\l}| for
%     `ł'. Not only is the symbolic
%     notation no longer needed because \XeLaTeX{} and the
%     \emph{biber} program handle
%     \textsc{utf-8} characters, which the old
%     \emph{bibtex} program doesn't; the
%     discipline of replacing helps to reduce the problem of
%     unmatched curly braces, which is one of the biggest
%     sources of errors in \BibTeX{} files.\par
% If you have a bibliography in
%     \emph{EndNote},
%     \emph{Mendeley},
%     \emph{Zotero},
%     \emph{ProCite}, \emph{Reference
%       Manager}, etc, you should be able to export
%     it in either \BibTeX{} or \textsc{ris} format. A
%     \textsc{ris} file can easily be converted to
%     \BibTeX{} by opening it in
%     \emph{JabRef} and saving it as
%     \BibTeX{}.\par
% \subsubsection{Entry values}
% A list of all the entry values from your \BibTeX{} file
%     (the unique names immediately after the document type),
%     each given as the argument to a
%     \verb|\makebook}{...}| command in a file called
%     {\ttfamily{}entries.tex}\thinspace.\par
% \subsubsection{Font file list}\label{fontfiles}
% A set of 1–line files in a subdirectory called
%     {\ttfamily{}fontsel} representing of all the
%     usable text fonts on your system that you wish to use;
%     that is, \emph{excluding} broken,
%     experimental, or partial fonts, symbols, mathematical
%     fonts, non-Latin characters or alphabets, and display or
%     non-text fonts.\par
% Each such file {\sffamily \textsc{must}} be
%     numbered sequentially in its name (eg
%     {\ttfamily{}1.tex}\thinspace, {\ttfamily{}2.tex}\thinspace,
%     {\ttfamily{}3.tex}\thinspace, etc) and
%     {\sffamily \textsc{must}} contain a
%     \verb|\newfontface{SILmfont}{...}| command for
%     the font name \emph{and} a definition of its
%     name in a \verb|\SILmfontname{...}| command
%     (see the examples generated by the
%     {\ttfamily{}prepdata.sh} script):\par
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language={[LaTeX]TeX}]
\newfontface{\SILmfont}{Freestyle Script}
\def\SILmfontname{Freestyle Script}
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% Be aware that many fonts on your system may not be
%     suitable for setting normal text: see the comments in the
%     script\par
% These files are entirely dependent on your system
%     because everyone has a different set of fonts.\par
% \par\smallskip\leavevmode
% \CPKrunningecho{}%
% \leavevmode\kern-12pt\colorbox{Black}{\vbox{\advance\hsize by-2em
%   \color{White}\sffamily\raggedright TODO: Plans under way for adding non-Latin fonts.}}\par\smallskip
% \subsubsection{Maximum number of fonts}
% A file called {\ttfamily{}pickfont.tex}
%     containing a
%     \verb|\setcounter{SIL@maxfont}{...}| command to
%     set the total number of the fonts which are represented in
%     the {\ttfamily{}fontsel} subdirectory above\par
% \subsubsection{List of colors}
% A list of all the colors represented by a palette
%     usable by the \textsf{xcolor} package: the color
%     choice file created by the script is called after the
%     palette name, eg {\ttfamily{}svgnam.tex}\thinspace,
%     {\ttfamily{}x11nam.tex}\thinspace,
%     {\ttfamily{}farben.tex}\thinspace, etc. This contains three
%     definitions:\par
% \begin{enumerate}
% \item the command {\ttfamily{}\textbackslash{}SIL@svgcolname}
% which uses an {\ttfamily{}\textbackslash{}ifcase} command to
% return the name of the \emph{n}th color
% in alphabetical order;\par
% \item the command {\ttfamily{}\textbackslash{}SIL@svgcolval} which
% does the same to return the brightness value of that
% color, computed by the formula on \vpageref{bright} (see script for
% details);\par
% \item the counter {\ttfamily{}SIL@maxcolno} which holds
% the number of colors available.\par
% \end{enumerate}
% \subsection{Producing your bookshelf}
% This class comes with a file
%   {\ttfamily{}test.tex} which you can use to test your
%   file of references. As installed, it is set just to make the
%   {\ttfamily{}test.aux} file that
%   \emph{biber} needs to create your
%   {\ttfamily{}test.bbl} bibliography file; that is, it
%   will \emph{not} try to run the shell script
%   \emph{or} to create a bookshelf the first time
%   round, until everything else is ready.\par
% \begin{enumerate}
% \item Run the shell script with your
%       {\ttfamily{}.bib} filename as the argument,
%       eg;
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language=bash]
$ ./prepdata.sh mythesis.bib
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% \item Edit the {\ttfamily{}test.tex} file and
%       change the name of the {\ttfamily{}.bib} file in
%       the {\ttfamily{}\textbackslash{}addbibresource} command to the
%       name of your own file\par 
% Leave the two lines {\ttfamily{}\textbackslash{}immediate} and
%       {\ttfamily{}\textbackslash{}input} commented out for the
%       moment;
% \item Delete any existing {\ttfamily{}test.aux} or
%       {\ttfamily{}test.bbl} files in the directory in
%       which you are doing this;
% \item Typeset the test file with \XeLaTeX{}. You should get
%     three messages:\par
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language={[LaTeX]TeX}]
LaTeX Warning: Empty bibliography on input line 12.
LaTeX Warning: There were undefined references.
Package biblatex Warning: Please (re)run Biber on the file:
(biblatex)                test
(biblatex)                and rerun LaTeX afterwards.
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% \item Process the test bibliography with
%       \emph{biber}
%       (\emph{not} \emph{bibtex}). You will probably
%       get many warning messages: ignore them. If you get a
%       fatal error, however, you will need to find the problem
%       in your {\ttfamily{}.bib} file and fix it before
%       going any further.\par
% See also the known bug at item~\ref{sgmlbib} in the list on p.\thinspace\pageref{sgmlbib};
% \item Edit the test file and
%       \emph{un}comment the line starting
%       {\ttfamily{}\textbackslash{}input}, save the file, and retypeset
%       it twice.
% \end{enumerate}
% You should now have a \textsc{pdf} bookshelf!
%   The books are in the order in which they appear in your
%   {\ttfamily{}.bib} file because the script creates
%   the list of entries to process in that order, regardless of
%   what \emph{biblatex} or
%   \emph{biber} are configured to
%   do.\par
% To convert the first page to \textsc{jpeg}
%   (image) format, use a facility like
%   \emph{ImageMagick} and type (for
%   example):\par
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language=bash]
$ convert -density 300 mybib.pdf[0] -resize 50% mybib.jpg
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% To create an image of another page, change the zero to
%   the page number minus one (\textsc{pdf} pages are
%   counted from zero, not one).\par
% \subsubsection{Options}
% The class comes set for making an
%     \textbf{\texttt{a0paper}} page (1189 mm × 841 mm or
%     4′ 11″ × 2′ 10″) in \textbf{\texttt{landscape}} mode,
%     suitable for large bibliographies. If you have a smaller
%     {\ttfamily{}.bib} file, or if you want fewer
%     volumes per page, you can change the paper size option in
%     the {\ttfamily{}\textbackslash{}documentclass} command to a smaller
%     one: all the `A' sizes from 5 to 0
%     are supported, plus the common US office sizes including
%     Ledger (Tabloid).\par
% There is also a \textbf{\texttt{portrait}} option to
%     produce the page in that format instead of
%     landscape.\par
% \subsection{Changes between \BibTeX{} fields and
%   \emph{biblatex}}\label{bibchanges}
% This has been expanded from the description provided in
%   \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3 
%     of the online documentation for
%     \textsf{biblatex}} v3.14 (1 December 2019)
%   \parencite{biblatex}.\par
% This is for information only. You do not need to do any
%   of this to use the \index{bookshelf@\textsf{bookshelf} (class)}\index{classes:!bookshelf@\textsf{bookshelf}}\textsf{bookshelf} document
%   class unless you encounter errors processing your
%   {\ttfamily{}.bib} file.\par
% \begin{enumerate}
% \item The entry type {\ttfamily{}@inbook}
%       (basically only use this where each chapter of the book
%       is written by a different author). See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=8}{§2.1.1} 
%       and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.1} 
%       for details.\par
% \item Replace {\ttfamily{}school} with {\ttfamily{}institution} for theses;
%       replace {\ttfamily{}publisher} with {\ttfamily{}organization} for manuals
% and conference sponsors;
%       and replace {\ttfamily{}address} with {\ttfamily{}location}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}\thinspace, 
%       \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=32}{§2.2.5}\thinspace, 
%       and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=34}{§2.3.4} 
%       for details.\par
% \item The handling of certain types of titles. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=35}{§2.3.5} 
%       for details. Replace {\ttfamily{}journal} with
%       {\ttfamily{}journaltitle} in {\ttfamily{}@article} entries.\par
% \item The field {\ttfamily{}series}: only
%       use it for journal series; for the main title of
%       multi-volume works use {\ttfamily{}maintitle}.
%       See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2} 
%       and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=37}{§2.3.7} 
%       for details.\par
% \item The fields {\ttfamily{}year} and {\ttfamily{}month} must be
%       integers; {\ttfamily{}month} {\sffamily \textsc{must not}} be
%       alphabetic. The field {\ttfamily{}date} {\sffamily \textsc{must}} be an
%       \textsc{iso} 8601 date in the format
%       {\ttfamily{}yyyy-mm-dd}\thinspace. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}\thinspace, 
%       \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=38}{§2.3.8}\thinspace, 
%       and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=39}{§2.3.9} 
%       for details.\par
% \item The field {\ttfamily{}edition} must
%       be an integer with no ordinal indicator or abbreviation
%       `ed'. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2} 
%       for details.\par
% \item Replace {\ttfamily{}key} with
%       {\ttfamily{}label}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.2} 
%       for details.\par
% \end{enumerate}
% Most of this is for creating new entries. For converting
%   \BibTeX{} files for use with
%   \emph{biblatex}, just change the field
%   names as in items 2, 3, 4, and 7; and make sure your months
%   and editions are integers.\par
% \subsection{Bugs}\label{bugs}
% Some things don't yet work as they should, and
%   there are some features that may or may not make
%   the final cut.\par
% \begin{enumerate}
% \item The shell script doesn't run on Windows
%       because I don't have any Windows. If someone
%       would write some Powershell I could include it
%       in a later version.\par
% \item There is no conscious
%       `line'-breaking when a
%       row of books comes to the
%       {\ttfamily{}\textbackslash{}pagewidth}, and as it is
%       deliberately set
%       {\ttfamily{}\textbackslash{}raggedright} (because you
%       can't hyphenate a book and variable space
%       between books seems to be a silly idea), there
%       is no filler at the ends of lines to complete
%       the `shelf' (which is
%       in any case just a bar below each
%       book).\par
% \item \label{sgmlbib}A test with a bibliography file from
%       Nelson Beebe's collection
%       ({\ttfamily{}sgml.bib}) generated a
%       {\ttfamily{}test.bbl} with a missing
%       closing curly brace, terminating (or rather,
%       failing to terminate) the
%       {\ttfamily{}\textbackslash{}name} command for an entry.
%       This appears to be a known bug in
%       \emph{biber} which is
%       being fixed in the version 2.15.\par
% \item There seems to be a recurrent problem with
%       certain entries and certain fonts where the
%       length of the title is measured as 0.0pt which
%       causes an unresolvable problem for the routine
%       which assigns space and layout. Any
%       suggestions as to why this occurs are
%       welcomed.\par
% \item The objective of the field re-expressions
%       (see \vref{fields}) was to make sure the book
%       spine for journal {\ttfamily{}@article}, {\ttfamily{}@incollection}, and
%       {\ttfamily{}@inbook} entry
%       types reflected the \emph{book}
%       or \emph{journal} title, not the
%       title of the article or chapter. This may or
%       may not be a good idea.\par
% \item During development, it became obvious that
%       the number of fonts on many systems can be
%       very large. The
%       {\ttfamily{}prepdata.sh} script
%       currently includes the exclusions I made on
%       \textsc{unix}/\textsc{gnu}
%       Linux and Apple Mac \textsc{os x} in
%       order to get a set of fonts that did not issue
%       errors (bearing in mind we are using
%       \textsf{fontspec}, so for simplicity
%       the script deals only with TrueType and
%       OpenType fonts, not Postscript Type 1 or
%       Type 3, or font packaging systems like
%       \emph{Suitcase} or True
%       Type Collections). I am not aware of any
%       easily-accessible machine-readable list or
%       \textsc{api} for identifying normal
%       text fonts by name (there are commercial
%       databases but that is outside the scope of
%       this document class).\par
% \end{enumerate}
% \StopEventually{\label{endcode}%
%   \clearpage
%   \addcontentsline{toc}{section}{Change History}%
%   \label{changehistory}%
%   \PrintChanges
%   \clearpage
%   \label{codeindex}%
%   \addcontentsline{toc}{section}{Index}%
%   \PrintIndex}
% \clearpage\subsection*{Code for the Package code for the \textsf{bookshelf} class}
% \iffalse
%<*class>
% \fi
% \section{Implementation}\label{setup}
% \iffalse
%% 
%% Implementation
% \fi
% \par
% \iffalse
%% 
%% 
% \fi
% \subsection{Auto-initialisation}\label{setup:autoinit}
% This section is added automatically by \textit{ClassPack} 
% as a preamble to all classes and style packages.
% For details see the \textsf{ltxdoc} package documentation.
% \par\smallskip
% 
% \begingroup\color{DarkRed}\footnotesize
% \leavevmode\enspace{\scriptsize1}\quad{\ttfamily\textbackslash NeedsTeXFormat\{LaTeX2e\}[2017/04/15]}\\
% \leavevmode\enspace{\scriptsize2}\quad{\ttfamily\textbackslash ProvidesClass\{bookshelf\}[2024/01/04 v0.8}\\
% \leavevmode\enspace{\scriptsize3}\qquad{\ttfamily Package code for the bookshelf class]}\\\endgroup
% \setcounter{CodelineNo}{3}
% \begin{CPKpackage}{fix-cm}
% Preloaded functions to override the default \LaTeX\
% step-size font sizes (which can still be used,
% but are no longer restrictions).\par
%    \begin{macrocode}
\RequirePackage{fix-cm}
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKoption}{svgnames}
% Pass the \textbf{\texttt{svgnames}} option to the
% \textsf{xcolor} package if that gets loaded later.
% This avoids a conflict with any other packages in the class
% (eg \textsf{hyperref}) which use their own default
% when they load \textsf{xcolor}.\par
%    \begin{macrocode}
  \PassOptionsToPackage{svgnames}{xcolor}
%    \end{macrocode}
% \end{CPKoption}
% \subsection{Options}\label{options}
% \iffalse
%% 
%% ****************************************************************** 
%% 
%% Options
%%
%% There are no package options.
% \fi
% The paper size and orientation are the only two valid
%   options, both of which are the same as the standard
%   documentclass options, and will be passed to the underlying
%   class automatically, but they need recording so that they
%   can be used by the \textsf{geometry}
%   package. The default is for A0 paper, landscape.\par
% \iffalse
%% 
%% The paper size and orientation are the only two valid options, both of which are the same as the standard documentclass options, and will be passed to the underlying class automatically, but they need recording so that they can be used by the _geometry_ package. The default is for A0 paper, landscape.
% \fi
%    \begin{macrocode}
\def\SIL@paper{a0paper}%
\DeclareOption{a0paper}{%
    \def\SIL@paper{a0paper}%
    \setlength\paperheight {1189mm}%
    \setlength\paperwidth  {841mm}}
\DeclareOption{a1paper}{%
    \def\SIL@paper{a1paper}%
    \setlength\paperheight {841mm}%
    \setlength\paperwidth  {594mm}}
\DeclareOption{a2paper}{%
    \def\SIL@paper{a2paper}%
    \setlength\paperheight {594mm}%
    \setlength\paperwidth  {420mm}}
\DeclareOption{a3paper}{%
    \def\SIL@paper{a3paper}%
    \setlength\paperheight {420mm}%
    \setlength\paperwidth  {297mm}}
\DeclareOption{a4paper}{%
    \def\SIL@paper{a4paper}%
    \setlength\paperheight {297mm}%
    \setlength\paperwidth  {210mm}}
\DeclareOption{a5paper}{%
    \def\SIL@paper{a5paper}%
    \setlength\paperheight {210mm}%
    \setlength\paperwidth  {148mm}}
\DeclareOption{b5paper}{%
    \def\SIL@paper{b5paper}%
    \setlength\paperheight {250mm}%
    \setlength\paperwidth  {176mm}}
\DeclareOption{letterpaper}{%
    \def\SIL@paper{letterpaper}%
    \setlength\paperheight {11in}%
    \setlength\paperwidth  {8.5in}}
\DeclareOption{legalpaper}{%
    \def\SIL@paper{legalpaper}%
    \setlength\paperheight {14in}%
    \setlength\paperwidth  {8.5in}}
\DeclareOption{executivepaper}{%
    \def\SIL@paper{executivepaper}%
    \setlength\paperheight {10.5in}%
    \setlength\paperwidth  {7.25in}}
\DeclareOption{ledgerpaper}{%
    \def\SIL@paper{ledgerpaper}%
    \setlength\paperheight {17in}%
    \setlength\paperwidth  {11in}}
\DeclareOption{tabloidpaper}{%
    \def\SIL@paper{tabloidpaper}%
    \setlength\paperheight {17in}%
    \setlength\paperwidth  {11in}}
\def\SIL@orient{landscape}%
\DeclareOption{landscape}{%
    \def\SIL@orient{landscape}%
    \setlength\@tempdima   {\paperheight}%
    \setlength\paperheight {\paperwidth}%
    \setlength\paperwidth  {\@tempdima}}
\DeclareOption{portrait}{%
    \def\SIL@orient{}}
%    \end{macrocode}
% Now invoke the options.\par
% \iffalse
%% Now invoke the options.
% \fi
%    \begin{macrocode}
\ExecuteOptions{}
        \ProcessOptions\relax
%    \end{macrocode}
% \subsection{Load the document base class}\label{classload}
% \iffalse
%% 
%% ****************************************************************** 
%% 
%% Load the document base class
% \fi
% This class is based on the standard \LaTeX{}
%   \DescribeClass{report}\textsf{report} class, with no special options
%   except the extra sizes defined above. The default is A0
%   paper, landscape.\par
% \iffalse
%% 
%% This class is based on the standard LaTeX _report_ class, with no special options except the extra sizes defined above. The default is A0 paper, landscape.
% \fi
%    \begin{macrocode}
\DeclareOption*{\ClassWarning{bookshelf}{%
    Unknown option `\CurrentOption', please RTFM}}
\ProcessOptions\relax
\LoadClass{report}
%    \end{macrocode}
%\iffalse
%%
%% Packages required for the class
%% 
% \fi
% \subsection{Packages required for the class or
%     package}\label{clspackages}
% Packages required for operation:
% \begin{CPKpackage}{noto}
% Sets the Google NoTo typeface as the default.
% \iffalse
%% Sets the Google NoTo typeface as the default.
% \fi
%    \begin{macrocode}
\RequirePackage{noto}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{mflogo}
% Provides the \MF{} and \MP{} logos.
% \iffalse
%% Provides the \MF{} and \MP{} logos.
% \fi
%    \begin{macrocode}
\RequirePackage{mflogo}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{fancyhdr}
% Provide for running headers and footers.
% \iffalse
%% Provide for running headers and footers.
% \fi
%    \begin{macrocode}
\RequirePackage{fancyhdr}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{parskip}
% Creates paragraphs separated by white-space with no
% indentation.
% \iffalse
%% Creates paragraphs separated by white-space with no indentation.
% \fi
%    \begin{macrocode}
\RequirePackage{parskip}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{fontspec}
% Font specification setup for use with \XeLaTeX{}.
% \iffalse
%% Font specification setup for use with \XeLaTeX{}.
% \fi
%    \begin{macrocode}
\RequirePackage{fontspec}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{calc}
% Implements simple mathematics in counters and dimensions.
% \iffalse
%% Implements simple mathematics in counters and dimensions.
% \fi
%    \begin{macrocode}
\RequirePackage{calc}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{fp}
% Used for fixed-point calculations;
% \iffalse
%% Used for fixed-point calculations
% \fi
%    \begin{macrocode}
\RequirePackage{fp}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{graphicx}
% Provide for graphics (PNG, JPG, or PDF format (only) for
% pdflatex; EPS format (only) for standard \LaTeX{}); and for 
% reflection and rotation features.
% \iffalse
%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}); and for reflection and rotation features.
% \fi
%    \begin{macrocode}
\RequirePackage{graphicx}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{textcase}
% Provides a more sophisticated casing function than the
%       default.
% \iffalse
%% Provides a more sophisticated casing function than the default.
% \fi
%    \begin{macrocode}
\RequirePackage{textcase}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{xcolor}
% Provide color.
% \iffalse
%% Provide color.
% \fi
%    \begin{macrocode}
\RequirePackage{xcolor}%
  \@ifundefined{T}{%
	    \newcommand{\T}[2]{{\fontencoding{T1}%
	      \selectfont#2}}}{}
%    \end{macrocode}
% There seems to be a bug in the T1 encoding of some package
% (unidentified, but possibly \textsf{xcolor}) which
% uses the command {\ttfamily{}\textbackslash{}T1}, which is an
% impossibility (no digits allowed in command names). So we fake
% it here to stop \LaTeX{} complaining, by dropping the first
% argument on the floor.
% \end{CPKpackage}
% \begin{CPKpackage}{eso-pic}
% Add picture commands (or backgrounds) to every page.
% \iffalse
%% Add picture commands (or backgrounds) to every page.
% \fi
%    \begin{macrocode}
\RequirePackage{eso-pic}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{geometry}
% Package for establishing margins and text area.
% \iffalse
%% Package for establishing margins and text area.
% \fi
%    \begin{macrocode}
\RequirePackage[\SIL@paper,\SIL@orient,nohead,
  nofoot,margin=1cm]{geometry}%
%    \end{macrocode}
% \end{CPKpackage}
% \begin{CPKpackage}{biblatex}
% Use \textsf{biblatex} instead of \BibTeX{};
% \iffalse
%% Use biblatex instead of \BibTeX{}
% \fi
%    \begin{macrocode}
\RequirePackage[backend=biber,style=authoryear]{biblatex}%
  \AtBeginDocument{%
	    \setlength{\bibitemsep}{1ex}%
	    \setlength{\bibnamesep}{1.5\itemsep}%
	    \defbibheading{shortbib}[References]%
	      {\section{#1}}}
	  \@ifpackagewith{babel}{british}{%
	    \DeclareLanguageMapping{british}%
	      {british-apa}}{\relax}
  \providetoggle{blx@skipbiblist}
%    \end{macrocode}
% \end{CPKpackage}
% 
% \subsection{Non-package resources}
% \iffalse
%% 
%% ****************************************************************** 
%% 
%% Non-package resources
% \fi
% \begin{CPKfile}{random.tex}\label{file--random.tex}
% There is one resource not available in packaged form,
%     the module that lets \LaTeX{} create random values. This is
%     in {\ttfamily{}random.tex}\thinspace, which on the author's
%     system is hiding in a directory
%     {\ttfamily{}texmf/tex/generic/genmisc/}\thinspace, in the
%     {\ttfamily{}texmf-dist} tree, and indexed by an
%     {\ttfamily{}ls-R} database, so it should therefore
%     be findable by any \TeX{} system.\par
% \iffalse
%% 
%% There is one resource not available in packaged form, the module that lets LaTeX create random values. This is in `random.tex`, which on the author's system is hiding in a directory `texmf/tex/generic/genmisc/`, in the `texmf-dist` tree, and indexed by an `ls-R` database, so it should therefore be findable by any TeX system.
% \fi
%    \begin{macrocode}
\input{random.tex}
%    \end{macrocode}
% \end{CPKfile}
% \subsection{The code}
% \iffalse
%% 
%% ****************************************************************** 
%% 
%% The code
% \fi
% This is beta software: the code is messy and covered in
%   tracing output.\par
% \iffalse
%% 
%% This is beta software: the code is messy and covered in tracing output.
% \fi
% \subsubsection{Font selection}\label{fonts}
% \iffalse
%% 
%% Font selection
% \fi
% \begin{CPKcounter}{SIL@maxfont}\label{counter--SIL@maxfont}
% This is set in the {\ttfamily{}\textbackslash{}input} file
%       {\ttfamily{}pickfont.tex}\thinspace, which is created by
%       the preparatory data script
%       {\ttfamily{}prepdata.sh}\thinspace. It is the number of
%       working text fonts found on the system.\par
% \iffalse
%% 
%% This is set in the `\input` file `pickfont.tex`, which is created by the preparatory data script `prepdata.sh`. It is the number of working text fonts found on the system.
% \fi
%    \begin{macrocode}
\newcounter{SIL@maxfont}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKcounter}{SIL@fontsel}\label{counter--SIL@fontsel}
% This is set to a random number between one and
%       {\ttfamily{}SIL@maxfont}, and used as the
%       name of the file containing the font name.\par
% \iffalse
%% 
%% This is set to a random number between one and `\SIL@maxfont`, and used as the name of the file containing the font name.
% \fi
%    \begin{macrocode}
\newcounter{SIL@fontsel}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKfile}{pickfont.tex}\label{file--pickfont.tex}
% This file is created by the preparatory data script
%       {\ttfamily{}prepdata.sh} after it sets up the
%       subdirectory list of valid text fonts. It sets the value
%       of \DescribeCounter{SIL@maxfont}{\ttfamily{}SIL@maxfont}.\par
% \iffalse
%% 
%% This file is created by the preparatory data script `prepdata.sh` after it sets up the subdirectory list of valid text fonts. It sets the value of `\SIL@maxfont`.
% \fi
%    \begin{macrocode}
\input{pickfont.tex}
%    \end{macrocode}
% \end{CPKfile}
% \subsubsection{Color selection}\label{color}
% \iffalse
%% 
%% Color selection
% \fi
% \begin{CPKcounter}{SIL@maxcolno}\label{counter--SIL@maxcolno}
% This value is set at the end of the color choice
%       file created by the script. This is the number of color
%       names found by the routine in
%       {\ttfamily{}prepdata.sh} which extracts the
%       color names.\par
% \iffalse
%% 
%% This value is set at the end of the color choice file created by the script. This is the number of color names found by the routine in `prepdata.sh` which extracts the color names.
% \fi
%    \begin{macrocode}
\newcounter{SIL@maxcolno}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKfile}{svgnam.tex}\label{file--svgnam.tex}
% The preparatory data script
%       {\ttfamily{}prepdata.sh} retrieves the colors named
%       in the \textbf{\texttt{svgnames}} option to the
%       \textsf{xcolor} package and instantiates them
%       as a \LaTeX{} case list in the file
%       {\ttfamily{}svgnam.tex} as the command
%       {\ttfamily{}\textbackslash{}SIL@svgcolname}.\par
% \iffalse
%% 
%% The preparatory data script `prepdata.sh` retrieves the colors named in the **`svgnames`** option to the _xcolor_ package and instantiates them as a LaTeX case list in the file `svgnam.tex` as the command `\SIL@svgcolname`.
% \fi
%    \begin{macrocode}
\input{svgnam.tex}
%    \end{macrocode}
% \end{CPKfile}
% \begin{CPKcounter}{SIL@loopcount}\label{counter--SIL@loopcount}
% The random font selection is done in a loop because
%       of the need to test the values. This counter counts the
%       iterations…\par
% \iffalse
%% 
%% The random font selection is done in a loop because of the need to test the values. This counter counts the iterations…
% \fi
%    \begin{macrocode}
\newcounter{SIL@loopcount}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKcounter}{SIL@maxloop}\label{counter--SIL@maxloop}
% …and this one the limit.\par
% \iffalse
%% 
%% …and this one the limit.
% \fi
%    \begin{macrocode}
\newcounter{SIL@maxloop}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKcounter}{SIL@bgcolno}\label{counter--SIL@bgcolno}
% The colors are selected numerically. This value is
%       the background color of the spine of a book.\par
% \iffalse
%% 
%% The colors are selected numerically. This value is the background color of the spine of a book.
% \fi
%    \begin{macrocode}
\newcounter{SIL@bgcolno}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKcounter}{SIL@fgcolno}\label{counter--SIL@fgcolno}
% And this is the foreground color, used to typeset
%       the title and author on the spine of a book.\par
% \iffalse
%% 
%% And this is the foreground color, used to typeset the title and author on the spine of a book.
% \fi
%    \begin{macrocode}
\newcounter{SIL@fgcolno}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKlength}{splitpoint}\label{length--splitpoint}
% To make sure that \DescribeCounter{SIL@bgcolno}{\ttfamily{}SIL@bgcolno} and \DescribeCounter{SIL@fgcolno}{\ttfamily{}SIL@fgcolno}
%       are distinct, we will need to pick one
%       `dark' and one
%       `light', crudely distinguished by
%       examining their `brightness'
%       (monochrome intensity value) using the formula
%       \(b=\sqrt(.241r^2+.691g^2+.068b^2)\)\label{bright} due to \parencite{dob2008}.
%       From inspection, the modal point of the
%       \textsc{svg} values occurs around 0.6, so use
%       use this to determine if the randomly-selected color is
%       `dark' or
%       `light'. Because it's a decimal
%       fraction, we express it as a dimension and strip off the
%       `pt' later.\par
% \iffalse
%% 
%% To make sure that `\SIL@bgcolno` and `\SIL@fgcolno` are distinct, we will need to pick one “dark” and one “light”, crudely distinguished by examining their “brightness” (monochrome intensity value) using the formula due to (Dobovizki, 2008). From inspection, the modal point of the SVG values occurs around 0.6, so use use this to determine if the randomly-selected color is “dark” or “light”. Because it's a decimal fraction, we express it as a dimension and strip off the “pt” later.
% \fi
%    \begin{macrocode}
\newlength{\SIL@splitpoint}
\setlength{\SIL@splitpoint}{0.6pt}
%    \end{macrocode}
% \end{CPKlength}
% \begin{CPKmacro}{\SIL@bgcol}\label{macro--SIL@bgcol}
% We establish defaults for the background color…\par
% \iffalse
%% 
%% We establish defaults for the background color…
% \fi
%    \begin{macrocode}
\def\SIL@bgcol{White}
%    \end{macrocode}
% \end{CPKmacro}
% \begin{CPKmacro}{\SIL@fgcol}\label{macro--SIL@fgcol}
% …and the foreground color.\par
% \iffalse
%% 
%% …and the foreground color.
% \fi
%    \begin{macrocode}
\def\SIL@fgcol{Black}
%    \end{macrocode}
% \end{CPKmacro}
% \begin{CPKlength}{SIL@bgval}\label{length--SIL@bgval}
% The values computed by the
%       {\ttfamily{}prepdata.sh} script and stored in
%       {\ttfamily{}svgnam.tex} are decimal fractions,
%       to they need to be retrieved as lengths. This is the
%       background value…\par
% \iffalse
%% 
%% The values computed by the `prepdata.sh` script and stored in `svgnam.tex` are decimal fractions, to they need to be retrieved as lengths. This is the background value…
% \fi
%    \begin{macrocode}
\newlength{\SIL@bgval}
%    \end{macrocode}
% \end{CPKlength}
% \begin{CPKlength}{SIL@fgval}\label{length--SIL@fgval}
% …and the foreground value.\par
% \iffalse
%% 
%% …and the foreground value.
% \fi
%    \begin{macrocode}
\newlength{\SIL@fgval}
%    \end{macrocode}
% \end{CPKlength}
% \begin{CPKlength}{SIL@bgfgdiff}\label{length--SIL@bgfgdiff}
% The `dark' or
%       `light' test discussed above also
%       needs to test if the values are too close to the
%       splitpoint. By examination, if the values have an
%       absolute difference of 0.2 they should be visually
%       distinct enough. The difference is calculated and stored
%       in this length variable, as it's a decimal fraction.\par
% \iffalse
%% 
%% The “dark” or “light” test discussed above also needs to test if the values are too close to the splitpoint. By examination, if the values have an absolute difference of 0.2 they should be visually distinct enough. The difference is calculated and stored in this length variable, as it's a decimal fraction.
% \fi
%    \begin{macrocode}
\newlength{\SIL@bgfgdiff}
%    \end{macrocode}
% \end{CPKlength}
% \begin{CPKswitch}{SIL@notyetcols}\label{switch--SIL@notyetcols}
% In the testing for colors, the nested conditionals
%       set this switch true or false, so that it can be used to
%       control the iteration through successive attempts to find
%       suitable random values.\par
% \iffalse
%% 
%% In the testing for colors, the nested conditionals set this switch true or false, so that it can be used to control the iteration through successive attempts to find suitable random values.
% \fi
%    \begin{macrocode}
\newif\ifSIL@notyetcols
%    \end{macrocode}
% \end{CPKswitch}
% \subsubsection{Page border setup}\label{borders}
% \iffalse
%% 
%% Page border setup
% \fi
% \begin{CPKmacro}{\AddToShipoutPictureBG}\label{macro--AddToShipoutPictureBG}
% The page background color is set to a pale brown
%       roughly matching the pine veneer of IKEA bookcases, with
%       the inner page (behind the books) in a dark shadow
%       brown. The technique for imposing a colored margin is
%       due to \href{https://tex.stackexchange.com/questions/7725/how-to-set-a-certain-color-other-than-white-to-margin-areas}{Ulrike 
% Fischer} and uses the commands from the
%       \textsf{eso-pic} package.\par
% \iffalse
%% 
%% The page background color is set to a pale brown roughly matching the pine veneer of IKEA bookcases, with the inner page (behind the books) in a dark shadow brown. The technique for imposing a colored margin is due to [Ulrike Fischer](https://tex.stackexchange.com/questions/7725/how-to-set-a-certain-color-other-than-white-to-margin-areas) and uses the commands from the _eso-pic_ package.
% \fi
%    \begin{macrocode}
\pagecolor{BurlyWood}
\AddToShipoutPictureBG{%
 \AtTextLowerLeft{\color{SaddleBrown}%
   \rule[-\footskip]{\textwidth}{%
     \dimexpr\textheight+\footskip}}}
%    \end{macrocode}
% \end{CPKmacro}
% \subsubsection{Size and shape}\label{sizeshape}
% \iffalse
%% 
%% Size and shape
% \fi
% Each book is assigned a random height and width,
%     within the bounds set by the maxima and minima. The final
%     dimensions may then be modified by the choice of layout
%     and font.\par
% \iffalse
%% 
%% Each book is assigned a random height and width, within the bounds set by the maxima and minima. The final dimensions may then be modified by the choice of layout and font.
% \fi
%    \begin{macrocode}
\newlength{\SIL@bookheight}
\newlength{\SIL@bookwidth}
\newlength{\SIL@minbookwidth}
\newlength{\SIL@maxbookwidth}
\newlength{\SIL@minbookheight}
\newlength{\SIL@maxbookheight}
%    \end{macrocode}
% \subsubsection{Title and author dimensions}\label{titling}
% \iffalse
%% 
%% Title and author dimensions
% \fi
% The title and author need to be measured, and
%     decisions are made about what size they need to be. The
%     two layouts (author separately at the top, and author
%     inline to title) are distinguished with the
%     {\ttfamily{}\textbackslash{}SIL@topauthor} conditional. If the title
%     (with or without the author can fit on one line (rather
%     than multiple lines) this is signalled with the
%     {\ttfamily{}\textbackslash{}SIL@titleoneline} conditional.\par
% \iffalse
%% 
%% The title and author need to be measured, and decisions are made about what size they need to be. The two layouts (author separately at the top, and author inline to title) are distinguished with the `\SIL@topauthor` conditional. If the title (with or without the author can fit on one line (rather than multiple lines) this is signalled with the `\SIL@titleoneline` conditional.
% \fi
%    \begin{macrocode}
\newlength{\SIL@titlewidth}
\newlength{\SIL@authorwidth}
\newlength{\SIL@titleheight}
\newlength{\SIL@authorheight}
\newlength{\SIL@scaledtitle}
\newlength{\SIL@heightfortitle}
\newbox\SIL@titlebox
\newif\ifSIL@topauthor
\newif\ifSIL@titleoneline
%    \end{macrocode}
% \subsubsection{Handling the math}
% \iffalse
%% 
%% Handling the math
% \fi
% \begin{CPKcounter}{SIL@scale}\label{counter--SIL@scale}
% To extract the integer part of a fixed-point value,
%       we define a simple strip which uses the integer and
%       throws away the rest. The integer ends up in this
%       counter.\par
% \iffalse
%% 
%% To extract the integer part of a fixed-point value, we define a simple strip which uses the integer and throws away the rest. The integer ends up in this counter.
% \fi
%    \begin{macrocode}
\newcounter{SIL@scale}
%    \end{macrocode}
% \end{CPKcounter}
% \begin{CPKmacro}{\SIL@scaleint}\label{macro--SIL@scaleint}
% The integer macro returns the counter above.\par
% \iffalse
%% 
%% The integer macro returns the counter above.
% \fi
%    \begin{macrocode}
\def\SIL@scaleint#1.#2\sentinel{%
   \setcounter{SIL@scale}{#1}}
%    \end{macrocode}
% \end{CPKmacro}
% \subsubsection{Settings}
% \iffalse
%% 
%% Settings
% \fi
% We set the space around a box and the thickness of the
%   rule, and remove the page numbers.\par
% \iffalse
%% 
%% We set the space around a box and the thickness of the rule, and remove the page numbers.
% \fi
%    \begin{macrocode}
\fboxsep1em\fboxrule.1pt
\pagestyle{empty}
%    \end{macrocode}
% \subsubsection{Making the book}\label{mb}
% \iffalse
%% 
%% Making the book
% \fi
% The {\ttfamily{}\textbackslash{}makebook} macro is huge, and
%     handles all the detail of making a book spine. It takes
%     one mandatory argument: a \BibTeX{} entry label value from
%     the declared \BibTeX{} {\ttfamily{}.bib} file in
%     {\ttfamily{}\textbackslash{}addbibresource}.\par
% \iffalse
%% 
%% The `\makebook` macro is huge, and handles all the detail of making a book spine. It takes one mandatory argument: a BiBTeX entry label value from the declared BiBTeX `.bib` file in `\addbibresource`.
% \fi
% \begin{CPKmacro}{\makebook}\label{macro--makebook}
% Start by announcing the entry label and setting the
%     values that need to be reset every time.\par
% \iffalse
%% 
%% Start by announcing the entry label and setting the values that need to be reset every time.
% \fi
%    \begin{macrocode}
\newcommand{\makebook}[1]{{%
  \typeout{^^J#1}%
  \setcounter{SIL@maxloop}{10}%
  \setcounter{SIL@loopcount}{0}%
% observed
  \setlength{\SIL@minbookwidth}{5mm}%
  \setlength{\SIL@maxbookwidth}{20mm}%
% A5 to A4 height
  \setlength{\SIL@minbookheight}{70mm}%
  \setlength{\SIL@maxbookheight}{110mm}%
  \setlength{\SIL@bookwidth}{0pt}%
  \setlength{\SIL@bookheight}{0pt}%
  \setlength{\SIL@heightfortitle}{0pt}%
  \SIL@topauthorfalse
%    \end{macrocode}
% \end{CPKmacro}
% \begin{CPKmacro}{\loop}\label{macro--loop}
% Start a loop which will pick two random integers,
%       one for background and one for foreground colors. Look
%       these up in the {\ttfamily{}\textbackslash{}SIL@svgcolval} (in
%       {\ttfamily{}svgnam.tex}) to get the brightness
%       values, and calculate the absolute distance between
%       them.\par
% \iffalse
%% 
%% Start a loop which will pick two random integers, one for background and one for foreground colors. Look these up in the `\SIL@svgcolval` (in `svgnam.tex`) to get the brightness values, and calculate the absolute distance between them.
% \fi
%    \begin{macrocode}
  \loop
    \addtocounter{SIL@loopcount}{1}%
    \typeout{Try \theSIL@loopcount}%
    \setrannum{\c@SIL@bgcolno}{1}{%
      \c@SIL@maxcolno}%
    \typeout{BG=\theSIL@bgcolno}%
    \setrannum{\c@SIL@fgcolno}{1}{%
      \c@SIL@maxcolno}%
    \typeout{FG=\theSIL@fgcolno}%
    \setlength{\SIL@bgval}{%
      \SIL@svgcolval{\theSIL@bgcolno}pt}%
    \typeout{BGval=\the\SIL@bgval}%
    \setlength{\SIL@fgval}{%
      \SIL@svgcolval{\theSIL@fgcolno}pt}%
    \typeout{FGval=\the\SIL@fgval}%
    \setlength{\SIL@bgfgdiff}{%
      \SIL@bgval - \SIL@fgval}%
    \typeout{Split gap is \the\SIL@bgfgdiff}%
    \ifdim\SIL@bgfgdiff<0pt
      \setlength{\SIL@bgfgdiff}{%
        \SIL@fgval - \SIL@bgval}%
      \typeout{Using absolute value
        \the\SIL@bgfgdiff}%
    \fi
%    \end{macrocode}
% The colours need to be separated either side of the
%       0.6 splitpoint value of the calculated brightness, so
%       make this the outer test, and make the inner test for
%       the separation difference. This will return true if the
%       colors are separated enough, and come from opposite
%       sides of the split point. If the loop makes \DescribeCounter{SIL@maxloop}{\ttfamily{}SIL@maxloop}
%       iterations without finding a pair of values, use
%       whatever was tested last.\par
% \iffalse
%% 
%% The colours need to be separated either side of the 0.6 splitpoint value of the calculated brightness, so make this the outer test, and make the inner test for the separation difference. This will return true if the colors are separated enough, and come from opposite sides of the split point. If the loop makes `\SIL@maxloop` iterations without finding a pair of values, use whatever was tested last.
% \fi
%    \begin{macrocode}
    \ifdim\SIL@bgval<\SIL@splitpoint
      \ifdim\SIL@fgval>\SIL@splitpoint
        \ifdim\SIL@bgfgdiff>0.2pt
          \SIL@notyetcolsfalse
        \else
          \SIL@notyetcolstrue
        \fi
      \else
        \SIL@notyetcolstrue
      \fi
    \else
      \ifdim\SIL@fgval<\SIL@splitpoint
        \ifdim\SIL@bgfgdiff>0.2pt
          \SIL@notyetcolsfalse
        \else
          \SIL@notyetcolstrue
        \fi
      \else
        \SIL@notyetcolstrue
      \fi
    \fi
    \typeout{BG=\theSIL@bgcolno,
             FG=\theSIL@fgcolno}%  
    \ifnum\c@SIL@loopcount>\c@SIL@maxloop
      \SIL@notyetcolsfalse
    \fi
  \ifSIL@notyetcols\repeat
  \def\SIL@bgcol{\SIL@svgcolname{%
      \theSIL@bgcolno}}% 
  \def\SIL@fgcol{\SIL@svgcolname{%
      \theSIL@fgcolno}}%
  \typeout{BG=\SIL@bgcol, FG=\SIL@fgcol}%
%    \end{macrocode}
% Now pick a random font: the files generated by
%       {\ttfamily{}prepdata.sh} are named as integers with
%       a {\ttfamily{}.tex} extension in the
%       {\ttfamily{}fontsel} directory. These files load
%       the font as {\ttfamily{}\textbackslash{}SILmfont} (no
%       {\ttfamily{}@} sign, because this is
%       occurring in user mode), and define
%       {\ttfamily{}\textbackslash{}SILmfontname} as the name (for the
%       same reason).\par
% \iffalse
%% 
%% Now pick a random font: the files generated by `prepdata.sh` are named as integers with a `.tex` extension in the `fontsel` directory. These files load the font as `\SILmfont` (no @ sign, because this is occurring in user mode), and define `\SILmfontname` as the name (for the same reason).
% \fi
%    \begin{macrocode}
  \setrannum{\c@SIL@fontsel}{1}{\c@SIL@maxfont}%
  \input{fontsel/\theSIL@fontsel.tex}%
  \typeout{Set in \SILmfontname}%
%    \end{macrocode}
% Measure the author width and height at the default
%       size (10pt). If the author fits in 90\% of the
%       maximum width of the book, we put it at the top of the
%       spine and shrink the book width to 1.1 times the set
%       width, provided that is not less than the defined
%       minimum width. The book width is therefore fixed at this
%       point and won't change later.\par
% \iffalse
%% 
%% Measure the author width and height at the default size (10pt). If the author fits in 90\% of the maximum width of the book, we put it at the top of the spine and shrink the book width to 1.1 times the set width, provided that is not less than the defined minimum width. The book width is therefore fixed at this point and won't change later.
% \fi
%    \begin{macrocode}
  \settowidth{\SIL@authorwidth}{%
              \SILmfont\citefullauthor{#1}}%
  \typeout{Author width: \the\SIL@authorwidth}%
  \settoheight{\SIL@authorheight}{%
               \SILmfont\citefullauthor{#1}}%
  \typeout{Author height: \the\SIL@authorheight}%
  \ifdim\SIL@authorwidth<.9\SIL@maxbookwidth
    \typeout{Author width is less than 90\%
             of \the\SIL@maxbookwidth}%
    \setlength{\SIL@bookwidth}{%
               1.1\SIL@authorwidth}%
    \typeout{Book width set to \the\SIL@bookwidth}%
    \ifdim\SIL@bookwidth<\SIL@minbookwidth
      \setlength{\SIL@bookwidth}{%
                 \SIL@minbookwidth}%
      \typeout{Book width reset to min
               \the\SIL@minbookwidth}% was height 2020-06-26
    \fi
    \SIL@topauthortrue
  \else
    \typeout{Author won't fit in .9 of
             \the\SIL@maxbookwidth}%
  \fi
%    \end{macrocode}
% Now measure the title, with an em rule and the
%       author if it hasn't been assigned to the top of the
%       spine.\par
% \iffalse
%% 
%% Now measure the title, with an em rule and the author if it hasn't been assigned to the top of the spine.
% \fi
%    \begin{macrocode}
  \settowidth{\SIL@titlewidth}{%
              \SILmfont\citetitle{#1}}%
  \ifdim\SIL@titlewidth=0pt
    \typeout{WARNING title width for entry "#1" 
      set in \SILmfontname=0pt!}%
    \typeout{Likely that the entry has faulty
      syntax or a bogus title field}%
    \typeout{or a BiBTeX management or 
      crossref setting is being misinterpreted.}%
    \typeout{I can't go any further until you
      fix this, sorry}%
    \end{document}%
  \fi
  \ifSIL@topauthor
    \typeout{Title width: \the\SIL@titlewidth}%
  \else
    \addtolength{\SIL@titlewidth}{%
                 \widthof{\SILmfont~~—~~}}%
    \addtolength{\SIL@titlewidth}{%
                 \SIL@authorwidth}%
    \typeout{Title width with em rule and author:
      \the\SIL@titlewidth}%
  \fi
%    \end{macrocode}
% We now have enough data to make a shot at the
%       dimensions. Pick a random book height and set the height
%       available for the title (set sideways) to 90\% of
%       that, so that it fits comfortably. Then if the author
%       was earlier assigned to the top of the spine, reduce
%       this height available for the title by 1.2 times the
%       height occupied by the author (again, to leave a little
%       space). In this case, the width has already been set;
%       otherwise, generate a random width now.\par
% \iffalse
%% 
%% We now have enough data to make a shot at the dimensions. Pick a random book height and set the height available for the title (set sideways) to 90\% of that, so that it fits comfortably. Then if the author was earlier assigned to the top of the spine, reduce this height available for the title by 1.2 times the height occupied by the author (again, to leave a little space). In this case, the width has already been set; otherwise, generate a random width now.
% \fi
%    \begin{macrocode}
  \typeout{Limits: width=\the\SIL@minbookwidth
              –\the\SIL@maxbookwidth;
                   height=\the\SIL@minbookheight
              –\the\SIL@maxbookheight}%
  \setrandim{\SIL@bookheight}%
            {\SIL@minbookheight}%
            {\SIL@maxbookheight}%
  \typeout{Height generated as
           \the\SIL@bookheight}%
  \setlength{\SIL@heightfortitle}%
            {.9\SIL@bookheight}%
  \typeout{Height available for title (90\%):
           \the\SIL@heightfortitle}%
  \ifSIL@topauthor
    \typeout{Width set because author fits:
             \the\SIL@bookwidth}%
    \addtolength{\SIL@heightfortitle}%
                {-1.2\SIL@authorheight}%
    \typeout{Height available for title reset to
             \the\SIL@heightfortitle}%
  \else
  \setrandim{\SIL@bookwidth}%
            {\SIL@minbookwidth}%
            {\SIL@maxbookwidth}%
  \typeout{Width generated as
           \the\SIL@bookwidth}%
  \fi
%    \end{macrocode}
% See how the title will fit the space: if it's
%       smaller, it will fit on one line, but we scale it up so
%       it occupies more of the space available. To do this, we
%       perform fixed-point arithmetic on the space it takes and
%       the space available, and use the resulting decimal
%       fraction later to scale the title. However, if the value
%       resulting is greater than four, set it to four,
%       otherwise the title will be too big to fit. The value
%       four was obtained by inspection and trial and
%       error.\par
% \iffalse
%% 
%% See how the title will fit the space: if it's smaller, it will fit on one line, but we scale it up so it occupies more of the space available. To do this, we perform fixed-point arithmetic on the space it takes and the space available, and use the resulting decimal fraction later to scale the title. However, if the value resulting is greater than four, set it to four, otherwise the title will be too big to fit. The value four was obtained by inspection and trial and error.
% \fi
%    \begin{macrocode}
  \ifdim\SIL@titlewidth<\SIL@heightfortitle
    \typeout{Titling fits in
             \the\SIL@heightfortitle}%
    \SIL@titleonelinetrue
    \edef\titleval{\strip@pt\SIL@titlewidth}%
    \edef\heightval{\strip@pt\SIL@heightfortitle}%
    \FPeval\SIL@scaledtitle{\heightval/\titleval}%
    \typeout{Scaling 1-line title by
             \SIL@scaledtitle}%
    \expandafter\SIL@scaleint
                \SIL@scaledtitle\sentinel
    \ifnum\c@SIL@scale>4
      \gdef\SIL@scaledtitle{4}%
      \typeout{Resetting scale \theSIL@scale\ to
               \SIL@scaledtitle}%
    \fi
%    \end{macrocode}
% Otherwise (too long) the title needs to be set in a
%       box as a multi-line title. This gets complicated:\par
% \iffalse
%% 
%% Otherwise (too long) the title needs to be set in a box as a multi-line title. This gets complicated:
% \fi
% \begin{enumerate}
% \item set the title in a {\ttfamily{}\textbackslash{}vbox} and
%   then add the height and depth it occupies to get the
%   height of the set title;
% \iffalse

  1. %% set the title in a `\vbox` and then add the height and depth it occupies to get the height of the set title
% \fi
% \item if that height is more than the width of the
% book, use the method above to divide the available
% height by the [over]used height and use that to reduce
% the point size by deducting it from 10 (points);
% \iffalse

  2. %% if that height is more than the width of the book, use the method above to divide the available height by the [over]used height and use that to reduce the point size by deducting it from 10 (points)
% \fi
% \item otherwise (the multiline title fits in the width
% of the book), do the reverse and increase the point
% size to take advantage of the extra space by adding it
% to 10pt.\par
% \iffalse

  3. %% otherwise (the multiline title fits in the width of the book), do the reverse and increase the point size to take advantage of the extra space by adding it to 10pt.
% \fi
% \end{enumerate}
%    \begin{macrocode}
  \else
    \typeout{Titling won't fit
             \the\SIL@heightfortitle}%
    \SIL@titleonelinefalse
    \setbox\SIL@titlebox=\vbox{%
      \hsize\SIL@heightfortitle
      \SILmfont\raggedright
      \vrule height1em width0pt
      \bfseries\citetitle{#1}%
      \vrule depth.2em width0pt
    }%
    \setlength{\SIL@titleheight}%
              {\ht\SIL@titlebox + \dp\SIL@titlebox}%
    \typeout{Multiline title takes
             \the\SIL@titleheight}%
    \ifdim\SIL@titleheight>\SIL@bookwidth
      \typeout{Height of title
               \the\SIL@titleheight\
               is greater than
               \the\SIL@bookwidth}%
      \edef\titleval{\strip@pt\SIL@titleheight}%
      \edef\heightval{\strip@pt\SIL@bookwidth}%
      \FPeval\SIL@scaledtitle
          {10 - \heightval / \titleval}%
      \typeout{10 - \heightval\ ÷ \titleval\
               = \SIL@scaledtitle}%
      \typeout{Using smaller font \SIL@scaledtitle
               pt for multiline title}%
    \else
      \typeout{Height of title
               \the\SIL@titleheight\
               is less than
               \the\SIL@bookwidth}%
      \edef\titleval{\strip@pt\SIL@titleheight}%
      \edef\heightval{\strip@pt\SIL@bookwidth}%
      \FPeval\SIL@scaledtitle
          {10 + \heightval / \titleval}%
      \typeout{10 + \heightval\ ÷ \titleval\
               = \SIL@scaledtitle}%
      \typeout{Using larger font \SIL@scaledtitle
               pt for multiline title}%
    \fi
  \fi
%    \end{macrocode}
% Finally, set a {\ttfamily{}\textbackslash{}vbox} to the
%       defined width \emph{less} the space
%       occupied by the {\ttfamily{}\textbackslash{}fcolorbox} border and
%       rule; then set the {\ttfamily{}\textbackslash{}fcolorbox} with the
%       chosen colors, with the author at the top if that's what
%       was selected earlier, and the title below, either scaled
%       using {\ttfamily{}\textbackslash{}scalebox} if it was a
%       single-line title, or with the amended font size if it
%       was a multiline title.\par
% \iffalse
%% 
%% Finally, set a `\vbox` to the defined width _less_ the space occupied by the `\fcolorbox` border and rule; then set the `\fcolorbox` with the chosen colors, with the author at the top if that's what was selected earlier, and the title below, either scaled using `\scalebox` if it was a single-line title, or with the amended font size if it was a multiline title.
% \fi
% For a setting with the author inline to the title,
%       just do the scaling of the title.\par
% \iffalse
%% 
%% For a setting with the author inline to the title, just do the scaling of the title.
% \fi
%    \begin{macrocode}
  \leavevmode\vbox{\hsize\SIL@bookwidth
    \advance\hsize by2\fboxsep
    \advance\hsize by2\fboxrule
  \fcolorbox{black}{\SIL@bgcol}{%
    \ifSIL@topauthor
      \typeout{Setting with top author}%
      \vbox to\SIL@bookheight{\hsize\SIL@bookwidth
        \typeout{Spine is a vbox to
          \the\SIL@bookheight,
          hsize=\the\SIL@bookwidth}%
        \centering
        \SILmfont\color{\SIL@fgcol}%
        \citefullauthor{#1}%
        \par\vfill
        \rotatebox{90}{\vbox to\SIL@bookwidth{%
            \hsize\SIL@heightfortitle
          \null\vfill
          \typeout{Title in a vbox to
                   \the\SIL@bookwidth,
                   hsize=\the\SIL@heightfortitle}%
          \raggedright\color{\SIL@fgcol}%
          \ifSIL@titleoneline
            \scalebox{\SIL@scaledtitle}%
                     {\bfseries\citetitle{#1}}%
          \else
            \fontsize{\SIL@scaledtitle}%
                     {\SIL@scaledtitle}\selectfont
            \bfseries\citetitle{#1}%
          \fi
          \par\vfill}%
        }%
      }%
    \else
      \typeout{Setting author inline to title}%
      \vbox to\SIL@bookheight{\hsize\SIL@bookwidth
        \typeout{Spine is a vbox to
                 \the\SIL@bookheight,
                 hsize=\the\SIL@bookwidth}%
        \centering
        \SILmfont\color{\SIL@fgcol}%
        \rotatebox{90}{\vbox to\SIL@bookwidth{%
            \hsize\SIL@heightfortitle
          \null\vfill
          \typeout{Title and author in a vbox to
                   \the\SIL@bookwidth,
                   hsize=\the\SIL@heightfortitle}%
          \raggedright\color{\SIL@fgcol}%
          \ifSIL@titleoneline
            \scalebox{\SIL@scaledtitle}%
                     {{\bfseries\citetitle{#1}}\quad
                       —\ \ \citefullauthor{#1}}%
          \else
            \fontsize{\SIL@scaledtitle}%
                     {\SIL@scaledtitle}\selectfont
                     {\bfseries\citetitle{#1}}\quad
                     —\ \ \citefullauthor{#1}%
          \fi
          \par\vfill}%
        }%
      }%
    \fi
  }%
%    \end{macrocode}
% At the bottom, add a colored bar to fake up the
%       shelf the books stand on. The number is the number of
%       the font that was selected, and is there for
%       error-tracing purposes only.\par
% \iffalse
%% 
%% At the bottom, add a colored bar to fake up the shelf the books stand on. The number is the number of the font that was selected, and is there for error-tracing purposes only.
% \fi
% Despite best efforts at ending all
%       non-control-sequence line-ends with a percent shield,
%       space is creeping in somewhere, so the final negative
%       kern removes it.\par
% \iffalse
%% 
%% Despite best efforts at ending all non-control-sequence line-ends with a percent shield, space is creeping in somewhere, so the final negative kern removes it.
% \fi
%    \begin{macrocode}
  \\\fboxsep0pt\fboxrule0pt
  \colorbox{BurlyWood}{\hbox to\hsize{%
      \hfil\vrule height3mm depth6mm width0pt
      \normalfont\scriptsize\theSIL@fontsel\hfil}}%
  }%
\kern-2.2mm}}%
%    \end{macrocode}
% \end{CPKmacro}
% \begin{CPKmacro}{\DeclareCiteCommand}\label{fields}
% Trying to ensure we have an author's full name, not
%       just the surname. This came from \href{https://tex.stackexchange.com/questions/24979/citing-authors-full-name-in-biblatex}{lockstep}\thinspace, 
%       modified at \textsf{biblatex}'s suggestion to
%       use {\ttfamily{}given-family} instead of
%       {\ttfamily{}first-last}\thinspace, but it doesn't seem
%       to have any effect.\par
% \iffalse
%% 
%% Trying to ensure we have an author's full name, not just the surname. This came from [lockstep](https://tex.stackexchange.com/questions/24979/citing-authors-full-name-in-biblatex), modified at _biblatex_'s suggestion to use given-family instead of first-last, but it doesn't seem to have any effect.
% \fi
%    \begin{macrocode}
\DeclareCiteCommand{\citefullauthor}
  {\boolfalse{citetracker}%
   \boolfalse{pagetracker}%
   \DeclareNameAlias{labelname}{given-family}%
   \usebibmacro{prenote}}
  {\ifciteindex
     {\indexnames{labelname}}
     {}%
   \printnames{labelname}}
  {\multicitedelim}
  {\usebibmacro{postnote}}
%    \end{macrocode}
% \end{CPKmacro}
% \begin{CPKmacro}{\DeclareLabeltitle}\label{macro--DeclareLabeltitle}
% Similarly, in an attempt to get keep the author and
%       title for books and monographs, but use the editors and
%       volume/journal/book title for articles, incollection, and
%       inbook entry types, these two definitions don't seem to
%       have any effect. The remaining definitions are
%       needed to cope with the expected commands found in
%       sample bibliographies.\par
% \iffalse
%% 
%% Similarly, in an attempt to get keep the author and title for books and monographs, but use the editors and volume/journal/book title for articles, incollection, and inbook entry types, these two definitions don't seem to have any effect. The remaining definitions are needed to cope with the expected commands found in sample bibliographies.
% \fi
%    \begin{macrocode}
%%\DeclareLabeltitle[article]{%
%%  \field{journaltitle}
%%}
%%\DeclareLabeltitle
%%    [inbook,incollection,inproceedings]{%
%%  \field{booktitle}
%%  \field{maintitle}
%%}
%
\DeclareFieldFormat*{citetitle}{#1}
\let\citeA\textcite
\let\titleref\emph
\def\emdash{~--- }
%    \end{macrocode}
% \end{CPKmacro}
% \iffalse
%</class>
% \fi
% \nocite{*}
% \clearpage
% \raggedright
% \raggedright\printbibliography\clearpage
% \appendix
% \section{The \LaTeX{} Project Public License (v\thinspace{}1.3c)}\label{LPPL}
% \begin{quotation}\small\sffamily\parindent0pt
%   \parskip.5\baselineskip
%   \color{DarkBlue}\noindent
% Everyone is allowed to distribute verbatim copies of this
%       license document, but modification of it is not allowed.\par
% \end{quotation}
% \subsection{Preamble}\label{Preamble}
% The \LaTeX{} Project Public License (\textsc{lppl})
%       is the primary license under which the \LaTeX{} kernel and the
%       base \LaTeX{} packages are distributed.\par
% You may use this license for any work of which you hold the
%       copyright and which you wish to distribute.  This license may be
%       particularly suitable if your work is \TeX{}-related (such as a
%       \LaTeX{} package), but it is written in such a way that you can
%       use it even if your work is unrelated to \TeX{}.\par
% The section “Whether and How to Distribute Works under This
%       License”, below, gives instructions, examples, and
%       recommendations for authors who are considering distributing
%       their works under this license.\par
% This license gives conditions under which a work may be
%       distributed and modified, as well as conditions under which
%       modified versions of that work may be distributed.\par
% We, the \LaTeX{3} Project, believe that the conditions below
%       give you the freedom to make and distribute modified versions of
%       your work that conform with whatever technical specifications
%       you wish while maintaining the availability, integrity, and
%       reliability of that work.  If you do not see how to achieve your
%       goal while meeting these conditions, then read the document
%       {\ttfamily{}cfgguide.tex} and {\ttfamily{}modguide.tex} in the base \LaTeX{}
%       distribution for suggestions.\par
% \subsection{Definitions}\label{Definitions}
% In this license document the following terms are used:\par
% \begin{description}[style=unboxed]
% \item[Work:]Any work being distributed under this License.\par
% \item[Derived Work:]Any work that under any applicable law is derived from
%     the Work.\par
% \item[Modification:]Any procedure that produces a Derived Work under any
%     applicable law~--- for example, the production of a file
%     containing an original file associated with the Work or a
%     significant portion of such a file, either verbatim or
%     with modifications and/or translated into another
%     language.\par
% \item[Modify:]To apply any procedure that produces a Derived Work
%     under any applicable law.\par
% \item[Distribution:]Making copies of the Work available from one person to
%     another, in whole or in part.  Distribution includes (but
%     is not limited to) making any electronic components of the
%     Work accessible by file transfer protocols such as
%     \textsc{ftp} or \textsc{http} or by
%     shared file systems such as Sun's Network File System
%     (\textsc{nfs}).\par
% \item[Compiled Work:]A version of the Work that has been processed into a
%     form where it is directly usable on a computer system.
%     This processing may include using installation facilities
%     provided by the Work, transformations of the Work, copying
%     of components of the Work, or other activities.  Note that
%     modification of any installation facilities provided by
%     the Work constitutes modification of the Work.\par
% \item[Current Maintainer:]A person or persons nominated as such within the Work.
%     If there is no such explicit nomination then it is the
%     `Copyright Holder' under any applicable
%     law.\par
% \item[Base Interpreter:]A program or process that is normally needed for
%     running or interpreting a part or the whole of the
%     Work.\par
% A Base Interpreter may depend on external components
%     but these are not considered part of the Base Interpreter
%     provided that each external component clearly identifies
%     itself whenever it is used interactively.  Unless
%     explicitly specified when applying the license to the
%     Work, the only applicable Base Interpreter is a
%     `\LaTeX{}-Format' or in the case of files
%     belonging to the `\LaTeX{}-format' a program
%     implementing the `\TeX{} language'.\par
% \end{description}
% \subsection{Conditions on Distribution and Modification}\label{Conditions}
% \begin{enumerate}
% \item Activities other than distribution and/or modification
%   of the Work are not covered by this license; they are
%   outside its scope. In particular, the act of running the
%   Work is not restricted and no requirements are made
%   concerning any offers of support for the Work.\par
% \item \label{item-distribute}You may distribute a complete, unmodified copy of the
%   Work as you received it.  Distribution of only part of the
%   Work is considered modification of the Work, and no right to
%   distribute such a Derived Work may be assumed under the
%   terms of this clause.\par
% \item You may distribute a Compiled Work that has been
%   generated from a complete, unmodified copy of the Work as
%   distributed under Clause~\vref{item-distribute} above, as
%   long as that Compiled Work is distributed in such a way that
%   the recipients may install the Compiled Work on their system
%   exactly as it would have been installed if they generated a
%   Compiled Work directly from the Work.\par
% \item \label{item-currmaint}If you are the Current Maintainer of the Work, you may,
%   without restriction, modify the Work, thus creating a
%   Derived Work.  You may also distribute the Derived Work
%   without restriction, including Compiled Works generated from
%   the Derived Work.  Derived Works distributed in this manner
%   by the Current Maintainer are considered to be updated
%   versions of the Work.\par
% \item If you are not the Current Maintainer of the Work, you
%   may modify your copy of the Work, thus creating a Derived
%   Work based on the Work, and compile this Derived Work, thus
%   creating a Compiled Work based on the Derived Work.\par
% \item \label{item-conditions}If you are not the Current Maintainer of the Work, you
%   may distribute a Derived Work provided the following
%   conditions are met for every component of the Work unless
%   that component clearly states in the copyright notice that
%   it is exempt from that condition.  Only the Current
%   Maintainer is allowed to add such statements of exemption to
%   a component of the Work.\par
% \begin{enumerate}
% \item If a component of this Derived Work can be a direct
%       replacement for a component of the Work when that
%       component is used with the Base Interpreter, then,
%       wherever this component of the Work identifies itself to
%       the user when used interactively with that Base
%       Interpreter, the replacement component of this Derived
%       Work clearly and unambiguously identifies itself as a
%       modified version of this component to the user when used
%       interactively with that Base Interpreter.\par
% \item Every component of the Derived Work contains
%       prominent notices detailing the nature of the changes to
%       that component, or a prominent reference to another file
%       that is distributed as part of the Derived Work and that
%       contains a complete and accurate log of the
%       changes.\par
% \item No information in the Derived Work implies that any
%       persons, including (but not limited to) the authors of
%       the original version of the Work, provide any support,
%       including (but not limited to) the reporting and
%       handling of errors, to recipients of the Derived Work
%       unless those persons have stated explicitly that they do
%       provide such support for the Derived Work.\par
% \item You distribute at least one of the following with
%       the Derived Work:\par
% \begin{enumerate}
% \item A complete, unmodified copy of the Work; if your
%   distribution of a modified component is made by
%   offering access to copy the modified component from
%   a designated place, then offering equivalent access
%   to copy the Work from the same or some similar place
%   meets this condition, even though third parties are
%   not compelled to copy the Work along with the
%   modified component;\par
% \item Information that is sufficient to obtain a
%   complete, unmodified copy of the Work.\par
% \end{enumerate}
% \end{enumerate}
% \item If you are not the Current Maintainer of the Work, you
%   may distribute a Compiled Work generated from a Derived
%   Work, as long as the Derived Work is distributed to all
%   recipients of the Compiled Work, and as long as the
%   conditions of Clause~\vref{item-conditions}, above, are met
%   with regard to the Derived Work.\par
% \item The conditions above are not intended to prohibit, and
%   hence do not apply to, the modification, by any method, of
%   any component so that it becomes identical to an updated
%   version of that component of the Work as it is distributed
%   by the Current Maintainer under Clause~\vref{item-currmaint}, above.\par
% \item Distribution of the Work or any Derived Work in an
%   alternative format, where the Work or that Derived Work (in
%   whole or in part) is then produced by applying some process
%   to that format, does not relax or nullify any sections of
%   this license as they pertain to the results of applying that
%   process.\par
% \item % \begin{enumerate}
% \item A Derived Work may be distributed under a different
%       license provided that license itself honors the
%       conditions listed in Clause~\vref{item-conditions} above, in
%       regard to the Work, though it does not have to honor the
%       rest of the conditions in this license.\par
% \item If a Derived Work is distributed under a different
%       license, that Derived Work must provide sufficient
%       documentation as part of itself to allow each recipient
%       of that Derived Work to honor the restrictions in
%       Clause~\vref{item-conditions} above, concerning
%       changes from the Work.\par
% \end{enumerate}
% \item This license places no restrictions on works that are
%   unrelated to the Work, nor does this license place any
%   restrictions on aggregating such works with the Work by any
%   means.\par
% \item Nothing in this license is intended to, or may be used
%   to, prevent complete compliance by all parties with all
%   applicable laws.\par
% \end{enumerate}
% \subsection{No Warranty}\label{Warranty}
% There is no warranty for the Work.  Except when otherwise
%       stated in writing, the Copyright Holder provides the Work
%       `as is', without warranty of any kind, either
%       expressed or implied, including, but not limited to, the implied
%       warranties of merchantability and fitness for a particular
%       purpose.  The entire risk as to the quality and performance of
%       the Work is with you.  Should the Work prove defective, you
%       assume the cost of all necessary servicing, repair, or
%       correction.\par
% In no event unless required by applicable law or agreed to
%       in writing will The Copyright Holder, or any author named in the
%       components of the Work, or any other party who may distribute
%       and/or modify the Work as permitted above, be liable to you for
%       damages, including any general, special, incidental or
%       consequential damages arising out of any use of the Work or out
%       of inability to use the Work (including, but not limited to,
%       loss of data, data being rendered inaccurate, or losses
%       sustained by anyone as a result of any failure of the Work to
%       operate with any other programs), even if the Copyright Holder
%       or said author or said other party has been advised of the
%       possibility of such damages.\par
% \subsection{Maintenance of The Work}\label{Maintenance}
% The Work has the status `author-maintained'
%       if the Copyright Holder explicitly and prominently states near
%       the primary copyright notice in the Work that the Work can only
%       be maintained by the Copyright Holder or simply that it is
%       `author-maintained'.\par
% The Work has the status `maintained' if there
%       is a Current Maintainer who has indicated in the Work that they
%       are willing to receive error reports for the Work (for example,
%       by supplying a valid e-mail address). It is not required for the
%       Current Maintainer to acknowledge or act upon these error
%       reports.\par
% The Work changes from status `maintained' to
%       `unmaintained' if there is no Current Maintainer,
%       or the person stated to be Current Maintainer of the work cannot
%       be reached through the indicated means of communication for a
%       period of six months, and there are no other significant signs
%       of active maintenance.\par
% You can become the Current Maintainer of the Work by
%       agreement with any existing Current Maintainer to take over this
%       role.\par
% If the Work is unmaintained, you can become the Current
%       Maintainer of the Work through the following steps:\par
% \begin{enumerate}
% \item Make a reasonable attempt to trace the Current
%   Maintainer (and the Copyright Holder, if the two differ)
%   through the means of an Internet or similar search.\par
% \item If this search is successful, then enquire whether the
%   Work is still maintained.\par
% \begin{enumerate}
% \item If it is being maintained, then ask the Current
%       Maintainer to update their communication data within one
%       month.\par
% \item \label{item-intention}If the search is unsuccessful or no action to resume
%       active maintenance is taken by the Current Maintainer,
%       then announce within the pertinent community your
%       intention to take over maintenance.  (If the Work is a
%       \LaTeX{} work, this could be done, for example, by
%       posting to \url{news:comp.text.tex}.).
% \end{enumerate}
% \item % \begin{enumerate}
% \item If the Current Maintainer is reachable and agrees to
%       pass maintenance of the Work to you, then this takes
%       effect immediately upon announcement.\par
% \item \label{item-announce}If the Current Maintainer is not reachable and the
%       Copyright Holder agrees that maintenance of the Work be
%       passed to you, then this takes effect immediately upon
%       announcement.\par
% \end{enumerate}
% \item \label{item-change}If you make an `intention announcement'
%   as described in~\vref{item-intention} above and after three
%   months your intention is challenged neither by the Current
%   Maintainer nor by the Copyright Holder nor by other people,
%   then you may arrange for the Work to be changed so as to
%   name you as the (new) Current Maintainer.\par
% \item If the previously unreachable Current Maintainer becomes
%   reachable once more within three months of a change
%   completed under the terms of~\vref{item-announce}
%   or~\vref{item-change}, then that
%   Current
%   Maintainer must become or remain the Current Maintainer upon
%   request provided they then update their communication data
%   within one month.\par
% \end{enumerate}
% A change in the Current Maintainer does not, of itself,
%       alter the fact that the Work is distributed under the
%       \textsc{lppl} license.\par
% If you become the Current Maintainer of the Work, you should
%       immediately provide, within the Work, a prominent and
%       unambiguous statement of your status as Current Maintainer.  You
%       should also announce your new status to the same pertinent
%       community as in~\vref{item-intention}
%       above.\par
% \subsection{Whether and How to Distribute Works under This
%       License}\label{Distribute}
% This section contains important instructions, examples, and
%       recommendations for authors who are considering distributing
%       their works under this license.  These authors are addressed as
%       `you' in this section.\par
% \subsubsection{Choosing This License or Another License}\label{Choosing}
% If for any part of your work you want or need to use
% \emph{distribution} conditions that differ
% significantly from those in this license, then do not refer to
% this license anywhere in your work but, instead, distribute
% your work under a different license. You may use the text of
% this license as a model for your own license, but your license
% should not refer to the \textsc{lppl} or otherwise
% give the impression that your work is distributed under the
% \textsc{lppl}.\par
% The document {\ttfamily{}modguide.tex} in the base \LaTeX{}
% distribution explains the motivation behind the conditions of
% this license.  It explains, for example, why distributing
% \LaTeX{} under the \textsc{gnu} General Public
% License (\textsc{gpl}) was considered inappropriate.
% Even if your work is unrelated to \LaTeX{}, the discussion in
% {\ttfamily{}modguide.tex} may still be
% relevant, and authors intending to distribute their works
% under any license are encouraged to read it.\par
% \subsubsection{A Recommendation on Modification Without
% Distribution}\label{WithoutDistribution}
% It is wise never to modify a component of the Work, even
% for your own personal use, without also meeting the above
% conditions for distributing the modified component.  While you
% might intend that such modifications will never be
% distributed, often this will happen by accident~--- you may
% forget that you have modified that component; or it may not
% occur to you when allowing others to access the modified
% version that you are thus distributing it and violating the
% conditions of this license in ways that could have legal
% implications and, worse, cause problems for the community. It
% is therefore usually in your best interest to keep your copy
% of the Work identical with the public one.  Many works provide
% ways to control the behavior of that work without altering any
% of its licensed components.\par
% \subsubsection{How to Use This License}\label{HowTo}
% To use this license, place in each of the components of
% your work both an explicit copyright notice including your
% name and the year the work was authored and/or last
% substantially modified.  Include also a statement that the
% distribution and/or modification of that component is
% constrained by the conditions in this license.\par
% Here is an example of such a notice and statement:\par
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language={[LaTeX]TeX}]
%%% pig.dtx
%%% Copyright 2005 M. Y. Name
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%% 
%% The Current Maintainer of this work is M. Y. Name.
%%
%% This work consists of the files pig.dtx and pig.ins
%% and the derived file pig.sty.
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% Given such a notice and statement in a file, the
% conditions given in this license document would apply, with
% the `Work' referring to the three files
% {\ttfamily{}pig.dtx}\thinspace, {\ttfamily{}pig.ins}\thinspace, and {\ttfamily{}pig.sty} (the last being generated
% from {\ttfamily{}pig.dtx} using {\ttfamily{}pig.ins}), the `Base
%   Interpreter' referring to any
% `\LaTeX{}-Format', and both `Copyright
%   Holder' and `Current Maintainer'
% referring to the person
% M.~Y.~Name\index{!}.\par
% If you do not want the Maintenance section of
% \textsc{lppl} to apply to your Work, change
% `maintained' above into
% `author-maintained'. However, we recommend that
% you use `maintained' as the Maintenance
% section was added in order to ensure that your Work remains
% useful to the community even when you can no longer maintain
% and support it yourself.\par
% \subsubsection{Derived Works That Are Not Replacements}\label{NotReplacements}
% Several clauses of the \textsc{lppl} specify
% means to provide reliability and stability for the user
% community. They therefore concern themselves with the case
% that a Derived Work is intended to be used as a (compatible or
% incompatible) replacement of the original Work. If this is not
% the case (e.g., if a few lines of code are reused for a
% completely different task), then clauses 6b and 6d shall not
% apply.\par
% \subsubsection{Important Recommendations}\label{Recommendations}
% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work :}
% The \textsc{lppl} requires that distributions
%   of the Work contain all the files of the Work.  It is
%   therefore important that you provide a way for the licensee
%   to determine which files constitute the Work.  This could,
%   for example, be achieved by explicitly listing all the files
%   of the Work near the copyright notice of each file or by
%   using a line such as:\par
% \iffalse
%<*ignore>
% \fi
\begin{lstlisting}[language={[LaTeX]TeX}]
%% This work consists of all files listed in manifest.txt.
\end{lstlisting}
% \iffalse
%</ignore>
% \fi
% in that place.  In the absence of an unequivocal list it
%   might be impossible for the licensee to determine what is
%   considered by you to comprise the Work and, in such a case,
%   the licensee would be entitled to make reasonable
%   conjectures as to which files comprise the Work.\par
% \subsection{Script to generate data files}\label{script}
% Run this before you run the test file.
% \iffalse
%<*script>
.cp
autopack.xml
bookshelf
bookshelf.aux
bookshelf.bbl
bookshelf.bcf
bookshelf.bib
bookshelf.blg
bookshelf.cls
bookshelf.dtx
bookshelf.err
bookshelf.fdb_latexmk
bookshelf.fls
bookshelf.glo
bookshelf.gls
bookshelf.hd
bookshelf.idx
bookshelf.ilg
bookshelf.ind
bookshelf.ins
bookshelf.log
bookshelf.newidx
bookshelf.out
bookshelf.pdf
bookshelf.run.xml
bookshelf.tex
bookshelf.toc
bookshelf.xdv
bookshelf.xml
bookshelf-0.2.tds.zip
bookshelf-0.2.zip
bookshelf-0.3.tds.zip
bookshelf-0.3.zip
bookshelf-0.4.tds.zip
bookshelf-0.4.zip
bookshelf-0.5.tds.zip
bookshelf-0.5.zip
bookshelf-0.6.tds.zip
bookshelf-0.6.zip
bookshelf-0.7.tds.zip
bookshelf-0.7.zip
bookshelf-0.8.tds.zip
boxes.csv
bug.aux
bug.bbl
bug.bcf
bug.bib
bug.blg
bug.log
bug.pdf
bug.run.xml
bug.tex
citations.bib
citations.ris
citations.ris.bak
citations.ris.sav
doc
entries.tex
exp
farben.csv
farben.tex
fixes
fonts
fontsel
fonttest
fonttest.aux
fonttest.bbl
fonttest.bcf
fonttest.blg
fonttest.log
fonttest.pdf
fonttest.run.xml
fonttest.tex
frank.bib
index.html
lppl.xml
macfonts.list
Makefile
makeshelf.png
makeshelf1.jpg
MANIFEST
mflog
missfont.log
mydox.sty
mydox.sty~
myshelf.aux
myshelf.bbl
myshelf.bcf
myshelf.blg
myshelf.jpg
myshelf.log
myshelf.pdf
myshelf.run.xml
myshelf.tex
mythesis.bib
PhD.bib
pickfont.tex
prepdata.sh
README.md
res
sgml.bib
source
svgnam.csv
svgnam.tex
test
test.aux
test.bbl
test.bcf
test.blg
test.fdb_latexmk
test.fls
test.log
test.pdf
test.run.xml
test.tex
test~
testa.aux
testa.log
testa.pdf
testa.tex
testfont.aux
testfont.pdf
testfont.tex
tex
thesis.bib
trial.aux
trial.log
trial.pdf
trial.tex
type.bib
upload
VERSION
working
xuser
zip.log
%</script>
% \fi
% \subsection{Test document}\label{tester}
% Run this with \XeLaTeX{} then run
% \emph{biber}, then \XeLaTeX{} again.
% \iffalse
%<*tester>
.cp
autopack.xml
bookshelf
bookshelf.aux
bookshelf.bbl
bookshelf.bcf
bookshelf.bib
bookshelf.blg
bookshelf.cls
bookshelf.dtx
bookshelf.err
bookshelf.fdb_latexmk
bookshelf.fls
bookshelf.glo
bookshelf.gls
bookshelf.hd
bookshelf.idx
bookshelf.ilg
bookshelf.ind
bookshelf.ins
bookshelf.log
bookshelf.newidx
bookshelf.out
bookshelf.pdf
bookshelf.run.xml
bookshelf.tex
bookshelf.toc
bookshelf.xdv
bookshelf.xml
bookshelf-0.2.tds.zip
bookshelf-0.2.zip
bookshelf-0.3.tds.zip
bookshelf-0.3.zip
bookshelf-0.4.tds.zip
bookshelf-0.4.zip
bookshelf-0.5.tds.zip
bookshelf-0.5.zip
bookshelf-0.6.tds.zip
bookshelf-0.6.zip
bookshelf-0.7.tds.zip
bookshelf-0.7.zip
bookshelf-0.8.tds.zip
boxes.csv
bug.aux
bug.bbl
bug.bcf
bug.bib
bug.blg
bug.log
bug.pdf
bug.run.xml
bug.tex
citations.bib
citations.ris
citations.ris.bak
citations.ris.sav
doc
entries.tex
exp
farben.csv
farben.tex
fixes
fonts
fontsel
fonttest
fonttest.aux
fonttest.bbl
fonttest.bcf
fonttest.blg
fonttest.log
fonttest.pdf
fonttest.run.xml
fonttest.tex
frank.bib
index.html
lppl.xml
macfonts.list
Makefile
makeshelf.png
makeshelf1.jpg
MANIFEST
mflog
missfont.log
mydox.sty
mydox.sty~
myshelf.aux
myshelf.bbl
myshelf.bcf
myshelf.blg
myshelf.jpg
myshelf.log
myshelf.pdf
myshelf.run.xml
myshelf.tex
mythesis.bib
PhD.bib
pickfont.tex
prepdata.sh
README.md
res
sgml.bib
source
svgnam.csv
svgnam.tex
test
test.aux
test.bbl
test.bcf
test.blg
test.fdb_latexmk
test.fls
test.log
test.pdf
test.run.xml
test.tex
test~
testa.aux
testa.log
testa.pdf
testa.tex
testfont.aux
testfont.pdf
testfont.tex
tex
thesis.bib
trial.aux
trial.log
trial.pdf
trial.tex
type.bib
upload
VERSION
working
xuser
zip.log
%</tester>
% \fi
% \iffalse
%<*tester>
.cp
autopack.xml
bookshelf
bookshelf.aux
bookshelf.bbl
bookshelf.bcf
bookshelf.bib
bookshelf.blg
bookshelf.cls
bookshelf.dtx
bookshelf.err
bookshelf.fdb_latexmk
bookshelf.fls
bookshelf.glo
bookshelf.gls
bookshelf.hd
bookshelf.idx
bookshelf.ilg
bookshelf.ind
bookshelf.ins
bookshelf.log
bookshelf.newidx
bookshelf.out
bookshelf.pdf
bookshelf.run.xml
bookshelf.tex
bookshelf.toc
bookshelf.xdv
bookshelf.xml
bookshelf-0.2.tds.zip
bookshelf-0.2.zip
bookshelf-0.3.tds.zip
bookshelf-0.3.zip
bookshelf-0.4.tds.zip
bookshelf-0.4.zip
bookshelf-0.5.tds.zip
bookshelf-0.5.zip
bookshelf-0.6.tds.zip
bookshelf-0.6.zip
bookshelf-0.7.tds.zip
bookshelf-0.7.zip
bookshelf-0.8.tds.zip
boxes.csv
bug.aux
bug.bbl
bug.bcf
bug.bib
bug.blg
bug.log
bug.pdf
bug.run.xml
bug.tex
citations.bib
citations.ris
citations.ris.bak
citations.ris.sav
doc
entries.tex
exp
farben.csv
farben.tex
fixes
fonts
fontsel
fonttest
fonttest.aux
fonttest.bbl
fonttest.bcf
fonttest.blg
fonttest.log
fonttest.pdf
fonttest.run.xml
fonttest.tex
frank.bib
index.html
lppl.xml
macfonts.list
Makefile
makeshelf.png
makeshelf1.jpg
MANIFEST
mflog
missfont.log
mydox.sty
mydox.sty~
myshelf.aux
myshelf.bbl
myshelf.bcf
myshelf.blg
myshelf.jpg
myshelf.log
myshelf.pdf
myshelf.run.xml
myshelf.tex
mythesis.bib
PhD.bib
pickfont.tex
prepdata.sh
README.md
res
sgml.bib
source
svgnam.csv
svgnam.tex
test
test.aux
test.bbl
test.bcf
test.blg
test.fdb_latexmk
test.fls
test.log
test.pdf
test.run.xml
test.tex
test~
testa.aux
testa.log
testa.pdf
testa.tex
testfont.aux
testfont.pdf
testfont.tex
tex
thesis.bib
trial.aux
trial.log
trial.pdf
trial.tex
type.bib
upload
VERSION
working
xuser
zip.log
%</tester>
% \fi
% \Finale

