texlive[55262] Master: bookshelf (23may20)

commits+karl at tug.org commits+karl at tug.org
Sun May 24 23:43:07 CEST 2020


Revision: 55262
          http://tug.org/svn/texlive?view=revision&revision=55262
Author:   karl
Date:     2020-05-24 23:43:06 +0200 (Sun, 24 May 2020)
Log Message:
-----------
bookshelf (23may20)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/bookshelf/
    trunk/Master/texmf-dist/doc/latex/bookshelf/MANIFEST
    trunk/Master/texmf-dist/doc/latex/bookshelf/README.md
    trunk/Master/texmf-dist/doc/latex/bookshelf/VERSION
    trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf
    trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg
    trunk/Master/texmf-dist/doc/latex/bookshelf/prepdata.sh
    trunk/Master/texmf-dist/doc/latex/bookshelf/test.tex
    trunk/Master/texmf-dist/source/latex/bookshelf/
    trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx
    trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins
    trunk/Master/texmf-dist/tex/latex/bookshelf/
    trunk/Master/texmf-dist/tex/latex/bookshelf/bookshelf.cls
    trunk/Master/tlpkg/tlpsrc/bookshelf.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/bookshelf/MANIFEST
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/MANIFEST	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/MANIFEST	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,7 @@
+bookshelf.dtx
+bookshelf.ins
+bookshelf.pdf
+MANIFEST
+myshelf.jpg
+README.md
+VERSION

