Browse Source

* Okay, this is a big one!

* Created a new tufte-book document class.
* Moved most of the tufte-handout code into a tufte-common.sty file.
* The tufte-handout.cls and tufte-book.cls files now include
  tufte-common.sty.
* No documentation for the new stuff yet -- read the code.
* The tufte-book class is very much unfinished -- I've only just started.
* Bugs abound!


git-svn-id: https://tufte-latex.googlecode.com/svn/trunk@63 516e2f36-ce3a-0410-bea4-1d4a03f5df72
master
Kevin M. Godby 17 years ago
parent
commit
a638523a48
8 changed files with 1287 additions and 543 deletions
  1. BIN
      sample-book.pdf
  2. +342
    -0
      sample-book.tex
  3. +3
    -3
      sample-handout.bib
  4. BIN
      sample-handout.pdf
  5. +26
    -13
      sample-handout.tex
  6. +83
    -0
      tufte-book.cls
  7. +810
    -0
      tufte-common.sty
  8. +23
    -527
      tufte-handout.cls

BIN
sample-book.pdf View File


+ 342
- 0
sample-book.tex View File

@@ -0,0 +1,342 @@
\documentclass{tufte-book}

%%
% Book metadata
\title{A Tufte-Style Book\thanks{Thanks to Edward R.~Tufte for his inspiration.}}
\author[The Tufte-LaTeX Developers]{The Tufte-\LaTeX\ Developers}
\publisher{Publisher of This Book}

%%
% If they're installed, use Bergamo and Chantilly from www.fontsite.com.
% They're clones of Bembo and Gill Sans, respectively.
\IfFileExists{bergamo.sty}{\usepackage[osf]{bergamo}}{}% Bembo
\IfFileExists{chantill.sty}{\usepackage{chantill}}{}% Gill Sans

%\usepackage{microtype}

%%
% Just some sample text
\usepackage{lipsum}

%%
% For nicely typeset tabular material
\usepackage{booktabs}

%%
% For graphics / images
\usepackage{graphicx}

%%
% Prints argument within hanging parentheses (i.e., parentheses that take
% up no horizontal space). Useful in tabular environments.
\newcommand{\hangp}[1]{\makebox[0pt][r]{(}#1\makebox[0pt][l]{)}}

%%
% Prints an asterisk that takes up no horizontal space.
% Useful in tabular environments.
\newcommand{\hangstar}{\makebox[0pt][l]{*}}

%%
% Prints a trailing space in a smart way.
\usepackage{xspace}

%%
% Some shortcuts for Tufte's book titles. The lowercase commands will
% produce the initials of the book title in italics. The all-caps commands
% will print out the full title of the book in italics.
\newcommand{\vdqi}{\textit{VDQI}\xspace}
\newcommand{\ei}{\textit{EI}\xspace}
\newcommand{\ve}{\textit{VE}\xspace}
\newcommand{\be}{\textit{BE}\xspace}
\newcommand{\VDQI}{\textit{The Visual Display of Quantitative Information}\xspace}
\newcommand{\EI}{\textit{Envisioning Information}\xspace}
\newcommand{\VE}{\textit{Visual Explanations}\xspace}
\newcommand{\BE}{\textit{Beautiful Evidence}\xspace}

% Prints the month name (e.g., January) and the year (e.g., 2008)
\newcommand{\monthyear}{%
\ifcase\month\or January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or
December\fi\space\number\year
}


% Prints an epigraph and speaker in sans serif, all-caps type.
\newcommand{\openepigraph}[2]{%
%\sffamily\fontsize{14}{16}\selectfont
\begin{fullwidth}
\sffamily\large
\begin{doublespace}
\noindent\allcaps{#1}\\% epigraph
\noindent\allcaps{#2}% author
\end{doublespace}
\end{fullwidth}
}

% Inserts a blank page
\newcommand{\blankpage}{%
\newpage~\\\thispagestyle{empty}\newpage
}


\begin{document}

% Front matter
\frontmatter

% r.1 blank page
\blankpage

% v.2 epigraphs
\newpage\thispagestyle{empty}
\openepigraph{%
The public is more familiar with bad design than good design.
It is, in effect, conditioned to prefer bad design,
because that is what it lives with.
The new becomes threatening, the old reassuring.
}{Paul Rand%, {\itshape Design, Form, and Chaos}
}
\vfill
\openepigraph{%
A designer knows that he has achieved perfection
not when there is nothing left to add,
but when there is nothing left to take away.
}{Antoine de St-Expurey}
\vfill
\openepigraph{%
\ldots the designer of a new system must not only be the implementor and the first
large-scale user; the designer should also write the first user manual\ldots
If I had not participated fully in all these activities,
literally hundreds of improvements would never have been made,
because I would never have thought of them or perceived
why they were important.
}{Donald E. Knuth}


% r.3 full title page
\maketitle


% v.4 copyright page
\newpage
\begin{fullwidth}
~\vfill
\thispagestyle{empty}
\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}
Copyright \copyright\ \the\year\ \thanklessauthor

\par\smallcaps{Published by \thanklesspublisher}

\par\smallcaps{tufte-latex.googlecode.com}

\par Licensed under the Apache License, Version 2.0 (the ``License''); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at \url{http://www.apache.org/licenses/LICENSE-2.0}. Unless
required by applicable law or agreed to in writing, software distributed
under the License is distributed on an \smallcaps{``AS IS'' BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND}, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.

\par\textit{First printing, \monthyear}
\end{fullwidth}

% r.5 contents
\tableofcontents

% r.7 dedication
\cleardoublepage
~\vfill
\begin{doublespace}
\noindent\fontsize{18}{22}\selectfont\itshape
\nohyphenation
Dedicated to those who appreciate \LaTeX{}
and the work of \mbox{Edward R.~Tufte}
and \mbox{Donald E.~Knuth}.
\end{doublespace}
\vfill
\vfill


% r.9 introduction
\cleardoublepage
\chapter*{Introduction}

This sample book discusses the design of Edward Tufte's
%books\cite{Tufte2001}\cite{Tufte1990}\cite{Tufte1997}\cite{Tufte2006}
books\cite{Tufte2001,Tufte1990,Tufte1997,Tufte2006}
and the use of the \texttt{tufte-book} document class.

\lipsum[1-20]

%%
% Start the main matter (normal chapters)
\mainmatter


\chapter{The Design of Tufte's Books}
\label{ch:tufte-design}


\newthought{The pages} of a book are usually divided into three major
sections: the front matter (also called preliminary matter or prelim), the
main matter (the core text of the book), and the back matter (or end
matter).

\newthought{The front matter} of a book refers to all of the material that
comes before the main text. The following table from shows a list of
material that appears in the front matter of \VDQI, \EI, \VE, and \BE
along with its page number. Page numbers that appear in parentheses refer
to folios that do not have a printed page number (but they are still
counted in the page number sequence).

\bigskip
\begin{minipage}{\textwidth}
\begin{center}
\begin{tabular}{lcccc}
\toprule
& \multicolumn{4}{c}{Books} \\
\cmidrule(l){2-5}
Page content & \vdqi & \ei & \ve & \be \\
\midrule
Blank half title page & \hangp{1} & \hangp{1} & \hangp{1} & \hangp{1} \\
Frontispiece\footnotemark{}
& \hangp{2} & \hangp{2} & \hangp{2} & \hangp{2} \\
Full title page & \hangp{3} & \hangp{3} & \hangp{3} & \hangp{3} \\
Copyright page & \hangp{4} & \hangp{4} & \hangp{4} & \hangp{4} \\
Contents & \hangp{5} & \hangp{5} & \hangp{5} & \hangp{5} \\
%Blank & -- & \hangp{6} & \hangp{6} & \hangp{6} \\
Dedication & \hangp{6} & \hangp{7} & \hangp{7} & 7 \\
%Blank & -- & \hangp{8} & -- & \hangp{8} \\
Epigraph & -- & -- & \hangp{8} & -- \\
Introduction & \hangp{7} & \hangp{9} & \hangp{9} & 9 \\
\bottomrule
\end{tabular}
\end{center}
\end{minipage}
\vspace{-7\baselineskip}\footnotetext{The contents of this page vary from book to book. In
\vdqi this page is blank; in \ei and \ve this page holds a frontispiece;
and in \be this page contains three epigraphs.}
\vspace{7\baselineskip}

\bigskip
The design of the front matter in Tufte's books varies slightly from the
traditional design of front matter. First, the pages in front matter are
traditionally numbered with lowercase roman numerals (e.g., i, ii, iii,
iv,~\ldots). Second, the front matter page numbering sequence is usually
separate from the main matter page numbering. That is, the page numbers
restart at 1 when the main matter begins. In contrast, Tufte has
enumerated his pages with arabic numerals that share the same page counting
sequence as the main matter.

There are also some variations in design across Tufte's four books. The
page opposite the full title page (labeled ``frontispiece'' in the above
table) has different content in each of the books. In \VDQI, this page is
blank; in \EI and \VE, this page holds a frontispiece; and in \BE, this
page contains three epigraphs.

The dedication appears on page~6 in \vdqi (opposite the introduction), and
is placed on its own spread in the other books. In \ve, an epigraph shares
the spread with the opening page of the introduction.

None of the page numbers (folios) of the front matter are expressed except in
\be, where the folios start to appear on the dedication page.

\newthought{The full title page} of each of the books varies slightly in
design. In all the books, the author's name appears at the top of the
page, the title it set just above the center line, and the publisher is
printed along the bottom margin. Some of the differences are outlined in
the following table.

\bigskip
\begin{center}
\footnotesize
\begin{tabular}{lllll}
\toprule
Feature & \vdqi & \ei & \ve & \be \\
\midrule
Author & & & & \\
\quad Typeface & serif & serif & serif & sans serif \\
\quad Style & italics & italics & italics & upright, caps \\
\quad Size & 24 pt & 20 pt & 20 pt & 20 pt \\
\addlinespace
Title & & & & \\
\quad Typeface & serif & serif & serif & sans serif \\
\quad Style & upright & italics & upright & upright, caps \\
\quad Size & 36 pt & 48 pt & 48 pt & 36 pt \\
\addlinespace
Subtitle & & & & \\
\quad Typeface & -- & -- & serif & -- \\
\quad Style & -- & -- & upright & -- \\
\quad Size & -- & -- & 20 pt & -- \\
\addlinespace
Edition & & & & \\
\quad Typeface & sans serif & -- & -- & -- \\
\quad Style & upright, caps & -- & -- & -- \\
\quad Size & 14 pt & -- & -- & -- \\
\addlinespace
Publisher & & & & \\
\quad Typeface & serif & serif & serif & sans serif \\
\quad Style & italics & italics & italics & upright, caps \\
\quad Size & 14 pt & 14 pt & 14 pt & 14 pt \\
\bottomrule
\end{tabular}
\end{center}

%\begin{figure*}[p]
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/vdqi-title.pdf}}
%\hfill
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/ei-title.pdf}}
%\\\vspace{\baselineskip}
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/ve-title.pdf}}
%\hfill
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/be-title.pdf}}
%\end{figure*}

