diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/savetrees |
Initial commit
Diffstat (limited to 'macros/latex/contrib/savetrees')
-rw-r--r-- | macros/latex/contrib/savetrees/README | 43 | ||||
-rw-r--r-- | macros/latex/contrib/savetrees/savetrees.dtx | 3773 | ||||
-rw-r--r-- | macros/latex/contrib/savetrees/savetrees.ins | 100 | ||||
-rw-r--r-- | macros/latex/contrib/savetrees/savetrees.pdf | bin | 0 -> 406548 bytes | |||
-rw-r--r-- | macros/latex/contrib/savetrees/st-sample2e.pdf | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000000..a069eb7a82 --- /dev/null +++ b/macros/latex/contrib/savetrees/savetrees.pdf diff --git a/macros/latex/contrib/savetrees/st-sample2e.pdf b/macros/latex/contrib/savetrees/st-sample2e.pdf Binary files differnew file mode 100644 index 0000000000..1891398e15 --- /dev/null +++ b/macros/latex/contrib/savetrees/st-sample2e.pdf |