Added: trunk/Master/texmf-dist/doc/latex/bookshelf/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/README.md	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,188 @@
+
+[//]: # (bookshelf LaTeX class)
+
+# bookshelf
+
+This is the README.md file for the bookshelf LaTeX class v0.5 (2020-05-24)
+generated by ClassPack v.1.19 (2020-05-19) on 23 May 2020 at 23:33:08 
+
+## Summary
+
+The _bookshelf_ package uses _biblatex_ and _biber_ to turn a 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 JPEG from PDF) can then be used as a background in
+_Zoom_, _Teams_, _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
+`.bib` file, but otherwise should work on any modern TeX distribution.
+
+![Image created from the author's own files](http://latex.silmaril.ie/packages/bookshelf/myshelf.jpg)
+
+
+## Automated installation
+
+If this class is distributed from CTAN, it should be in a zip file which
+allows it to be installed automatically by the TeX Live Manager (tlmgr)
+and similar automated installers.
+
+If you are using automated LaTeX package installation, no further action
+is required: the package will be installed the first time you use it in
+a LaTeX document.
+
+If you are using the TeX Live Manager (_tlmgr_) program manually, you
+can install this package with the command:
+
+
+## TDS installation
+
+This class is also available as a TeX Directory System (TDS) zip file
+(`.tds.zip`). This is the standard directory layout for a modern TeX
+installation which enables the class to be unzipped directly into your
+Personal TeX Directory without the need to use _tlmgr_. If you haven’t
+yet created a Personal TeX Directory, see below for details of what one
+is, and how to create it.
+  *  You can install this class on any TDS-compliant personal system (laptop,
+desktop, workstation, table, smartphone, PDA, etc) by unzipping it
+straight into your Personal TeX Directory. This will put all the files
+into the right places, so you can start using them immediately.
+  *  On a shared (multiuser) system like a server, the administrator can
+unzip it into the `$TEXMFLOCAL` directory instead (see below), and run
+your TeX directory-indexing program (eg _texhash_, _mktexlsr_, etc) so
+that everyone can use it.
+  *  If you are using an old non-TDS-compliant system, see below under Manual
+Installation.
+
+### Your Personal TeX Directory
+
+This is a directory (folder) where you should put all local manual
+modifications (updates, additions such as new or updated classes,
+packages, and fonts) that are _not_ handled automatically by _tlmgr_.
+The name and location are fixed (for all practical purposes):
+  *  Apple Mac OS X
+
+    ~/Library/texmf
+  *  Unix and GNU/Linux
+
+    ~/texmf
+  *  MS-Windows 95/XP/NT
+
+    C:\texmf
+  *  MS-Windows 2007 and above
+
+    Computer\System\YOURNAME\texmf
+
+Create that folder now if it does not already exist. Put (or unzip) all
+additions to your system that are _not_ handled by _tlmgr_ into this
+directory, following _exactly_ the subdirectory structure that is used
+in your main TeX distribution (unzipping a TDS file does this for you).
+This is what enables LaTeX to find stuff automatically.
+
+
+> ####  If you are a Windows user running _MiKTeX_
+> When you create the folder for your Personal TeX Directory, you MUST add it to _MiKTeX_ ’s list of supported folders. Run the _MiKTeX Maintenance/Settings_ program, select the `Roots` tab, and add the folder. You only have to do this once.
+> > Each time you add or remove software in your Personal TeX Directory, you MUST then click on the `Update FNDB` button in the `General` tab of the _MiKTeX Maintenance/Settings_ program, otherwise _MiKTeX_ will not find them and nothing will work!
+> 
+
+Unix (Mac and GNU/Linux) users do not need to (indeed, should not) run
+their filename database indexer program (_mktexlsr_ or _texhash_) for
+files put into a personal TeX directory.
+
+
+## Installation on shared systems
+
+On multi-user systems (Unix-based), identify the shared local directory
+tree with the command
+
+    kpsewhich -expand-var '$TEXMFLOCAL'
+
+This will give you the location of the shared `texmf` directory into
+which you must unzip these files.
+
+Do not forget to run your local TeX filename database indexer program
+(_texhash_ or _mktexlsr_) after installation, otherwise the files will
+not be found by LaTeX and nothing will work!
+
+
+## Manual installation (non-TDS systems)
+
+To install this software manually, download and unzip the _non-_TDS zip
+file into a temporary directory and move the class and/or package
+file[s] and other files to the proper locations where LaTeX will find
+them on your system. This is referred to in some documentation as “the
+`TEXINPUTS` directory”, although it may be called something else on your
+system.
+
+_It is your responsibility to know where this location is._ See the
+question in the TeX FAQ at https://texfaq.org/FAQ-inst-wlcf.html for
+more information. If you do not know, or cannot find it, or do not have
+access to it, your TeX system may be out of date and may need replacing.
+
+
+
+## Online systems and “last resort” systems
+
+Some online LaTeX systems use CTAN, so a package from there should be
+available on demand. For other online LaTeX systems where you do not
+have access to the file system, unzip the _non-_TDS zip file into a
+temporary directory and upload the files to the online system. Follow
+their instructions for where to put them.
+
+In an emergency, or as a last resort on unmanageable systems, it is
+possible simply to put the class and/or package file[s] into your
+current working directory (the same folder as your `.tex` file[s]).
+
+While this may work, it is not supported, and may lead to other
+resources (packages, fonts, images etc) not being found.
+
+
+## Usage
+
+Include the line shown below in the Preamble of your LaTeX document; a
+`\documentclass` line should be at the top; a `\usepackage` command
+normally goes anywhere in the Preamble:
+
+    \documentclass[options]{bookshelf}
+
+(similarly for other classes or packages if more than one is supplied
+with this package). Read the documentation for the options available, if
+any. The documentation is distributed as a PDF document in the zip file.
+You can also regenerate it by typesetting the `bookshelf.dtx` file with
+`xelatex` (and `biber` and _makeindex_) in the normal way.
+
+
+## Bugs and TODO
+
+No outstanding reported bugs at the time of this version.
+
+For TODO items, see the PDF documentation.
+
+
+## Copyright
+
+The following statement is included in the source code:
+
+     Transformed from bookshelf.xml by ClassPack db2dtx.xsl
+     version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
+    
+     bookshelf.cls is copyright © 2020 by Peter Flynn <peter at 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 at silmaril.ie>
+    
+     This work consists of the files bookshelf.dtx and bookshelf.ins,
+     the derived file , 
+     and any other ancillary files listed in the MANIFEST.
+    
+


Property changes on: trunk/Master/texmf-dist/doc/latex/bookshelf/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/bookshelf/VERSION
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/VERSION	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/VERSION	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1 @@
+Date of most recent change is 2020-05-24

Added: trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf	2020-05-24 21:41:54 UTC (rev 55261)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf	2020-05-24 21:43:06 UTC (rev 55262)

Property changes on: trunk/Master/texmf-dist/doc/latex/bookshelf/bookshelf.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg	2020-05-24 21:41:54 UTC (rev 55261)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg	2020-05-24 21:43:06 UTC (rev 55262)

Property changes on: trunk/Master/texmf-dist/doc/latex/bookshelf/myshelf.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/bookshelf/prepdata.sh
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/prepdata.sh	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/prepdata.sh	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,129 @@
+#! /bin/bash
+
+# prepdata.sh - prepare the datasets for the bookshelf package
+# which creates a bookshelf image from a BiBTeX file.
+#
+# Peter Flynn, 2020-05-14 <peter at silmaril.ie>
+#
+# Dependencies: the standard UNIX/GNU Linux text utilities
+# and builtins : cat, grep, awk, mkdir, rm, echo, sed, sort
+# PLUS the font-cache program fc-list (1) and the TeX utility
+# kpsewhich (1).
+#
+# Note that if you have not updated your font-cach to take
+# account of fonts added since installation (eg fonts
+# distributed with TeX which are not installed in the system
+# fonts directories) then you should edit /etc/fonts/conf.avail
+# to add the directories where they are installed to (eg)
+# 09-texlive.conf and then alias that file to conf.d, and then
+# run fc-cache as root.
+
+if [ -z "$1" ]; then
+    echo You must give the full name of your BiBTeX file
+    exit 1
+else
+    if [ ! -s "$1" ]; then
+echo I can\'t find the file "$1" anywhere here
+exit 1
+    else
+BIBFILE="$1"
+    fi
+fi
+
+###########################################################
+#
+# Make a list of all the entries in the bib file. This is
+# in effect the 'driver' which creates each book spine image
+# and the entries.tex file is \input in the test.tex file.
+
+cat "$BIBFILE" |\
+    grep '^@' |\
+    grep -viE '(@Preamble|@String)' |\
+    awk -F\{ '{print $2}' |\
+    awk -F, '{print "\\makebook{" $1 "}%"}' >entries.tex
+
+echo `cat entries.tex|wc -l` bibliographic entries
+
+##########################################################
+#
+# Make a list of all the fonts available: this omits PFB
+# fonts (Postscript Type 1) and deduplicates the entries
+# on the first token of their name. CRITICALLY it then
+# applies a (typically) VERY LONG list of disallowed font
+# names so as to exclude non-text fonts: math, symbols,
+# display fonts, bogus and broken fonts, and fonts not
+# providing the Latin alphabet.
+#
+# Note that the current list includes many names which
+# ought not be there, because problems were encountered
+# when using them, especially as they returned a value
+# for the title length of 0.0pt, which is clearly a bug.
+
+mkdir -p fontsel
+rm -f fontsel/*
+
+if [[ "$OSTYPE" =~ ^darwin ]]; then
+
+    system_profiler SPFontsDataType 2>/dev/null |\
+        awk -F: '/^[ ]{4}[A-Za-z0-9\;\ ]*.[ot]tf*:$/ {font=substr($1,5)} \
+                 /^[ ]{10}Family:/ {if(font!="") \
+                 {print substr($2,2);font=""}}' |\
+        grep -Ev '^[\.\ ]' |\
+        sort |\
+        uniq |\
+        grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+        awk '{file="fontsel/" NR ".tex";\
+              print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+              print "\\def\\SILmfontname{" $0 "}" >file;
+              close(file)} \
+         END {print "\\setcounter{SIL at maxfont}{" NR "}"}' >pickfont.tex
+
+elif [[ "$OSTYPE" =~ ^linux ]]; then
+
+    fc-list |\
+        grep -v '\.[ot]tf' |\
+        grep -Ev '(fontsite|bitstrea)' |\
+        awk -F: '{print substr($2,2)}' |\
+        awk -F, '{print $1}' |\
+        awk '{print $1 "," length($0) "," $0}' |\
+        sort -t, -k 1,1 -k 2n |\
+        awk -F, '{if($1!=last)print $3;last=$1}' |\
+        grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+        awk '{file="fontsel/" NR ".tex";\
+              print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+              print "\\def\\SILmfontname{" $0 "}" >file;
+              close(file)} \
+         END {print "\\setcounter{SIL at maxfont}{" NR "}"}' >pickfont.tex
+
+fi
+
+echo `ls -1 fontsel|wc -l` fonts
+
+###########################################################
+#
+# Make a list of the colour selection from the SVG palette
+# of the xcolor LaTeX package, with calculation of the
+# brightness/darkness value according to
+# https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
+
+PALETTE=`kpsewhich svgnam.def`
+cat $PALETTE |\
+    grep '^[A-Z][A-Za-z]*,[\.0-9][0-9]*,[\.0-9][0-9]*,[\.0-9][0-9]*' |\
+    awk -F\; '{print $1}' |\
+    awk -F, '{r=$2;g=$3;b=$4} \
+      {brightness=sqrt((0.241*r*r)+(0.691*g*g)+(0.068*b*b))} \
+      {print $1,r,g,b,brightness}' >svgnam.csv
+    cat svgnam.csv |\
+    awk 'BEGIN {print "\\newcommand{\\SIL at svgcolname}[1]{\\ifcase#1 "} \
+               {print $1 "\\or"} END {print "Black\\fi}\n"}' >svgnam.tex
+    cat svgnam.csv |\
+    awk 'BEGIN {print "\\newcommand{\\SIL at svgcolval}[1]{\\ifcase#1 "} \
+               {print $5 "\\or"} END {print ".666666666\\fi}\n"}' >>svgnam.tex
+    cat svgnam.csv | wc -l |\
+    awk '{print "\\setcounter{SIL at maxcolno}{" $1 "}"}' >>svgnam.tex
+
+echo `cat svgnam.csv|wc -l` colors
+
+exit 0
+
+


Property changes on: trunk/Master/texmf-dist/doc/latex/bookshelf/prepdata.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/bookshelf/test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/bookshelf/test.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/bookshelf/test.tex	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,15 @@
+% !TEX TS-program = xelatex
+% !TEX encoding = UTF-8 Unicode
+% !BIB TS-program = biber
+
+\documentclass[a0paper,landscape]{bookshelf}
+\addbibresource{mythesis.bib}
+\begin{document}\raggedright
+%%\immediate\write18{./prepdata.sh}
+%%\input{entries.tex}
+\nocite{*}
+\par\vfill\clearpage
+\printbibliography
+\end{document}
+
+


Property changes on: trunk/Master/texmf-dist/doc/latex/bookshelf/test.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,2524 @@
+% \iffalse meta-comment
+%
+% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
+%
+% bookshelf.dtx is copyright © 2020 by Peter Flynn <peter at 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 at silmaril.ie>
+%
+% This work consists of the files bookshelf.dtx and bookshelf.ins,
+% the derived file , 
+% 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}[2020/05/24 v0.5
+%<class>  Turn your bibliography into a bookshelf image]
+%<*driver>
+\RequirePackage{fix-cm}% included by default.
+\PassOptionsToPackage{svgnames}{xcolor}% xcolor/dox/hyperref implied
+\documentclass[12pt]{ltxdoc}
+%%
+%% Packages added for documentation
+%%
+\usepackage{dox}% used by default. (0)%
+  \makeatletter
+  \doxitem[idxtype=attribute]{Attribute}{CPK at attribute}{attributes}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=attributevalue]{AttributeValue}{CPK at attributevalue}{attribute values}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=class]{Class}{CPK at class}{classes}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=colour]{Colour}{CPK at colour}{colours}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=counter]{Counter}{CPK at counter}{counters}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=DTD]{DTD}{CPK at dtd}{DTDs/Schemas}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=element]{Element}{CPK at element}{element types}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=entity]{Entity}{CPK at entity}{entities}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=error]{Error}{CPK at error}{errors}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=field]{Field}{CPK at field}{fields}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=file]{File}{CPK at file}{files}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=font]{Font}{CPK at font}{fonts}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=function]{Function}{CPK at function}{functions}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=language]{Language}{CPK at language}{languages}
+  \makeatother
+  \makeatletter
+  \doxitem[macrolike,idxtype=length]{Length}{CPK at length}{lengths}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=mode]{Mode}{CPK at mode}{modes}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=option]{Option}{CPK at option}{options}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=package]{Package}{CPK at package}{packages}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=variable]{Variable}{CPK at variable}{variables}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=parameter]{Parameter}{CPK at parameter}{parameters}
+  \makeatother
+  \makeatletter
+  \doxitem[macrolike,idxtype=switch]{Switch}{CPK at switch}{switches}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=template]{Template}{CPK at template}{templates}
+  \makeatother
+  \makeatletter
+  \doxitem[idxtype=typeface]{Typeface}{CPK at typeface}{typefaces}
+  \makeatother
+  \makeatletter
+  \doxitem[macrolike,idxtype=box]{Box}{CPK at box}{boxes}
+  \makeatother
+  \newcommand{\LabelFont}[2][\relax]{\strut
+    {\fontencoding\encodingdefault
+	    \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}\space}
+  \makeatletter
+  \let\CPK at macro\macro\let\CPK at endmacro\endmacro
+  \makeatother
+  \makeatletter
+  \let\CPK at environment\environment\let\CPK at endenvironment\endenvironment
+  \makeatother
+  \makeatletter
+  \def\PrintAttributeName#1{\LabelFont{@#1}}
+  \makeatother
+  \def\PrintAttributeValueName#1{\LabelFont{"#1"}}
+  \def\PrintClassName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+  \def\PrintColourName#1{\LabelFont[\color{#1}]{#1}}
+  \def\PrintCounterName#1{\LabelFont{#1}}
+  \def\PrintDTDName#1{\LabelFont{#1}}
+  \def\PrintElementName#1{\LabelFont{<#1>}}
+  \def\PrintEntityName#1{\LabelFont{\}}
+  \def\PrintEnvironmentName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+  \def\PrintErrorName#1{\LabelFont[\color{Red}!]{#1}}
+  \def\PrintFunctionName#1{\LabelFont[\bfseries\itshape]{#1}}
+  \def\PrintLanguageName#1{\LabelFont{#1}}
+  \def\PrintLengthName#1{\LabelFont{#1}}
+  \def\PrintMacroName#1{\LabelFont{#1}}
+  \def\PrintModeName#1{\LabelFont[\sffamily]{\textlangle#1\textrangle}}
+  \def\PrintOptionName#1{\LabelFont[\bfseries]{#1}}
+  \def\PrintPackageName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+  \def\PrintSwitchName#1{\LabelFont{#1}}
+  \def\PrintTemplateName#1{\LabelFont[\bfseries]{#1}}
+  \def\PrintVariableName#1{\LabelFont[\ttfamily]{#1}}
+  \def\PrintParameterName#1{\LabelFont[\ttfamily]{#1}}
+  \def\PrintFieldName#1{\LabelFont[\ttfamily]{#1}}
+%% fontenc omit: conflict: fontspec (3)
+%% inputenc omit: conflict: fontspec (6)
+\usepackage{fontspec}% part/@conformance=xelatex detected. (7)%
+  \renewcommand{\textsc}[1]{{\small\MakeTextUppercase{#1}}}
+\usepackage{noto}% requested by author (15)%
+\usepackage{luximono}% requested by author (16)%
+\usepackage{mflogo}% used by default. (36)%
+\usepackage[british]{babel}% used by default. (41)%
+\usepackage[backend=biber,doi=true,
+  isbn=true,url=true,uniquename=false,style=apa]{biblatex}% bibliography/@arch=biblatex detected. (42)%
+  \makeatletter
+  \AtBeginDocument{%
+	    \setlength{\bibitemsep}{1ex}%
+	    \setlength{\bibnamesep}{1.5\itemsep}%
+	    \defbibheading{shortbib}[References]%
+	      {\section{#1}}}
+	  \@ifpackagewith{babel}{british}{%
+	    \DeclareLanguageMapping{british}%
+	      {british-apa}}{\relax}
+  \makeatother
+  \makeatletter
+  \providetoggle{blx at skipbiblist}
+  \makeatother
+\usepackage{calc}% used by default. (50)%
+  \makeatletter
+  {\scriptsize
+	    \global\advance\@totalleftmargin by1em
+	    \global\advance\MacroIndent by.5em}
+  \makeatother
+\usepackage{ccaption}% used by default. (53)%
+  \captionnamefont{\bfseries}
+  \captionstyle{\raggedright}
+\usepackage[inline]{enumitem}% use of 'variablelist' detected (57)%
+  \setlist[description]{style=unboxed}
+  \setlist[itemize]{leftmargin=2em}
+  \setlist[enumerate]{leftmargin=2em}
+  \newlist{inlineenum}{enumerate*}{1}
+  \setlist[inlineenum,1]{label=\emph{\alph*}),
+	    itemjoin={{; }},itemjoin*={{; and }}}
+\usepackage{fancyhdr}% requested by author (59)%
+  \makeatletter
+  \pagestyle{fancy}
+	    \cfoot{}
+	    \lhead{\footnotesize\rightmark}
+	    \rhead{\small\thepage}
+	    \rfoot{\footnotesize The \LaTeX\
+	      \textsf{\SIL at docname} \SIL at doctype}
+	    \renewcommand{\headrulewidth}{0pt}
+	    \renewcommand{\footrulewidth}{0pt}
+  \makeatother
+\usepackage{relsize}% use of 'acronym' detected (65)%
+\usepackage{textcase}% used by default. (68)%
+\usepackage{float}% used by default. (70)%
+  \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}% xref/@linkend➝listitem/xml:id detected. (71)%
+\usepackage[a4paper,left=30mm,top=25mm,
+  textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by default. (72)%
+\usepackage{hypdoc}% requested by author (78)%
+  \hypersetup{linkcolor=DarkBlue,urlcolor=Blue,citecolor=Red}
+  \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}}}
+\usepackage{listings}% use of 'programlisting' detected (85)%
+  \lstdefinelanguage{dummy}
+	    {morekeywords={dummy}}
+  \lstdefinelanguage{Makefile}
+	  {otherkeywords={.PHONY,.DEFAULT},%
+	    morekeywords={PHONY,DEFAULT,shell,ifeq,else,endif},%
+	    keywordsprefix={.},%
+	    moredelim=[l][\color{Green}]{:},%
+	    morecomment=[l]{\#},%
+	    moredelim=[s][\color{Blue}]{\$(}{)}%
+	  }
+  \lstdefinelanguage{DocBook}[]{XML}
+	    {morekeywords={abstract,address,affiliation,annotation,arg,
+	    author,book,chapter,classname,cmdsynopsis,command,
+	    constraintdef,contrib,copyright,cover,date,email,emphasis,
+	    envar,filename,firstname,footnote,guibutton,guilabel,
+	    guimenu,guimenuitem,guisubmenu,holder,info,itemizedlist,
+	    listitem,literal,member,option,orderedlist,orgdiv,orgname,
+	    package,para,parameter,part,personname,phrase,procedure,
+	    productname,programlisting,quote,refsection,remark,
+	    constructorsynopsis,methodparan,modifier,funcparams,olink,
+	    bibliography,biblioentry,biblioset,subtitle,artpagenums,
+	    volumenum,issuenum,DOCTYPE,SYSTEM,xml:id,releaseinfo,
+	    replaceable,revdescription,revhistory,revision,sect1,sect2,
+	    sect3,sect4,seg,seglistitem,segmentedlist,segtitle,
+	    simplelist,step,surname,systemitem,tag,term,title,uri,
+	    userinput,variablelist,varlistentry,wordasword,xref,year,
+	    xlink:href}}
+	  
+  \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{APA}[]{XML}
+	    {morekeywords={TTL}}
+	  
+  \lstdefinelanguage{OOXML}[]{XML}
+	    {morekeywords={w:p,w:pPr,w:pStyle,w:rPr,w:rFonts,
+	    w:r,w:t,w:lang}}
+	  
+  \lstdefinelanguage{SGML}[]{XML}
+	    {morekeywords={sec,ttl}}
+	  
+  \lstdefinelanguage{DTD}[]{XML}
+	    {morekeywords={ELEMENT,ENTITY,ATTLIST,CDATA,ID,REQUIRED,
+	    IMPLIED,PCDATA}}
+	  
+  \lstdefinelanguage{Runoff}
+	    {morekeywords={h1}}
+	  
+  \lstdefinelanguage{GML}
+	    {morekeywords={h1}}
+	  
+  \lstdefinelanguage{Scribe}
+	    {morekeywords={Heading},morestring=[s]{[]}}
+	  
+  \lstdefinelanguage{RTF}[]{TeX}
+	    {moretexcs={rtf,ansi,deff,adeflang,fonttbl,f,froman,fprq,
+	    fcharset,f1,fswiss,falt,fnil,colortbl,red,green,blue,
+	    stylesheet,s,snext,nowidctlpar,hyphen,hyphlead,hyphtrail,
+	    hyphmax,cf,kerning,dbch,af,langfe,afs,alang,loch,fs,
+	    pgndec,pard,plain,qc,sb,sa,keepn,b,ab,rtlch,ltrch,par}}
+
+  \lstdefinelanguage{TEI}[]{XML}
+	    {morekeywords={TEI,TEI.2,teiHeader,fileDesc,sourceDesc,
+	    titleStmt,title,author,editor,respStmt,resp,name,
+	    editionStmt,edition,text,body,publicationStmt,publisher,
+	    div,div1,placeName,lg,l,s,cl,phr,w,list,distinct,p,pb,
+	    mls,div2,head,num,val,app,lem,rdg,q,sup,uncl,note,
+	    DOCTYPE,SYSTEM,xml:id}}[keywords,comments,strings]
+	  
+  \lstdefinelanguage{XSLT2}[]{XML}
+	    {morekeywords={xsl:stylesheet,xsl:transform,
+	    xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,
+	    xsl:import,xsl:include,xsl:key,xsl:namespace-alias,
+	    xsl:output,xsl:param,
+	    xsl:preserve-space,xsl:strip-space,xsl:template,
+	    xsl:variable,xsl:character-map,xsl:function,
+	    xsl:import-schema,xsl:param,xsl:variable,
+	    xsl:apply-imports,xsl:apply-templates,xsl:attribute,
+	    xsl:call-template,xsl:choose,xsl:comment,xsl:copy,
+	    xsl:copy-of,xsl:element,xsl:fallback,xsl:for-each,
+	    xsl:if,xsl:message,xsl:number,xsl:otherwise,
+	    xsl:processing-instruction,xsl:text,xsl:value-of,
+	    xsl:variable,xsl:when,xsl:with-param,xsl:sort,
+	    xsl:for-each-group,xsl:next-match,xsl:analyze-string,
+	    xsl:namespace,xsl:result-document,xsl:copy,
+	    xsl:fallback,xsl:document,xsl:sequence,
+	    xsl:matching-substring,xsl:non-matching-substring,
+	    xsl:perform-sort,xsl:output-character},
+	    alsodigit={-}}
+	  
+  \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}}
+	  
+  \lstdefinelanguage{BIBTeX}{
+	    morekeywords = {title,author,edition,publisher,year,
+	    address},
+	    morestring=[b]",
+	    }
+	  
+  \lstdefinelanguage{Email}{
+	    morekeywords={From,Subject,To,Date},
+	    }
+	  
+  \lstset{defaultdialect=LaTeXe,frame=single,
+	    framesep=.5em,backgroundcolor=\color{AliceBlue},
+	    rulecolor=\color{LightSteelBlue},framerule=1pt}
+	  
+  \lstloadlanguages{LaTeXe,DocBook,XML,XSLT2,bash}
+  \lstdefinelanguage{XMLFRAG}{tag=**[s]<>}[html]
+  \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{DarkGreen}\bfseries,
+	    identifierstyle=\color{DarkRed},
+	    commentstyle=\color{Gray}\upshape,
+	    stringstyle=\color{DarkBlue}\upshape,
+	    emphstyle=\color{Chocolate}\upshape,
+	    showstringspaces=false,
+	    columns=fullflexible,
+	    keepspaces=true}
+\usepackage{makeidx}% used by default. (87)%
+  \makeindex
+\usepackage{nicefrac}% used by default. (93)%
+  \def\textonehalf{\ensuremath{\nicefrac12}}
+\usepackage{parskip}% requested by author (95)%
+\usepackage{sectsty}% requested by author (99)%
+  \allsectionsfont{\sffamily\raggedright}
+  \renewcommand*{\descriptionlabel}[1]{\hspace\labelsep
+	    \sffamily\bfseries #1}
+\usepackage[normalem]{ulem}% use of 'link' detected (105)%
+\usepackage{url}% use of 'uri' detected (106)%
+  \AtBeginDocument{\urlstyle{tt}}
+\usepackage{varioref}% use of 'xref' detected (109)%
+  \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}{elsewhere on this
+	    page}
+  \def\reftextafter{on the
+	    \reftextvario{next}{following} page}
+\usepackage{xcolor}% used by default. (117)%
+  \makeatletter
+  \@ifundefined{T}{%
+	    \newcommand{\T}[2]{{\fontencoding{T1}%
+	      \selectfont#2}}}{}
+  \makeatother
+\usepackage{classpack}[2020/05/19]% used by default. (122)%
+\makeatletter
+\newcommand{\SIL at doctype}{class}
+\newcommand{\SIL at docname}{bookshelf}
+\newcommand{\SIL at docowner}{Silmaril}
+\makeatother
+\addbibresource{bookshelf.bib}
+\allsectionsfont{\sffamily}
+%
+%%
+%% Settings for docstrip and ltxdoc 
+%%
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}\raggedright
+  \DocInput{bookshelf.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{718}
+%
+% \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.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/7}{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 at inlabel}
+% \DoNotIndex{\if at tempswa,\if at twocolumn,\ifcase,\ifcat}
+% \DoNotIndex{\iffalse,\ifx,\ignorespaces,\index,\input}
+% \DoNotIndex{\item,\jobname,\kern,\leavevmode,\leftskip}
+% \DoNotIndex{\let,\llap,\lower,\m at 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 at minipage,\if at 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{\SIL at doctype}
+% \DoNotIndex{\SIL at docname}
+% \DoNotIndex{\SIL at docowner}
+% \DoNotIndex{\SIL at svgcolname}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\SIL at svgcolval}
+% \DoNotIndex{\addbibresource}
+% \DoNotIndex{\immediate}
+% \DoNotIndex{\input}
+% \DoNotIndex{\documentclass}
+% \DoNotIndex{\pagewidth}
+% \DoNotIndex{\raggedright}
+% \DoNotIndex{\name}
+% \DoNotIndex{\SIL at topauthor}
+% \DoNotIndex{\SIL at 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 at noprint\else\marginpar{\raggedleft \textcolor{DarkRed}{\@nameuse{PrintDescribe#1}{#2}}}\fi \ifdox at noindex\else\@nameuse{Special#1Index}{#2}\fi \endgroup\@esphack\ignorespaces}
+% \makeatother
+%
+% \def\fileversion{0.5}
+% \def\filedate{2020/05/24}
+% \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 at 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 a \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 {\smaller JPEG} from
+% {\smaller 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 {\smaller MUST}}, {\sffamily {\smaller MUST NOT}}, {\sffamily {\smaller REQUIRED}},
+%     {\sffamily {\smaller SHALL}}, {\sffamily {\smaller SHALL NOT}}, {\sffamily {\smaller SHOULD}},
+%     {\sffamily {\smaller SHOULD NOT}},
+%     {\sffamily {\smaller RECOMMENDED}},
+%     {\sffamily {\smaller MAY}}, and
+%     {\sffamily {\smaller OPTIONAL}} have a specific
+%     meaning when shown in {\sffamily {\smaller THIS TYPESTYLE}}, and
+%     {\sffamily {\smaller 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
+% \section*{Latest changes}
+% \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\par
+% \end{itemize}
+% \subsection*{v.0.1 (2020-05-7)}
+% \paragraph*{First packaged draft}
+% \begin{itemize}
+% \item Done manually from .tex file\par
+% \end{itemize}
+% \subsection*{v.0.4 (2020-05-19)}
+% \paragraph*{Completed documentation}
+% \begin{itemize}
+% \item Updated note on bug in
+% \emph{biber} when processing
+% {\ttfamily{}sgml.bib}\par
+% \item Removed {\ttfamily{}sgml.bib} as example
+% until problems are resolved\par
+% \item Backtracked on attempt to use the monographic
+% title for articles, chapters, etc\par
+% \item Revised notes on production\par
+% \end{itemize}
+% \subsection*{v.0.3 (2020-05-14)}
+% \paragraph*{Finished first pass on documentation}
+% \begin{itemize}
+% \item Done preliminary testing\par
+% \item Script adapted for Mac OS X\par
+% \end{itemize}
+% 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
+% \clearpage
+% \section{Documentation}
+% During the era of the
+% {\smaller COVID-19} lockdown, 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 list of all the entry values;
+% \item A list of all your usable text fonts;
+% \item A command defining how many such fonts;
+% \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}. 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 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
+%     {\smaller 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 {\smaller RIS} format. A
+%     {\smaller 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}.\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, excluding broken or partial fonts, symbols, math,
+%     non-Latin characters or alphabets, and display or non-text
+%     fonts.\par
+% Each file {\sffamily {\smaller MUST}} be
+%     numbered sequentially in its name (eg
+%     {\ttfamily{}1.tex}, {\ttfamily{}2.tex},
+%     {\ttfamily{}3.tex}, etc) and
+%     {\sffamily {\smaller 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). 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
+% \subsubsection{Maximum number of fonts}
+% A file called {\ttfamily{}pickfont.tex}
+%     containing a
+%     \verb|\setcounter{SIL at 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 the
+%     {\smaller SVG} palette used by the
+%     \textsf{xcolor} package: the file created by
+%     the script is called {\ttfamily{}svgnam.tex}.
+%     This contains three definitions:\par
+% \begin{enumerate}
+% \item the command {\ttfamily{}\textbackslash{}SIL at 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 at 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 at 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. It is initially 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={[LaTeX]TeX}]
+$ ./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 {\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 file 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 {\smaller 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
+% \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).\par
+% This is for information only. You do not need to do any
+%   of this to use the \index{bookshelf=\textsf{bookshelf} (class)}\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}, 
+%       \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=32}{§2.2.5}, 
+%       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 {\smaller MUST NOT}} be
+%       alphabetic. The field {\ttfamily{}date} {\sffamily {\smaller MUST}} be an
+%       {\smaller ISO} 8601 date in the format
+%       {\ttfamily{}yyyy-mm-dd}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}, 
+%       \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=38}{§2.3.8}, 
+%       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
+%       {\smaller UNIX}/{\smaller GNU}
+%       Linux and Apple Mac {\smaller 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
+%       {\smaller 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
+%   \newgeometry{left=3cm}%
+%   \addcontentsline{toc}{section}{Change History}%
+%   \label{changehistory}%
+%   \PrintChanges
+%   \clearpage
+%   \label{codeindex}%
+%   \addcontentsline{toc}{section}{Index}%
+%   \PrintIndex}
+% \addtolength{\CPKrevmarg}{\widthof{\LabelFont{AddToShipoutPictureBG}}}
+% \newgeometry{left=\CPKrevmarg}
+% \message{Margin reset to \the\CPKrevmarg, to fit <AddToShipoutPictureBG>}
+% \iffalse
+%<*class>
+% \fi
+% \clearpage
+% \section{Implementation}\label{setup}
+% \par
+% \subsection{Auto-initialisation}\label{setup:autoinit}
+% This section is added automatically by \textit{ClassPack} 
+% as a preamble to all classes and style packages. 
+% The \textsf{fixltx2e} package, which used to be included
+% automatically, is no longer preloaded, as its
+% features are now a part of the latest \LaTeXe\ kernel.\par
+% The code starts with identity and requirements which are 
+% generated automatically as needed by the Doc\TeX\ system.
+% 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\}[2020/05/24 v0.5}\\
+% \leavevmode\enspace{\scriptsize3}\qquad{\ttfamily Turn your bibliography into a bookshelf image]}\\\endgroup
+% \setcounter{CodelineNo}{3}
+% \begin{CPK at package}{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{CPK at package}
+% \begin{CPK at option}{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
+% (eg \textsf{hyperref}) which use their own default
+% is when they load \textsf{xcolor}.\par
+%    \begin{macrocode}
+  \PassOptionsToPackage{svgnames}{xcolor}
+%    \end{macrocode}
+% \end{CPK at option}
+% \subsection{Options}\label{options}
+% \iffalse
+%% 
+%% ****************************************************************** 
+%% 
+%% 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
+%    \begin{macrocode}
+\def\SIL at paper{a0paper}%
+\DeclareOption{a0paper}{%
+    \def\SIL at paper{a0paper}%
+    \setlength\paperheight {1189mm}%
+    \setlength\paperwidth  {841mm}}
+\DeclareOption{a1paper}{%
+    \def\SIL at paper{a1paper}%
+    \setlength\paperheight {841mm}%
+    \setlength\paperwidth  {594mm}}
+\DeclareOption{a2paper}{%
+    \def\SIL at paper{a2paper}%
+    \setlength\paperheight {594mm}%
+    \setlength\paperwidth  {420mm}}
+\DeclareOption{a3paper}{%
+    \def\SIL at paper{a3paper}%
+    \setlength\paperheight {420mm}%
+    \setlength\paperwidth  {297mm}}
+\DeclareOption{a4paper}{%
+    \def\SIL at paper{a4paper}%
+    \setlength\paperheight {297mm}%
+    \setlength\paperwidth  {210mm}}
+\DeclareOption{a5paper}{%
+    \def\SIL at paper{a5paper}%
+    \setlength\paperheight {210mm}%
+    \setlength\paperwidth  {148mm}}
+\DeclareOption{b5paper}{%
+    \def\SIL at paper{b5paper}%
+    \setlength\paperheight {250mm}%
+    \setlength\paperwidth  {176mm}}
+\DeclareOption{letterpaper}{%
+    \def\SIL at paper{letterpaper}%
+    \setlength\paperheight {11in}%
+    \setlength\paperwidth  {8.5in}}
+\DeclareOption{legalpaper}{%
+    \def\SIL at paper{legalpaper}%
+    \setlength\paperheight {14in}%
+    \setlength\paperwidth  {8.5in}}
+\DeclareOption{executivepaper}{%
+    \def\SIL at paper{executivepaper}%
+    \setlength\paperheight {10.5in}%
+    \setlength\paperwidth  {7.25in}}
+\DeclareOption{ledgerpaper}{%
+    \def\SIL at paper{ledgerpaper}%
+    \setlength\paperheight {17in}%
+    \setlength\paperwidth  {11in}}
+\DeclareOption{tabloidpaper}{%
+    \def\SIL at paper{tabloidpaper}%
+    \setlength\paperheight {17in}%
+    \setlength\paperwidth  {11in}}
+\def\SIL at orient{landscape}%
+\DeclareOption{landscape}{%
+    \def\SIL at orient{landscape}%
+    \setlength\@tempdima   {\paperheight}%
+    \setlength\paperheight {\paperwidth}%
+    \setlength\paperwidth  {\@tempdima}}
+\DeclareOption{portrait}{%
+    \def\SIL at orient{}}
+%    \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
+%    \begin{macrocode}
+\DeclareOption*{\ClassWarning{bookshelf}{%
+    Unknown option `\CurrentOption', please RTFM}}
+\ProcessOptions\relax
+\LoadClass{report}
+%    \end{macrocode}
+%\iffalse
+%%
+%% Packages required for the class or package
+%% 
+% \fi
+% \subsection{Packages required for the class or
+%     package}\label{clspackages}
+% \begin{CPK at package}{fontspec}
+% Font specification setup for use with \XeLaTeX{}.
+% \iffalse
+%% Font specification setup for use with \XeLaTeX{}.
+% \fi
+%    \begin{macrocode}
+\RequirePackage{fontspec}%
+%    \end{macrocode}
+% \end{CPK at package}
+% \begin{CPK at package}{calc}
+% Required for calculations involving lengths or counters,
+% such as changes to widths for margin adjustment.
+% \iffalse
+%% Required for calculations involving lengths or counters, such as changes to widths for margin adjustment.
+% \fi
+%    \begin{macrocode}
+\RequirePackage{calc}%
+%    \end{macrocode}
+% \end{CPK at package}
+% \begin{CPK at package}{fp}
+% Used for fixed-point calculations;
+% \iffalse
+%% Used for fixed-point calculations
+% \fi
+%    \begin{macrocode}
+\RequirePackage{fp}%
+%    \end{macrocode}
+% \end{CPK at package}
+% \begin{CPK at package}{graphicx}
+% Provide for graphics (PNG, JPG, or PDF format (only) for
+% pdflatex; EPS format (only) for standard \LaTeX{}).
+% \iffalse
+%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}).
+% \fi
+%    \begin{macrocode}
+\RequirePackage{graphicx}%
+%    \end{macrocode}
+% \end{CPK at package}
+% \begin{CPK at package}{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{CPK at package}
+% \begin{CPK at package}{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{CPK at package}
+% \begin{CPK at package}{geometry}
+% Package for establishing margins and text area.
+% \iffalse
+%% Package for establishing margins and text area.
+% \fi
+%    \begin{macrocode}
+\RequirePackage[\SIL at paper,\SIL at orient,nohead,
+  nofoot,margin=1cm]{geometry}%
+%    \end{macrocode}
+% \end{CPK at package}
+% \begin{CPK at package}{biblatex}
+% Use \textsf{biblatex} instead of \BibTeX{};
+% \iffalse
+%% Use biblatex instead of \BibTeX{}
+% \fi
+%    \begin{macrocode}
+\RequirePackage[backend=biber,style=authoryear,
+  doi=true,isbn=true,url=true,uniquename=false]{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 at skipbiblist}
+%    \end{macrocode}
+% \end{CPK at package}
+% 
+% \subsection{Non-package resources}
+% \iffalse
+%% 
+%% ****************************************************************** 
+%% 
+%% Non-package resources
+% \fi
+% \begin{CPK at file}{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}, which on the author's
+%     system is hiding in a directory
+%     {\ttfamily{}texmf/tex/generic/genmisc/}, 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
+%    \begin{macrocode}
+\input{random.tex}
+%    \end{macrocode}
+% \end{CPK at file}
+% \subsection{The code}
+% \iffalse
+%% 
+%% ****************************************************************** 
+%% 
+%% The code
+% \fi
+% This is beta software: the code is messy and covered in
+%   tracing output.\par
+% \subsubsection{Font selection}\label{fonts}
+% \begin{CPK at counter}{maxfont}\label{counter--maxfont}
+% This is set in the {\ttfamily{}\textbackslash{}input} file
+%       {\ttfamily{}pickfont.tex}, which is created by
+%       the preparatory data script
+%       {\ttfamily{}prepdata.sh}. It is the number of
+%       working text fonts found on the system.\par
+%    \begin{macrocode}
+\newcounter{SIL at maxfont}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at counter}{SIL at fontsel}\label{counter--SIL at fontsel}
+% This is set to a random number between one and
+%       \DescribeCounter{SIL at maxfont}{\ttfamily{}SIL at maxfont}, and used as the
+%       name of the file containing the font name.\par
+%    \begin{macrocode}
+\newcounter{SIL at fontsel}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at file}{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 at maxfont}{\ttfamily{}SIL at maxfont}.\par
+%    \begin{macrocode}
+\input{pickfont.tex}
+%    \end{macrocode}
+% \end{CPK at file}
+% \subsubsection{Color selection}\label{color}
+% \begin{CPK at counter}{SIL at maxcolno}\label{counter--SIL at maxcolno}
+% This value is set at the end of the file
+%       {\ttfamily{}svgnam.tex}. This is the number of
+%       color names found by the routine in
+%       {\ttfamily{}prepdata.sh} which extracts the color
+%       names.\par
+%    \begin{macrocode}
+\newcounter{SIL at maxcolno}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at file}{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{} {\ttfamily{}\textbackslash{}ifcase} list in the file
+%       {\ttfamily{}svgnam.tex} as the command
+%       {\ttfamily{}\textbackslash{}SIL at svgcolname}.\par
+%    \begin{macrocode}
+\input{svgnam.tex}
+%    \end{macrocode}
+% \end{CPK at file}
+% \begin{CPK at counter}{SIL at loopcount}\label{counter--SIL at loopcount}
+% The random font selection is done in a loop because
+%       of the need to test the values. This counter counts the
+%       iterations…\par
+%    \begin{macrocode}
+\newcounter{SIL at loopcount}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at counter}{SIL at maxloop}\label{counter--SIL at maxloop}
+% …and this one the limit.\par
+%    \begin{macrocode}
+\newcounter{SIL at maxloop}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at counter}{SIL at bgcolno}\label{counter--SIL at bgcolno}
+% The colors are selected numerically. This value is
+%       the background color of the spine of a book.\par
+%    \begin{macrocode}
+\newcounter{SIL at bgcolno}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at counter}{SIL at fgcolno}\label{counter--SIL at fgcolno}
+% And this is the foreground color, used to typeset
+%       the title and author on the spine of a book.\par
+%    \begin{macrocode}
+\newcounter{SIL at fgcolno}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at length}{\splitpoint}\label{length--splitpoint}
+% To make sure that \DescribeCounter{SIL at bgcolno}{\ttfamily{}SIL at bgcolno} and \DescribeCounter{SIL at fgcolno}{\ttfamily{}SIL at 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
+%       \label{bright}\(b=\sqrt(.241r^2+.691g^2+.068b^2)\) due to \href{https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx}{Nir 
+% Dobovizki}. From inspection, the modal point of
+%       the {\smaller 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
+%    \begin{macrocode}
+\newlength{\SIL at splitpoint}
+\setlength{\SIL at splitpoint}{0.6pt}
+%    \end{macrocode}
+% \end{CPK at length}
+% \begin{CPK at macro}{\SIL at bgcol}\label{macro--SIL at bgcol}
+% We establish defaults for the background color…\par
+%    \begin{macrocode}
+\def\SIL at bgcol{White}
+%    \end{macrocode}
+% \end{CPK at macro}
+% \begin{CPK at macro}{\SIL at fgcol}\label{macro--SIL at fgcol}
+% …and the foreground color.\par
+%    \begin{macrocode}
+\def\SIL at fgcol{Black}
+%    \end{macrocode}
+% \end{CPK at macro}
+% \begin{CPK at length}{\SIL at bgval}\label{length--SIL at 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
+%    \begin{macrocode}
+\newlength{\SIL at bgval}
+%    \end{macrocode}
+% \end{CPK at length}
+% \begin{CPK at length}{\SIL at fgval}\label{length--SIL at fgval}
+% …and the foreground value.\par
+%    \begin{macrocode}
+\newlength{\SIL at fgval}
+%    \end{macrocode}
+% \end{CPK at length}
+% \begin{CPK at length}{\SIL at bgfgdiff}\label{length--SIL at 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
+%    \begin{macrocode}
+\newlength{\SIL at bgfgdiff}
+%    \end{macrocode}
+% \end{CPK at length}
+% \begin{CPK at switch}{\SIL at notyetcols}\label{switch--SIL at 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
+%    \begin{macrocode}
+\newif\ifSIL at notyetcols
+%    \end{macrocode}
+% \end{CPK at switch}
+% \subsubsection{Page border setup}\label{borders}
+% \begin{CPK at macro}{\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
+%    \begin{macrocode}
+\pagecolor{BurlyWood}
+\AddToShipoutPictureBG{%
+ \AtTextLowerLeft{\color{SaddleBrown}%
+   \rule[-\footskip]{\textwidth}{%
+     \dimexpr\textheight+\footskip}}}
+%    \end{macrocode}
+% \end{CPK at macro}
+% \subsubsection{Size and shape}\label{sizeshape}
+% 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
+%    \begin{macrocode}
+\newlength{\SIL at bookheight}
+\newlength{\SIL at bookwidth}
+\newlength{\SIL at minbookwidth}
+\newlength{\SIL at maxbookwidth}
+\newlength{\SIL at minbookheight}
+\newlength{\SIL at maxbookheight}
+%    \end{macrocode}
+% \subsubsection{Title and author dimensions}\label{titling}
+% 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 at 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 at titleoneline} conditional.\par
+%    \begin{macrocode}
+\newlength{\SIL at titlewidth}
+\newlength{\SIL at authorwidth}
+\newlength{\SIL at titleheight}
+\newlength{\SIL at authorheight}
+\newlength{\SIL at scaledtitle}
+\newlength{\SIL at heightfortitle}
+\newbox\SIL at titlebox
+\newif\ifSIL at topauthor
+\newif\ifSIL at titleoneline
+%    \end{macrocode}
+% \subsubsection{Handling the math}
+% \begin{CPK at counter}{SIL at scale}\label{counter--SIL at 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
+%    \begin{macrocode}
+\newcounter{SIL at scale}
+%    \end{macrocode}
+% \end{CPK at counter}
+% \begin{CPK at macro}{\SIL at scaleint}\label{macro--SIL at scaleint}
+% The integer macro returns the counter above.\par
+%    \begin{macrocode}
+\def\SIL at scaleint#1.#2\sentinel{%
+   \setcounter{SIL at scale}{#1}}
+%    \end{macrocode}
+% \end{CPK at macro}
+% \subsubsection{Settings}
+% We set the space around a box and the thickness of the
+%   rule, and remove the page numbers.\par
+%    \begin{macrocode}
+\fboxsep1em\fboxrule.1pt
+\pagestyle{empty}
+%    \end{macrocode}
+% \subsubsection{Making the book}\label{mb}
+% 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
+% \begin{CPK at macro}{\makebook}\label{macro--makebook}
+% Start by announcing the entry label and setting the
+%     values that need to be reset every time.\par
+%    \begin{macrocode}
+\newcommand{\makebook}[1]{%
+  \typeout{^^J#1}%
+  \setcounter{SIL at maxloop}{10}%
+  \setcounter{SIL at loopcount}{0}%
+% observed
+  \setlength{\SIL at minbookwidth}{5mm}%
+  \setlength{\SIL at maxbookwidth}{20mm}%
+% A5 to A4 height
+  \setlength{\SIL at minbookheight}{70mm}%
+  \setlength{\SIL at maxbookheight}{110mm}%
+  \setlength{\SIL at bookwidth}{0pt}%
+  \setlength{\SIL at bookheight}{0pt}%
+  \setlength{\SIL at heightfortitle}{0pt}%
+  \SIL at topauthorfalse
+%    \end{macrocode}
+% \end{CPK at macro}
+% \begin{CPK at macro}{\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 at svgcolval} (in
+%       {\ttfamily{}svgnam.tex}) to get the brightness
+%       values, and calculate the absolute distance between
+%       them.\par
+%    \begin{macrocode}
+  \loop
+    \addtocounter{SIL at loopcount}{1}%
+    \typeout{Try \theSIL at loopcount}%
+    \setrannum{\c at SIL@bgcolno}{1}{%
+      \c at SIL@maxcolno}%
+    \typeout{BG=\theSIL at bgcolno}%
+    \setrannum{\c at SIL@fgcolno}{1}{%
+      \c at SIL@maxcolno}%
+    \typeout{FG=\theSIL at fgcolno}%
+    \setlength{\SIL at bgval}{%
+      \SIL at svgcolval{\theSIL at bgcolno}pt}%
+    \typeout{BGval=\the\SIL at bgval}%
+    \setlength{\SIL at fgval}{%
+      \SIL at svgcolval{\theSIL at fgcolno}pt}%
+    \typeout{FGval=\the\SIL at fgval}%
+    \setlength{\SIL at bgfgdiff}{%
+      \SIL at bgval - \SIL at fgval}%
+    \typeout{Split gap is \the\SIL at bgfgdiff}%
+    \ifdim\SIL at bgfgdiff<0pt
+      \setlength{\SIL at bgfgdiff}{%
+        \SIL at fgval - \SIL at bgval}%
+      \typeout{Using absolute value
+        \the\SIL at 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 at maxloop}{\ttfamily{}SIL at maxloop}
+%       iterations without finding a pair of values, use
+%       whatever was tested last.\par
+%    \begin{macrocode}
+    \ifdim\SIL at bgval<\SIL at splitpoint
+      \ifdim\SIL at fgval>\SIL at splitpoint
+        \ifdim\SIL at bgfgdiff>0.2pt
+          \SIL at notyetcolsfalse
+        \else
+          \SIL at notyetcolstrue
+        \fi
+      \else
+        \SIL at notyetcolstrue
+      \fi
+    \else
+      \ifdim\SIL at fgval<\SIL at splitpoint
+        \ifdim\SIL at bgfgdiff>0.2pt
+          \SIL at notyetcolsfalse
+        \else
+          \SIL at notyetcolstrue
+        \fi
+      \else
+        \SIL at notyetcolstrue
+      \fi
+    \fi
+    \typeout{BG=\theSIL at bgcolno,
+             FG=\theSIL at fgcolno}%  
+    \ifnum\c at SIL@loopcount>\c at SIL@maxloop
+      \SIL at notyetcolsfalse
+    \fi
+  \ifSIL at notyetcols\repeat
+  \def\SIL at bgcol{\SIL at svgcolname{%
+      \theSIL at bgcolno}}% 
+  \def\SIL at fgcol{\SIL at svgcolname{%
+      \theSIL at fgcolno}}%
+  \typeout{BG=\SIL at bgcol, FG=\SIL at 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
+%    \begin{macrocode}
+  \setrannum{\c at SIL@fontsel}{1}{\c at SIL@maxfont}%
+  \input{fontsel/\theSIL at 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
+%    \begin{macrocode}
+  \settowidth{\SIL at authorwidth}{%
+              \SILmfont\citefullauthor{#1}}%
+  \typeout{Author width: \the\SIL at authorwidth}%
+  \settoheight{\SIL at authorheight}{%
+               \SILmfont\citefullauthor{#1}}%
+  \typeout{Author height: \the\SIL at authorheight}%
+  \ifdim\SIL at authorwidth<.9\SIL at maxbookwidth
+    \typeout{Author width is less than 90\%
+             of \the\SIL at maxbookwidth}%
+    \setlength{\SIL at bookwidth}{%
+               1.1\SIL at authorwidth}%
+    \typeout{Book width set to \the\SIL at bookwidth}%
+    \ifdim\SIL at bookwidth<\SIL at minbookwidth
+      \setlength{\SIL at bookwidth}{%
+                 \SIL at minbookwidth}%
+      \typeout{Book width reset to min
+               \the\SIL at minbookheight}%
+    \fi
+    \SIL at topauthortrue
+  \else
+    \typeout{Author won't fit in .9 of
+             \the\SIL at 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
+%    \begin{macrocode}
+  \settowidth{\SIL at titlewidth}{%
+              \SILmfont\citetitle{#1}}%
+  \ifdim\SIL at 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 at topauthor
+    \typeout{Title width: \the\SIL at titlewidth}%
+  \else
+    \addtolength{\SIL at titlewidth}{%
+                 \widthof{\SILmfont~~—~~}}%
+    \addtolength{\SIL at titlewidth}{%
+                 \SIL at authorwidth}%
+    \typeout{Title width with em rule and author:
+      \the\SIL at 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
+%    \begin{macrocode}
+  \typeout{Limits: width=\the\SIL at minbookwidth
+              –\the\SIL at maxbookwidth;
+                   height=\the\SIL at minbookheight
+              –\the\SIL at maxbookheight}%
+  \setrandim{\SIL at bookheight}%
+            {\SIL at minbookheight}%
+            {\SIL at maxbookheight}%
+  \typeout{Height generated as
+           \the\SIL at bookheight}%
+  \setlength{\SIL at heightfortitle}%
+            {.9\SIL at bookheight}%
+  \typeout{Height available for title (90\%):
+           \the\SIL at heightfortitle}%
+  \ifSIL at topauthor
+    \typeout{Width set because author fits:
+             \the\SIL at bookwidth}%
+    \addtolength{\SIL at heightfortitle}%
+                {-1.2\SIL at authorheight}%
+    \typeout{Height available for title reset to
+             \the\SIL at heightfortitle}%
+  \else
+  \setrandim{\SIL at bookwidth}%
+            {\SIL at minbookwidth}%
+            {\SIL at maxbookwidth}%
+  \typeout{Width generated as
+           \the\SIL at 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
+%    \begin{macrocode}
+  \ifdim\SIL at titlewidth<\SIL at heightfortitle
+    \typeout{Titling fits in
+             \the\SIL at heightfortitle}%
+    \SIL at titleonelinetrue
+    \edef\titleval{\strip at pt\SIL at titlewidth}%
+    \edef\heightval{\strip at pt\SIL at heightfortitle}%
+    \FPeval\SIL at scaledtitle{\heightval/\titleval}%
+    \typeout{Scaling 1-line title by
+             \SIL at scaledtitle}%
+    \expandafter\SIL at scaleint
+                \SIL at scaledtitle\sentinel
+    \ifnum\c at SIL@scale>4
+      \gdef\SIL at scaledtitle{4}%
+      \typeout{Resetting scale \theSIL at scale\ to
+               \SIL at 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
+% \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;
+% \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);
+% \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
+% \end{enumerate}
+%    \begin{macrocode}
+  \else
+    \typeout{Titling won't fit
+             \the\SIL at heightfortitle}%
+    \SIL at titleonelinefalse
+    \setbox\SIL at titlebox=\vbox{%
+      \hsize\SIL at heightfortitle
+      \SILmfont\raggedright
+      \vrule height1em width0pt
+      \bfseries\citetitle{#1}%
+      \vrule depth.2em width0pt
+    }%
+    \setlength{\SIL at titleheight}%
+              {\ht\SIL at titlebox + \dp\SIL at titlebox}%
+    \typeout{Multiline title takes
+             \the\SIL at titleheight}%
+    \ifdim\SIL at titleheight>\SIL at bookwidth
+      \typeout{Height of title
+               \the\SIL at titleheight\
+               is greater than
+               \the\SIL at bookwidth}%
+      \edef\titleval{\strip at pt\SIL at titleheight}%
+      \edef\heightval{\strip at pt\SIL at bookwidth}%
+      \FPeval\SIL at scaledtitle
+          {10 - \heightval / \titleval}%
+      \typeout{10 - \heightval\ ÷ \titleval\
+               = \SIL at scaledtitle}%
+      \typeout{Using smaller font \SIL at scaledtitle
+               pt for multiline title}%
+    \else
+      \typeout{Height of title
+               \the\SIL at titleheight\
+               is less than
+               \the\SIL at bookwidth}%
+      \edef\titleval{\strip at pt\SIL at titleheight}%
+      \edef\heightval{\strip at pt\SIL at bookwidth}%
+      \FPeval\SIL at scaledtitle
+          {10 + \heightval / \titleval}%
+      \typeout{10 + \heightval\ ÷ \titleval\
+               = \SIL at scaledtitle}%
+      \typeout{Using larger font \SIL at 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
+% For a setting with the author inline to the title,
+%       just do the scaling of the title.\par
+%    \begin{macrocode}
+  \leavevmode\vbox{\hsize\SIL at bookwidth
+    \advance\hsize by2\fboxsep
+    \advance\hsize by2\fboxrule
+  \fcolorbox{black}{\SIL at bgcol}{%
+    \ifSIL at topauthor
+      \typeout{Setting with top author}%
+      \vbox to\SIL at bookheight{\hsize\SIL at bookwidth
+        \typeout{Spine is a vbox to
+          \the\SIL at bookheight,
+          hsize=\the\SIL at bookwidth}%
+        \centering
+        \SILmfont\color{\SIL at fgcol}%
+        \citefullauthor{#1}%
+        \par\vfill
+        \rotatebox{90}{\vbox to\SIL at bookwidth{%
+            \hsize\SIL at heightfortitle
+          \null\vfill
+          \typeout{Title in a vbox to
+                   \the\SIL at bookwidth,
+                   hsize=\the\SIL at heightfortitle}%
+          \raggedright\color{\SIL at fgcol}%
+          \ifSIL at titleoneline
+            \scalebox{\SIL at scaledtitle}%
+                     {\bfseries\citetitle{#1}}%
+          \else
+            \fontsize{\SIL at scaledtitle}%
+                     {\SIL at scaledtitle}\selectfont
+            \bfseries\citetitle{#1}%
+          \fi
+          \par\vfill}%
+        }%
+      }%
+    \else
+      \typeout{Setting author inline to title}%
+      \vbox to\SIL at bookheight{\hsize\SIL at bookwidth
+        \typeout{Spine is a vbox to
+                 \the\SIL at bookheight,
+                 hsize=\the\SIL at bookwidth}%
+        \centering
+        \SILmfont\color{\SIL at fgcol}%
+        \rotatebox{90}{\vbox to\SIL at bookwidth{%
+            \hsize\SIL at heightfortitle
+          \null\vfill
+          \typeout{Title and author in a vbox to
+                   \the\SIL at bookwidth,
+                   hsize=\the\SIL at heightfortitle}%
+          \raggedright\color{\SIL at fgcol}%
+          \ifSIL at titleoneline
+            \scalebox{\SIL at scaledtitle}%
+                     {{\bfseries\citetitle{#1}}\quad
+                       —\ \ \citefullauthor{#1}}%
+          \else
+            \fontsize{\SIL at scaledtitle}%
+                     {\SIL at 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
+% 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
+%    \begin{macrocode}
+  \\\fboxsep0pt\fboxrule0pt
+  \colorbox{BurlyWood}{\hbox to\hsize{%
+      \hfil\vrule height3mm depth6mm width0pt
+      \normalfont\scriptsize\theSIL at fontsel\hfil}}%
+  }%
+\kern-2.2mm}%
+%    \end{macrocode}
+% \end{CPK at macro}
+% \begin{CPK at macro}{\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}, 
+%       modified at \textsf{biblatex}'s suggestion to
+%       use {\ttfamily{}given-family} instead of
+%       {\ttfamily{}first-last}, but it doesn't seem
+%       to have any effect.\par
+%    \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{CPK at macro}
+% \begin{CPK at macro}{\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
+%    \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{CPK at macro}
+% \iffalse
+%</class>
+% \fi
+% \nocite{*}
+% \clearpage
+% \raggedright
+% \raggedright\printbibliography
+% \appendix
+% \newgeometry{left=3cm}
+% \clearpage
+% \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 ({\smaller 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\thinspace:]Any work being distributed under this License.\par
+% \item[Derived Work\thinspace:]Any work that under any applicable law is derived from
+%     the Work.\par
+% \item[Modification\thinspace:]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\thinspace:]To apply any procedure that produces a Derived Work
+%     under any applicable law.\par
+% \item[Distribution\thinspace:]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
+%     {\smaller FTP} or {\smaller HTTP} or by
+%     shared file systems such as Sun's Network File System
+%     ({\smaller NFS}).\par
+% \item[Compiled Work\thinspace:]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\thinspace:]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\thinspace:]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~item~\ref{item-distribute} above 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~item~\ref{item-conditions} above, 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~item~\ref{item-currmaint} above, 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~item~\ref{item-conditions} in the list on p.\thinspace\pageref{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~item~\ref{item-conditions} in the list on p.\thinspace\pageref{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}.)\par
+% \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~item~\ref{item-intention} in the list on p.\thinspace\pageref{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~item~\ref{item-announce} in the list on p.\thinspace\pageref{item-announce}
+%   or~item~\ref{item-change} above, 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
+%       {\smaller 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~item~\ref{item-intention} in the list on p.\thinspace\pageref{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 {\smaller LPPL} or otherwise
+% give the impression that your work is distributed under the
+% {\smaller 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 {\smaller GNU} General Public
+% License ({\smaller 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}, {\ttfamily{}pig.ins}, 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
+% {\smaller 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 {\smaller 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 {\smaller 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
+% \iffalse
+%<*script>
+#! /bin/bash
+
+# prepdata.sh - prepare the datasets for the bookshelf package
+# which creates a bookshelf image from a BiBTeX file.
+#
+# Peter Flynn, 2020-05-14 <peter at silmaril.ie>
+#
+# Dependencies: the standard UNIX/GNU Linux text utilities
+# and builtins : cat, grep, awk, mkdir, rm, echo, sed, sort
+# PLUS the font-cache program fc-list (1) and the TeX utility
+# kpsewhich (1).
+#
+# Note that if you have not updated your font-cach to take
+# account of fonts added since installation (eg fonts
+# distributed with TeX which are not installed in the system
+# fonts directories) then you should edit /etc/fonts/conf.avail
+# to add the directories where they are installed to (eg)
+# 09-texlive.conf and then alias that file to conf.d, and then
+# run fc-cache as root.
+
+if [ -z "$1" ]; then
+    echo You must give the full name of your BiBTeX file
+    exit 1
+else
+    if [ ! -s "$1" ]; then
+echo I can\'t find the file "$1" anywhere here
+exit 1
+    else
+BIBFILE="$1"
+    fi
+fi
+
+###########################################################
+#
+# Make a list of all the entries in the bib file. This is
+# in effect the 'driver' which creates each book spine image
+# and the entries.tex file is \input in the test.tex file.
+
+cat "$BIBFILE" |\
+    grep '^@' |\
+    grep -viE '(@Preamble|@String)' |\
+    awk -F\{ '{print $2}' |\
+    awk -F, '{print "\\makebook{" $1 "}%"}' >entries.tex
+
+echo `cat entries.tex|wc -l` bibliographic entries
+
+##########################################################
+#
+# Make a list of all the fonts available: this omits PFB
+# fonts (Postscript Type 1) and deduplicates the entries
+# on the first token of their name. CRITICALLY it then
+# applies a (typically) VERY LONG list of disallowed font
+# names so as to exclude non-text fonts: math, symbols,
+# display fonts, bogus and broken fonts, and fonts not
+# providing the Latin alphabet.
+#
+# Note that the current list includes many names which
+# ought not be there, because problems were encountered
+# when using them, especially as they returned a value
+# for the title length of 0.0pt, which is clearly a bug.
+
+mkdir -p fontsel
+rm -f fontsel/*
+
+if [[ "$OSTYPE" =~ ^darwin ]]; then
+
+    system_profiler SPFontsDataType 2>/dev/null |\
+        awk -F: '/^[ ]{4}[A-Za-z0-9\;\ ]*.[ot]tf*:$/ {font=substr($1,5)} \
+                 /^[ ]{10}Family:/ {if(font!="") \
+                 {print substr($2,2);font=""}}' |\
+        grep -Ev '^[\.\ ]' |\
+        sort |\
+        uniq |\
+        grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+        awk '{file="fontsel/" NR ".tex";\
+              print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+              print "\\def\\SILmfontname{" $0 "}" >file;
+              close(file)} \
+         END {print "\\setcounter{SIL at maxfont}{" NR "}"}' >pickfont.tex
+
+elif [[ "$OSTYPE" =~ ^linux ]]; then
+
+    fc-list |\
+        grep -v '\.[ot]tf' |\
+        grep -Ev '(fontsite|bitstrea)' |\
+        awk -F: '{print substr($2,2)}' |\
+        awk -F, '{print $1}' |\
+        awk '{print $1 "," length($0) "," $0}' |\
+        sort -t, -k 1,1 -k 2n |\
+        awk -F, '{if($1!=last)print $3;last=$1}' |\
+        grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+        awk '{file="fontsel/" NR ".tex";\
+              print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+              print "\\def\\SILmfontname{" $0 "}" >file;
+              close(file)} \
+         END {print "\\setcounter{SIL at maxfont}{" NR "}"}' >pickfont.tex
+
+fi
+
+echo `ls -1 fontsel|wc -l` fonts
+
+###########################################################
+#
+# Make a list of the colour selection from the SVG palette
+# of the xcolor LaTeX package, with calculation of the
+# brightness/darkness value according to
+# https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
+
+PALETTE=`kpsewhich svgnam.def`
+cat $PALETTE |\
+    grep '^[A-Z][A-Za-z]*,[\.0-9][0-9]*,[\.0-9][0-9]*,[\.0-9][0-9]*' |\
+    awk -F\; '{print $1}' |\
+    awk -F, '{r=$2;g=$3;b=$4} \
+      {brightness=sqrt((0.241*r*r)+(0.691*g*g)+(0.068*b*b))} \
+      {print $1,r,g,b,brightness}' >svgnam.csv
+    cat svgnam.csv |\
+    awk 'BEGIN {print "\\newcommand{\\SIL at svgcolname}[1]{\\ifcase#1 "} \
+               {print $1 "\\or"} END {print "Black\\fi}\n"}' >svgnam.tex
+    cat svgnam.csv |\
+    awk 'BEGIN {print "\\newcommand{\\SIL at svgcolval}[1]{\\ifcase#1 "} \
+               {print $5 "\\or"} END {print ".666666666\\fi}\n"}' >>svgnam.tex
+    cat svgnam.csv | wc -l |\
+    awk '{print "\\setcounter{SIL at maxcolno}{" $1 "}"}' >>svgnam.tex
+
+echo `cat svgnam.csv|wc -l` colors
+    
+exit 0
+      
+%</script>
+% \fi
+% \iffalse
+%<*tester>
+%<<COMMENT
+% !TEX TS-program = xelatex
+% !TEX encoding = UTF-8 Unicode
+% !BIB TS-program = biber
+%COMMENT
+      
+%</tester>
+% \fi
+% \iffalse
+%<*tester>
+\documentclass[a0paper,landscape]{bookshelf}
+\addbibresource{mythesis.bib}
+\begin{document}\raggedright
+%%\immediate\write18{./prepdata.sh}
+%%\input{entries.tex}
+\nocite{*}
+\par\vfill\clearpage
+\printbibliography
+\end{document}
+      
+%</tester>
+% \fi
+% \Finale
+


Property changes on: trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,62 @@
+% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
+%
+% bookshelf.ins is copyright © 2020 by Peter Flynn <peter at 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 at silmaril.ie>
+%
+% This work consists of the files bookshelf.dtx and bookshelf.ins,
+% the derived file 
+% and any other ancillary files listed in the MANIFEST.
+%
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/bookshelf}
+\preamble
+
+This is a generated file.
+
+Copyright © 2020 by latex at silmaril.ie
+
+This file was generated from an XML master source.
+Amendments and corrections should be notified to the
+maintainer for inclusion in future versions.
+
+\endpreamble
+\generate{\file{bookshelf.cls}{\from{bookshelf.dtx}{class}}
+          \usepreamble\empty\usepostamble\empty
+          \file{prepdata.sh}{\from{bookshelf.dtx}{script}}
+          \usepreamble\empty\usepostamble\empty
+          \file{test.tex}{\from{bookshelf.dtx}{tester}}
+}
+\obeyspaces
+\Msg{********************************************************}
+\Msg{**                                                    **}
+\Msg{** Read the documentation before using this class.    **}
+\Msg{**                                                    **}
+\Msg{** To finish the installation you have to move the    **}
+\Msg{** following files into a directory searched by TeX:  **}
+\Msg{**                                                    **}
+\Msg{**                                                    **}
+\Msg{**     prepdata.sh                                   **}
+\Msg{**     test.tex                                       **}
+\Msg{**                                                    **}
+\Msg{** To produce the documentation run the file          **}
+\Msg{** bookshelf.dtx through XeLaTeX and biber            **}
+\Msg{**                                                    **}
+\Msg{** Happy LaTeXing!                                    **}
+\Msg{**                                                    **}
+\Msg{********************************************************}
+\endbatchfile

Added: trunk/Master/texmf-dist/tex/latex/bookshelf/bookshelf.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/bookshelf/bookshelf.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/bookshelf/bookshelf.cls	2020-05-24 21:43:06 UTC (rev 55262)
@@ -0,0 +1,472 @@
+%%
+%% This is file `bookshelf.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% bookshelf.dtx  (with options: `class')
+%% 
+%% This is a generated file.
+%% 
+%% Copyright © 2020 by latex at silmaril.ie
+%% 
+%% This file was generated from an XML master source.
+%% Amendments and corrections should be notified to the
+%% maintainer for inclusion in future versions.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2017/04/15]
+\ProvidesClass{bookshelf}[2020/05/24 v0.5
+  Turn your bibliography into a bookshelf image]
+\RequirePackage{fix-cm}
+  \PassOptionsToPackage{svgnames}{xcolor}
+%%
+%% ******************************************************************
+%%
+%% Options
+\def\SIL at paper{a0paper}%
+\DeclareOption{a0paper}{%
+    \def\SIL at paper{a0paper}%
+    \setlength\paperheight {1189mm}%
+    \setlength\paperwidth  {841mm}}
+\DeclareOption{a1paper}{%
+    \def\SIL at paper{a1paper}%
+    \setlength\paperheight {841mm}%
+    \setlength\paperwidth  {594mm}}
+\DeclareOption{a2paper}{%
+    \def\SIL at paper{a2paper}%
+    \setlength\paperheight {594mm}%
+    \setlength\paperwidth  {420mm}}
+\DeclareOption{a3paper}{%
+    \def\SIL at paper{a3paper}%
+    \setlength\paperheight {420mm}%
+    \setlength\paperwidth  {297mm}}
+\DeclareOption{a4paper}{%
+    \def\SIL at paper{a4paper}%
+    \setlength\paperheight {297mm}%
+    \setlength\paperwidth  {210mm}}
+\DeclareOption{a5paper}{%
+    \def\SIL at paper{a5paper}%
+    \setlength\paperheight {210mm}%
+    \setlength\paperwidth  {148mm}}
+\DeclareOption{b5paper}{%
+    \def\SIL at paper{b5paper}%
+    \setlength\paperheight {250mm}%
+    \setlength\paperwidth  {176mm}}
+\DeclareOption{letterpaper}{%
+    \def\SIL at paper{letterpaper}%
+    \setlength\paperheight {11in}%
+    \setlength\paperwidth  {8.5in}}
+\DeclareOption{legalpaper}{%
+    \def\SIL at paper{legalpaper}%
+    \setlength\paperheight {14in}%
+    \setlength\paperwidth  {8.5in}}
+\DeclareOption{executivepaper}{%
+    \def\SIL at paper{executivepaper}%
+    \setlength\paperheight {10.5in}%
+    \setlength\paperwidth  {7.25in}}
+\DeclareOption{ledgerpaper}{%
+    \def\SIL at paper{ledgerpaper}%
+    \setlength\paperheight {17in}%
+    \setlength\paperwidth  {11in}}
+\DeclareOption{tabloidpaper}{%
+    \def\SIL at paper{tabloidpaper}%
+    \setlength\paperheight {17in}%
+    \setlength\paperwidth  {11in}}
+\def\SIL at orient{landscape}%
+\DeclareOption{landscape}{%
+    \def\SIL at orient{landscape}%
+    \setlength\@tempdima   {\paperheight}%
+    \setlength\paperheight {\paperwidth}%
+    \setlength\paperwidth  {\@tempdima}}
+\DeclareOption{portrait}{%
+    \def\SIL at orient{}}
+%%
+%% ******************************************************************
+%%
+%% Load the document base class
+\DeclareOption*{\ClassWarning{bookshelf}{%
+    Unknown option `\CurrentOption', please RTFM}}
+\ProcessOptions\relax
+\LoadClass{report}
+%%
+%% Packages required for the class or package
+%%
+%% Font specification setup for use with \XeLaTeX{}.
+\RequirePackage{fontspec}%
+%% Required for calculations involving lengths or counters, such as changes to widths for margin adjustment.
+\RequirePackage{calc}%
+%% Used for fixed-point calculations
+\RequirePackage{fp}%
+%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}).
+\RequirePackage{graphicx}%
+%% Provide color.
+\RequirePackage{xcolor}%
+  \@ifundefined{T}{%
+    \newcommand{\T}[2]{{\fontencoding{T1}%
+      \selectfont#2}}}{}
+%% Add picture commands (or backgrounds) to every page.
+\RequirePackage{eso-pic}%
+%% Package for establishing margins and text area.
+\RequirePackage[\SIL at paper,\SIL at orient,nohead,
+  nofoot,margin=1cm]{geometry}%
+%% Use biblatex instead of \BibTeX{}
+\RequirePackage[backend=biber,style=authoryear,
+  doi=true,isbn=true,url=true,uniquename=false]{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 at skipbiblist}
+%%
+%% ******************************************************************
+%%
+%% Non-package resources
+\input{random.tex}
+%%
+%% ******************************************************************
+%%
+%% The code
+\newcounter{SIL at maxfont}
+\newcounter{SIL at fontsel}
+\input{pickfont.tex}
+\newcounter{SIL at maxcolno}
+\input{svgnam.tex}
+\newcounter{SIL at loopcount}
+\newcounter{SIL at maxloop}
+\newcounter{SIL at bgcolno}
+\newcounter{SIL at fgcolno}
+\newlength{\SIL at splitpoint}
+\setlength{\SIL at splitpoint}{0.6pt}
+\def\SIL at bgcol{White}
+\def\SIL at fgcol{Black}
+\newlength{\SIL at bgval}
+\newlength{\SIL at fgval}
+\newlength{\SIL at bgfgdiff}
+\newif\ifSIL at notyetcols
+\pagecolor{BurlyWood}
+\AddToShipoutPictureBG{%
+ \AtTextLowerLeft{\color{SaddleBrown}%
+   \rule[-\footskip]{\textwidth}{%
+     \dimexpr\textheight+\footskip}}}
+\newlength{\SIL at bookheight}
+\newlength{\SIL at bookwidth}
+\newlength{\SIL at minbookwidth}
+\newlength{\SIL at maxbookwidth}
+\newlength{\SIL at minbookheight}
+\newlength{\SIL at maxbookheight}
+\newlength{\SIL at titlewidth}
+\newlength{\SIL at authorwidth}
+\newlength{\SIL at titleheight}
+\newlength{\SIL at authorheight}
+\newlength{\SIL at scaledtitle}
+\newlength{\SIL at heightfortitle}
+\newbox\SIL at titlebox
+\newif\ifSIL at topauthor
+\newif\ifSIL at titleoneline
+\newcounter{SIL at scale}
+\def\SIL at scaleint#1.#2\sentinel{%
+   \setcounter{SIL at scale}{#1}}
+\fboxsep1em\fboxrule.1pt
+\pagestyle{empty}
+\newcommand{\makebook}[1]{%
+  \typeout{^^J#1}%
+  \setcounter{SIL at maxloop}{10}%
+  \setcounter{SIL at loopcount}{0}%
+  \setlength{\SIL at minbookwidth}{5mm}%
+  \setlength{\SIL at maxbookwidth}{20mm}%
+  \setlength{\SIL at minbookheight}{70mm}%
+  \setlength{\SIL at maxbookheight}{110mm}%
+  \setlength{\SIL at bookwidth}{0pt}%
+  \setlength{\SIL at bookheight}{0pt}%
+  \setlength{\SIL at heightfortitle}{0pt}%
+  \SIL at topauthorfalse
+  \loop
+    \addtocounter{SIL at loopcount}{1}%
+    \typeout{Try \theSIL at loopcount}%
+    \setrannum{\c at SIL@bgcolno}{1}{%
+      \c at SIL@maxcolno}%
+    \typeout{BG=\theSIL at bgcolno}%
+    \setrannum{\c at SIL@fgcolno}{1}{%
+      \c at SIL@maxcolno}%
+    \typeout{FG=\theSIL at fgcolno}%
+    \setlength{\SIL at bgval}{%
+      \SIL at svgcolval{\theSIL at bgcolno}pt}%
+    \typeout{BGval=\the\SIL at bgval}%
+    \setlength{\SIL at fgval}{%
+      \SIL at svgcolval{\theSIL at fgcolno}pt}%
+    \typeout{FGval=\the\SIL at fgval}%
+    \setlength{\SIL at bgfgdiff}{%
+      \SIL at bgval - \SIL at fgval}%
+    \typeout{Split gap is \the\SIL at bgfgdiff}%
+    \ifdim\SIL at bgfgdiff<0pt
+      \setlength{\SIL at bgfgdiff}{%
+        \SIL at fgval - \SIL at bgval}%
+      \typeout{Using absolute value
+        \the\SIL at bgfgdiff}%
+    \fi
+    \ifdim\SIL at bgval<\SIL at splitpoint
+      \ifdim\SIL at fgval>\SIL at splitpoint
+        \ifdim\SIL at bgfgdiff>0.2pt
+          \SIL at notyetcolsfalse
+        \else
+          \SIL at notyetcolstrue
+        \fi
+      \else
+        \SIL at notyetcolstrue
+      \fi
+    \else
+      \ifdim\SIL at fgval<\SIL at splitpoint
+        \ifdim\SIL at bgfgdiff>0.2pt
+          \SIL at notyetcolsfalse
+        \else
+          \SIL at notyetcolstrue
+        \fi
+      \else
+        \SIL at notyetcolstrue
+      \fi
+    \fi
+    \typeout{BG=\theSIL at bgcolno,
+             FG=\theSIL at fgcolno}%
+    \ifnum\c at SIL@loopcount>\c at SIL@maxloop
+      \SIL at notyetcolsfalse
+    \fi
+  \ifSIL at notyetcols\repeat
+  \def\SIL at bgcol{\SIL at svgcolname{%
+      \theSIL at bgcolno}}%
+  \def\SIL at fgcol{\SIL at svgcolname{%
+      \theSIL at fgcolno}}%
+  \typeout{BG=\SIL at bgcol, FG=\SIL at fgcol}%
+  \setrannum{\c at SIL@fontsel}{1}{\c at SIL@maxfont}%
+  \input{fontsel/\theSIL at fontsel.tex}%
+  \typeout{Set in \SILmfontname}%
+  \settowidth{\SIL at authorwidth}{%
+              \SILmfont\citefullauthor{#1}}%
+  \typeout{Author width: \the\SIL at authorwidth}%
+  \settoheight{\SIL at authorheight}{%
+               \SILmfont\citefullauthor{#1}}%
+  \typeout{Author height: \the\SIL at authorheight}%
+  \ifdim\SIL at authorwidth<.9\SIL at maxbookwidth
+    \typeout{Author width is less than 90\%
+             of \the\SIL at maxbookwidth}%
+    \setlength{\SIL at bookwidth}{%
+               1.1\SIL at authorwidth}%
+    \typeout{Book width set to \the\SIL at bookwidth}%
+    \ifdim\SIL at bookwidth<\SIL at minbookwidth
+      \setlength{\SIL at bookwidth}{%
+                 \SIL at minbookwidth}%
+      \typeout{Book width reset to min
+               \the\SIL at minbookheight}%
+    \fi
+    \SIL at topauthortrue
+  \else
+    \typeout{Author won't fit in .9 of
+             \the\SIL at maxbookwidth}%
+  \fi
+  \settowidth{\SIL at titlewidth}{%
+              \SILmfont\citetitle{#1}}%
+  \ifdim\SIL at 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 at topauthor
+    \typeout{Title width: \the\SIL at titlewidth}%
+  \else
+    \addtolength{\SIL at titlewidth}{%
+                 \widthof{\SILmfont~~—~~}}%
+    \addtolength{\SIL at titlewidth}{%
+                 \SIL at authorwidth}%
+    \typeout{Title width with em rule and author:
+      \the\SIL at titlewidth}%
+  \fi
+  \typeout{Limits: width=\the\SIL at minbookwidth
+              –\the\SIL at maxbookwidth;
+                   height=\the\SIL at minbookheight
+              –\the\SIL at maxbookheight}%
+  \setrandim{\SIL at bookheight}%
+            {\SIL at minbookheight}%
+            {\SIL at maxbookheight}%
+  \typeout{Height generated as
+           \the\SIL at bookheight}%
+  \setlength{\SIL at heightfortitle}%
+            {.9\SIL at bookheight}%
+  \typeout{Height available for title (90\%):
+           \the\SIL at heightfortitle}%
+  \ifSIL at topauthor
+    \typeout{Width set because author fits:
+             \the\SIL at bookwidth}%
+    \addtolength{\SIL at heightfortitle}%
+                {-1.2\SIL at authorheight}%
+    \typeout{Height available for title reset to
+             \the\SIL at heightfortitle}%
+  \else
+  \setrandim{\SIL at bookwidth}%
+            {\SIL at minbookwidth}%
+            {\SIL at maxbookwidth}%
+  \typeout{Width generated as
+           \the\SIL at bookwidth}%
+  \fi
+  \ifdim\SIL at titlewidth<\SIL at heightfortitle
+    \typeout{Titling fits in
+             \the\SIL at heightfortitle}%
+    \SIL at titleonelinetrue
+    \edef\titleval{\strip at pt\SIL at titlewidth}%
+    \edef\heightval{\strip at pt\SIL at heightfortitle}%
+    \FPeval\SIL at scaledtitle{\heightval/\titleval}%
+    \typeout{Scaling 1-line title by
+             \SIL at scaledtitle}%
+    \expandafter\SIL at scaleint
+                \SIL at scaledtitle\sentinel
+    \ifnum\c at SIL@scale>4
+      \gdef\SIL at scaledtitle{4}%
+      \typeout{Resetting scale \theSIL at scale\ to
+               \SIL at scaledtitle}%
+    \fi
+  \else
+    \typeout{Titling won't fit
+             \the\SIL at heightfortitle}%
+    \SIL at titleonelinefalse
+    \setbox\SIL at titlebox=\vbox{%
+      \hsize\SIL at heightfortitle
+      \SILmfont\raggedright
+      \vrule height1em width0pt
+      \bfseries\citetitle{#1}%
+      \vrule depth.2em width0pt
+    }%
+    \setlength{\SIL at titleheight}%
+              {\ht\SIL at titlebox + \dp\SIL at titlebox}%
+    \typeout{Multiline title takes
+             \the\SIL at titleheight}%
+    \ifdim\SIL at titleheight>\SIL at bookwidth
+      \typeout{Height of title
+               \the\SIL at titleheight\
+               is greater than
+               \the\SIL at bookwidth}%
+      \edef\titleval{\strip at pt\SIL at titleheight}%
+      \edef\heightval{\strip at pt\SIL at bookwidth}%
+      \FPeval\SIL at scaledtitle
+          {10 - \heightval / \titleval}%
+      \typeout{10 - \heightval\ ÷ \titleval\
+               = \SIL at scaledtitle}%
+      \typeout{Using smaller font \SIL at scaledtitle
+               pt for multiline title}%
+    \else
+      \typeout{Height of title
+               \the\SIL at titleheight\
+               is less than
+               \the\SIL at bookwidth}%
+      \edef\titleval{\strip at pt\SIL at titleheight}%
+      \edef\heightval{\strip at pt\SIL at bookwidth}%
+      \FPeval\SIL at scaledtitle
+          {10 + \heightval / \titleval}%
+      \typeout{10 + \heightval\ ÷ \titleval\
+               = \SIL at scaledtitle}%
+      \typeout{Using larger font \SIL at scaledtitle
+               pt for multiline title}%
+    \fi
+  \fi
+  \leavevmode\vbox{\hsize\SIL at bookwidth
+    \advance\hsize by2\fboxsep
+    \advance\hsize by2\fboxrule
+  \fcolorbox{black}{\SIL at bgcol}{%
+    \ifSIL at topauthor
+      \typeout{Setting with top author}%
+      \vbox to\SIL at bookheight{\hsize\SIL at bookwidth
+        \typeout{Spine is a vbox to
+          \the\SIL at bookheight,
+          hsize=\the\SIL at bookwidth}%
+        \centering
+        \SILmfont\color{\SIL at fgcol}%
+        \citefullauthor{#1}%
+        \par\vfill
+        \rotatebox{90}{\vbox to\SIL at bookwidth{%
+            \hsize\SIL at heightfortitle
+          \null\vfill
+          \typeout{Title in a vbox to
+                   \the\SIL at bookwidth,
+                   hsize=\the\SIL at heightfortitle}%
+          \raggedright\color{\SIL at fgcol}%
+          \ifSIL at titleoneline
+            \scalebox{\SIL at scaledtitle}%
+                     {\bfseries\citetitle{#1}}%
+          \else
+            \fontsize{\SIL at scaledtitle}%
+                     {\SIL at scaledtitle}\selectfont
+            \bfseries\citetitle{#1}%
+          \fi
+          \par\vfill}%
+        }%
+      }%
+    \else
+      \typeout{Setting author inline to title}%
+      \vbox to\SIL at bookheight{\hsize\SIL at bookwidth
+        \typeout{Spine is a vbox to
+                 \the\SIL at bookheight,
+                 hsize=\the\SIL at bookwidth}%
+        \centering
+        \SILmfont\color{\SIL at fgcol}%
+        \rotatebox{90}{\vbox to\SIL at bookwidth{%
+            \hsize\SIL at heightfortitle
+          \null\vfill
+          \typeout{Title and author in a vbox to
+                   \the\SIL at bookwidth,
+                   hsize=\the\SIL at heightfortitle}%
+          \raggedright\color{\SIL at fgcol}%
+          \ifSIL at titleoneline
+            \scalebox{\SIL at scaledtitle}%
+                     {{\bfseries\citetitle{#1}}\quad
+                       —\ \ \citefullauthor{#1}}%
+          \else
+            \fontsize{\SIL at scaledtitle}%
+                     {\SIL at scaledtitle}\selectfont
+                     {\bfseries\citetitle{#1}}\quad
+                     —\ \ \citefullauthor{#1}%
+          \fi
+          \par\vfill}%
+        }%
+      }%
+    \fi
+  }%
+  \\\fboxsep0pt\fboxrule0pt
+  \colorbox{BurlyWood}{\hbox to\hsize{%
+      \hfil\vrule height3mm depth6mm width0pt
+      \normalfont\scriptsize\theSIL at fontsel\hfil}}%
+  }%
+\kern-2.2mm}%
+\DeclareCiteCommand{\citefullauthor}
+  {\boolfalse{citetracker}%
+   \boolfalse{pagetracker}%
+   \DeclareNameAlias{labelname}{given-family}%
+   \usebibmacro{prenote}}
+  {\ifciteindex
+     {\indexnames{labelname}}
+     {}%
+   \printnames{labelname}}
+  {\multicitedelim}
+  {\usebibmacro{postnote}}
+%%\DeclareLabeltitle[article]{%
+%%  \field{journaltitle}
+%%}
+%%\DeclareLabeltitle
+%%    [inbook,incollection,inproceedings]{%
+%%  \field{booktitle}
+%%  \field{maintitle}
+%%}
+\DeclareFieldFormat*{citetitle}{#1}
+\let\citeA\textcite
+\let\titleref\emph
+\def\emdash{~--- }
+
+\endinput
+%%
+%% End of file `bookshelf.cls'.


Property changes on: trunk/Master/texmf-dist/tex/latex/bookshelf/bookshelf.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2020-05-24 21:41:54 UTC (rev 55261)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2020-05-24 21:43:06 UTC (rev 55262)
@@ -134,7 +134,7 @@
     bnumexpr bodegraph bohr boisik bold-extra
     boites boldtensors bondgraph bondgraphs
     bookcover bookdb bookest bookhands booklet bookman bookmark
-    booktabs booktabs-de booktabs-fr boolexpr boondox bophook
+    bookshelf booktabs booktabs-de booktabs-fr boolexpr boondox bophook
     borceux bosisio
     boxedminipage boxhandler bpchem bpolynomial
     br-lex bracketkey braids braille braket

Added: trunk/Master/tlpkg/tlpsrc/bookshelf.tlpsrc
===================================================================
Modified: trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2020-05-24 21:41:54 UTC (rev 55261)
+++ trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2020-05-24 21:43:06 UTC (rev 55262)
@@ -110,6 +110,7 @@
 depend bookcover
 depend bookest
 depend booklet
+depend bookshelf
 depend boolexpr
 depend bophook
 depend boxedminipage



More information about the tex-live-commits mailing list.