\newthought{The tables of contents} in Tufte's books give us our first
glimpse of the structure of the main matter. \VDQI is split into two
parts, each containing some number of chapters. His other three books only
contain chapters---they're not broken into parts.

%\begin{figure*}[p]
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/vdqi-contents.pdf}}
%\hfill
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/ei-contents.pdf}}
%\\\vspace{\baselineskip}
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/ve-contents.pdf}}
%\hfill
%\fbox{\includegraphics[width=0.45\textwidth]{graphics/be-contents.pdf}}
%\end{figure*}

\lipsum[21-50]

\chapter{On the Use of the \texttt{tufte-book} Document Class}
\label{ch:tufte-book}
The \texttt{tufte-book} document class is modeled primarily on \BE, since
it's the most recent of Tufte's books and the design is (presumably) more
refined.

This choice of book design has a few important implications:
\begin{inparaenum}
\item there are no parts---the highest heading level is the chapter;
\item the use of a sans serif font for many design elements (especially the
title page and epigraphs); and
\item \emph{something else---yyy}.
\end{inparaenum}

\lipsum[1-25]


%%
% The back matter contains appendices, indices, glossaries, etc.

\backmatter



\bibliography{sample-handout}
\bibliographystyle{plainnat}

\end{document}


+ 3
- 3
sample-handout.bib View File

@@ -6,7 +6,7 @@
month = {May},
edition = {First},
place = {Cheshire, Connecticut},
isbn = {0961392177}
isbn = {0-9613921-7-7}
}

@BOOK{Tufte2001,
@@ -15,7 +15,7 @@
publisher = {Graphics Press},
year = {2001},
address = {Cheshire, Connecticut},
isbn = {0961392142}
isbn = {0-9613921-4-2}
}

@BOOK{Tufte1990,
@@ -24,7 +24,7 @@
publisher = {Graphics Press},
year = {1990},
address = {Cheshire, Connecticut},
isbn = {0961392118}
isbn = {0-9613921-1-8}
}

