summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/savetrees
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/savetrees
Initial commit
Diffstat (limited to 'macros/latex/contrib/savetrees')
-rw-r--r--macros/latex/contrib/savetrees/README43
-rw-r--r--macros/latex/contrib/savetrees/savetrees.dtx3773
-rw-r--r--macros/latex/contrib/savetrees/savetrees.ins100
-rw-r--r--macros/latex/contrib/savetrees/savetrees.pdfbin0 -> 406548 bytes
-rw-r--r--macros/latex/contrib/savetrees/st-sample2e.pdfbin0 -> 121494 bytes
5 files changed, 3916 insertions, 0 deletions
diff --git a/macros/latex/contrib/savetrees/README b/macros/latex/contrib/savetrees/README
new file mode 100644
index 0000000000..85b34bde82
--- /dev/null
+++ b/macros/latex/contrib/savetrees/README
@@ -0,0 +1,43 @@
+ +------------------------------------+
+ | THE SAVETREES PACKAGE |
+ | By Scott Pakin, scott+st@pakin.org |
+ +------------------------------------+
+
+
+Description
+===========
+
+The goal of the savetrees package is to pack as much text as possible
+onto each page of a LaTeX document. Admittedly, this makes the
+document far less attractive. Nevertheless, savetrees is a simple way
+to save paper when printing draft copies of a document. It can also
+be useful when trying to meet a tight page-length requirement for a
+conference or journal submission.
+
+
+Installation
+============
+
+To install savetrees, run "latex savetrees.ins" to produce the various
+package files. Move savetrees.sty into a directory searched by LaTeX
+(e.g., .../texmf/tex/latex/misc/). Move savetrees.bst into a
+directory searched by BibTeX (e.g., .../texmf/bibtex/bst/misc/). And
+move savetrees.bbx and savetrees.cvx into directories searched by
+Biblatex (e.g., .../texmf/tex/latex/biblatex/bbx/ and
+.../texmf/tex/latex/biblatex/cbx/).
+
+
+Copyright and license
+=====================
+
+Copyright (C) 2016 by Scott Pakin <scott+st@pakin.org>
+
+This file may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, either version 1.3c of this license
+or (at your option) any later version. The latest version of this
+license is in:
+
+ http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions of LaTeX
+version 2006/05/20 or later.
diff --git a/macros/latex/contrib/savetrees/savetrees.dtx b/macros/latex/contrib/savetrees/savetrees.dtx
new file mode 100644
index 0000000000..a58e6f48b0
--- /dev/null
+++ b/macros/latex/contrib/savetrees/savetrees.dtx
@@ -0,0 +1,3773 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2016 by Scott Pakin <scott+st@pakin.org>
+% ------------------------------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2006/05/20 or later.
+%
+% \fi
+%
+% \iffalse
+%<bbxfile>\ProvidesFile{savetrees.bbx}
+%<cbxfile>\ProvidesFile{savetrees.cbx}
+%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{savetrees}
+%<*driver>
+\ProvidesFile{savetrees.dtx}
+%</driver>
+%<*package|bbxfile|cbxfile>
+ [2016/04/13 v2.4 Pack as much text as possible onto each page]
+%</package|bbxfile|cbxfile>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{array}
+\usepackage{dcolumn}
+\usepackage{tabularx}
+\usepackage{booktabs}
+\usepackage{topcapt}
+\usepackage{changepage}
+\usepackage{calc}
+\usepackage{varioref}
+\usepackage{needspace}
+\usepackage[format=hang,justification=raggedright]{subfig}
+\usepackage[tracking]{microtype}
+\SetExpansion[context=tightcharwidths,stretch=0,shrink=55]{encoding=*,shape=*}{}
+\usepackage{hyperref}
+\usepackage{hyperxmp}
+\hypersetup{%
+ pdftitle={The savetrees package},
+ pdfauthor={Scott Pakin},
+ pdfsubject={Reduce a LaTeX document's page count by adjusting the formatting},
+ pdfkeywords={LaTeX, reduce document size, margins, whitespace, page count},
+ pdfcopyright={Copyright (C) \the\year, Scott Pakin},
+ pdflicenseurl={http://www.latex-project.org/lppl.txt},
+ pdfcaptionwriter={Scott Pakin},
+ pdfcontactregion={New Mexico},
+ pdfcontactcountry={USA},
+ pdfcontactemail={scott+st@pakin.org},
+ pdfcontacturl={http://www.pakin.org/\xmptilde scott/},
+ baseurl={http://mirror.ctan.org/macros/latex/contrib/savetrees/savetrees.pdf},
+ pdflang={en-US}
+}
+\EnableCrossrefs
+\CodelineIndex
+\setcounter{IndexColumns}{2}
+\RecordChanges
+\begin{document}
+ \DocInput{savetrees.dtx}
+ \Needspace{10\baselineskip}
+ \phantomsection\addcontentsline{toc}{section}{Change History}
+ \PrintChanges
+ \makeatletter
+ \let\orig@index@prologue=\index@prologue
+ \def\index@prologue{%
+ \phantomsection\addcontentsline{toc}{section}{Index}
+ \orig@index@prologue
+ }%
+ \makeatother
+ \Needspace{12\baselineskip}
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{528}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v1.0}{2002/07/06}{Initial version}
+% \changes{v2.2}{2014/02/19}{Disabled \textsf{tracking}'s effect
+% except when called from pdf\LaTeX, and disabled \textsf{charwidths}'s
+% effect except when called from either pdf\LaTeX\ or Lua\LaTeX}
+%
+% \GetFileInfo{savetrees.dtx}
+%
+% \DoNotIndex{\.,\@arabic,\@author,\@biblabel,\@clubpenalty,\@date,\@empty}
+% \DoNotIndex{\@enumctr,\@enumdepth,\@gobble,\@ifundefined,\@itemdepth}
+% \DoNotIndex{\@itemitem,\@latex@warning,\@m,\@mkboth,\@ne,\@noitemerr}
+% \DoNotIndex{\@openbib@code,\@tempcnta,\@tempdima,\@title,\@toodeep}
+% \DoNotIndex{\@undefined,\MakeUppercase,\MessageBreak,\addtolength}
+% \DoNotIndex{\advance,\baselineskip,\begin,\bibname,\c@enumiv,\chapter}
+% \DoNotIndex{\clubpenalty,\csname,\def,\descriptionlabel,\divide,\edef}
+% \DoNotIndex{\else,\end,\endcsname,\endlist,\expandafter,\fi,\footnote}
+% \DoNotIndex{\g@addto@macro,\gdef,\hss,\ifnum,\ifx,\itemindent,\labelwidth}
+% \DoNotIndex{\large,\let,\list,\llap,\multiply,\newcommand,\newenvironment}
+% \DoNotIndex{\newif,\newlength,\newpage,\newtoks,\null,\p@enumiv,\par}
+% \DoNotIndex{\refname,\relax,\renewcommand,\renewenvironment,\romannumeral}
+% \DoNotIndex{\section,\setcounter,\setlength,\settowidth,\sfcode,\sloppy}
+% \DoNotIndex{\small,\textbf,\thanks,\the,\theenumiv,\thr@@,\usecounter}
+% \DoNotIndex{\vskip,\widowpenalty,\xdef,\z@}
+%
+% ^^A ----------------------------------------------------------------------
+%
+% \title{The \textsf{savetrees} package\thanks{This document
+% corresponds to \textsf{savetrees}~\fileversion, dated \filedate.}}
+% \author{Scott Pakin \\ \texttt{scott+st@pakin.org}}
+%
+% ^^A Define macros for typesetting/indexing package and program names.
+% \DeclareRobustCommand{\pkgname}[1]{^^A
+% \textsf{#1}^^A
+% \index{#1 (package)\actualchar\string\textsf{#1} (package)\encapchar usage}^^A
+% \index{packages:\levelchar#1\actualchar^^A
+% \string\textsf{#1}\encapchar usage}^^A
+% }
+% \DeclareRobustCommand{\progname}[1]{^^A
+% \texttt{#1}^^A
+% \index{#1 (program)\actualchar\string\texttt{#1} (program)\encapchar usage}^^A
+% \index{programs:\levelchar#1\actualchar^^A
+% \string\texttt{#1}\encapchar usage}^^A
+% }
+%
+% ^^A Display and index a package option.
+% \newcommand{\pkgoption}[1]{^^A
+% \textsf{#1}^^A
+% \index{#1 (package option)\actualchar^^A
+% \string\textsf{#1} (package option)\encapchar usage}^^A
+% \index{package options:\levelchar#1\actualchar^^A
+% \string\textsf{#1}\encapchar usage}^^A
+% }
+%
+% ^^A Define a macro to index an option declaration that appeared on the
+% ^^A previous code line.
+% \makeatletter
+% \newcommand{\pkgoptiondecl}[1]{^^A
+% \special@index{#1 (package option)\actualchar^^A
+% \string\textsf{#1} (package option)\encapchar main}^^A
+% \special@index{package options:\levelchar#1\actualchar^^A
+% \string\textsf{#1}\encapchar main}^^A
+% }
+% \makeatother
+%
+% ^^A Define macros for computing the average character width of various fonts.
+% \newcommand{\thousandletters}{^^A
+% aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^^A
+% bbbbbbbbb^^A
+% cccccccccccccccccccccccccccccc^^A
+% dddddddddddddddddddddddddddddddddddddddddddd^^A
+% eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee^^A
+% ffffffffffffffffffffffffffff^^A
+% gggggggggggggggg^^A
+% hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^A
+% iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii^^A
+% jj^^A
+% kkk^^A
+% lllllllllllllllllllllllllllllllllll^^A
+% mmmmmmmmmmmmmmmmmmmmmmmmm^^A
+% nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn^^A
+% oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo^^A
+% ppppppppppppppppppppppppppp^^A
+% qqq^^A
+% rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr^^A
+% sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss^^A
+% ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt^^A
+% uuuuuuuuuuuuuuuuuuuuuuuuuuu^^A
+% vvvvvvvvvvvvv^^A
+% wwwwwwwwwwwwwwww^^A
+% xxxxx^^A
+% yyyyyyyyyyyyyyyyyyy^^A
+% z^^A
+% }
+% \newlength{\thousandwidth}
+% \makeatletter
+% \newcommand{\fontwidth}[1]{^^A
+% \settowidth{\thousandwidth}{\fontsize{10}{12}\fontfamily{#1}\selectfont\thousandletters}^^A
+% \divide\thousandwidth by 1000\relax
+% \strip@pt\thousandwidth
+% }
+% \makeatother
+%
+% ^^A Include "Table" and "Figure" in the hyperlink itself.
+% \labelformat{table}{Table~#1}
+% \labelformat{figure}{Figure~#1}
+% \labelformat{section}{Section~#1}
+% \labelformat{subsection}{Section~#1}
+%
+% ^^A Define a block of text to use to showcase savetrees's
+% ^^A space-saving techniques.
+% \newcommand*{\lipsumtext}{%
+% Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam
+% dapibus tempus dolor ac dignissim. Nam et ante eu velit interdum
+% bibendum. Etiam ligula dolor, varius at rutrum at, porta vit\ae{}
+% lacus. Cras et elit ut lectus aliquet scelerisque ut sed arcu.
+% Morbi eleifend iaculis augue non tristique. Pr\ae{}sent cursus
+% iaculis diam et tristique. Curabitur facilisis, eros in scelerisque
+% mollis, diam ante mollis purus, vel euismod neque velit vit\ae{}
+% augue. In sit amet nulla odio, at ultrices dui. Quisque venenatis
+% velit eget nulla ultrices rutrum. In hac habitasse platea dictumst.
+% \AE{}nean odio turpis, laoreet non vulputate eu, fermentum sed
+% metus.
+% }
+%
+% ^^A Store \lipsumtext in a box so we can both measure and re-use it.
+% \newsavebox{\normalbox}
+% \savebox{\normalbox}{^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% \lipsumtext
+% \end{minipage}}^^A
+% }
+%
+% ^^A Define a macro that presents "before" and "after" comparisons
+% ^^A of a savetrees space-saving technique.
+% \newcommand{\comparisonfigure}[4][\lipsumtext]{^^A
+% \begin{figure}[htbp]
+% \savebox{\normalbox}{^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% #1
+% \end{minipage}}}^^A
+% \subfloat[\texttt{#2=normal}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \usebox{\normalbox}}^^A
+% \hfill
+% \subfloat[\texttt{#2=tight}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% #3#1#4^^A
+% \end{minipage}}}^^A
+% \caption{Effect of the \texttt{#2} option}
+% \label{fig:ex-#2}
+% \end{figure}
+% }
+%
+% ^^A Define macros for labeling lines of code.
+% \makeatletter
+% \newcommand{\labelprevcodeline}[1]{^^A
+% \begingroup
+% \edef\@currentlabel{\the\c@CodelineNo}^^A
+% \label{#1}^^A
+% \endgroup
+% }
+% \newcounter{nextCodelineNo}
+% \newcommand{\labelnextcodeline}[1]{^^A
+% \begingroup
+% \setcounter{nextCodelineNo}{\c@CodelineNo}^^A
+% \addtocounter{nextCodelineNo}{1}^^A
+% \edef\@currentlabel{\thenextCodelineNo}^^A
+% \label{#1}^^A
+% \endgroup
+% }
+% \makeatother
+%
+%
+% \sloppy
+% \maketitle
+%
+%
+% \section{Introduction}
+%
+% The goal of the \pkgname{savetrees} package is to pack as much text as
+% possible onto each page of a \LaTeX{} document. Admittedly, this
+% makes the document far less attractive. Nevertheless,
+% \pkgname{savetrees} provides a simple way to save paper when printing
+% draft copies of a document. It can also be useful when trying to meet
+% a tight page-length requirement. For example, consider the difference
+% between
+%
+% \savebox{\normalbox}{^^A
+% \fbox{^^A
+% \begin{minipage}[t]{\linewidth-2cm}^^A
+% \lipsumtext
+% \end{minipage}}^^A
+% }
+% \begin{center}
+% \usebox{\normalbox}
+% \end{center}
+%
+% \noindent
+% and
+%
+% \newlength{\oldwordspacing}
+% \setlength{\oldwordspacing}{\fontdimen2\font}
+% \begin{center}
+% \renewcommand{\baselinestretch}{0.95}^^A
+% \fbox{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \begin{minipage}[t]{\linewidth-2cm}^^A
+% \begin{microtypecontext}{expansion=tightcharwidths}^^A
+% \SetTracking{encoding=*,shape=*}{-25}^^A
+% \lsstyle
+% \fontdimen2\font=0.75\oldwordspacing
+% \lipsumtext
+% \end{microtypecontext}^^A
+% \end{minipage}}^^A
+% \end{center}
+%
+% The former (default) layout looks nicer, but the latter consumes
+% approximately~10\% less space.
+%
+% \bigskip
+%
+% The easiest way to use \pkgname{savetrees} is simply to place one of
+% the following in your document's preable:
+%
+% \begin{itemize}
+% \item |\usepackage[subtle]{savetrees}|
+% \item |\usepackage[moderate]{savetrees}|
+% \item |\usepackage[extreme]{savetrees}|
+% \end{itemize}
+%
+% The first option, \pkgoption{subtle}, preserves all document layout
+% and merely encourages \LaTeX\ to try harder to pack text onto the page
+% while introducing white space only when absolutely necessary. The
+% second option, \pkgoption{moderate}, additionally reduces paragraph
+% indentation, typesets lists and mathematical displays without
+% indentation or surrounding vertical space, reduces interline spacing,
+% and makes the font slightly narrower, if supported. The third option,
+% \pkgoption{extreme}, which is in fact the default if no package
+% options are specified, turns on all of the space-saving techniques in
+% \pkgname{savetrees}'s repertoire, including using smaller title and
+% section fonts, typesetting the bibliography with a smaller font and no
+% inter-item spacing, and substantially reducing the page margins. For
+% a demonstration of these package options, see the accompanying
+% \href[pdfnewwindow]{st-sample2e.pdf}{\texttt{st-sample2e.pdf}} file,
+% which presents Lamport's ``An Example Document'' typeset both normally
+% and with each of \pkgname{savetrees}'s \pkgoption{subtle},
+% \pkgoption{moderate}, and \pkgoption{extreme} options.
+%
+% The following section describes those and the rest of
+% \pkgname{savetrees}'s space-saving capabilities in more detail.
+%
+%
+% \section{Usage}
+%
+% \vrefrange{tbl:st-opts-subt}{tbl:st-opts-ext} describe
+% \pkgname{savetrees}'s main package options and summarize their
+% implementation. Some package options merely load a package or
+% redefine some variables. Others redefine entire environments to
+% consume less space. A few resort to some underhanded \TeX\ trickery
+% to squeeze as much text as possible onto the page.
+% \makeatletter
+% \@ifundefined{r@sec:savetrees.sty}{^^A
+% See the \pkgname{savetrees} source code
+% }{^^A
+% See the annotated source code listing in \ref{sec:savetrees.sty}
+% }^^A
+% \makeatother
+% for the definitive description of the mechanics underlying the
+% \pkgname{savetrees} package.
+%
+% \newlength{\implwidth}
+% \settowidth{\implwidth}{and \texttt{\string\belowdisplayshortskip}.}
+% \begin{table}
+% \begin{adjustwidth}{1in-\marginparwidth-\marginparsep}{0pt}
+% \centering
+% \topcaption{\pkgname{savetrees} package options for enabling/disabling
+% space-saving techniques (\texttt{subtle})}
+% \label{tbl:st-opts-subt}
+% \renewcommand{\arraystretch}{2}
+% \begin{tabularx}{\linewidth}{@{}l>{\raggedright}X>{\raggedright\arraybackslash}p{\implwidth}@{}}
+% \toprule
+% Option & Space-saving technique & Implementation \\
+% \midrule
+%
+% \pkgoption{bibbreaks}
+% & Allow page breaks within bibliographic entries.
+% & Redefine Biblatex's \texttt{\string\bibsetup} hook. \\
+%
+% \pkgoption{paragraphs}
+% & Discourage \TeX\ from allowing the last line of a paragraph to
+% contain only a single word.
+% & Reassign |\looseness|. \\
+%
+% \pkgoption{floats}
+% & Relax float placement (more floats per page, increased ability to
+% share pages with text, etc.).
+% & Reassign \LaTeXe{} float variables. \\
+%
+% \pkgoption{mathspacing}
+% & Reduce the amount of space within mathematical expressions.
+% & Reassign |\thinmuskip|, |\medmuskip|, and |\thickmuskip|. \\
+%
+% \pkgoption{wordspacing}
+% & Reduce the amount of space between words.
+% & Reassign \texttt{\string\fontdimen2}. \\
+%
+% \pkgoption{tracking}
+% & Reduce the amount of space between characters.
+% & Pass options to the \pkgname{microtype} package. \\
+%
+% \bottomrule
+% \end{tabularx}
+% \end{adjustwidth}
+% \end{table}
+%
+% \begin{table}
+% \begin{adjustwidth}{1in-\marginparwidth-\marginparsep}{0pt}
+% \centering
+% \topcaption{\pkgname{savetrees} package options for enabling/disabling
+% space-saving techniques (\texttt{moderate})}
+% \label{tbl:st-opts-mod}
+% \renewcommand{\arraystretch}{2}
+% \begin{tabularx}{\linewidth}{@{}l>{\raggedright}X>{\raggedright\arraybackslash}p{\implwidth}@{}}
+% \toprule
+% Option & Space-saving technique & Implementation \\
+% \midrule
+%
+% \pkgoption{bibnotes}
+% & Ignore \texttt{NOTE} fields in the bibliography.
+% & Pass information to |savetrees.bst| (\BibTeX) or |savetrees.bbx|
+% (Biblatex). \\
+%
+% \pkgoption{charwidths}
+% & Allow character glyphs to be drawn slightly narrower than
+% normal.
+% & Pass options to the \pkgname{microtype} package. \\
+%
+% \pkgoption{mathdisplays}
+% & Reduce the amount of vertical space surrounding displayed mathematics.
+% & Reassign |\abovedisplayskip|, |\belowdisplayskip|,
+% |\abovedisplayshortskip|, and |\belowdisplayshortskip|. \\
+%
+% \pkgoption{leading}
+% & Reduce interline spacing.
+% & Reassign |\baselinestretch|. \\
+%
+% \pkgoption{indent}
+% & Decrease paragraph indentation.
+% & Reassign |\parindent|. \\
+%
+% \pkgoption{lists}
+% & Remove both indentation and inter-item spacing from the various
+% list environments.
+% & Redefine the \texttt{itemize}, \texttt{enumerate}, and
+% \texttt{description} environments. \\
+%
+% \bottomrule
+% \end{tabularx}
+% \end{adjustwidth}
+% \end{table}
+%
+% \begin{table}
+% \begin{adjustwidth}{1in-\marginparwidth-\marginparsep}{0pt}
+% \centering
+% \topcaption{\pkgname{savetrees} package options for enabling/disabling
+% space-saving techniques (\texttt{extreme})}
+% \label{tbl:st-opts-ext}
+% \renewcommand{\arraystretch}{2}
+% \begin{tabularx}{\linewidth}{@{}l>{\raggedright}X>{\raggedright\arraybackslash}p{\implwidth}@{}}
+% \toprule
+% Option & Space-saving technique & Implementation \\
+% \midrule
+%
+% \pkgoption{bibliography}
+% & Typeset the bibliography in a smaller font and with no inter-item
+% spacing.
+% & Redefine \texttt{thebibliography}, |\bibfont|, and |\bibitemsep|. \\
+%
+% \pkgoption{title}
+% & Typeset the document title with smaller fonts and with less
+% surrounding white space.
+% & Redefine |\maketitle|. \\
+%
+% \pkgoption{sections}
+% & Typeset section titles with smaller fonts and with less surrounding
+% white space.
+% & Pass options to the \pkgname{titlesec} package. \\
+%
+% \pkgoption{margins}
+% & Reduce the page margins.
+% & Pass options to the \pkgname{geometry} package. \\
+%
+% \bottomrule
+% \end{tabularx}
+% \end{adjustwidth}
+% \end{table}
+%
+% Each of the options that appears in \ref{tbl:st-opts-subt} through
+% \ref{tbl:st-opts-ext} can be set to either |tight| or |normal|.
+% |tight|, the default, enables the space-saving technique while
+% |normal| disables it. For example, specifying
+% |\usepackage[title=normal]{savetrees}| instructs \pkgname{savetrees}
+% not to modify the font size and spacing used to typeset the document's
+% title. The \pkgoption{all} option can be used to set all of
+% \pkgname{savetrees}'s options en~masse to either |tight| or |normal|.
+% For example, if only a few space-saving techniques should be enabled,
+% it may be more convenient to specify |all=normal| followed by a small
+% list of options set to |tight| than to specify |normal| typesetting
+% for a large set of options. The arguments passed to |\usepackage| are
+% processed left-to-right.
+%
+% As convenient shortcuts, the options in \ref{tbl:st-opts-subt} can be
+% enabled as a group by passing the \pkgoption{subtle} option to
+% \pkgname{savetrees}; the options in both \ref{tbl:st-opts-subt} and
+% \ref{tbl:st-opts-mod} can be enabled as a group by passing the
+% \pkgoption{moderate} option to \pkgname{savetrees}; and all of the
+% options in \ref{tbl:st-opts-subt}, \ref{tbl:st-opts-mod}, and
+% \ref{tbl:st-opts-ext} can be enabled as a group by passing the
+% \pkgoption{extreme} option to \pkgname{savetrees}.
+%
+% The options in \ref{tbl:st-opts-subt} through \ref{tbl:st-opts-ext}
+% are presented in roughly decreasing order of subtlety. If you find
+% that \pkgname{savetrees}'s default options---or the
+% \pkgoption{subtle}, \pkgoption{moderate}, and \pkgoption{extreme}
+% meta-options---produce too hideous a result, try incrementally setting
+% to |normal| the options from the bottom of the options list up, and
+% see if doing so improves the document's appearance while still saving
+% space over the non-\pkgname{savetrees} version. That is, start by
+% including |margins=normal| in the optional argument to |\usepackage|.
+% Then add |sections=normal|, then |title=normal|, and so forth,
+% rebuilding the document and examining the result each time.
+% Alternatively, if you need to save just a small amount of space
+% (e.g.,~if your document is just barely over a maximum page length),
+% specify |all=normal| then incrementally add options from the top of
+% the three tables downwards: |paragraphs=tight|, then |floats=tight|,
+% then |mathspacing=tight|, and so forth. \ref{sec:gallery} presents
+% examples of some of \pkgname{savetrees}'s space-saving features so you
+% can decide for yourself which are worth the price paid in typesetting
+% elegance.
+%
+% Saving space in a document is always a balancing act between document
+% aesthetics and the amount of space that can be saved. If you find
+% that a particular space-saving option makes the document formatting
+% just a little too ugly---or if you're willing to make it even uglier
+% to save even more space---\pkgname{savetrees} provides additional
+% package options that let you adjust the aggressiveness of various
+% space-saving techniques. \vref{tbl:st-refinements} lists and
+% describes these package options. As an example, \LaTeX's normal line
+% height is defined to have a value of~1.0. When \pkgname{savetrees} is
+% loaded with |leading=tight| (the default), \ref{tbl:st-refinements}
+% indicates that the line height is reduced to 95\% of that.
+% Additionally including |leadingfraction=0.98| on the |\usepackage| line
+% increases the line height to 98\% of \LaTeX's default---still a space
+% reduction but possibly a somewhat less overt one.
+%
+% \begin{table}
+% \topcaption{\pkgname{savetrees} package options for refining the way
+% space is saved}
+% \label{tbl:st-refinements}
+% \renewcommand{\arraystretch}{2}
+% \begin{tabularx}{\linewidth}{@{}l>{\raggedright}Xlr@{}}
+% \toprule
+% Option & Description & \multicolumn{1}{l}{Requires \texttt{tight}} & Default \\
+% \midrule
+%
+% \pkgoption{charwidthfraction}
+% & Fraction of normal character widths
+% & \pkgoption{charwidths}
+% & 0.95 \\
+%
+% \pkgoption{leadingfraction}
+% & Fraction of normal line height
+% & \pkgoption{leading}
+% & 0.95 \\
+%
+% \pkgoption{marginwidth}
+% & Width of the page margins
+% & \pkgoption{margins}
+% & 1.5cm \\
+%
+% \pkgoption{parindent}
+% & Paragraph indentation
+% & \pkgoption{indent}
+% & 1em \\
+%
+% \pkgoption{trackingfraction}
+% & Fraction of normal inter-character spacing
+% & \pkgoption{tracking}
+% & 0.975 \\
+%
+% \pkgoption{wordspacingfraction}
+% & Fraction of normal inter-word spacing
+% & \pkgoption{wordspacing}
+% & 0.8 \\
+%
+% \bottomrule
+% \end{tabularx}
+% \end{table}
+%
+% There are a few restrictions on the space-saving techniques that can
+% be applied. The \pkgname{tracking} option requires pdf\LaTeX\@. The
+% \pkgoption{charwidths} option requires either pdf\LaTeX\ or
+% Lua\LaTeX\@. For both options, pdf\LaTeX\ must be in PDF mode, not
+% DVI mode. See the \pkgname{microtype} documentation for additional
+% (and possibly more up-to-date) information.
+%
+%
+% \section{Abbreviating bibliographic information}
+%
+% One of the advantages of a tool like \BibTeX\ is that the
+% bibliographic database can---and should---contain complete
+% bibliographic information for each reference while style files
+% determine the subset of that information that is actually typeset.
+% Hence, to help further reduce a document's length, the
+% \pkgname{savetrees} package additionally provides a \BibTeX{} style
+% file, |savetrees.bst|, which exhibits the following salient
+% differences from |plain.bst|:
+%
+% \begin{itemize}
+% \item Abbreviations are used wherever possible:
+%
+% \begin{center}
+% \begin{tabular}{l@{\quad$\Longrightarrow$\quad}l}
+% chapter & chap. \\
+% edition & ed. \\
+% editor \emph{or} editors & ed.\ \emph{or} eds. \\
+% January, February,~\dots & Jan., Feb.,~\dots \\
+% page \emph{or} pages & p.\ \emph{or} pp. \\
+% Technical Report & Tech. Rep. \\
+% \end{tabular}
+% \end{center}
+%
+% \item At most two authors are listed. The remainder are replaced by
+% ``et al.''
+%
+% \item Authors' names are abbreviated to their initials plus surname
+% (e.g.,~``S.~D.~Pakin'').
+% \end{itemize}
+%
+% \noindent
+% In addition, |savetrees.bst| does not normally typeset |NOTE| fields,
+% although it can be instructed to do so by passing \pkgname{savetrees}
+% the |bibnotes=normal| package option.
+%
+% To use |savetrees.bst|, simply replace your document's existing
+% |\bibliographystyle| line with ``|\bibliographystyle{savetrees}|''.
+% Then, to give |savetrees.bst|---or \emph{any} \BibTeX{} style
+% file---maximum flexibility, you should obey the following rules when
+% writing your |.bib| file:
+%
+% \begin{enumerate}
+% \item Use the three-letter month macros defined by virtually all
+% \BibTeX{} style files instead of spelling out month names
+% explicitly:
+%
+% \begin{tabularx}{\linewidth}{@{}lX@{}}
+% \toprule
+% Good: & \texttt{MONTH = sep,} \\
+% & Can be typeset as ``September'', ``Sept.'', ``SEP'',
+% ``Septiembre'', etc. \\
+%
+% Bad: & \texttt{MONTH = \{September\},} \\
+% & Can be typeset only as ``September''. \\
+% \bottomrule
+% \end{tabularx}
+%
+% \item Include authors' full names (or as much of each name as is
+% available); let \BibTeX{} abbreviate as necessary:
+%
+% \begin{tabularx}{\linewidth}{@{}lX@{}}
+% \toprule
+% Good: & \texttt{AUTHOR = \{Rufus Xavier Sarsaparilla\}}, \\
+% & Can be typeset either in full or abbreviated to
+% ``Rufus~X. Sarsaparilla'', ``R.~X. Sarsaparilla'', etc. \\
+%
+% Bad: & \texttt{AUTHOR = \{R.~X. Sarsaparilla\}}, \\
+% & Can be typeset only as ``R.~X. Sarsaparilla'' and can't
+% be expanded to the full name. \\
+% \bottomrule
+% \end{tabularx}
+%
+% \item Include the names of \emph{all} authors; let \BibTeX{} decide
+% where to truncate the list:
+%
+% \begin{tabularx}{\linewidth}{@{}lX@{}}
+% \toprule
+%
+% Good: & \texttt{AUTHOR = \{Rufus Xavier Sarsaparilla and
+% Rafaella Gabriela Sarsaparilla and Albert Andreas
+% Armadillo\},} \\
+% & All authors can be named, or the list can be truncated at any
+% point with ``et al.'', ``and others'', or whatever. \\
+%
+% Bad: & \texttt{AUTHOR = \{Rufus Xavier Sarsaparilla and others\},} \\
+% & At most one author can be named, but ``and others'' can
+% still be replaced by ``et al.''\ or a different phrase,
+% and the author's name can still be abbreviated, as
+% discussed in the previous rule. \\
+% Worse: & \texttt{AUTHOR = \{\{Rufus Xavier Sarsaparilla, et al.\}\},} \\
+% & Can be typeset only precisely as ``Rufus Xavier
+% Sarsaparilla, et al.'' \\
+% \bottomrule
+% \end{tabularx}
+% \end{enumerate}
+%
+% The \pkgname{savetrees} \BibTeX{} style utilizes the same fields as
+% the standard \BibTeX{} styles (|plain|, |alpha|, |abbrv|, |unsrt|,
+% etc.), with the exception that the |NOTE| field is suppressed unless
+% the |bibnotes=normal| package option is provided.
+%
+% \bigskip
+%
+% In addition to |savetrees.bst|, \pkgname{savetrees} provides analogous
+% Biblatex style files: |savetrees.bbx| and |savetrees.cbx|. Like their
+% \BibTeX\ counterpart, they use abbreviated terms whenever possible,
+% list at most two authors before truncating them with ``et~al.'', and
+% abbreviate authors' names to initials plus surname.
+%
+% To use the \pkgname{savetrees} Biblatex style files, simply load
+% \pkgname{biblatex} with ``|\usepackage[style=savetrees]{biblatex}|''.
+% By default, the bibliography style suppresses the |isbn| |url|, |doi|,
+% and |eprint| fields from typesetting, but these can be re-enabled
+% explicitly:
+%
+% \begin{verbatim}
+% \usepackage[style=savetrees,isbn,url,doi,eprint]{biblatex}
+% \end{verbatim}
+%
+% The \pkgname{savetrees} \BibTeX\ and Biblatex style files can be
+% used independently of |savetrees.sty|.
+%
+%
+% \changes{v2.0}{2011/05/03}{Removed the awkward-to-use
+% \progname{makethin} script now that the \pkgname{microtype} package
+% can shrink character widths more automatically}
+%
+% \StopEventually{^^A
+% \labelformat{section}{Appendix~##1}
+% \appendix
+% \section{Average character widths of common fonts}
+%
+% \paragraph{Question:}
+% What's the narrowest font?
+%
+% \paragraph{Answer:}
+% It depends upon how you measure. \ref{tbl:font-widths} shows,
+% for various 10\,pt.\ fonts, the width in points of 1000 lowercase
+% letters with relative frequencies chosen to match ``typical'' English
+% text. There are 130~e's, 93~t's, 78~n's, 77~r's, and so forth down
+% the frequency distribution. According to the table, Times is
+% statistically likely to be the best typeface for maximizing the amount
+% of text on the page. However, Times may not be the narrowest for
+% \emph{your} document; you'll have to experiment and see.
+%
+% \begin{table}[htbp]
+% \centering
+% \begin{tabular}{@{}l>{\sffamily\selectfont}l@{\qquad}D{.}{.}{-1}@{}}
+% \hline
+% Typeface &
+% \multicolumn{1}{l}{Package} &
+% \multicolumn{1}{l@{}}{Avg. width (pt.)} \\
+% \hline
+%
+% Times & mathptmx & \fontwidth{ptm} \\
+% Computer Modern & \multicolumn{1}{l}{(default)} & \fontwidth{cmr} \\
+% Charter & charter & \fontwidth{bch} \\
+% Helvetica & helvet & \fontwidth{phv} \\
+% Palatino & mathpazo & \fontwidth{ppl} \\
+% Utopia & utopia & \fontwidth{put} \\
+% New Century Schoolbook & newcent & \fontwidth{pnc} \\
+% Avant Garde & avant & \fontwidth{pag} \\
+% Bookman & bookman & \fontwidth{pbk} \\
+% Courier & courier & \fontwidth{pcr} \\
+% \hline
+% \end{tabular}
+% \caption{Common fonts sorted by increasing width}
+% \label{tbl:font-widths}
+% \end{table}
+%
+% Although \pkgname{savetrees} does not automatically change the
+% document font it does specify that character glyphs may be typeset
+% narrower than normal (cf.~the \pkgoption{charwidth} option). Note,
+% however, that \pkgname{savetrees} unfortunately has no control over
+% precisely which lines of text are typeset with narrow characters.
+% This narrowing technique works only with pdf\LaTeX, so that program
+% should be used if possible to maximize the space-saving achievable
+% with \pkgname{savetrees}.
+%
+%
+% \section{Gallery of space-saving techniques}
+% \label{sec:gallery}
+%
+% \ref{fig:ex-lists} through \ref{fig:ex-leading}
+% \vpagerefrange{fig:ex-lists}{fig:ex-leading} provide examples of some
+% of the ways that \pkgname{savetrees} saves space when typesetting
+% text. Each figure showcases a single space-saving technique in
+% isolation. The default pararameters are used for each technique.
+% \vref{tbl:st-refinements} documents the package options that can be
+% used to refine these parameters either to save more space or to make
+% the typesetting less offensive.
+%
+% \ref{fig:ex-lists} shows how setting |lists=tight| saves space by
+% reducing the white space above, below, and within list environments (in
+% this case, the |itemize| environment). \ref{fig:ex-mathspacing} shows
+% how setting |mathspacing=tight| saves space by typesetting
+% mathematical expressions denser. \ref{fig:ex-mathdisplays} shows how
+% setting |mathdisplays=tight| removes the space around mathematical
+% displays (e.g.,~\texttt{\string\[}\dots\texttt{\string\]} or
+% \texttt{\string\begin\string{equation\string}}\dots\linebreak[0]\texttt{\string\end\string{equation\string}}).
+% \ref{fig:ex-wordspacing} shows how setting |wordspacing=tight| saves
+% space by typesetting words closer together. \ref{fig:ex-tracking}
+% shows how setting |tracking=tight| saves space by typesetting the
+% characters within a word closer together. \ref{fig:ex-charwidths}
+% shows how setting |charwidths=tight| saves space by narrowing the
+% individual character glyphs without affecting the font's point size
+% (height) or amount of white space. Finally, \ref{fig:ex-leading} shows
+% how setting |leading=tight| saves space by removing white space between
+% adjacent lines of text. Again, these techniques are shown with their
+% default parameters, which can be adjusted if desired.
+%
+% While \ref{fig:ex-lists} through \ref{fig:ex-leading} each illustrate
+% a single space-saving technique, \vref{fig:ex-multiple} demonstrates
+% that when multiple techniques are used in combination, the benefits
+% are essentially additive.
+%
+% \begin{figure}[htbp]
+% \savebox{\normalbox}{^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+% \begin{itemize}
+% \item curabitur
+% \item tellus
+% \item nulla
+% \end{itemize}
+% Quisque feugiat lacinia mauris ut tincidunt.
+% \end{minipage}}}^^A
+% \subfloat[\texttt{lists=normal}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \usebox{\normalbox}}^^A
+% \hfill
+% \subfloat[\texttt{lists=tight}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+% \begin{list}{\labelitemi}{^^A
+% \def\makelabel##1{\hss\llap{##1}}
+% \settowidth{\leftmargin}{\labelitemi}^^A
+% \addtolength{\leftmargin}{\labelsep}^^A
+% \setlength{\partopsep}{0pt plus 4pt}^^A
+% \setlength{\topsep}{0pt plus 4pt}^^A
+% \setlength{\itemsep}{0pt}^^A
+% \setlength{\parsep}{0pt}^^A
+% \setlength{\listparindent}{1em}^^A
+% }^^A
+% \item curabitur
+% \item tellus
+% \item nulla
+% \end{list}
+% Quisque feugiat lacinia mauris ut tincidunt.
+% \end{minipage}}}^^A
+% \caption{Effect of the \texttt{lists} option}
+% \label{fig:ex-lists}
+% \end{figure}
+%
+% \comparisonfigure[^^A
+% Lorem ipsum dolor sit amet, consectetur adipiscing elit
+% ${\cal H} = T + V$
+% quisque feugiat
+% $T = \frac{p^2}{2m}$
+% lacinia mauris
+% $V = V(q)$
+% ut tincidunt. Etiam ligula dolor
+% ${\cal H} = \sum_i \dot{q_i}
+% \frac{\partial \cal L}{\partial \dot{q_i}} -
+% {\cal L} = \sum_i \dot{q_i} p_i - {\cal L}$
+% eget nulla.
+% ]^^A
+% {mathspacing}
+% {^^A
+% \thinmuskip=0mu plus 3mu
+% \medmuskip=1mu plus 4mu
+% \thickmuskip=2mu plus 5mu
+% }{}
+%
+% \comparisonfigure[^^A
+% Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam dapibus
+% \[
+% \mathrm{d}{\cal L}
+% = \sum_i
+% \left(
+% \frac{\partial {\cal L}}{\partial q_i} \mathrm{d}q_i +
+% p_i \mathrm{d}\dot{q}_i
+% \right) +
+% \frac{\partial {\cal L}}{\partial t} \mathrm{d}t
+% \]
+% tempus dolor ac dignissim. Etiam ligula dolor, varius at rutrum.
+% ]^^A
+% {mathdisplays}
+% {^^A
+% \abovedisplayskip=0pt plus 3pt
+% \belowdisplayskip=0pt plus 3pt
+% \abovedisplayshortskip=0pt plus 3pt
+% \belowdisplayshortskip=0pt plus 3pt
+% }{}
+%
+% \newlength{\origwordspacing}
+% \setlength{\origwordspacing}{\fontdimen2\font}
+% \comparisonfigure{wordspacing}{^^A
+% \fontdimen2\font=0.75\origwordspacing
+% }{^^A
+% \fontdimen2\font=\origwordspacing
+% }
+%
+% \comparisonfigure{tracking}{^^A
+% \SetTracking{encoding=*,shape=*}{-25}^^A
+% \lsstyle
+% }{}
+%
+% \comparisonfigure{charwidths}{^^A
+% \begin{microtypecontext}{expansion=tightcharwidths}^^A
+% }{^^A
+% \end{microtypecontext}^^A
+% }
+%
+% \comparisonfigure{leading}{\fontsize{10}{11.4}\selectfont}{}
+%
+% \begin{figure}[htbp]
+% \savebox{\normalbox}{^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% \lipsumtext
+% \end{minipage}}}^^A
+% \subfloat[\texttt{all=normal}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \usebox{\normalbox}}^^A
+% \hfill
+% \subfloat[\texttt{wordspacing=tight, tracking=tight,
+% charwidths=tight, leading=tight}]{^^A
+% \rule[-\dp\normalbox]{0pt}{\dp\normalbox}^^A
+% \fbox{^^A
+% \begin{minipage}[t]{0.5\linewidth-0.5cm}^^A
+% \fontdimen2\font=0.75\origwordspacing
+% \fontsize{10}{11.4}\selectfont
+% \begin{microtypecontext}{expansion=tightcharwidths}^^A
+% \lsstyle
+% \lipsumtext
+% \end{microtypecontext}^^A
+% \fontdimen2\font=\origwordspacing
+% \end{minipage}}}^^A
+% \caption{Combined effect of using multiple options}
+% \label{fig:ex-multiple}
+% \end{figure}
+%
+% }
+%
+%
+% \section{Implementation of \texttt{savetrees.sty}}
+% \label{sec:savetrees.sty}
+%
+% This section presents the complete, commented source code for the
+% \pkgname{savetrees} package. Although reading this section---and the
+% subsequent implementation sections---is not necessary for
+% understanding how to use \pkgname{savetrees}, it may be a useful
+% teaching instrument for \LaTeX{} newcomers who want to learn more
+% about fine-tuning document formatting.
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \subsection{Default values}
+%
+% \pkgname{savetrees} attempts to provide a reasonable balance between
+% aesthetics and the amount of space saved in a document. However,
+% \pkgname{savetrees} does enable the document author to adjust a number
+% of parameters to bias \pkgname{savetrees}'s behavior towards either
+% reduced document length or prettier output. This section defines the
+% default values for various package parameters.
+%
+% \begin{macro}{\st@margin@width}
+% When |margins=tight|, |\st@margin@width| specifies how wide the page
+% margins should be. The default, 1.5\,cm, is extremely small, but it
+% can sure save a lot of space on the page.
+% \begin{macrocode}
+\newcommand*{\st@margin@width}{1.5cm}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\st@parindent}
+% The standard \LaTeX\ classes (|article|, |report|, and |book|) define
+% paragraph indentation as follows. If |twocolumn| is in effect,
+% |\parindent| is set to 1\,em. Otherwise, if the base font size is
+% 10\,pt., |\parindent| is set to 15\,pt.; if the base font size is
+% 11\,pt., |\parindent| is set to 17\,pt.; and if the base font size is
+% 12\,pt., |\parindent| is set to 1.5\,em. When |indent=tight|,
+% \pkgname{savetrees} uses a default of 1\,em---approximately a third of
+% the no-\pkgname{savetrees} value---regardless of font size.
+% \begin{macrocode}
+\newcommand*{\st@parindent}{1em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\st@baselinestretch}
+% Depending on font size, the standard \LaTeX\ classes (|article|,
+% |report|, and |book|) use 2--2.6\,pt.\ lead (inter-line spacing), or
+% approximately~20\% of font size. Specifically, they typeset body text
+% at 10/12, 11/13.6, or 12/14.5. When |leading=tight|,
+% \pkgname{savetrees} reduces the line spacing to 95\% of normal or an
+% average of about~0.67\,pt.\ less lead than \LaTeX's defaults: 10/11.4,
+% 11/12.92, or 12/13.78. 95\% gives very good compression but still
+% prevents descenders from running into successive ascenders.
+% \begin{macrocode}
+\newcommand*{\st@baselinestretch}{0.95}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\st@char@shrink}
+% When |charwidths=tight|, \pkgname{savetrees} disables font expansion
+% but enables font compaction. The default contraction of 5\% (50/1000)
+% of normal character widths is largely undetectable to the casual
+% observer but can save a great deal of space over the course of a long
+% document.
+% \begin{macrocode}
+\newcommand*{\st@char@shrink}{50}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\st@cspace@shrink}
+% \pkgname{savetrees} reduces tracking (inter-character spacing)
+% when |tracking=tight|. By default, tracking is set to -2.5\%
+% (-25/1000) of an em~width. When decreased much more than that,
+% characters begin to overlap and become hard to read.
+% \begin{macrocode}
+\newcommand*{\st@cspace@shrink}{-25}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\st@wspace@factor}
+% \pkgname{savetrees} reduces inter-word spacing when
+% |wordspacing=tight|. By default, inter-word spacing is set to 80\% of
+% normal. If decreased much beyond that, words start to run together
+% and become hard to read.
+% \begin{macrocode}
+\newcommand*{\st@wspace@factor}{0.8}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Option processing}
+% \label{sec:options}
+%
+% \subsubsection{Enabling/disabling space-saving techniques}
+%
+% By default, \pkgname{savetrees} tries to make documents extremely
+% dense. However, this also makes them rather ugly. The package
+% options defined below let the author specify which space-saving
+% routines are unacceptably grotesque and should not be utilized.
+%
+% \bigskip
+%
+% \pkgname{savetrees} uses the \pkgname{xkeyval} package to parse its
+% package options.
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+%
+% \pkgname{savetrees} uses the \pkgname{ifpdf} and \pkgname{ifluatex}
+% packages to control the use of the \pkgname{microtype} package.
+% \begin{macrocode}
+\RequirePackage{ifpdf}
+\RequirePackage{ifluatex}
+% \end{macrocode}
+%
+% \begin{macro}{\st@more@packages}
+% \begin{macro}{\st@RequirePackage}
+% As we process the package options we may encounter additional packages
+% that we need to load. Rather than load them eagerly, which may lead
+% to the same package problematically being loaded twice with different
+% options, we merely construct a list of required packages. Then, as
+% \pkgname{savetrees}'s last action before finishing, it loads all of
+% the pending packages. |\st@RequirePackage| takes the same arguments
+% as |\RequirePackage| but simply adds the package name to the
+% |\st@more@packages| list and instructs \LaTeXe\ to eventually pass the
+% given arguments, if any, to the package.
+% \begin{macrocode}
+\def\st@more@packages{}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*{\st@RequirePackage}[2][]{%
+ \PassOptionsToPackage{#1}{#2}%
+ \@cons\st@more@packages{{#2}}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\AtEndOfPackage{%
+ \let\@elt=\RequirePackage
+ \st@more@packages
+ \let\@elt=\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\st@define@option}
+% \begin{macro}{\st@arg}
+% \begin{macro}{\st@arg@num}
+% \pkgname{savetrees} accepts a large number of package options, each of
+% which can be set to |tight| (the default) to enable a feature or
+% |normal| to disable it. As the definitions of these options are fairly
+% repetitive, we define a helper macro to assist with the processing.
+% \begin{macrocode}
+\newcommand*{\st@define@option}[1]{%
+ \expandafter\newif\csname if@st@tight@#1\endcsname
+ \csname @st@tight@#1true\endcsname
+ \define@choicekey{savetrees}{#1}[\st@arg\st@arg@num]{tight,normal}[tight]{%
+ \ifnum\st@arg@num=0
+ \csname @st@tight@#1true\endcsname
+ \else
+ \csname @st@tight@#1false\endcsname
+ \fi
+ }%
+ \DeclareOptionX{#1}[tight]{\csname KV@savetrees@#1\endcsname{##1}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Using the preceding macro we define one conditional and one package
+% option for each trick in \pkgname{savetrees}'s book. When
+% \emph{true} (caused by passing |tight| to the package option), the
+% conditional enables the corresponding space compression; when
+% \emph{false}, (caused by passing |normal| to the package option),
+% \pkgname{savetrees} leaves alone that aspect of the formatting.
+%
+% \begin{macro}{\if@st@tight@sections}
+% \begin{macro}{\@st@tight@sectionstrue}
+% \begin{macro}{\@st@tight@sectionsfalse}
+% \begin{macro}{\KV@savetrees@sections}
+% The \pkgoption{sections} package option enables or disables
+% \pkgname{savetrees}'s modifications to section titles by setting
+% |\@st@tight@sectionstrue| or |\@st@tight@sectionsfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{sections}
+% \end{macrocode}
+% \pkgoptiondecl{sections}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@margins}
+% \begin{macro}{\@st@tight@marginstrue}
+% \begin{macro}{\@st@tight@marginsfalse}
+% \begin{macro}{\KV@savetrees@margins}
+% The \pkgoption{margins} package option enables or disables
+% \pkgname{savetrees}'s modifications to page margins by setting
+% |\@st@tight@marginstrue| or |\@st@tight@marginsfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{margins}
+% \end{macrocode}
+% \pkgoptiondecl{margins}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@lists}
+% \begin{macro}{\@st@tight@liststrue}
+% \begin{macro}{\@st@tight@listsfalse}
+% \begin{macro}{\KV@savetrees@lists}
+% The \pkgoption{lists} package option enables or disables
+% \pkgname{savetrees}'s modifications to the various list environments
+% by setting |\@st@tight@liststrue| or |\@st@tight@listsfalse|,
+% respectively.
+% \begin{macrocode}
+\st@define@option{lists}
+% \end{macrocode}
+% \pkgoptiondecl{lists}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@floats}
+% \begin{macro}{\@st@tight@floatstrue}
+% \begin{macro}{\@st@tight@floatsfalse}
+% \begin{macro}{\KV@savetrees@floats}
+% The \pkgoption{floats} package option enables or disables
+% \pkgname{savetrees}'s modifications to \LaTeX's float-placement
+% parameters by setting |\@st@tight@floatstrue| or
+% |\@st@tight@floatsfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{floats}
+% \end{macrocode}
+% \pkgoptiondecl{floats}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@indent}
+% \begin{macro}{\@st@tight@indenttrue}
+% \begin{macro}{\@st@tight@indentfalse}
+% \begin{macro}{\KV@savetrees@indent}
+% The \pkgoption{indent} package option enables or disables
+% \pkgname{savetrees}'s modifications to paragraph indentation by
+% setting |\@st@tight@indenttrue| or |\@st@tight@indentfalse|,
+% respectively.
+% \begin{macrocode}
+\st@define@option{indent}
+% \end{macrocode}
+% \pkgoptiondecl{indent}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@title}
+% \begin{macro}{\@st@tight@titletrue}
+% \begin{macro}{\@st@tight@titlefalse}
+% \begin{macro}{\KV@savetrees@title}
+% The \pkgoption{title} package option enables or disables
+% \pkgname{savetrees}'s modifications to title formatting by setting
+% |\@st@tight@titletrue| or |\@st@tight@titlefalse|, respectively.
+% \begin{macrocode}
+\st@define@option{title}
+% \end{macrocode}
+% \pkgoptiondecl{title}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@leading}
+% \begin{macro}{\@st@tight@leadingtrue}
+% \begin{macro}{\@st@tight@leadingfalse}
+% \begin{macro}{\KV@savetrees@leading}
+% The \pkgoption{leading} package option enables or disables
+% \pkgname{savetrees}'s modifications to interline spacing by setting
+% |\@st@tight@leadingtrue| or |\@st@tight@leadingfalse|, respectively.
+% This interline spacing is known as ``leading'' because of the
+% additional strips of lead placed between lines in the days of metal
+% type.
+% \begin{macrocode}
+\st@define@option{leading}
+% \end{macrocode}
+% \pkgoptiondecl{leading}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@paragraphs}
+% \begin{macro}{\@st@tight@paragraphstrue}
+% \begin{macro}{\@st@tight@paragraphsfalse}
+% \begin{macro}{\KV@savetrees@paragraphs}
+% The \pkgoption{paragraphs} package option enables or disables
+% \pkgname{savetrees}'s modifications to \TeX's paragraph looseness
+% (i.e.,~the number of lines by which \TeX\ is instructed to shrink each
+% paragraph) by setting |\@st@tight@paragraphstrue| or
+% |\@st@tight@paragraphsfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{paragraphs}
+% \end{macrocode}
+% \pkgoptiondecl{paragraphs}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@charwidths}
+% \begin{macro}{\@st@tight@charwidthstrue}
+% \begin{macro}{\@st@tight@charwidthsfalse}
+% \begin{macro}{\KV@savetrees@charwidths}
+% The \pkgoption{charwidths} package option enables or disables
+% \pkgname{savetrees}'s modifications to character width by setting
+% |\@st@tight@charwidthstrue| or |\@st@tight@charwidthsfalse|,
+% respectively.
+% \begin{macrocode}
+\st@define@option{charwidths}
+% \end{macrocode}
+% \pkgoptiondecl{charwidths}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@tracking}
+% \begin{macro}{\@st@tight@trackingtrue}
+% \begin{macro}{\@st@tight@trackingfalse}
+% \begin{macro}{\KV@savetrees@tracking}
+% The \pkgoption{tracking} package option enables or disables
+% \pkgname{savetrees}'s modifications to tracking (spacing between
+% letters) by setting |\@st@tight@trackingtrue| or
+% |\@st@tight@trackingfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{tracking}
+% \end{macrocode}
+% \pkgoptiondecl{tracking}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@wordspacing}
+% \begin{macro}{\@st@tight@wordspacingtrue}
+% \begin{macro}{\@st@tight@wordspacingfalse}
+% \begin{macro}{\KV@savetrees@wordspacing}
+% The \pkgoption{wordspacing} package option enables or disables
+% \pkgname{savetrees}'s modifications to inter-word spacing by setting
+% |\@st@tight@wordspacingtrue| or |\@st@tight@wordspacingfalse|,
+% respectively.
+% \begin{macrocode}
+\st@define@option{wordspacing}
+% \end{macrocode}
+% \pkgoptiondecl{wordspacing}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@bibliography}
+% \begin{macro}{\@st@tight@bibliographytrue}
+% \begin{macro}{\@st@tight@bibliographyfalse}
+% \begin{macro}{\KV@savetrees@bibliography}
+% The \pkgoption{bibliography} package option enables or disables
+% \pkgname{savetrees}'s modifications to bibliography formatting by
+% setting |\@st@tight@bibliographytrue| or
+% |\@st@tight@bibliographyfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{bibliography}
+% \end{macrocode}
+% \pkgoptiondecl{bibliography}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@bibnotes}
+% \begin{macro}{\@st@tight@bibnotestrue}
+% \begin{macro}{\@st@tight@bibnotesfalse}
+% \begin{macro}{\KV@savetrees@bibnotes}
+% The \pkgoption{bibnotes} package option conditionally excludes or
+% includes |NOTE| fields when using |savetrees.bst| by setting
+% |\@st@tight@bibnotestrue| or |\@st@tight@bibnotesfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{bibnotes}
+% \end{macrocode}
+% \pkgoptiondecl{bibnotes}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@bibbreaks}
+% \begin{macro}{\@st@tight@bibbreakstrue}
+% \begin{macro}{\@st@tight@bibbreaksfalse}
+% \begin{macro}{\KV@savetrees@bibbreaks}
+% The \pkgoption{bibbreaks} package option allows Biblatex to break
+% pages within bibliographic items.
+% \begin{macrocode}
+\st@define@option{bibbreaks}
+% \end{macrocode}
+% \pkgoptiondecl{bibbreaks}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@mathspacing}
+% \begin{macro}{\@st@tight@mathspacingtrue}
+% \begin{macro}{\@st@tight@mathspacingfalse}
+% \begin{macro}{\KV@savetrees@mathspacing}
+% The \pkgoption{mathspacing} package option enables or disables
+% \pkgname{savetrees}'s modifications to horizontal spacing within
+% mathematical expressions by setting |\@st@tight@mathspacingtrue| or
+% |\@st@tight@mathspacingfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{mathspacing}
+% \end{macrocode}
+% \pkgoptiondecl{mathspacing}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@st@tight@mathdisplays}
+% \begin{macro}{\@st@tight@mathdisplaystrue}
+% \begin{macro}{\@st@tight@mathdisplaysfalse}
+% \begin{macro}{\KV@savetrees@mathdisplays}
+% The \pkgoption{mathdisplays} package option enables or disables
+% \pkgname{savetrees}'s modifications to vertical spacing surrounding
+% mathematical displays by setting |\@st@tight@mathdisplaystrue| or
+% |\@st@tight@mathdisplaysfalse|, respectively.
+% \begin{macrocode}
+\st@define@option{mathdisplays}
+% \end{macrocode}
+% \pkgoptiondecl{mathdisplays}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Meta options}
+%
+% \pkgname{savetrees} provides a large number of package options, which
+% might be overwhelming for a casual user. Here, we define a few ``meta
+% options'' that set multiple, related, package options en masse.
+%
+% \begin{macro}{\KV@savetrees@all}
+% \begin{macro}{\st@arg}
+% \begin{macro}{\st@arg@num}
+% Define an \pkgoption{all} meta-option that can be used to enable or
+% disable all of \pkgname{savetrees}'s space-saving features at once.
+% \begin{macrocode}
+\define@choicekey{savetrees}{all}[\st@arg\st@arg@num]{tight,normal}[tight]{%
+ \ifnum\st@arg@num=0
+ \@st@tight@sectionstrue
+ \@st@tight@marginstrue
+ \@st@tight@liststrue
+ \@st@tight@floatstrue
+ \@st@tight@indenttrue
+ \@st@tight@titletrue
+ \@st@tight@leadingtrue
+ \@st@tight@paragraphstrue
+ \@st@tight@charwidthstrue
+ \@st@tight@trackingtrue
+ \@st@tight@wordspacingtrue
+ \@st@tight@bibliographytrue
+ \@st@tight@bibnotestrue
+ \@st@tight@bibbreakstrue
+ \@st@tight@mathspacingtrue
+ \@st@tight@mathdisplaystrue
+ \else
+ \@st@tight@sectionsfalse
+ \@st@tight@marginsfalse
+ \@st@tight@listsfalse
+ \@st@tight@floatsfalse
+ \@st@tight@indentfalse
+ \@st@tight@titlefalse
+ \@st@tight@leadingfalse
+ \@st@tight@paragraphsfalse
+ \@st@tight@charwidthsfalse
+ \@st@tight@trackingfalse
+ \@st@tight@wordspacingfalse
+ \@st@tight@bibliographyfalse
+ \@st@tight@bibnotesfalse
+ \@st@tight@bibbreaksfalse
+ \@st@tight@mathspacingfalse
+ \@st@tight@mathdisplaysfalse
+ \fi
+}
+\DeclareOptionX{all}[tight]{\KV@savetrees@all{#1}}
+% \end{macrocode}
+% \pkgoptiondecl{all}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v2.1}{2013/04/07}{Introduced the \textsf{subtle}, \textsf{moderate},
+% and \textsf{extreme} package options}
+%
+% \begin{macro}{\KV@savetrees@subtle}
+% The \pkgoption{subtle} package option turns off all of
+% \pkgname{savetrees}'s space-saving tricks except those that preserve
+% document layout: margins, indentation, font heights, vertical spacing
+% surrounding titles, lists, displays, etc.
+%
+% \begin{macrocode}
+\define@key{savetrees}{subtle}{%
+ \setkeys{savetrees}{%
+ all=normal,
+ paragraphs=tight,
+ floats=tight,
+ mathspacing=tight,
+ wordspacing=tight,
+ tracking=tight,
+ bibbreaks=tight
+ }%
+}
+\DeclareOptionX{subtle}{\KV@savetrees@subtle}
+% \end{macrocode}
+% \pkgoptiondecl{subtle}
+% \end{macro}
+%
+% \begin{macro}{\KV@savetrees@moderate}
+% The \pkgoption{moderate} package option includes everything covered by
+% \pkgoption{subtle} but additionally makes the font narrower, removes
+% vertical white space around lists and displays, cuts back on
+% indentation, reduces interline spacing, and drops \texttt{NOTE} fields
+% from the bibliography,
+%
+% \begin{macrocode}
+\define@key{savetrees}{moderate}{%
+ \setkeys{savetrees}{%
+ subtle=yes,
+ charwidths=tight,
+ mathdisplays=tight,
+ lists=tight,
+ indent=tight,
+ leading=tight,
+ bibnotes=tight
+ }%
+}
+\DeclareOptionX{moderate}{\KV@savetrees@moderate}
+% \end{macrocode}
+% \pkgoptiondecl{moderate}
+% \end{macro}
+%
+% \begin{macro}{\KV@savetrees@extreme}
+% The \pkgoption{extreme} package option is simply a synonym for |all=tight|.
+%
+% \begin{macrocode}
+\DeclareOptionX{extreme}{%
+ \setkeys{savetrees}{all=tight}%
+}
+% \end{macrocode}
+% \pkgoptiondecl{extreme}
+% \end{macro}
+%
+% \subsubsection{Parameter tuning}
+%
+% While \pkgname{savetrees} tries to use reasonable defaults for the
+% numerical values used by its space-saving techniques, many of these
+% parameters can be modified conveniently via package options:
+% \changes{v2.0}{2011/05/07}{Added package options for altering various
+% formatting parameters}
+%
+% The \pkgoption{marginwidth} option specifies the width of the page
+% margins when |margins=tight|.
+% \begin{macrocode}
+\DeclareOptionX{marginwidth}{\gdef\st@margin@width{#1}}
+% \end{macrocode}
+% \pkgoptiondecl{marginwidth}
+%
+% The \pkgoption{parindent} option specifies the paragraph indent
+% when |indent=tight|.
+% \begin{macrocode}
+\DeclareOptionX{parindent}{\gdef\st@parindent{#1}}
+% \end{macrocode}
+% \pkgoptiondecl{parindent}
+%
+% The \pkgoption{leadingfraction} option specifies the fraction by which
+% to multiply the line spacing when |leading=tight|.
+% \begin{macrocode}
+\DeclareOptionX{leadingfraction}{\gdef\st@baselinestretch{#1}}
+% \end{macrocode}
+% \pkgoptiondecl{leadingfraction}
+%
+% The \pkgoption{charwidthfraction} option specifies the fraction by
+% which to multiply character-glyph widths when |charwidths=tight|.
+% Because the \pkgname{microtype} package takes a per~mill width
+% contraction we have to do some arithmetic to produce
+% |\st@char@shrink|.
+% \begin{macrocode}
+\DeclareOptionX{charwidthfraction}{%
+ \@tempdima=#1pt
+ \multiply\@tempdima by -1000
+ \advance\@tempdima by 1000pt
+ \divide\@tempdima by 65536
+ \@tempcnta=\@tempdima
+ \xdef\st@char@shrink{\the\@tempcnta}%
+}
+% \end{macrocode}
+% \pkgoptiondecl{charwidthfraction}
+%
+% The \pkgoption{trackingfraction} option specifies the fraction by
+% which to multiply character spacing when |tracking=tight|. Because
+% the \pkgname{microtype} package takes a per~mill width expansion we
+% have to do some arithmetic to produce |\st@cspace@shrink|.
+% \begin{macrocode}
+\DeclareOptionX{trackingfraction}{%
+ \@tempdima=#1pt
+ \advance\@tempdima by -1pt
+ \multiply\@tempdima by 1000
+ \divide\@tempdima by 65536
+ \@tempcnta=\@tempdima
+ \xdef\st@cspace@shrink{\the\@tempcnta}%
+}
+% \end{macrocode}
+% \pkgoptiondecl{trackingfraction}
+%
+% The \pkgoption{wordspacingfraction} option specifies the fraction by
+% which to multiply inter-word spacing when |wordspacing=tight|.
+% \begin{macrocode}
+\DeclareOptionX{wordspacingfraction}{\gdef\st@wspace@factor{#1}}
+% \end{macrocode}
+% \pkgoptiondecl{wordspacingfraction}
+%
+% \subsubsection{Obsolete options}
+%
+% \pkgname{savetrees} used to name all of its options
+% |normal|\meta{something}. None of these took arguments so the only
+% usage model was for \pkgname{savetrees} to turn all space-saving
+% techniques on by default and let the user selectively disable them.
+% Starting with version~2.0, \pkgname{savetrees} package options take
+% the form \meta{something}[|=tight|] or \meta{something}|=normal|, which
+% gives a document author the ability to enable or disable options as
+% desired. To move authors to the new set of parameters, we define all
+% of the old options as error-generating calls.
+%
+% \begin{macro}{\st@mark@as@obsolete}
+% We define a helper macro that processes the given option by issuing an
+% error message that instructs the document author to use a different
+% option instead.
+% \begin{macrocode}
+\newcommand*{\st@mark@as@obsolete}[2]{%
+ \define@key{savetrees}{#1}[tight]{%
+ \PackageError{savetrees}{Package option `#1' is no longer supported}{%
+ Rather than `#1', please specify `#2=normal'.\MessageBreak
+ Instead of enabling all features by default and letting the\MessageBreak
+ user selectively disable them, savetrees now provides the\MessageBreak
+ ability to turn features on or off as desired, including all\MessageBreak
+ features en masse.}%
+% \end{macrocode}
+% Out of the goodness of our heart, we automatically convert the
+% obsolete option to a new option and evaluate that.
+% \begin{macrocode}
+ \csname @st@tight@#2false\endcsname
+ }%
+ \DeclareOptionX{#1}[tight]{\csname KV@savetrees@#1\endcsname{##1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% We now invoke |\st@mark@as@obsolete| once for each obsolete
+% \pkgname{savetrees} option,
+% \begin{macrocode}
+\st@mark@as@obsolete{normalsections}{sections}
+\st@mark@as@obsolete{normalmargins}{margins}
+\st@mark@as@obsolete{normallists}{lists}
+\st@mark@as@obsolete{normalfloats}{floats}
+\st@mark@as@obsolete{normalindent}{indent}
+\st@mark@as@obsolete{normaltitle}{title}
+\st@mark@as@obsolete{normalleading}{leading}
+\st@mark@as@obsolete{normallooseness}{paragraphs}
+\st@mark@as@obsolete{normalcharwidths}{charwidths}
+\st@mark@as@obsolete{normalbib}{bibliography}
+\st@mark@as@obsolete{normalbibnotes}{bibnotes}
+% \end{macrocode}
+%
+% At long last, we can process all of the options defined in
+% Section~\ref{sec:options}.
+% \begin{macrocode}
+\ProcessOptionsX\relax
+% \end{macrocode}
+%
+%
+% \subsection{Section titles}
+%
+% The \LaTeX{} default is to typeset section titles in a large font and
+% with significant surrounding white space. We use the
+% \pkgname{titlesec} package to typeset section titles in the same font
+% size as the body text and to leave only a single blank line above and
+% below them.
+%
+% \begin{macrocode}
+\if@st@tight@sections
+ \st@RequirePackage[tiny,compact]{titlesec}
+\fi
+% \end{macrocode}
+%
+% \subsection{Page margins}
+%
+% The typesetting wisdom of the ages says that the human eye is most
+% comfortable reading approximately 60~characters per line of text, and
+% this is what \LaTeX's default margins aim to achieve. Of course,
+% narrower margins mean fewer pages, and that's what \pkgname{savetrees}
+% is striving for.
+%
+% We use the \pkgname{geometry} package to narrow our page margins
+% unless the author wants to keep \LaTeX's original ones. Note that we
+% accept \pkgname{geometry}'s default of zero space allocated to
+% marginal notes.
+% \changes{v1.2}{2006/11/20}{Made the top margin consistent with the other
+% margins and allocated space for the footer}
+% \begin{macrocode}
+\if@st@tight@margins
+ \st@RequirePackage[lmargin=\st@margin@width,
+ rmargin=\st@margin@width,
+ tmargin=\st@margin@width,
+ bmargin=\st@margin@width,
+ includefoot,
+ footskip=2ex]{geometry}
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{List spacing}
+%
+% We try to save space in itemized lists, enumerated lists, and
+% description lists by reducing indentation and by eliminating
+% pre-list and inter-item spacing altogether.
+%
+% \begin{macrocode}
+\if@st@tight@lists
+% \end{macrocode}
+% The \pkgname{calc} package helps simplify our list redefinitions.
+% \begin{macrocode}
+ \st@RequirePackage{calc}
+% \end{macrocode}
+%
+% \begin{environment}{itemize}
+% Except where indicated, the following code was taken directly from
+% \LaTeXe's definition of the |itemize| environment, in |ltlists.dtx|:
+% \begin{macrocode}
+ \def\itemize{%
+ \ifnum \@itemdepth >\thr@@\@toodeep\else
+ \advance\@itemdepth\@ne
+ \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
+ \expandafter
+ \list
+ \csname\@itemitem\endcsname
+ {\def\makelabel##1{\hss\llap{##1}}%
+% \end{macrocode}
+% The following lines have been modified from the original.
+% \changes{v2.1}{2013/04/05}{Reduced vertical space before the list}
+% \begin{macrocode}
+ \settowidth{\leftmargin}{\csname\@itemitem\endcsname}%
+ \addtolength{\leftmargin}{\labelsep * \@itemdepth}%
+ \setlength{\partopsep}{0pt plus 4pt}%
+ \setlength{\topsep}{0pt plus 4pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\listparindent}{\st@parindent}%
+% \end{macrocode}
+% That's it for the modifications. We can now finish up the redefinition
+% of |itemize|.
+% \begin{macrocode}
+ }%
+ \fi}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{enumerate}
+% Except where indicated, the following code was taken directly from
+% \LaTeXe's definition of the |enumerate| environment, in |ltlists.dtx|:
+% \begin{macrocode}
+ \def\enumerate{%
+ \ifnum \@enumdepth >\thr@@\@toodeep\else
+ \advance\@enumdepth\@ne
+ \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+ \expandafter
+ \list
+ \csname label\@enumctr\endcsname
+ {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}%
+% \end{macrocode}
+% The following lines have been modified from the original.
+% \changes{v2.1}{2013/04/05}{Reduced vertical space before the list}
+% \begin{macrocode}
+ \settowidth{\leftmargin}{\csname label\@enumctr\endcsname}%
+ \addtolength{\leftmargin}{\labelsep * \@enumdepth}%
+ \setlength{\partopsep}{0pt plus 4pt}%
+ \setlength{\topsep}{0pt plus 4pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\listparindent}{\st@parindent}%
+% \end{macrocode}
+% That's it for the modifications. We can now finish up the
+% redefinition of |enumerate|.
+% \begin{macrocode}
+ }
+ \fi}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{description}
+% The |description| environment is a bit simpler than the |itemize| and
+% |enumerate| environments; it's a direct application of |list|. All we
+% need to do is reduce the left margin from the |list| default of 2\,em
+% to a slightly denser~1\,pc.
+% \changes{v2.1}{2013/04/05}{Reduced vertical space before and within the list}
+% \begin{macrocode}
+ \renewenvironment{description}{%
+ \begin{list}{}{\setlength{\leftmargin}{1pc}%
+ \setlength{\itemindent}{-\leftmargin}%
+ \setlength{\partopsep}{0pt plus 4pt}%
+ \setlength{\topsep}{0pt plus 4pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\labelwidth}{0pt}%
+ \setlength{\listparindent}{\st@parindent}%
+ \let\makelabel\descriptionlabel}%
+ }{%
+ \end{list}
+ }
+\fi
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Float placement}
+%
+% \begin{macro}{\topfraction}
+% \begin{macro}{\bottomfraction}
+% \begin{macro}{\textfraction}
+% \begin{macro}{\floatpagefraction}
+% \begin{macro}{\dbltopfraction}
+% \begin{macro}{\dblfloatpagefraction}
+% \LaTeX{} normally doesn't try very hard to pack floats onto a page.
+% The following parameter changes attempt to reduce the number of float
+% pages (and hence, total pages).
+% \begin{macrocode}
+\if@st@tight@floats
+ \renewcommand{\topfraction}{0.85}
+ \renewcommand{\bottomfraction}{0.85}
+ \renewcommand{\textfraction}{0.1}
+ \renewcommand{\floatpagefraction}{0.85}
+ \renewcommand{\dbltopfraction}{0.85}
+ \renewcommand{\dblfloatpagefraction}{.85}
+ \setcounter{topnumber}{25}
+ \setcounter{bottomnumber}{25}
+ \setcounter{totalnumber}{25}
+ \setcounter{dbltopnumber}{25}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Paragraph indentation}
+%
+% \LaTeX\ normally provides approximately 1.5\,em of indentation at the
+% start of each paragraph. We can save a little space by slightly
+% reducing the indentation amount.
+%
+% \begin{macrocode}
+\if@st@tight@indent
+ \setlength{\parindent}{\st@parindent}
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Document title formatting}
+%
+% By default, the document title is typeset in the |\LARGE| font size,
+% and the author list and date are typeset |\large|. We redefine
+% |\@maketitle| to typeset the title |\large| and everything else in the
+% body font. In addition, we remove the extra white space above the
+% title and lessen the white space below the title.
+% \begin{macrocode}
+\if@st@tight@title
+% \end{macrocode}
+% \begin{macro}{\@maketitle}
+% The following was taken largely from |classes.dtx|, but modified as
+% specified above.
+% \changes{v2.4}{2016/04/13}{Remove even more white space above the title}
+% \begin{macrocode}
+ \def\@maketitle{%
+ \newpage
+ \mbox{}%
+ \begingroup
+ \centering
+ \let \footnote \thanks
+ {\large \textbf{\@title}\par}
+ \vskip 0.5\baselineskip
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par
+ \vskip 0.5\baselineskip
+ \@date
+ \par
+ \endgroup
+ \vskip \baselineskip
+ }
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Interline spacing}
+%
+% \begin{macro}{\baselinestretch}
+% A document's page count can be reduced quite significantly by reducing
+% the amount of white space between successive lines of text so that's
+% exactly what we do below.
+% \begin{macrocode}
+\if@st@tight@leading
+ \renewcommand{\baselinestretch}{\st@baselinestretch}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Paragraph looseness}
+% \changes{v1.2}{2006/11/20}{Added support for reducing paragraph looseness}
+%
+% Some paragraphs end with a lone word on the last line. If we can
+% discourage such typesetting we can gain an extra line. The underlying
+% mechanism we use is \TeX's |\looseness| primitive, which encourages
+% \TeX\ to expand the current paragraph by a given number of lines.
+% However, |\looseness| can be set to a negative number, which
+% encourages \TeX\ to shrink the current paragraph by a given number of
+% lines. For this technique to work, the paragraph must be relatively
+% long so \TeX\ has enough shrinkable white space to work with.
+%
+% Unfortunately, |\looseness| applies only to the current paragraph. We
+% therefore use |\everypar| to inject |\looseness=-1| into every
+% paragraph. However, the approach is not quite so simple as the
+% |\looseness=-1| is not injected into list environments. We therefore
+% use some tricky code due to Donald Arseneau to make the effect of
+% |\looseness=-1| as global as possible:
+% \changes{v1.2a}{2007/12/23}{Appended \texttt{\string\string\relax} to
+% \texttt{\string\string\looseness!=-1} to avoid discarding any
+% leading digits appearing in a paragraph}
+% \begin{macrocode}
+\if@st@tight@paragraphs
+ \let\markeverypar\everypar
+ \newtoks\everypar
+ \everypar\markeverypar
+ \markeverypar{\the\everypar\looseness=-1\relax}
+\fi
+% \end{macrocode}
+%
+% Even when |\everypar| is used in the ordinary fashion it is likely to
+% conflict with various \LaTeX\ packages. Because the preceding code is
+% a particularly tricky redefinition of |\everypar| it's likely that
+% many documents will need to disable paragraph looseness by providing
+% the |paragraphs=normal| option to \pkgname{savetrees}.
+%
+%
+% \subsection{Font width}
+% \changes{v1.3}{2010/06/03}{Added support for narrowing font widths}
+%
+% The \pkgname{microtype} package provides \LaTeX\ support for the
+% font-expansion feature supported by pdf\TeX\ and lua\TeX\@. Font
+% expansion is intended to improve text ``color''---the even balance
+% between ink and absence of ink on a page---by subtly expanding or
+% narrowing character widths instead of by adding or removing
+% white space. \pkgname{savetrees} hijacks this feature as a
+% space-saving mechanisms by specifying a maximum expansion of~0\% of a
+% character's natural width but a maximum contraction of greater
+% than~0\%. At the time of this writing, this feature works only with
+% pdf\LaTeX\ and Lua\LaTeX.
+% \begin{macrocode}
+\if@st@tight@charwidths
+ \ifpdf
+ \st@RequirePackage[stretch=0,shrink=\st@char@shrink]{microtype}
+ \fi
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Inter-character spacing}
+% \changes{v2.0}{2011/05/06}{Added support for reducing inter-character
+% spacing}
+%
+% The \pkgname{microtype} package provides \LaTeX\ support for pdf\TeX's
+% tracking feature. Rather than using tracking with a light touch and
+% just in certain contexts (e.g.,~small caps), we instruct
+% \pkgname{microtype} to track somewhat aggressively, shaving off a few
+% percent of an em~width between \emph{every} pair of characters. At
+% the time of this writing, this feature works only with pdf\LaTeX.
+%
+% \begin{macrocode}
+\if@st@tight@tracking
+ \ifpdf
+ \ifluatex
+ \else
+ \st@RequirePackage[letterspace=\st@cspace@shrink,tracking=all]{microtype}
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Inter-word spacing}
+% \changes{v2.0}{2011/05/06}{Added support for reducing inter-word
+% spacing}
+%
+% Any font used by \TeX\ is required to have at least seven |\fontdimen|
+% parameters. |\fontdimen2| represents the base inter-word spacing.
+% (|\fontdimen3| and |\fontdimen4| represent, respectively, the amount
+% by which inter-word spacing can stretch or shrink; \pkgname{savetrees}
+% does not currently alter those.) Here, we hook into \LaTeXe's
+% font-loading mechanism. Whenever a new font is loaded, we specify
+% that the inter-word spacing for that font should be reduced.
+% \begin{macrocode}
+\if@st@tight@wordspacing
+ \g@addto@macro\define@newfont{%
+ \fontdimen2\font@name=\st@wspace@factor\fontdimen2\font@name
+ }%
+% \end{macrocode}
+% We also reduce the inter-word spacing for whatever font is currently
+% loaded.
+% \begin{macrocode}
+ \fontdimen2\font@name=\st@wspace@factor\fontdimen2\font@name
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Bibliography formatting}
+%
+% There are two ways we save space when typesetting bibliographies.
+% First, we omit blank linkes between entries. And second, we typeset
+% the entire bibliography---excluding the section title---with |\small|.
+%
+% \begin{macrocode}
+\if@st@tight@bibliography
+% \end{macrocode}
+% \begin{environment}{thebibliography}
+% The following was taken largely from |classes.dtx|; see that file for
+% additional documentation. \pkgname{savetrees}'s modifications are
+% indicated below.
+% \begin{macrocode}
+ \renewenvironment{thebibliography}[1]{%
+% \end{macrocode}
+% In the |article| document class, a bibliography is a \emph{section}
+% called ``|\refname|''. In the |report| and |book| document classes, a
+% bibliography is a \emph{chapter} called ``|\bibname|''. In
+% |classes.dtx|, the correct code is extracted by \pkgname{DocStrip}.
+% Here, we have to use an |\ifx| primitive to select the appropriate
+% title and formatting.
+% \changes{v1.1}{2004/07/17}{Modified to test for
+% \texttt{\string\string\string\chapter}, not
+% \texttt{\string\string\string\bibname}.}
+% \changes{v1.2}{2006/11/19}{Modified to use the more robust
+% \texttt{\string\string\string\@ifundefined} macro to test for the existence
+% of \texttt{\string\string\string\chapter}}
+% \begin{macrocode}
+ \@ifundefined{chapter}{%
+ \section*{\refname
+ \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}%
+ }{%
+ \chapter*{\bibname
+ \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}}%
+ }%
+% \end{macrocode}
+% Back to the original code\dots
+% \begin{macrocode}
+ \list{\@biblabel{\@arabic\c@enumiv}}%
+ {\settowidth\labelwidth{\@biblabel{#1}}%
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+% \end{macrocode}
+% We eliminate the space between paragraphs, and we set the space
+% between items to only~1\,pt. We could have set this to~0\,pt., but
+% the extra space helps keep the citation numbers' brackets from getting
+% too close to each other, vertically.
+% \begin{macrocode}
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{1pt}%
+% \end{macrocode}
+% Back to the original code\dots
+% \begin{macrocode}
+ \@openbib@code
+ \usecounter{enumiv}%
+ \let\p@enumiv\@empty
+ \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+% \end{macrocode}
+% Although we kept the section title in its original size, we typeset
+% the rest of the bibliography a little bit smaller.
+% \begin{macrocode}
+ \small
+% \end{macrocode}
+% We finish up using the original code, except we reduce the club and
+% widow penalties from~4000 to~150.
+% \changes{v2.3}{2014/12/19}{Reduced club and widow penalties from~4000 to~150}
+% \begin{macrocode}
+ \sloppy
+ \clubpenalty150
+ \@clubpenalty \clubpenalty
+ \widowpenalty150%
+ \sfcode`\.\@m
+ }{%
+ \def\@noitemerr
+ {\@latex@warning{Empty `thebibliography' environment}}%
+ \endlist
+ }
+% \end{macrocode}
+% \end{environment}
+%
+% \changes{v2.3}{2014/12/19}{Made \protect\texttt{bibliography!=tight} work with
+% Biblatex, not just \protect\BibTeX}
+% \begin{macro}{\bibfont}
+% \begin{macro}{\bibitemsep}
+% If the \pkgname{biblatex} package was loaded we use Biblatex's
+% mechanisms for reducing the font size to |\small| (|\bibfont|) and
+% for omitting blank lines between bibliographic entries (|\bibitemsep|).
+% \begin{macrocode}
+ \AtBeginDocument{%
+ \@ifundefined{bibfont}{}{%
+ \renewcommand*{\bibfont}{\normalfont\small}%
+ \bibitemsep=0pt plus 2pt\relax
+ }%
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Bibliographic notes}
+% \label{sec:bibliographic-notes}
+%
+% \begin{macro}{\savetreesbibnote}
+% The bibliographies output by the |savetrees.bst| \BibTeX{} style
+% (presented in \ref{sec:savetrees.bst}) surround all |NOTE| fields with
+% a call to the |\savetreesbibnote| macro. As a result, this macro must
+% be defined for |savetrees.bst| to work. By default,
+% |\savetreesbibnote| is defined to do nothing. Howevever, setting
+% |bibnotes=normal| indicates that |\savetreesbibnote| should instead
+% output its argument as is.
+% \labelnextcodeline{code:stbn-begin}
+% \begin{macrocode}
+\if@st@tight@bibnotes
+% \end{macrocode}
+% To supppress a |NOTE| field, we also have to gobble the period
+% following the note. Otherwise, the bibliography will show two periods
+% surrounding an empty note.
+% \begin{macrocode}
+ \newcommand{\savetreesbibnote}[1]{\@gobble}
+\else
+ \newcommand{\savetreesbibnote}[1]{#1}
+\fi
+% \end{macrocode}
+% \labelprevcodeline{code:stbn-end}
+% \end{macro}
+%
+% \subsection{Page breaks within bibliographies}
+% \label{sec:bibliographic-breaks}
+%
+% The Biblatex package strongly discourages \TeX\ from breaking pages
+% within a bibliographic entry. Instead, \TeX\ is told to favor pushing
+% an entire bibliographic entry onto the next page. Setting
+% |bibbreaks=tight| changes Biblatex's behavior to allow page breaks to
+% appear anywhere in a bibliography. The setting has no effect on
+% \BibTeX, only Biblatex.
+% \changes{v2.3}{2014/12/19}{Added support for allowing page breaks
+% within Biblatex bibliographies}
+% \labelnextcodeline{code:stbb-begin}
+% \begin{macrocode}
+\if@st@tight@bibbreaks
+ \AtBeginDocument{%
+ \@ifundefined{bibsetup}{}{%
+% \end{macrocode}
+% \begin{macro}{\bibsetup}
+% The \pkgname{biblatex} package was loaded. Redefine its |\bibsetup| hook.
+% \begin{macrocode}
+ \renewcommand*{\bibsetup}{%
+ \interlinepenalty=100\relax
+ \widowpenalty=100\relax
+ \clubpenalty=100\relax
+ \raggedbottom
+ \frenchspacing
+ \biburlsetup
+ }%
+ }%
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+% \labelprevcodeline{code:stbb-end}
+%
+% \subsection{Mathematical expressions}
+% \label{sec:math-exprs}
+%
+% By default, mathematical expressions contain substantial white space
+% around operators, relations, etc. Here, we shave approximately three
+% math units off each of |\thinmuskip|, |\medmuskip|, and
+% |\thickmuskip|. This needs to happen after the |\begin{document}| so
+% that the new values don't get overwritten.
+% \changes{v2.1}{2013/04/06}{Added support for squeezing space out of
+% mathematical expressions}
+%
+% \begin{macrocode}
+\if@st@tight@mathspacing
+ \AtBeginDocument{%
+ \thinmuskip=0mu plus 3mu
+ \medmuskip=1mu plus 4mu
+ \thickmuskip=2mu plus 5mu
+ }
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Displayed mathematics}
+% \label{sec:math-displays}
+%
+% Displayed mathematical expressions are normally offset from the
+% surrounding text with vertical white space. Here, we set the amount of
+% vertical white space to zero. This needs to happen after the
+% |\begin{document}| so that the new values don't get overwritten.
+% \changes{v2.1}{2013/04/06}{Added support for removing vertical space
+% around displayed mathematics}
+%
+% \begin{macrocode}
+\if@st@tight@mathdisplays
+ \AtBeginDocument{%
+ \abovedisplayskip=0pt plus 3pt
+ \belowdisplayskip=0pt plus 3pt
+ \abovedisplayshortskip=0pt plus 3pt
+ \belowdisplayshortskip=0pt plus 3pt
+ }
+\fi
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+%
+% \section{Implementation of the \texorpdfstring{\BibTeX}{BibTeX} style file}
+% \label{sec:savetrees.bst}
+%
+% In addition to a \LaTeXe{} style, the \pkgname{savetrees} package also
+% includes a \BibTeX{} style, |savetrees.bst|. |savetrees.bst| was
+% generated with the help of Patrick W. Daly's \pkgname{custom-bib}
+% package. The following options were provided to |merlin.mbs|:
+%
+% \begin{center}
+% \begin{minipage}{0.75\textwidth}
+% \ttfamily\selectfont
+% lang, nm-init, ed-au, nmdash, nmlm, x2, m2, isbn, issn, pp, ed, abr,
+% ednx, xedn, jabr, nfss
+% \end{minipage}
+% \end{center}
+%
+% Because |savetrees.bst| is a generated file---and can be regenerated using
+% the options listed above---it is unnecessary to list the complete
+% source code in this document. Rather, only the hand-modified parts are
+% presented below.
+%
+% \iffalse
+%<*bstfile>
+% \fi
+%
+% \begin{center}
+% $\vdots$ \\
+% (443 lines of code omitted) \\
+% $\vdots$
+% \end{center}
+%
+% ^^A We surround all but our modified format.note function
+% ^^A within \iffalse...\fi.
+% \iffalse
+% \begin{macrocode}
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This bibliographic style (bst) file has been generated from one or
+ % more master bibliographic style (mbs) files, listed above.
+ %
+ % This generated file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ % Name and version information of the main mbs file:
+ % \ProvidesFile{merlin.mbs}[1999/05/28 3.89 (PWD)]
+ % For use with BibTeX version 0.99a or later
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is a numerical citation style, and as such is standard LaTeX.
+ % It requires no extra package to interface to the main text.
+ % The form of the \bibitem entries is
+ % \bibitem{key}...
+ % Usage of \cite is as follows:
+ % \cite{key} ==>> [#]
+ % \cite[chap. 2]{key} ==>> [#, chap. 2]
+ % where # is a number determined by the ordering in the reference list.
+ % The order in the reference list is alphabetical by authors.
+ %---------------------------------------------------------------------
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ isbn
+ issn
+ journal
+ key
+ language
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ {}
+ { label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {add.blank}
+{ " " * before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ new.block
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+
+FUNCTION {capitalize}
+{ "u" change.case$ "t" change.case$ }
+
+FUNCTION {space.word}
+{ " " swap$ * " " * }
+
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+FUNCTION {bbl.and}
+{ "and"}
+
+FUNCTION {bbl.etal}
+{ "et~al." }
+
+FUNCTION {bbl.editors}
+{ "eds." }
+
+FUNCTION {bbl.editor}
+{ "ed." }
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+{ "ed." }
+
+FUNCTION {bbl.volume}
+{ "vol." }
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+{ "no." }
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{ "pp." }
+
+FUNCTION {bbl.page}
+{ "p." }
+
+FUNCTION {bbl.chapter}
+{ "chap." }
+
+FUNCTION {bbl.techrep}
+{ "Tech. Rep." }
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+MACRO {acmcs} {"ACM Comput. Surv."}
+
+MACRO {acta} {"Acta Inf."}
+
+MACRO {cacm} {"Commun. ACM"}
+
+MACRO {ibmjrd} {"IBM J. Res. Dev."}
+
+MACRO {ibmsj} {"IBM Syst.~J."}
+
+MACRO {ieeese} {"IEEE Trans. Softw. Eng."}
+
+MACRO {ieeetc} {"IEEE Trans. Comput."}
+
+MACRO {ieeetcad}
+ {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}
+
+MACRO {ipl} {"Inf. Process. Lett."}
+
+MACRO {jacm} {"J.~ACM"}
+
+MACRO {jcss} {"J.~Comput. Syst. Sci."}
+
+MACRO {scp} {"Sci. Comput. Programming"}
+
+MACRO {sicomp} {"SIAM J. Comput."}
+
+MACRO {tocs} {"ACM Trans. Comput. Syst."}
+
+MACRO {tods} {"ACM Trans. Database Syst."}
+
+MACRO {tog} {"ACM Trans. Gr."}
+
+MACRO {toms} {"ACM Trans. Math. Softw."}
+
+MACRO {toois} {"ACM Trans. Office Inf. Syst."}
+
+MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}
+
+MACRO {tcs} {"Theoretical Comput. Sci."}
+
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{f.~}{vv~}{ll}{, jj}" format.name$
+ 't :=
+ nameptr #1 >
+ {
+ nameptr #2
+ #1 + =
+ numnames #2
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ " " * bbl.etal *
+ }
+ { bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.names.ed}
+{ format.names }
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ ", " *
+ editor num.names$ #1 >
+ 'bbl.editors
+ 'bbl.editor
+ if$
+ *
+ }
+ if$
+}
+
+FUNCTION {format.in.editors}
+{ editor empty$
+ { "" }
+ { editor format.names.ed
+ editor num.names$ #1 >
+ { ", " * bbl.editors * }
+ { ", " * bbl.editor * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.isbn}
+{ isbn empty$
+ { "" }
+ {
+ new.block
+ "ISBN " isbn * }
+ if$
+}
+
+FUNCTION {format.issn}
+{ issn empty$
+ { "" }
+ {
+ new.block
+ "ISSN " issn * }
+ if$
+}
+
+FUNCTION {select.language}
+{ duplicate$ empty$
+ 'pop$
+ { language empty$
+ 'skip$
+ { "{\selectlanguage{" language * "}" * swap$ * "}" * }
+ if$
+ }
+ if$
+}
+% \end{macrocode}
+% \fi
+%
+% |format.note| is the first of two functions modified by hand. The
+% modification involves placing the entire note field within
+% |\savetreesbibnote{|\dots|}|. This enables |savetrees.sty| to
+% selectively define |\savetreesbibnote| to either output its argument
+% as is or discard it (and the subsequent period). See
+% \ref{sec:bibliographic-notes} for |savetrees.sty|'s definition
+% of~|\savetreesbibnote|.
+% \begin{macrocode}
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { "\savetreesbibnote{"
+ note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ { output.state mid.sentence =
+ { "l" }
+ { "u" }
+ if$
+ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ *
+ "}" * *
+ }
+ if$
+}
+% \end{macrocode}
+%
+% \begin{center}
+% $\vdots$ \\
+% (914 lines of code omitted) \\
+% $\vdots$
+% \end{center}
+%
+% \iffalse
+% \begin{macrocode}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$
+ select.language
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {n.dashify}
+{
+ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{ bbl.in capitalize
+ " " * }
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month " " * year * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+ select.language
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { bbl.volume volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { bbl.of space.word * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { bbl.number }
+ { bbl.number capitalize }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { bbl.in space.word * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " " * bbl.edition * }
+ { edition "t" change.case$ " " * bbl.edition * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { bbl.pages pages n.dashify tie.or.space.connect }
+ { bbl.page pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.journal.pages}
+{ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ {
+ ":" *
+ pages n.dashify *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ number empty$
+ 'skip$
+ {
+ "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ format.journal.pages
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { bbl.chapter }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { word.in booktitle emphasize * }
+ { word.in format.in.editors * ", " *
+ booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ key empty$ not and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { bbl.techrep }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { word.in journal emphasize * }
+ if$
+ }
+ { word.in key * " " *}
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$
+ " " * bbl.etal *
+ }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+ " " * bbl.etal *
+ }
+ { bbl.and space.word * editor #2 "{vv~}{ll}" format.name$
+ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ word.in
+ }
+ { bbl.volume capitalize
+ volume tie.or.space.connect
+ bbl.of space.word *
+ }
+ if$
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { series emphasize * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ { word.in booktitle emphasize * }
+ if$
+ }
+ { word.in key * " " *}
+ if$
+ }
+ { word.in format.crossref.editor * " " *}
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+ address empty$ t empty$ and
+ 'skip$
+ {
+ t empty$
+ { address empty$
+ 'skip$
+ { address * }
+ if$
+ }
+ { t *
+ address empty$
+ 'skip$
+ { ", " * address * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.publisher.address}
+{ publisher empty$
+ { "empty publisher in " cite$ * warning$
+ ""
+ }
+ { publisher }
+ if$
+ format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization empty$
+ { "" }
+ { organization }
+ if$
+ format.org.or.pub
+}
+
+STRINGS {oldname}
+
+FUNCTION {name.or.dash}
+{ 's :=
+ oldname empty$
+ { s 'oldname := s }
+ { s oldname =
+ { "---" }
+ { s 'oldname := s }
+ if$
+ }
+ if$
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal
+ emphasize
+ "journal" output.check
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.issn output
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ name.or.dash
+ }
+ { format.authors output.nonnull
+ name.or.dash
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ format.publisher.address output
+ }
+ {
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ format.isbn output
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ format.date output
+ format.isbn output
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ name.or.dash
+ }
+ { format.authors output.nonnull
+ name.or.dash
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ {
+ format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ format.publisher.address output
+ }
+ {
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ crossref missing$
+ { format.isbn output }
+ 'skip$
+ if$
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ format.publisher.address output
+ format.edition output
+ format.date "year" output.check
+ format.isbn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ new.sentence
+ publisher empty$
+ { format.organization.address output }
+ { organization output
+ format.publisher.address output
+ }
+ if$
+ format.date "year" output.check
+ format.isbn output
+ format.issn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ name.or.dash
+ new.block
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ {
+ address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ {
+ organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.btitle "title" output.check
+ new.block
+ bbl.mthesis format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ name.or.dash
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ format.note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.btitle "title" output.check
+ new.block
+ bbl.phdthesis format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ name.or.dash
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ editor empty$
+ { publisher empty$
+ 'skip$
+ {
+ new.sentence
+ format.publisher.address output
+ }
+ if$
+ }
+ { publisher empty$
+ {
+ new.sentence
+ format.organization.address output }
+ {
+ new.sentence
+ organization output
+ format.publisher.address output
+ }
+ if$
+ }
+ if$
+ format.date "year" output.check
+ format.isbn output
+ format.issn output
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ format.note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ name.or.dash
+ new.block
+ format.title "title" output.check
+ format.date output
+ new.block
+ format.note "note" output.check
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+READ
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ nameptr #2
+ #1 + =
+ numnames #2
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ { t sortify * }
+ if$
+ }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.organization.sort}
+{ author empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need author, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {editor.organization.sort}
+{ editor empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need editor, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION {presort}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT
+
+STRINGS { longest.label }
+
+INTEGERS { number.label longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #1 'number.label :=
+ #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ number.label int.to.str$ 'label :=
+ number.label #1 + 'number.label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+% \end{macrocode}
+% \fi
+%
+% |begin.bib| is the second of two functions modified by hand. The
+% modification is to have the function write some additional code to the
+% |.bbl| file to define |\savetreesbibnote| as the identity function if
+% that macro is not already defined.
+% \changes{v2.0}{2011/05/12}{Made \texttt{savetrees.bib} work
+% independently of \texttt{savetrees.sty} by having it define
+% \texttt{\string\string\string\savetreesbibnote} if not already
+% defined}
+% \begin{macrocode}
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" *
+ write$ newline$
+ "\providecommand*{\selectlanguage}[1]{\relax}%"
+ write$ newline$
+ "\providecommand*{\savetreesbibnote}[1]{#1}%"
+ write$ newline$
+}
+% \end{macrocode}
+%
+% \begin{center}
+% $\vdots$ \\
+% (13 lines of code omitted) \\
+% $\vdots$
+% \end{center}
+%
+% \iffalse
+% \begin{macrocode}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+% \end{macrocode}
+% \fi
+%
+% \iffalse
+%</bstfile>
+% \fi
+%
+%
+% \section{Implementation of the Biblatex style files}
+% \label{sec:savetrees-biblatex}
+%
+% We define an analogue of |savetrees.bst| (\ref{sec:savetrees.bst}) for
+% Biblatex. This comprises two files: a bibliography style,
+% |savetrees.bbx| (\ref{sec:savetrees.bbx}), and a citation style,
+% |savetrees.cbx| (\ref{sec:savetrees.cbx}).
+%
+% \subsection{Implementation of \texttt{savetrees.bbx}}
+% \label{sec:savetrees.bbx}
+%
+% Biblatex's default |numeric-comp| bibliography style is already fairly
+% abbreviated so we begin with that and merely make a few changes to
+% reduce the number of authors before ``et~al.''\ kicks in; use initials
+% for all given and middle names,; suppress typesetting ISBNs, URLs,
+% DOIs, and eprint IDs; and honor \pkgname{savetrees}'s |bibnotes|
+% option.
+%
+% \changes{v2.3}{2014/12/19}{Included style files for Biblatex}
+%
+% \iffalse
+%<*bbxfile>
+% \fi
+%
+% \begin{macrocode}
+\RequireBibliographyStyle{numeric-comp}
+
+\ExecuteBibliographyOptions{%
+ maxnames = 2,
+ minnames = 2,
+ firstinits = true,
+ isbn = false,
+ url = false,
+ doi = false,
+ eprint = false
+}
+
+\AtBeginDocument{%
+ \@ifundefined{if@st@tight@bibnotes}{}{%
+ \if@st@tight@bibnotes
+ \DeclareFieldFormat{note}{}%
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% \iffalse
+%</bbxfile>
+% \fi
+%
+%
+% \subsection{Implementation of \texttt{savetrees.cbx}}
+% \label{sec:savetrees.cbx}
+%
+% The corresponding |savetrees.cbx| citation style is even more trivial
+% than |savetrees.bbx|. It simply defines itself as an alias for
+% Biblatex's standard |numeric-comp| citation style.
+%
+% \iffalse
+%<*cbxfile>
+% \fi
+%
+% \begin{macrocode}
+\RequireCitationStyle{numeric-comp}
+% \end{macrocode}
+%
+% \iffalse
+%</cbxfile>
+% \fi
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/savetrees/savetrees.ins b/macros/latex/contrib/savetrees/savetrees.ins
new file mode 100644
index 0000000000..2bbcee0f12
--- /dev/null
+++ b/macros/latex/contrib/savetrees/savetrees.ins
@@ -0,0 +1,100 @@
+%%
+%% Copyright (C) 2016 by Scott Pakin <scott+st@pakin.org>
+%%
+%% This file may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License, either version 1.3c of this license
+%% or (at your option) any later version. The latest version of this
+%% license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of LaTeX version
+%% 2006/05/20 or later.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/savetrees}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----- Prepend Scott Pakin's copyright to savetrees.sty, -----%
+%----- savetrees.bbx, and savetrees.cbx -----%
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2016 by Scott Pakin <scott+st@pakin.org>
+
+This file may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, either version 1.3c of this license
+or (at your option) any later version. The latest version of this
+license is in:
+
+ http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions of LaTeX version
+2006/05/20 or later.
+
+\endpreamble
+
+\generate{\file{savetrees.sty}%
+ {\from{savetrees.dtx}{package}}
+ \file{savetrees.bbx}%
+ {\from{savetrees.dtx}{bbxfile}}
+ \file{savetrees.cbx}%
+ {\from{savetrees.dtx}{cbxfile}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----- Prepend Patrick W. Daly's copyright to savetrees.bst -----%
+
+\preamble
+
+The original, *original* source files were:
+
+merlin.mbs (with options: `,lang,nm-init,ed-au,nmdash,nmlm,x2,m2,isbn,issn,pp,ed,abr,ednx,xedn,jabr,nfss')
+
+In addition, Scott Pakin <scott+st@pakin.org> slightly modified this
+file by hand.
+----------------------------------------
+*** Extremely abbreviated BibTeX style ***
+
+Copyright 1994-1999 Patrick W Daly
+\endpreamble
+
+\postamble
+End of customized bst file
+\endpostamble
+
+\generate{\file{savetrees.bst}%
+ {\from{savetrees.dtx}{bstfile}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\obeyspaces
+\Msg{******************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you need to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* savetrees.sty *}
+\Msg{* *}
+\Msg{* the following file into a directory searched by BibTeX: *}
+\Msg{* *}
+\Msg{* savetrees.bst *}
+\Msg{* *}
+\Msg{* and the following files into directories searched by Biblatex: *}
+\Msg{* *}
+\Msg{* savetrees.bbx *}
+\Msg{* savetrees.cbx *}
+\Msg{* *}
+\Msg{* To produce the documentation, run the file savetrees.dtx *}
+\Msg{* through LaTeX (twice, to get the references correct). *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{******************************************************************}
+
+\endbatchfile
diff --git a/macros/latex/contrib/savetrees/savetrees.pdf b/macros/latex/contrib/savetrees/savetrees.pdf
new file mode 100644
index 0000000000..a069eb7a82
--- /dev/null
+++ b/macros/latex/contrib/savetrees/savetrees.pdf
Binary files differ
diff --git a/macros/latex/contrib/savetrees/st-sample2e.pdf b/macros/latex/contrib/savetrees/st-sample2e.pdf
new file mode 100644
index 0000000000..1891398e15
--- /dev/null
+++ b/macros/latex/contrib/savetrees/st-sample2e.pdf
Binary files differ