@BOOK{Tufte1997,


BIN
sample-handout.pdf View File


+ 26
- 13
sample-handout.tex View File

@@ -1,4 +1,4 @@
\documentclass{tufte-handout}
\documentclass[nofonts]{tufte-handout}

\usepackage{amsmath}

@@ -9,12 +9,26 @@

\usepackage{mcaption} % FIXME move to .cls file

%\title{An Example of the Usage of the Tufte-Handout Style\thanks{Inspired by Edward~R. Tufte!}}
\title{An Example of the Usage of the Tufte-Handout Style}
\author{The Tufte-\LaTeX\ Developers}
%\date{22 February 2008} % if the \date{} command is left out, the current date will be used
\title{An Example of the Usage of the Tufte-Handout Style\thanks{Inspired by Edward~R. Tufte!}}
\author[The Tufte-LaTeX Developers]{The Tufte-\LaTeX\ Developers}
\date{22 February 2008} % if the \date{} command is left out, the current date will be used

\usepackage{helvet}
%%
% If we have Bergamo and Chantilly fonts (from www.fontsite.com) installed,
% use them. Bergamo is a clone of Bembo and Chantilly is similar to Gill Sans.
\makeatletter
\ifthenelse{\NOT\boolean{@tufte@xetex}}
{%
\IfFileExists{bergamo.sty}{\usepackage[osf]{bergamo}}{}% Bembo clone
\IfFileExists{chantill.sty}{\usepackage{chantill}}{}% Gill Sans clone
}{% We're using XeTeX -- load fontspec, etc.
\usepackage{fontspec}
\usepackage{xltxtra}
\setromanfont{Bergamo}% Bembo clone
\setsansfont{Chantilly}% Gill Sans clone
\setmonofont{Bitstream Vera Sans Mono}%
}
\makeatother

% The following package makes prettier tables. We're all about the bling!
\usepackage{booktabs}
@@ -28,19 +42,18 @@
\usepackage{fancyvrb}
\fvset{fontsize=\normalsize}

% Small sections of multiple columns
\usepackage{multicol}

%\usepackage[savepos]{zref}

% Provides paragraphs of dummy text
\usepackage{lipsum}

\usepackage{url}
\urldef{\asyurl}\url{http://asymptote.sf.net/}

\begin{document}

\maketitle % this prints the handout title, author, and date



\begin{abstract}
\noindent This document describes the Tufte handout \LaTeX\ document style.
It also provides examples and comments on the style's use.
@@ -112,7 +125,7 @@ example.) If you do not want to print a bibliography at the end of your
document, use the \Verb|\nobibliography| command in its place.

To enter multiple citations at one
location,\cite{Tufte2006}\cite{Tufte1990} you will need to use multiple
location,\cite{Tufte2006,Tufte1990} you will need to use multiple
\Verb|\cite| commands: \Verb|\cite{Tufte2006}| \Verb|\cite{Tufte1990}|. Each
\Verb|\cite| command will generate its own sidenote and its own sidenote
number.
@@ -132,7 +145,7 @@ use the \Verb|marginfigure| or \Verb|margintable| environments as follows
\includegraphics[width=\marginparwidth]{helix}
\caption{This is a margin figure. The helix is defined by
$x = \cos(2\pi z)$, $y = \sin(2\pi z)$, and $z = [0, 2.7]$. The figure was
drawn using Asymptote (\asyurl).}
drawn using Asymptote (\url{http://asymptote.sf.net/}).}
\label{fig:marginfig}
\end{marginfigure}
\begin{Verbatim}


+ 83
- 0
tufte-book.cls View File

@@ -0,0 +1,83 @@
\NeedsTeXFormat{LaTeX2e}[1994/06/01]

\ProvidesClass{tufte-book}[2008/11/16 v3.0.0 Tufte-book class]


\PassOptionsToPackage{book}{tufte-common}
\DeclareOption*{% pass options to tufte-common package and the article class
\PassOptionsToPackage{\CurrentOption}{tufte-common}
\PassOptionsToClass{\CurrentOption}{book}
\PackageInfo{tufte-book}{Passing \CurrentOption\space to `book' class}
}
\ProcessOptions

\LoadClass{book}

\RequirePackage{tufte-common}


%%
% Set up any book-specific stuff now

%%
% The front matter in Tufte's /Beautiful Evidence/ contains everything up
% to the opening page of Chapter 1. The running heads, when they appear,
% contain only the (arabic) page number in the outside corner.
%\newif\if@mainmatter \@mainmattertrue
\renewcommand\frontmatter{%
\cleardoublepage
\@mainmatterfalse
\pagenumbering{arabic}
%\pagestyle{plain}
\fancyhf{}
\if@tufte@twoside
\fancyhead[LE,RO]{\thepage}
\else
\fancyhead[RE,RO]{\thepage}
\fi
}


%%
% The main matter in Tufte's /Beautiful Evidence/ doesn't restart the page
% numbering---it continues where it left off in the front matter.
\renewcommand\mainmatter{%
\cleardoublepage
\@mainmattertrue
% TODO The book should have the book title on the left and the chapter
% title on the right.
\fancyhf{}
\if@tufte@twoside
\renewcommand{\chaptermark}[1]{\markboth{##1}{}}
\fancyhead[LE]{\thepage\quad\smallcaps{\thetitle}}% book title
\fancyhead[RO]{\smallcaps{\leftmark}\quad\thepage}% chapter title
\else
\fancyhead[RE,RO]{\smallcaps{\thetitle}\quad\thepage}% book title
\fi
}


%%
% The back matter contains appendices, indices, glossaries, endnotes,
% biliographies, list of contributors, illustration credits, etc.
\renewcommand\backmatter{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\@mainmatterfalse
}


%%
% If there is a `tufte-book-local.sty' file, load it.

\IfFileExists{tufte-book-local.tex}
{\input{tufte-book-local.tex}}
{}

%%
% End of file
\endinput

+ 810
- 0
tufte-common.sty View File

@@ -0,0 +1,810 @@
\NeedsTeXFormat{LaTeX2e}[1994/06/01]

\ProvidesPackage{tufte-common}[2008/11/16 v3.0.0 Common code for the Tufte-LaTeX styles]

%%
% We use the `xifthen' package to handle our package option switches
\RequirePackage{xifthen}


%%
% `debug' option -- provides more information in the .log file for use in
% troubleshooting problems
\newboolean{@tufte@debug}
\DeclareOption{debug}{\setboolean{@tufte@debug}{true}}

%%
% `nofonts' option -- doesn't load any fonts
% `fonts' option -- tries to load fonts
\newboolean{@tufte@loadfonts}\setboolean{@tufte@loadfonts}{true}
\DeclareOption{fonts}{\setboolean{@tufte@loadfonts}{true}}
\DeclareOption{nofonts}{\setboolean{@tufte@loadfonts}{false}}

%%
% `nols' option -- doesn't configure letterspacing
% `ls' option -- configures letterspacing
\newboolean{@tufte@letterspace}\setboolean{@tufte@letterspace}{true}
\DeclareOption{ls}{\setboolean{@tufte@letterspace}{true}}
\DeclareOption{nols}{\setboolean{@tufte@letterspace}{false}}

%%
% `book' and `handout' options
\newcommand{\@tufte@class}{article}% the base LaTeX class (defaults to the article/handout style)
\newcommand{\@tufte@pkgname}{tufte-handout}% the name of the package (defaults to tufte-handout)
\DeclareOption{book}{%
\renewcommand{\@tufte@class}{book}
\renewcommand{\@tufte@pkgname}{tufte-book}
\setboolean{@tufte@titlepage}{true}
}
\DeclareOption{handout}{%
\renewcommand{\@tufte@class}{article}
\renewcommand{\@tufte@pkgname}{tufte-handout}
\setboolean{@tufte@titlepage}{false}
}
\DeclareOption{article}{% `article' is just an alias for `handout'
\renewcommand{\@tufte@class}{article}
\renewcommand{\@tufte@pkgname}{tufte-handout}
\setboolean{@tufte@titlepage}{false}
}

%%
% `titlepage' option -- creates a full title page with \maketitle

\newboolean{@tufte@titlepage}
\DeclareOption{titlepage}{\setboolean{@tufte@titlepage}{true}}
\DeclareOption{notitlepage}{\setboolean{@tufte@titlepage}{false}}

%%
% `a4paper' option

\newboolean{@tufte@afourpaper}
\DeclareOption{a4paper}{\setboolean{@tufte@afourpaper}{true}}

%%
% `sfsidenotes' option -- typesets sidenotes in sans serif typeface

\newboolean{@tufte@sfsidenotes}
\DeclareOption{sfsidenotes}{\setboolean{@tufte@sfsidenotes}{true}}

%%
% `symmetric' option -- puts marginpar space to the outside edge of the page
% Note: this option forces the twoside option

\newboolean{@tufte@symmetric}
\DeclareOption{symmetric}{
\setboolean{@tufte@symmetric}{true}
\PassOptionsToClass{twoside}{\@tufte@class}
}

%%
% `justified' option -- uses fully justified text (flush left and flush
% right) instead of ragged right.

\newboolean{@tufte@justified}
\DeclareOption{justified}{\setboolean{@tufte@justified}{true}}


% FIXME: should probably specify options not supported like Mittelbach's aipproc.cls

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\@tufte@class}}
\ProcessOptions

%\LoadClass{\@tufte@class}

%%
% Detect whether we're in two-side mode or not. (Used to set up running
% heads later.)

\newboolean{@tufte@twoside}
\ifthenelse{\boolean{@twoside}}
{\setboolean{@tufte@twoside}{true}}
{\setboolean{@tufte@twoside}{false}}

%%
% Detect if we're using pdfLaTeX

\newboolean{@tufte@pdf}
\IfFileExists{ifpdf.sty}{%
\RequirePackage{ifpdf}
\ifthenelse{\boolean{pdf}}
{\setboolean{@tufte@pdf}{true}}
{\setboolean{@tufte@pdf}{false}}
}{% assume we're not using pdfTex?
\setboolean{@tufte@pdf}{false}
}

%%
% Detect if we're using XeLaTeX

\newboolean{@tufte@xetex}
\IfFileExists{ifxetex.sty}{%
\RequirePackage{ifxetex}
\ifthenelse{\boolean{xetex}}
{\setboolean{@tufte@xetex}{true}}
{\setboolean{@tufte@xetex}{false}}
}{% not using xelatex
\setboolean{@tufte@xetex}{false}
}

%%
% Load the `hyperref' package. We will set more options later.
% TODO Set nice defaults for hyperref options
\ifthenelse{\boolean{@tufte@xetex}}
{\RequirePackage[xetex]{hyperref}}
{\RequirePackage{hyperref}}

\hypersetup{%
pdfborder = {0 0 0}
}

%%
% Set page layout geometry

\RequirePackage[letterpaper,includemp,width=6.5in,marginparsep=0.375in,marginparwidth=2in]{geometry}

\ifthenelse{\boolean{@tufte@afourpaper}}
{\geometry{a4paper,includemp,width=170mm,marginparsep=10mm,marginparwidth=50mm}}
{}

\ifthenelse{\boolean{@tufte@symmetric}}
{}
{\geometry{asymmetric}}


%%
% Separation marginpars by a line's worth of space.

\setlength\marginparpush{\baselineskip}

%%
% Font for margin items

\ifthenelse{\boolean{@tufte@sfsidenotes}}
{\newcommand{\@tufte@marginfont}{\normalfont\scriptsize\sffamily}}
{\newcommand{\@tufte@marginfont}{\normalfont\scriptsize}}

%%
% \RaggedRight allows hyphenation

\RequirePackage{ragged2e}
\setlength{\RaggedRightRightskip}{\z@ plus 0.08\hsize}

%%
% Set the justification baesed on the `justified' class option

\newcommand{\@tufte@justification}{%
\ifthenelse{\boolean{@tufte@justified}}
{\justifying}
{\RaggedRight}
}

%%
% Turn off section numbering

\setcounter{secnumdepth}{-1}

%%
% Tighten up space between displays (e.g., a figure or table) and make symmetric

\setlength\abovedisplayskip{6pt plus 2pt minus 4pt}
\setlength\belowdisplayskip{6pt plus 2pt minus 4pt}

%%
% To implement full-width display environments

\RequirePackage[strict]{chngpage}
% TODO this package may be obsolete -- see the changepage package for a replacement



% Compute length used for full-width displays

\newlength{\@tufte@overhang}
\setlength{\@tufte@overhang}{\marginparwidth}
\addtolength{\@tufte@overhang}{\marginparsep}

%%
% Modified \title, \author, and \date commands. These store the
% (footnote-less) values in \thetitle, \theauthor, and \thedate, respectively.

\newcommand{\thetitle}{}% plain-text-only title
\newcommand{\theauthor}{}% plain-text-only author
\newcommand{\thepublisher}{}% plain-text-only publisher

\newcommand{\thanklesstitle}{}% full title text minus \thanks{}
\newcommand{\thanklessauthor}{}% full author text minus \thanks{}
\newcommand{\thanklesspublisher}{}% full publisher minus \thanks{}

\newcommand{\@publisher}{}% full publisher with \thanks{}
\newcommand{\thedate}{\today}

% TODO Fix it so that \thanks is not spaced out (with `soul') and can be
% used in \maketitle when the `sfsidenotes' option is provided.
\renewcommand{\thanks}[1]{\NoCaseChange{\footnote{#1}}}

\renewcommand{\title}[2][]{%
\gdef\@title{#2}%
\begingroup%
% TODO store contents of \thanks command
\renewcommand{\thanks}[1]{}% swallow \thanks contents
\protected@xdef\thanklesstitle{#2}%
\endgroup%
\ifthenelse{\isempty{#1}}%
{\renewcommand{\thetitle}{\thanklesstitle}}% use thankless title
{\renewcommand{\thetitle}{#1}}% use provided plain-text title
\hypersetup{pdftitle={\thetitle}}% set the PDF metadata title
}

\renewcommand*{\author}[2][]{%
\gdef\@author{#2}%
\begingroup%
% TODO store contents of \thanks command
\renewcommand{\thanks}[1]{}% swallow \thanks contents
\protected@xdef\thanklessauthor{#2}%
\endgroup%
\ifthenelse{\isempty{#1}}
{\renewcommand{\theauthor}{\thanklessauthor}}% use thankless author
{\renewcommand{\theauthor}{#1}}% use provided plain-text author
\hypersetup{pdfauthor={\theauthor}}% set the PDF metadata author
}

\renewcommand*{\date}[1]{%
\gdef\@date{#1}%
\begingroup%
% TODO store contents of \thanks command
\renewcommand{\thanks}[1]{}% swallow \thanks contents
\protected@xdef\thedate{#1}%
\endgroup%
}

%%
% Provides a \publisher command to set the publisher

\newcommand{\publisher}[2][]{%
\gdef\@publisher{#2}%
\begingroup%
\renewcommand{\thanks}[1]{}% swallow \thanks contents
\protected@xdef\thanklesspublisher{#2}%
\endgroup%
\ifthenelse{\isempty{#1}}
{\renewcommand{\thepublisher}{\thanklesspublisher}}% use thankless publisher
{\renewcommand{\thepublisher}{#1}}% use provided plain-text publisher
}

% TODO: Test \hypersetup{pdfauthor,pdftitle} with DVI and XeTeX

%%
% Require paralist package for tighter lists

\RequirePackage{paralist}

% Add rightmargin to compactenum

\def\@compactenum@{%
\expandafter\list\csname label\@enumctr\endcsname{%
\usecounter{\@enumctr}%
\rightmargin=2em% added this
\parsep\plparsep
\itemsep\plitemsep
\topsep\pltopsep
\partopsep\plpartopsep
\def\makelabel##1{\hss\llap{##1}}}}

%%
% Improved letterspacing of small caps and all-caps text.
%
% First, try to use the `microtype' package, if it's available.
% Failing that, try to use the `soul' package, if it's available.
% Failing that, well, I give up.

\RequirePackage{textcase} % provides \MakeTextUppercase and \MakeTextLowercase
\def\allcapsspacing{\relax}
\def\smallcapsspacing{\relax}
\newcommand{\allcaps}[1]{\MakeTextUppercase{\allcapsspacing{#1}}}
\newcommand{\smallcaps}[1]{\MakeTextLowercase{\textsc{#1}}}

\newcommand{\@tufte@loadsoul}{%
\IfFileExists{soul.sty}{%
\RequirePackage{soul}
\sodef\allcapsspacing{\upshape}{0.15em}{0.65em}{0.6em}
\sodef\smallcapsspacing{\scshape}{0.075em}{0.5em}{0.6em}
}{
\PackageWarningNoLine{\@tufte@pkgname}{Couldn't locate `soul' package.}
}% soul not installed... giving up.
}

% If we're using pdfLaTeX v1.40+, use the letterspace package.
% If we're using pdfLaTex < v1.40, use the soul package.
% If we're using XeLaTeX, use XeLaTeX letterspacing options.
% Otherwise fall back on the soul package.

\ifthenelse{\boolean{@tufte@pdf}}
{\PackageInfo{\@tufte@pkgname}{ifpdf = true}}
{\PackageInfo{\@tufte@pkgname}{ifpdf = false}}

\ifthenelse{\boolean{@tufte@xetex}}
{\PackageInfo{\@tufte@pkgname}{ifxetex = true}}
{\PackageInfo{\@tufte@pkgname}{ifxetex = false}}

% Check pdfLaTeX version
\def\@tufte@pdftexversion{0}
\ifx\normalpdftexversion\@undefined \else
\let\pdftexversion \normalpdftexversion
\let\pdftexrevision\normalpdftexrevision
\let\pdfoutput \normalpdfoutput
\fi
\ifx\pdftexversion\@undefined \else
\ifx\pdftexversion\relax \else
\def\@tufte@pdftexversion{6}
\ifnum\pdftexversion < 140
\def\@tufte@pdftexversion{5}
\fi
\fi
\fi

\ifthenelse{\boolean{@tufte@letterspace}}
{%
\ifnum\@tufte@pdftexversion<6
% pdfLaTeX version is too old or not using pdfLaTeX
\ifthenelse{\boolean{@tufte@xetex}}
{% TODO use xetex letterspacing
\PackageInfo{\@tufte@pkgname}{XeTeX detected. Reverting to `soul' package for letterspacing.}
\@tufte@loadsoul}
{% use `soul' package for letterspacing
\PackageInfo{\tufte@pkgname}{Old version of pdfTeX detected. Reverting to `soul' package for letterspacing.}
\@tufte@loadsoul}
\else
\IfFileExists{letterspace.sty}{%
\PackageInfo{\@tufte@pkgname}{Modern version of pdfTeX detected. Using `letterspace' package.}
\RequirePackage{letterspace}
% Set up letterspacing (using microtype package) -- requires pdfTeX v1.40+
\renewcommand{\allcapsspacing}[1]{\textls[200]{##1}}
\renewcommand{\smallcapsspacing}[1]{\textls[50]{##1}}
\renewcommand{\allcaps}[1]{\textls[200]{\MakeTextUppercase{##1}}}
\renewcommand{\smallcaps}[1]{\textsc{\MakeTextLowercase{##1}}}
}{% microtype failed, check for soul
\PackageInfo{\@tufte@pkgname}{Modern version of pdfTeX detected, but `letterspace' package not installed. Reverting to `soul' package for letterspacing.}
\@tufte@loadsoul
}
\fi}
{}


\DeclareTextFontCommand{\textsmallcaps}{\scshape}
\renewcommand{\textsc}[1]{\textsmallcaps{\smallcapsspacing{#1}}}


%%
% An environment for paragraph-style section

\providecommand\newthought[1]{\vspace{1.8\baselineskip plus 3pt minus 2pt}%
{\noindent\textsc{#1}}}

%%
% Used for doublespacing, and other linespacing
% Note that setspace must be loaded before footmisc or it'll break sidenotes
\usepackage{setspace}


%%
% Transform existing \footnotes into \sidenotes
% Sidenote: ``Where God meant footnotes to go.'' ---Tufte

\RequirePackage[side,multiple,stable]{footmisc}
\providecommand*{\footnotelayout}{\@tufte@marginfont\@tufte@justification}
\renewcommand{\footnotelayout}{\@tufte@marginfont\@tufte@justification}

% Override footmisc's definition to set the sidenote marks (numbers) inside the
% sidenote's text block.
\long\def\@makefntext#1{\@textsuperscript{\@tufte@marginfont\tiny\@thefnmark}\,\footnotelayout#1}

% Set the in-text footnote mark in the same typeface as the body text itself.
\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\scriptsize\@thefnmark}}}

\let\sidenote\footnote

%%
% Sidenote without the footnote mark

\providecommand\marginnote[1]%
{\marginpar{\@tufte@marginfont\@tufte@justification #1}}

%%
% Citations should go in the margin as well

\RequirePackage{natbib}
\RequirePackage{bibentry} % allows bibitems to be typeset outside thebibliography environment
\nobibliography* % pre-loads the bibliography keys
\providecommand{\doi}[1]{\textsc{doi:} #1} % pre-defining this so it may be used before the \bibliography command it issued
\renewcommand{\cite}[1]{%
\@for\@temp@bibkey:=#1\do{%
\sidenote{\bibentry{\@temp@bibkey}.}%
}
}

% TODO: Combine sequences of citations so that 2,3,4,6 becomes 2--4,6
% but be careful of hyperref interaction

%%
% The placeins package provides the \FloatBarrier command. This forces
% LaTeX to place all of the floats before proceeding. We'll use this to
% keep the float (figure and table) numbers in sequence.
\RequirePackage{placeins}

%%
% Margin figure environment

\newsavebox{\@tufte@marginfigbox}
\newenvironment{marginfigure}[1]
[-1.2ex]
{\FloatBarrier% process all floats before this point so the figure numbers stay in order.
\begin{lrbox}{\@tufte@marginfigbox}
\begin{minipage}{\marginparwidth}
\@tufte@marginfont
\def\@captype{figure}
\vspace*{#1}
\@tufte@justification
}
{\end{minipage}%
\end{lrbox}%
\marginpar{\usebox{\@tufte@marginfigbox}}}


%%
% Margin table environment
\newsavebox{\@tufte@margintablebox}
\newenvironment{margintable}[1]
[-1.2ex]
{\FloatBarrier% process all floats before this point so the figure numbers stay in order.
\begin{lrbox}{\@tufte@margintablebox}
\begin{minipage}{\marginparwidth}
\@tufte@marginfont
\def\@captype{table}
\vspace*{#1}
\@tufte@justification
}
{\end{minipage}%
\end{lrbox}%
\marginpar{\usebox{\@tufte@margintablebox}}}


%%
% Full-width figure

\renewenvironment{figure*}[1]%
[htbp]%
{\@float{figure}[#1]%
\ifthenelse{\boolean{@tufte@symmetric}}
{\begin{adjustwidth}[]{}{-\@tufte@overhang}}
{\begin{adjustwidth}{}{-\@tufte@overhang}}
\begin{minipage}{\linewidth}}%
{\end{minipage}%
\end{adjustwidth}%
\end@float}

%%
% Full-width table

\renewenvironment{table*}[1]
[htbp]%
{\@float{table}[#1]%
\ifthenelse{\boolean{@tufte@symmetric}}
{\begin{adjustwidth}[]{}{-\@tufte@overhang}}
{\begin{adjustwidth}{}{-\@tufte@overhang}}
\begin{minipage}{\linewidth}}%
{\end{minipage}%
\end{adjustwidth}%
\end@float}

%%
% Full-page-width area

\newenvironment{fullwidth}
{\ifthenelse{\boolean{@tufte@symmetric}}
{\begin{adjustwidth}[]{}{-\@tufte@overhang}}
{\begin{adjustwidth}{}{-\@tufte@overhang}}
}
{\end{adjustwidth}}

%%
% Format the captions in a style similar to the sidenotes

\RequirePackage[format=default,font={rm,scriptsize},justification=raggedright,singlelinecheck=false]{caption}

% if the `sfsidenotes' option is specified, set the captions in sf, too.
\ifthenelse{\boolean{@tufte@sfsidenotes}}
{\captionsetup{font={sf,scriptsize}}}
{\captionsetup{font={rm,scriptsize}}}

% if the `justified' option is specified, set the captions in flush left
% and flush right
\ifthenelse{\boolean{@tufte@justified}}
{\captionsetup{justification=justified}}
{\captionsetup{justification=raggedright}}

%%
% If the Palatino typeface (and its math symbol set) are installed, load
% them unless the `nofonts' class option was provided, or if we're
% compiling with XeLaTeX.

\ifthenelse{\boolean{@tufte@loadfonts}\AND\NOT\boolean{@tufte@xetex}}{%
\IfFileExists{palatino.sty}{%
\RequirePackage{palatino}
\IfFileExists{mathpazo.sty}{\RequirePackage[osf,sc]{mathpazo}}{}
}{} % if the Palatino typefaces aren't found, do nothing.
}{}


%%
% If the Bera Mono typeface is available, use it unless the `nofonts' class
% option was provided, or if we're compiling with XeLaTeX.

\ifthenelse{\boolean{@tufte@loadfonts}\AND\NOT\boolean{@tufte@xetex}}{%
\IfFileExists{beramono.sty}{%
\RequirePackage[T1]{fontenc}
\RequirePackage[scaled=0.85]{beramono}
}{}
}{}


%%
% Sets up the running heads and folios.

\RequirePackage{fancyhdr}

% Set the default page style to 'fancy'
\pagestyle{fancy}

% Set the header/footer width to be the body text block plus the margin
% note area.
\ifthenelse{\boolean{@tufte@symmetric}}
{\fancyhfoffset[LE,RO]{\@tufte@overhang}}
{\fancyhfoffset[RE,RO]{\@tufte@overhang}}

% The running heads/feet don't have rules
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

% The 'fancy' page style is the default style for all pages.
\fancyhf{} % clear header and footer fields
\ifthenelse{\boolean{@tufte@twoside}}
{\fancyhead[LE]{\thepage\quad\smallcaps{\theauthor}}%
\fancyhead[RO]{\smallcaps{\thetitle}\quad\thepage}}
{\fancyhead[RE,RO]{\smallcaps{\thetitle}\quad\thepage}}


% The `plain' page style is used on chapter opening pages.
% In Tufte's /Beautiful Evidence/ he never puts page numbers at the
% bottom of pages -- the folios are unexpressed.
\fancypagestyle{plain}{
\fancyhf{} % clear header and footer fields
% Uncomment the following five lines of code if you want the opening page
% of the chapter to express the folio in the lower outside corner.
%\ifthenelse{\boolean{@tufte@twoside}}
% {\fancyfoot[LE,RO]{\thepage}}
% {\fancyfoot[RE,RO]{\thepage}}
}

% The `empty' page style suppresses all headers and footers.
% It's used on title pages and `intentionally blank' pages.
\fancypagestyle{empty}{
\fancyhf{} % clear header and footer fields
}




%%
% Set raggedright and paragraph indentation for document

\AtBeginDocument{\@tufte@justification\setlength\parindent{1em}}


%%
% Prints the list of class options and their states.

\newcommand{\typeoutbool}[2]{%
\ifthenelse{\boolean{#2}}
{\typeout{#1: true}}
{\typeout{#1: false}}
}

\newcommand{\PrintTufteSettings}{%
\typeout{-------------------- Tufte-LaTeX settings ----------}
\typeoutbool{a4paper}{@tufte@afourpaper}
\typeoutbool{load fonts}{@tufte@loadfonts}
\typeoutbool{fully-justified}{@tufte@justified}
\typeoutbool{letterspacing}{@tufte@letterspace}
\typeoutbool{sans-serif sidenotes}{@tufte@sfsidenotes}
\typeoutbool{symmetric margins}{@tufte@symmetric}
\typeoutbool{titlepage}{@tufte@titlepage}
\typeout{----------------------------------------------------}
}



%%
% Color
\RequirePackage{xcolor}

%%
% Produces a full title page

\newcommand{\maketitlepage}[0]{%
\cleardoublepage
{
\sffamily
\begin{fullwidth}
\par\noindent\fontsize{18}{18}\selectfont\textcolor{darkgray}{\allcaps{\thanklessauthor}}
\end{fullwidth}

\vspace{11.5pc}
\begin{fullwidth}
\par\noindent\fontsize{36}{36}\selectfont\textcolor{darkgray}{\allcaps{\thanklesstitle}}
\end{fullwidth}

\vfill
\begin{fullwidth}
\par\noindent\fontsize{14}{14}\selectfont\allcaps{\thanklesspublisher}
\end{fullwidth}
}
\thispagestyle{empty}
\clearpage
}

%%
% Title block

\renewcommand{\maketitle}{%
\newpage
\global\@topnum\z@% prevent floats from being placed at the top of the page
\setlength{\parindent}{0pt}
\setlength{\parskip}{4pt}
\ifthenelse{\boolean{@tufte@sfsidenotes}}
{\begingroup
% FIXME fails with \thanks
\sffamily
\par{\Large\allcaps{\@title}}
\par{\large\allcaps{\@author}}
\par{\large\allcaps{\@date}}
\endgroup}
{\begingroup
\par{\Large\textit{\@title}}
\par{\large\textit{\@author}}
\par{\large\textit{\@date}}
\endgroup}
\thispagestyle{plain}% suppress the running head
}


%%
% Title page (if the `titlepage' option was passed to the tufte-handout
% class.)

\ifthenelse{\boolean{@tufte@titlepage}}
{\renewcommand{\maketitle}{\maketitlepage}}
{}

%%
% When \cleardoublepage is called, produce a blank (empty) page -- i.e.,
% without headers and footers
\def\cleardoublepage{\clearpage\if@twoside\ifodd\c@page\else
\hbox{}
%\vspace*{\fill}
%\begin{center}
% This page intentionally contains only this sentence.
%\end{center}
%\vspace{\fill}
\thispagestyle{empty}
\newpage
\if@twocolumn\hbox{}\newpage\fi\fi\fi}

%%
% Make Tuftian-style section headings and TOC formatting

\RequirePackage{titlesec,titletoc}

% TODO: I'd prefer to use the 'titlesec' package for this formatting, but
% I'll do it old-style for now. --Kevin

\renewcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\large\it}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\it}}

% Subsubsection and following section headings shouldn't be used.
% See Bringhurst's _The Elements of Typography_, section 4.2.2.
\renewcommand\subsubsection{%
\PackageError{\@tufte@pkgname}{\noexpand\subsubsection is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\subsubsection was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}

\renewcommand\paragraph{%
\PackageError{\@tufte@pkgname}{\noexpand\paragraph is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\paragraph was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}

\renewcommand\subparagraph{%
\PackageError{\@tufte@pkgname}{\noexpand\subparagraph is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\subparagraph was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}


% Formatting for main TOC (printed in front matter)
% {section} [left] {above} {before w/label} {before w/o label} {filler + page} [after]
\titlecontents{chapter}%
[0em] % distance from left margin
{\begin{fullwidth}\fontsize{13pt}{18pt}\selectfont} % above (global formatting of entry)
{\contentslabel{2em}\rm\itshape} % before w/label (label = ``Chapter 1'')
{\rm\itshape} % before w/o label
{\rm\qquad\thecontentspage} % filler + page (leaders and page num)
[\vspace{1.5\baselineskip}\end{fullwidth}] % after

%\titlecontents{chapter}%
% [0em]% distance from left margin
% {\fontsize{12pt}{18pt}\selectfont}% above (global formatting of entry)
% {\textit}% before w/ label (label = ``Chapter 1'')
% {\textit}% before w/o label
% {\qquad\thecontentspage}% filler and page (leaders and page num)
% [\vspace{1.5\baselineskip}]% after

\titleformat{\chapter}%
[display]% shape
{\relax\begin{fullwidth}}% format applied to label+text
{\itshape\fontsize{22}{24}\selectfont\thechapter}% label
{0pt}% horizontal separation between label and title body
{\fontsize{22}{24}\rm\itshape}% before the title body
[\end{fullwidth}]% after the title body




%%
% A handy command to disable hyphenation for short bits of text.
% Borrowed from Peter Wilson's `hyphenat' package.

\newlanguage\langwohyphens% define a language without hyphenation rules
\newcommand{\nohyphens}[1]{{\language\langwohyphens #1}}% used for short bits of text
\newcommand{\nohyphenation}{\language\langwohyphens}% can be used inside environments for longer text


%%
% If debugging is enabled, print the Tufte-LaTeX options and the list of
% files.

\ifthenelse{\boolean{@tufte@debug}}
{\PrintTufteSettings\listfiles}
{}


%%
% If there is a `tufte-common-local.sty' file, load it up.

\IfFileExists{tufte-common-local.sty}
{\RequirePackage{tufte-common-local.sty}}
{}


%%
% End of file
\endinput


+ 23
- 527
tufte-handout.cls View File

@@ -1,552 +1,48 @@
\NeedsTeXFormat{LaTeX2e}[1994/06/01]

\ProvidesClass{tufte-handout}[2008/11/16 v2.0.1 Tufte-handout class]
\ProvidesClass{tufte-handout}[2008/11/16 v3.0.0 Tufte-handout class]

%%
% a4paper option

\newif\if@tufteh@afourpaper \@tufteh@afourpaperfalse
\DeclareOption{a4paper}{\@tufteh@afourpapertrue}

%%
% sfsidenotes option -- typesets sidenotes in sans serif typeface

\newif\if@tufteh@sfsidenotes \@tufteh@sfsidenotesfalse
\DeclareOption{sfsidenotes}{\@tufteh@sfsidenotestrue}

%%
% symmetric option -- puts marginpar space to the outside edge of the page
% Note: this forces twoside

\newif\if@tufteh@symmetric\@tufteh@symmetricfalse
\DeclareOption{symmetric}{
\@tufteh@symmetrictrue
\PassOptionsToClass{twoside}{article}
\PassOptionsToPackage{handout}{tufte-common}
\DeclareOption*{% pass options to tufte-common package and the article class
\PassOptionsToPackage{\CurrentOption}{tufte-common}
\PassOptionsToClass{\CurrentOption}{article}
\PackageInfo{tufte-handout}{Passing \CurrentOption\space to `article' class}
}

%%
% justified option -- uses fully justified text (flush left and flush
% right) instead of ragged right.

\newif\if@tufteh@justified\@tufteh@justifiedfalse
\DeclareOption{justified}{\@tufteh@justifiedtrue}


% FIXME: should probably specify options not supported like Mittelbach's aipproc.cls

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions

\LoadClass{article}

%%
% Detect whether we're in two-side mode or not. (Used to set up running
% heads later.)

\newif\if@tufteh@twoside\let\if@tufteh@twoside\if@twoside

%%
% Set page layout geometry

\RequirePackage[letterpaper,includemp,width=6.5in,marginparsep=0.375in,marginparwidth=2in]{geometry}

\if@tufteh@afourpaper
\geometry{a4paper,includemp,width=170mm,marginparsep=10mm,marginparwidth=50mm}
\fi

\if@tufteh@symmetric
\else
\geometry{asymmetric}
\fi


%%
% Separation marginpars by a line's worth of space.

\setlength\marginparpush{\baselineskip}

%%
% Font for margin items

\if@tufteh@sfsidenotes
\newcommand{\@tufteh@marginfont}{\normalfont\scriptsize\sffamily}
\else
\newcommand{\@tufteh@marginfont}{\normalfont\scriptsize}
\fi

%%
% \RaggedRight allows hyphenation

\RequirePackage{ragged2e}
\setlength{\RaggedRightRightskip}{\z@ plus 0.08\hsize}

%%
% Set the justification baesed on the `justified' class option

\newcommand{\@tufteh@justification}{%
\if@tufteh@justified
\justifying
\else
\RaggedRight
\fi
}

%%
% Turn off section numbering

\setcounter{secnumdepth}{-1}

%%
% Tighten up space between displays (e.g., a figure or table) and make symmetric

\setlength\abovedisplayskip{6pt plus 2pt minus 4pt}
\setlength\belowdisplayskip{6pt plus 2pt minus 4pt}

%%
% To implement full-width display environments

\RequirePackage[strict]{chngpage}

%%
% Detect if we're using pdfLaTeX
\IfFileExists{ifpdf.sty}{%
\RequirePackage{ifpdf}
}{% assume we're not using pdfTex?
\newif\ifpdf\pdffalse
}

%%
% Detect if we're using XeLaTeX
\IfFileExists{ifxetex.sty}{%
\RequirePackage{ifxetex}
}{% not using xelatex
\newif\ifxetex\xetexfalse
}

\RequirePackage{tufte-common}

% Compute length used for full-width displays

\newlength{\@tufteh@overhang}
\setlength{\@tufteh@overhang}{\marginparwidth}
\addtolength{\@tufteh@overhang}{\marginparsep}

%%
% Alter \maketitle from article.cls

\renewcommand\maketitle{\par
\global\let\and\relax
\global\let\thanks\footnote
\begingroup
\newpage
\global\@topnum\z@
\@maketitle
\endgroup
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@thanks\@empty
%\global\let\@author\@empty
%\global\let\@date\@empty
%\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
}
\def\@maketitle{%
\newpage
\noindent\sffamily\large{\allcaps{\@title}}\\
\vskip0.5\baselineskip
\noindent\normalsize{\allcaps{\@author}}\\
\vskip0.3\baselineskip
\noindent{\allcaps{\@date}}
\thispagestyle{plain}
}
% Set up any handout-specific stuff now

%%
% Abstract

\renewenvironment{abstract}%
{\begin{quotation}
\begin{sffamily}
\begin{small}}%
{ \end{small}
\end{sffamily}
\end{quotation}}

%%
% Require paralist package for tighter lists

\RequirePackage{paralist}

% Add rightmargin to compactenum

\def\@compactenum@{%
\expandafter\list\csname label\@enumctr\endcsname{%
\usecounter{\@enumctr}%
\rightmargin=2em% added this
\parsep\plparsep
\itemsep\plitemsep
\topsep\pltopsep
\partopsep\plpartopsep
\def\makelabel##1{\hss\llap{##1}}}}

%%
% Improved letterspacing of small caps and all-caps text.
%
% First, try to use the `microtype' package, if it's available.
% Failing that, try to use the `soul' package, if it's available.
% Failing that, well, I give up.

\RequirePackage{textcase} % provides \MakeTextUppercase and \MakeTextLowercase
\def\allcapsspacing{\relax}
\def\smallcapsspacing{\relax}
\newcommand{\allcaps}[1]{\MakeTextUppercase{\allcapsspacing{#1}}}
\newcommand{\smallcaps}[1]{\MakeTextLowercase{\textsc{#1}}}

\newcommand{\@tufteh@loadsoul}{%
\IfFileExists{soul.sty}{%
\RequirePackage{soul}
\sodef\allcapsspacing{\upshape}{0.15em}{0.65em}{0.6em}
\sodef\smallcapsspacing{\scshape}{0.075em}{0.5em}{0.6em}
}{
\PackageWarningNoLine{tufte-handout}{Couldn't locate `soul' package.}
}% soul not installed... giving up.
% TODO The abstract should be printed on its own page of the `titlepage'
% option was specified.
\renewenvironment{abstract}{%
\begin{quotation}
\if@tufte@sfsidenotes\begin{sffamily}\fi
\begin{small}
}{%
\end{small}
\if@tufte@sfsidenotes\end{sffamily}\fi
\end{quotation}
}

% If we're using pdfLaTeX v1.40+, use the letterspace package.
% If we're using pdfLaTex < v1.40, use the soul package.
% If we're using XeLaTeX, use XeLaTeX letterspacing options.
% Otherwise fall back on the soul package.

\ifpdf\PackageInfo{tufte-handout}{ifpdf = true}
\else\PackageInfo{tufte-handout}{ifpdf = false}
\fi

\ifxetex\PackageInfo{tufte-handout}{ifxetex = true}
\else\PackageInfo{tufte-handout}{ifxetex = false}
\fi



% Check pdfLaTeX version
\def\@tufteh@pdftexversion{0}
\ifx\normalpdftexversion\@undefined \else
\let\pdftexversion \normalpdftexversion
\let\pdftexrevision\normalpdftexrevision
\let\pdfoutput \normalpdfoutput
\fi
\ifx\pdftexversion\@undefined \else
\ifx\pdftexversion\relax \else
\def\@tufteh@pdftexversion{6}
\ifnum\pdftexversion < 140
\def\@tufteh@pdftexversion{5}
\fi
\fi
\fi

\ifnum\@tufteh@pdftexversion<6
% pdfLaTeX version is too old or not using pdfLaTeX
\ifxetex
% TODO use xetex letterspacing
\PackageInfo{tufte-handout}{XeTeX detected. Reverting to `soul' package for letterspacing.}
\@tufteh@loadsoul
\else
\PackageInfo{tufte-handout}{Old version of pdfTeX detected. Reverting to `soul' package for letterspacing.}
\@tufteh@loadsoul
\fi
\else
\IfFileExists{letterspace.sty}{%
\PackageInfo{tufte-handout}{Modern version of pdfTeX detected. Using `letterspace' package.}
\RequirePackage{letterspace}
% Set up letterspacing (using microtype package) -- requires pdfTeX v1.40+
\renewcommand{\smallcapsspacing}[1]{\textls[50]{##1}}
\renewcommand{\allcaps}[1]{\textls[200]{\MakeTextUppercase{##1}}}
\renewcommand{\smallcaps}[1]{\textsc{\MakeTextLowercase{##1}}}
}{% microtype failed, check for soul
\PackageInfo{tufte-handout}{Modern version of pdfTeX detected, but `letterspace' package not installed. Reverting to `soul' package for letterspacing.}
\@tufteh@loadsoul
}
\fi


\DeclareTextFontCommand{\textsmallcaps}{\scshape}
\renewcommand{\textsc}[1]{\textsmallcaps{\smallcapsspacing{#1}}}


%%
% An environment for paragraph-style section
% If there is a `tufte-handout-local.sty' file, load it.

\providecommand\newthought[1]{\vspace{1.8\baselineskip plus 3pt minus 2pt}%
{\noindent\textsc{#1}}}

%%
% Transform existing \footnotes into \sidenotes
% Sidenote: ``Where God meant footnotes to go.'' ---Tufte

\RequirePackage[side,multiple]{footmisc}
\providecommand*{\footnotelayout}{\@tufteh@marginfont\@tufteh@justification}
\renewcommand{\footnotelayout}{\@tufteh@marginfont\@tufteh@justification}

% Override footmisc's definition to set the sidenote marks (numbers) inside the
% sidenote's text block.
\long\def\@makefntext#1{\@textsuperscript{\@tufteh@marginfont\tiny\@thefnmark}\,\footnotelayout#1}

% Set the in-text footnote mark in the same typeface as the body text itself.
\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\scriptsize\@thefnmark}}}

\let\sidenote\footnote

%%
% Sidenote without the footnote mark

\providecommand\marginnote[1]%
{\marginpar{\@tufteh@marginfont\@tufteh@justification #1}}

%%
% Citations should go in the margin as well

\RequirePackage{natbib}
\RequirePackage{bibentry} % allows bibitems to be typeset outside thebibliography environment
\nobibliography* % pre-loads the bibliography keys
\renewcommand{\cite}[1]{\sidenote{\bibentry{#1}.}}
\providecommand{\doi}[1]{\textsc{doi:} #1} % pre-defining this so it may be used before the \bibliography command it issued

% TODO: Rewrite \cite so that you can specify multiple bib keys
% at once. For example, \cite{Author01,Author02}
% TODO: Combine sequences of citations so that 2,3,4,6 becomes 2-4,6
% but be careful of hyperref interaction

%%
% Make Tuftian-style section headings

% TODO: I'd prefer to use the 'titlesec' package for this formatting, but
% I'll do it old-style for now. --Kevin

\renewcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\large\it}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\it}}

% Subsubsection and following section headings shouldn't be used.
% See Bringhurst's _The Elements of Typography_, section 4.2.2.
\renewcommand\subsubsection{%
\PackageError{tufte-handout}{\noexpand\subsubsection is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\subsubsection was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}

\renewcommand\paragraph{%
\PackageError{tufte-handout}{\noexpand\paragraph is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\paragraph was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}

\renewcommand\subparagraph{%
\PackageError{tufte-handout}{\noexpand\subparagraph is undefined by this class.%
\MessageBreak See Robert Bringhurst's _The Elements of
\MessageBreak Typographic Style_, section 4.2.2.
\MessageBreak \noexpand\subparagraph was used}
{From Bringhurst's _The Elements of Typographic Style_, section 4.2.2: Use as
\MessageBreak many levels of headings as you need, no more and no fewer. Also see the many
\MessageBreak related threads on Ask E.T. at http://www.edwardtufte.com/.}
}


%%
% The placeins package provides the \FloatBarrier command. This forces
% LaTeX to place all of the floats before proceeding. We'll use this to
% keep the float (figure and table) numbers in sequence.
\RequirePackage{placeins}

%%
% Margin figure environment

\newsavebox{\@tufteh@marginfigbox}
\newenvironment{marginfigure}[1]
[-1.2ex]
{\FloatBarrier% process all floats before this point so the figure numbers stay in order.
\begin{lrbox}{\@tufteh@marginfigbox}
\begin{minipage}{\marginparwidth}
\@tufteh@marginfont
\def\@captype{figure}
\vspace*{#1}
\@tufteh@justification
}
{\end{minipage}%
\end{lrbox}%
\marginpar{\usebox{\@tufteh@marginfigbox}}}


%%
% Margin table environment
\newsavebox{\@tufteh@margintablebox}
\newenvironment{margintable}[1]
[-1.2ex]
{\FloatBarrier% process all floats before this point so the figure numbers stay in order.
\begin{lrbox}{\@tufteh@margintablebox}
\begin{minipage}{\marginparwidth}
\@tufteh@marginfont
\def\@captype{table}
\vspace*{#1}
\@tufteh@justification
}
{\end{minipage}%
\end{lrbox}%
\marginpar{\usebox{\@tufteh@margintablebox}}}
\IfFileExists{tufte-handout-local.tex}
{\input{tufte-handout-local.tex}}
{}


%%
% Full-width figure

\renewenvironment{figure*}[1]%
[htbp]%
{\@float{figure}[#1]%
\if@tufteh@symmetric
\begin{adjustwidth}[]{}{-\@tufteh@overhang}%
\else
\begin{adjustwidth}{}{-\@tufteh@overhang}%
\fi
\begin{minipage}{\linewidth}}%
{\end{minipage}%
\end{adjustwidth}%
\end@float}

%%
% Full-width table

\renewenvironment{table*}[1]
[htbp]%
{\@float{table}[#1]%
\if@tufteh@symmetric
\begin{adjustwidth}[]{}{-\@tufteh@overhang}%
\else
\begin{adjustwidth}{}{-\@tufteh@overhang}%
\fi
\begin{minipage}{\linewidth}}%
{\end{minipage}%
\end{adjustwidth}%
\end@float}

%%
% Full-page-width area

\newenvironment{fullwidth}
{\if@tufteh@symmetric
\begin{adjustwidth}[]{}{-\@tufteh@overhang}%
\else
\begin{adjustwidth}{}{-\@tufteh@overhang}%
\fi
}
{\end{adjustwidth}}

%%
% Format the captions in a style similar to the sidenotes

\RequirePackage[format=default,font={rm,scriptsize},justification=raggedright,singlelinecheck=false]{caption}

% if the `sfsidenotes' option is specified, set the captions in sf, too.
\if@tufteh@sfsidenotes
\captionsetup{font={sf,scriptsize}}
\else
\captionsetup{font={rm,scriptsize}}
\fi

% if the `justified' option is specified, set the captions in flush left
% and flush right
\if@tufteh@justified
\captionsetup{justification=justified}
\else
\captionsetup{justification=raggedright}
\fi

%%
% If the Palatino typeface (and its math symbol set) are installed, load them.

\IfFileExists{palatino.sty}{%
\RequirePackage{palatino}
\IfFileExists{mathpazo.sty}{\RequirePackage[osf,sc]{mathpazo}}{}
}{} % if the Palatino typefaces aren't found, do nothing.


%%
% If the Bera Mono typeface is available, use it.

\IfFileExists{beramono.sty}{%
\RequirePackage[T1]{fontenc}
\RequirePackage[scaled=0.85]{beramono}
}{}


%%
% Sets up the running heads and folios.

\RequirePackage{fancyhdr}

% Set the header/footer width to be the body text block plus the margin
% note area.
\if@tufteh@symmetric
\fancyhfoffset[LE,RO]{\@tufteh@overhang}
\else
\fancyhfoffset[RE,RO]{\@tufteh@overhang}
\fi

% The 'fancy' page style is the default style for all pages.
\fancyhf{} % clear header and footer fields
\if@tufteh@twoside
\fancyhead[LE]{\thepage\quad\smallcaps{\@author}}
\fancyhead[RO]{\smallcaps{\@title}\quad\thepage}
\else
\fancyhead[RE,RO]{\smallcaps{\@title}\quad\thepage}
\fi
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

% The 'plain' page style is used on chapter opening pages.
\fancypagestyle{plain}{
\fancyhf{} % clear header and footer fields
\if@tufteh@twoside
\fancyfoot[LE,RO]{\thepage}
\else
\fancyfoot[RE,RO]{\thepage}
\fi
}

% The 'empty' page style suppresses all headers and footers.
% It's used on title pages and `intentionally blank' pages.
\fancypagestyle{empty}{
\fancyhf{} % clear header and footer fields
}

% Set the default page style to 'fancy'
\pagestyle{fancy}


%%
% Set raggedright and paragraph indentation for document

\AtBeginDocument{\@tufteh@justification\setlength\parindent{1em}}


%%
% Prints the list of class options and their states.
\newcommand{\printclassoptions}{%
\texttt{symmetric}---\if@tufteh@symmetric true\else false\fi\\
\texttt{a4paper}---\if@tufteh@afourpaper true\else false\fi\\
\texttt{twoside}---\if@tufteh@twoside true\else false\fi\\
\texttt{sfsidenotes}---\if@tufteh@sfsidenotes true\else false\fi\\
\texttt{justified}---\if@tufteh@justified true\else false\fi
}

% End of file
\endinput

Loading…
Cancel
Save