% \iffalse
%
%FlashCards LaTeX2e Class for Typesetting Double Sided Cards
%Copyright (C) 2000  Alexander M. Budge <ambudge@mit.edu>
%
%This program is free software; you can redistribute it and/or modify
%it under the terms of the GNU General Public License as published by
%the Free Software Foundation; either version 2 of the License, or
%(at your option) any later version.
%
%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License
%along with this program (the file COPYING); if not, write to the
%Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%
%<*driver>
\def\filename{flashcards.dtx}
\def\fileversion{1.0.1}
\def\filedate{13 August 2010}
\def\docdate{16 March 2000}
%</driver>
%
%% \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         \~}
%%
%
%<flashcards|sample|avery5371|avery5388>\NeedsTeXFormat{LaTeX2e}[1996/12/01]
%<flashcards>\ProvidesClass{flashcards}[2010/08/13 1.0.1 (matthew@debian.org)]
%<sample>\ProvidesFile{samplecards.tex}
%<avery5371>\ProvidesFile{avery5371.cfg}
%<avery5388>\ProvidesFile{avery5388.cfg}
%<flashcards>\RequirePackage{ifthen}
%<flashcards>\LoadClass{article}
%
%<*driver>
\documentclass{ltxdoc}
\newcommand{\flashcards}{\textsc{FlashCards}}
\begin{document}
\title{\flashcards
  \thanks{Contains version \fileversion\ last revised \filedate}}
\author{Alexander M. Budge \\ \texttt{<ambudge@mit.edu>}}
\date{\docdate}
\maketitle
\DocInput{\filename}
\end{document}
%</driver>
%
% \fi
%
% \MakeShortVerb{\|}
%
% \changes{v1.0.1}{13 August 2010}{Bug-fix Release.}
% \changes{v1.0.0}{16 March 2000}{Full Release.}
% \changes{v0.1.1}{14 March 2000}{Second Pre-release.}
% \changes{v0.1.0}{12 March 2000}{First Pre-release.}
%
% \tableofcontents
%
% \section{Introduction}
%   The \flashcards\ class provides for the typesetting of flash
%   cards in \LaTeXe.  By flash card, I mean a two sided card which
%   has a prompt or a question on one side and the response or the
%   answer on the flip (back) side.  Flash cards come in many sizes
%   depending on the nature of the information they contain. In
%   particular, I like using both $3 \times 5''$ (index cards) and
%   $2 \times 3\frac{1}{2}''$ (business cards) which are available
%   in perforated sheets suitable for printing or copying onto.
%
%   In order to use this package effectively, you will need to
%   accurately configure |dvips| (or similar) for your printer.
%   \LaTeX\ provides a helpful |testpage.tex| for this purpose.
%
%
% \section{Using FlashCards}
%   \flashcards\ utilizes the standard \LaTeXe\ class interface. Your
%   document should be begin with:
%   \begin{center}
%     |\documentclass[|\textit{options}|]{flashcards}|
%   \end{center}
%   
% \subsection{Options}
%   \DescribeMacro{avery5371}
%   All documents should specify the paper type.  I have provided
%   the two that I use, business cards (Avery 5371 as well as Avery
%   5376, 5377, 5911, 8371, 8376, 8377, 8471 and 8373) and
%   \DescribeMacro{avery5388}
%   index cards (Avery 5388), but variants are easy to generate.  Please
%   refer to Section \ref{sec:paperconfig}  for the details of creating
%   your own configuration file for a particular type of paper.
%
%   \DescribeMacro{fronts}
%   If desired, you can typeset just the |fronts| of the cards or just
%   the |backs| of the cards.  Useful if your printer does not print
%   \DescribeMacro{backs}
%   two sides without your help, although |dvips| offers the same
%   functionality with odd/even switches (|-A| or |-B|, respectively).
%
%   \DescribeMacro{grid}
%   Useful for getting everything lined up as well as for examining
%   the cards as you create them, the |grid| option will draw lines
%   where the perforation will be.
%
%   \DescribeMacro{frame}
%   The |frame| option will frame the contents of the card with a thin
%   line.  There will be a uniform margin (see below for how to set it)
%   between the edge of the card and the frame. 
%
%   \DescribeMacro{dvips}
%   If you are using landscape oriented paper, you may want to use the
%   |dvips| option to send the right specials to |dvips| so that it
%   knows about the orientation without have to tell it from the
%   command line.  Warning: this option displaces my margins, if the
%   same happens to you, then you will want to avoid it or create a
%   special configuration for this case.  There must be some
%   alternative configuration file somewhere that gets used when this
%   option is specified for the |geometry| package.
%
% \subsection{Environment}
%   \DescribeEnv{flashcard}
%   The \flashcards\ class provideds the environment |flashcard|
%   for specifying the contents of each flash card.  The |flashcard|
%   environment has one required argument, which becomes the
%   contents of the front side of the card (the question or prompt).
%   The body of the environment then becomes the contents of the
%   back side of the card.  For example,
%   \begin{verbatim}
%     \begin{flashcard}{Dense Subset}
%       A subset $S$ of a normed space $B$ is called \emph{dense}
%       in $B$ if {\rm cl} $S$ = $B$.
%     \end{flashcard}
%   \end{verbatim}
%   will produce the front-back pair:
%   \begin{center}
%     \fbox{\parbox[t][1in][c]{2in}{%
%       \footnotesize\vspace*{\fill}\par
%       \centerline{\textbf{Dense Subset}}\par\vspace*{\fill}}}
%     \fbox{\parbox[t][1in][c]{2in}{%
%       \footnotesize\vspace*{\fill}\par\begin{center}%
%       A subset $S$ of a normed space $B$ is called \emph{dense}
%       in $B$ if {\rm cl} $S$ = $B$.\end{center}\par\vspace*{\fill}}}
%   \end{center}
%   This is not the end of the story, however, there are several
%   styles to choose from and an optional argument to the |flashcard|
%   environment.  These will be descibed next.
%
% \subsection{Styles}
%   By default, \flashcards\ uses the |plain| style for both the front
%   and back of the flash card.  The |plain| style centers the contents
%   horizontally and vertically.  The front contents are also set in
%   in large bold face, but this can be changed while setting the
%   style as described below.
%
%   \DescribeMacro{\cardfrontstyle}
%   The style of the front of the card can be conveniently selected
%   with the |\cardfrontstyle{|\textit{style}|}| command, where
%   \textit{style} can be one of |empty|, |plain|, or |headings|.
%   The |plain| style has already been described.  The |empty|
%   style does not center the contents horizontally nor vertically,
%   allowing for more generic usage. The |headings| style allows you to
%   set a running footer with
%   \DescribeMacro{\cardfrontfoot}
%   the |\cardfrontfoot{|\textit{text}|}| command, as well
%   as set a header for each card with an optional argument to
%   the |flashcard| environment.  For example,
%   \begin{verbatim}
%     \cardfrontstyle{headings}
%     \cardfrontfoot{Functional Analysis}
%     \begin{flashcard}[Definition]{Dense Subset}
%       A subset $S$ of a normed space $B$ is called \emph{dense}
%       in $B$ if {\rm cl} $S$ = $B$.
%     \end{flashcard}
%   \end{verbatim}
%   will produce the front-back pair:
%   \begin{center}
%     \fbox{\parbox[t][1in][c]{2in}{%
%       \footnotesize\textsc{Definition}\par\vspace*{\fill}\par
%       \centerline{\textbf{Dense Subset}}\par\vspace*{\fill}\par
%       \hspace*{\fill}\textsc{Functional Analysis}}}
%     \fbox{\parbox[t][1in][c]{2in}{%
%       \footnotesize\vspace*{\fill}\par\begin{center}%
%       A subset $S$ of a normed space $B$ is called \emph{dense}
%       in $B$ if {\rm cl} $S$ = $B$.\end{center}\par\vspace*{\fill}}}
%   \end{center}
%
%   You can also change the default formatting of the contents of the
%   front of the card by including the new formatting commands as an
%   optional argument to |\cardfrontstyle|.  For example, to set the
%   overall style to be |plain| (thus centering the contents of the
%   front of the card), as well as set the contents in a large
%   slanted face, you could issue the command:
%   \begin{center}
%     |\cardfrontstyle[\LARGE\slshape]{plain}|
%   \end{center}
%
%   \DescribeMacro{\cardbackstyle}
%   The style of the back of the card can be conveniently selected
%   with the |\cardbackstyle{|\textit{style}|}| command, where
%   \textit{style} can either be |empty| or |plain|. The |plain| style
%   has already been described.  The |empty| style does not center the
%   contents horizontally nor vertically, allowing for more generic
%   usage.
%
%   The default formatting can also be changed through an optional
%   argument in the same manner as for the front of the card.
%
% \subsubsection{Headings Styles}
%   \DescribeMacro{\cardfrontheadstyle}
%   The header and footer provided for the front of the card by the
%   |headings| style can be customized through two style commands.
%   \DescribeMacro{\cardfrontfootstyle}
%   The available styles for the header and footer are |left|,
%   |center| and |right|, which will place the contents of the
%   header or footer as advertized.  By default the header will be
%   |left| justified and the footer will be |right| justified.
%
%   Here as well, you can provide an optional argument to specify
%   the formatting of the header and footer, for example to have
%   the footer centered and set in a small italic face:
%   \begin{center}
%     |\cardfrontfootstyle[\small\itshape]{center}|
%   \end{center}
%
% \subsection{Lengths}
%   \flashcards\ has one length (in addition to the those discussed in
%   paper configuration below) which allows you to set the size of the
%   uniform margin around the contents of both the front and back of
%   the card.  For example, to set that uniform margin at $1/4''$, you
%   can do the following:
%   \begin{center}
%      |\setlength{\cardmargin}{0.25in}|
%   \end{center}
%
%
% \section{Sample Document}
%
%    \begin{macrocode}
%<*sample>
\documentclass[avery5388,grid,frame]{flashcards}

\cardfrontstyle[\large\slshape]{headings}
\cardbackstyle{empty}

\begin{document}

\cardfrontfoot{Functional Analysis}


\begin{flashcard}[Definition]{Norm on a Linear Space \\ Normed Space}

  A real-valued function $||x||$ defined on a linear space $X$, where
  $x \in X$, is said to be a \emph{norm on} $X$ if

  \smallskip

  \begin{description}
    \item [Positivity]            $||x|| \geq 0$,
    \item [Triangle Inequality]   $||x+y|| \leq ||x|| + ||y||$,
    \item [Homogeneity]           $||\alpha x|| = |\alpha| \:  ||x||$,
                                  $\alpha$ an arbitrary scalar,
    \item [Positive Definiteness] $||x|| = 0$ if and only if $x=0$,
  \end{description}

  \smallskip

  where $x$ and $y$ are arbitrary points in $X$.

  \medskip

  A linear/vector space with a norm is called a \emph{normed space}.
\end{flashcard}


\begin{flashcard}[Definition]{Inner Product}

  Let $X$ be a complex linear space. An \emph{inner product} on $X$ is
  a mapping that associates to each pair of vectors $x$, $y$ a scalar,
  denoted $(x,y)$, that satisfies the following properties:

  \medskip

  \begin{description}
    \item [Additivity]            $(x+y,z) = (x,z) + (y,z)$,
    \item [Homogeneity]           $(\alpha \: x, y) = \alpha (x,y)$,
    \item [Symmetry]              $(x,y) = \overline{(y,x)}$,
    \item [Positive Definiteness] $(x,x) > 0$, when $x\neq0$.
  \end{description}
\end{flashcard}


\begin{flashcard}[Definition]{Linear Transformation/Operator}

  A transformation $L$ of (operator on) a linear space $X$ into a linear
  space $Y$, where $X$ and $Y$ have the same scalar field, is said to be
  a \emph{linear transformation (operator)} if

  \medskip

  \begin{enumerate}
    \item $L(\alpha x) = \alpha L(x), \forall x\in X$ and $\forall$
          scalars $\alpha$, and
    \item $L(x_1 + x_2) = L(x_1) + L(x_2)$ for all $x_1,x_2 \in X$.
  \end{enumerate}

\end{flashcard}


\end{document}
%</sample>
%    \end{macrocode}
%
% \section{Paper Configuration}
%   \label{sec:paperconfig}
%
%   A separate configuration file specifies the details of each
%   paper type.  You should be able to create a new configuration
%   file from the information the paper manufacturer provides
%   with the product.  Again, in order for this to work properly,
%   you must accurately configure your printer.  I recommend
%   using |testpage.tex| and reading the |dvips| (or similar)
%   documentation (|info dvips| on a typical \textsc{Linux}
%   installation).  Also, on my setup I have experienced variation
%   between portrait and landscape oriented papers.
%
%   There are seven parameters which must be set. The names should be
%   somewhat self explanatory.  I recommend making a copy of one of the
%   existing configuration files and modifying the copy as
%   necessary.
%
%   For example, a $5 \times 2$ business card stock that I have been
%   using has a $0.75''$ left and right margins and a $0.50''$ top margin
%   which offset an array of $2''$ high and $3.5''$ wide business cards
%   arranged in $5$ vertical rows and $2$ horizontal columns.  I use
%   the following configuration file:
%   \begin{verbatim}
%     \newcommand{\cardpaper}{letterpaper}
%     \newcommand{\cardpapermode}{portrait}
%     \newcommand{\cardrows}{5}
%     \newcommand{\cardcolumns}{2}
%     \setlength{\cardheight}{2.0in}
%     \setlength{\cardwidth}{3.5in}
%     \setlength{\topoffset}{0.50in}
%     \setlength{\oddoffset}{0.75in}
%     \setlength{\evenoffset}{0.75in}
%   \end{verbatim}
%   All four commands must be defined and all five lengths must be
%   specified.  If the array of cards is not centered left-to-right
%   on the paper, you should set |\oddoffset| to the left margin of
%   the front and |\evenoffset| to the right margin of the front.
%
%
% \StopEventually{}
%
% \section{Class Source}
%    The \LaTeXe\ source code follows. The flash cards are built up
%    in an array of save boxes which are flushed at the end of each
%    page and at the end of the document.
%
% \subsection*{Declare Booleans and Set Defaults}
%
%    \begin{macrocode}
%<*flashcards>
\newboolean{flashcards@dvips}\setboolean{flashcards@dvips}{false}
\newboolean{flashcards@grid}\setboolean{flashcards@grid}{false}
\newboolean{flashcards@frame}\setboolean{flashcards@frame}{false}
\newboolean{flashcards@fronts}\setboolean{flashcards@fronts}{true}
\newboolean{flashcards@backs}\setboolean{flashcards@backs}{true}
%    \end{macrocode}
%
% \subsection*{Declare Lengths}
%
%    \begin{macrocode}
\newlength{\cardheight}
\newlength{\cardwidth}
\newlength{\topoffset}
\newlength{\oddoffset}
\newlength{\evenoffset}
\newlength{\oddevenshift}
%
\newlength{\cardmargin}
\newlength{\cardinnerheight}
\newlength{\cardinnerwidth}
%    \end{macrocode}
%
% \subsection*{Declare and Process Options}
%
%    \begin{macrocode}
\DeclareOption{dvips}{
  \setboolean{flashcards@dvips}{true}}
\DeclareOption{grid}{
  \setboolean{flashcards@grid}{true}}
\DeclareOption{frame}{
  \setboolean{flashcards@frame}{true}}
\DeclareOption{fronts}{
  \setboolean{flashcards@backs}{false}}
\DeclareOption{backs}{
  \setboolean{flashcards@fronts}{false}}
\DeclareOption*{
  \InputIfFileExists{\CurrentOption.cfg}{}{
    \typeout{Coudln't find \CurrentOption.cfg, using defualt.}
    \OptionNotUsed}}
\ProcessOptions
\pagestyle{empty}
%<flashcards>\RequirePackage[\cardpaper]{geometry}
%    \end{macrocode}
%
% \subsection*{Setup Paper}
%
%    \begin{macrocode}
\setlength{\oddevenshift}{\oddoffset}
\addtolength{\oddevenshift}{-\evenoffset}
\addtolength{\oddoffset}{-\oddevenshift}
\addtolength{\evenoffset}{\oddevenshift}
\geometry{\cardpapermode,
          \cardpaper,
          top=\topoffset,
          left=\oddoffset,
          right=\evenoffset,
          bottom=0.0in,
          noheadfoot}
\ifthenelse{\boolean{flashcards@dvips}}{\geometry{dvips}}{}
%    \end{macrocode}
%
% \subsection*{Create Row/Column Counters}
%
%    \begin{macrocode}
\newcounter{flashcards@row}
\newcounter{flashcards@col}[flashcards@row]
%    \end{macrocode}
%
% \subsection*{Create Frame and Grid Commands}
%
%    \begin{macrocode}
\ifthenelse{\boolean{flashcards@grid}}
 {\newcommand{\flashcards@gridbox}[1]{%
              \setlength{\fboxsep}{0in}\fbox{#1}}
  \addtolength{\cardwidth}{-2\fboxrule}
  \addtolength{\cardheight}{-2\fboxrule}}
 {\newcommand{\flashcards@gridbox}[1]{#1}}
%
\ifthenelse{\boolean{flashcards@frame}}
 {\newcommand{\flashcards@beginframebox}{%
    \begin{tabular}{|@{\hspace*{\fboxsep}}c@{\hspace*{\fboxsep}}|}%
      \hline}%
  \newcommand{\flashcards@endframebox}{\\ \hline
    \end{tabular}}}
 {\newcommand{\flashcards@beginframebox}{}%
  \newcommand{\flashcards@endframebox}{}}
%    \end{macrocode}
%
% \subsection*{Create Save Boxes}
%
%    \begin{macrocode}
\whiledo{\value{flashcards@row} < \cardrows}{%
  \stepcounter{flashcards@row}%
  \whiledo{\value{flashcards@col} < \cardcolumns}{%
    \stepcounter{flashcards@col}%
    \expandafter\newsavebox
      \csname flashcardFrontR\roman{flashcards@row}%
              C\roman{flashcards@col}\endcsname%
      \global\expandafter\setbox%
        \csname flashcardFrontR\roman{flashcards@row}%
                C\roman{flashcards@col}\endcsname%
        \hbox{\flashcards@gridbox{%
          \parbox[t][\cardheight]
                 [c]{\cardwidth}%
                 {\rule{\cardwidth}{0pt}%
                  \rule{0pt}{\cardheight}}}}%
    \expandafter\newsavebox
      \csname flashcardBackR\roman{flashcards@row}%
              C\roman{flashcards@col}\endcsname%
      \global\expandafter\setbox%
        \csname flashcardBackR\roman{flashcards@row}%
                C\roman{flashcards@col}\endcsname%
        \hbox{\flashcards@gridbox{%
          \parbox[t][\cardheight]
                 [c]{\cardwidth}%
                 {\rule{\cardwidth}{0pt}%
                  \rule{0pt}{\cardheight}}}}%
  }
}
%    \end{macrocode}
%
% \subsection*{Initialize Row/Column Counters}
%
%    \begin{macrocode}
\setcounter{flashcards@row}{1}
\setcounter{flashcards@col}{1}
%    \end{macrocode}
%
% \subsection*{Internal Formatting Commands}
%
%    \begin{macrocode}
\newcommand{\flashcards@frontfoot}{}
%
\newcommand{\flashcards@ps@front@empty}[3]{\@gobble{#1}\@gobble{#2}%
  \flashcards@format@front#3}
\newcommand{\flashcards@ps@front@plain}[3]{\@gobble{#1}\@gobble{#2}%
  \vspace*{\fill}\par%
  \begin{center}\flashcards@format@front#3\end{center}%
  \par\vspace*{\fill}}
\newcommand{\flashcards@ps@front@headings}[3]{%
  {\flashcards@ps@front@head{\flashcards@format@front@head#2}}\par%
  \vspace*{\fill}\begin{center}\flashcards@format@front#3\end{center}%
  \vspace*{\fill}%
  {\flashcards@ps@front@foot{\flashcards@format@front@foot#1}\par%
  \vspace*{\fboxsep}}%
}
%
\newcommand{\flashcards@ps@back@begin@empty}{\flashcards@format@back}
\newcommand{\flashcards@ps@back@end@emtpy}{}
\newcommand{\flashcards@ps@back@begin@plain}
  {\vspace*{\fill}\center\flashcards@format@back}
\newcommand{\flashcards@ps@back@end@plain}{\vspace*{\fill}}
%
\newcommand{\flashcards@ps@front@head@left}[1]{#1}
\newcommand{\flashcards@ps@front@head@right}[1]{\hspace*{\fill}#1}
\newcommand{\flashcards@ps@front@head@center}[1]{\centerline{#1}}
%
\newcommand{\flashcards@ps@front@foot@left}[1]{#1}
\newcommand{\flashcards@ps@front@foot@right}[1]{\hspace*{\fill}#1}
\newcommand{\flashcards@ps@front@foot@center}[1]{\centerline{#1}}
%
\newcommand{\flashcards@ps@front}
  {\flashcards@ps@front@plain}
\newcommand{\flashcards@ps@front@head}
  {\flashcards@ps@front@head@left}
\newcommand{\flashcards@ps@front@foot}
  {\flashcards@ps@front@foot@right}
\newcommand{\flashcards@ps@back@begin}
  {\flashcards@ps@back@begin@plain}
\newcommand{\flashcards@ps@back@end}
  {\flashcards@ps@back@end@plain}
%
\newlength{\flashcards@savelineskip}
\newcommand{\flashcards@lineskip@zero}
  {\setlength{\flashcards@savelineskip}{\lineskip}%
   \setlength{\lineskip}{0pt}}
\newcommand{\flashcards@lineskip@restore}
  {\setlength{\lineskip}{\flashcards@savelineskip}}
%
\newcommand{\flashcards@format@front}
  {\large\bfseries}
\newcommand{\flashcards@format@front@head}
  {\normalsize\scshape}
\newcommand{\flashcards@format@front@foot}
  {\normalsize\scshape}
\newcommand{\flashcards@format@back}{}
%
\setlength{\cardmargin}{0.035\cardwidth}
%    \end{macrocode}
%
% \subsection*{Internal Flushing Commands}
%
%    \begin{macrocode}
\newcommand{\flashcards@flush}
  {\flashcards@flushfronts\flashcards@flushbacks}
%
\ifthenelse{\boolean{flashcards@fronts}}{%
  \newcommand{\flashcards@flushfronts}{%
    \flashcards@lineskip@zero%
    \noindent\raggedright\par%
    \setcounter{flashcards@row}{0}
    \whiledo{\value{flashcards@row} < \cardrows}{%
      \stepcounter{flashcards@row}%
      \whiledo{\value{flashcards@col} < \cardcolumns}{%
        \stepcounter{flashcards@col}%
        \flashcards@gridbox{\usebox{%
          \csname flashcardFrontR\roman{flashcards@row}%
                  C\roman{flashcards@col}\endcsname}}%
        \global\expandafter\setbox%
          \csname flashcardFrontR\roman{flashcards@row}%
                  C\roman{flashcards@col}\endcsname%
          \hbox{\flashcards@gridbox{%
            \parbox[t][\cardheight]
                   [c]{\cardwidth}%
                   {\rule{\cardwidth}{0pt}%
                    \rule{0pt}{\cardheight}}}}%
      }
      \noindent\raggedright\par%
    }
    \clearpage%
    \flashcards@lineskip@restore%
    \setcounter{flashcards@row}{1}%
    \setcounter{flashcards@col}{1}%
  }
}{%
  \newcommand{\flashcards@flushfronts}{}%
}
%
\ifthenelse{\boolean{flashcards@backs}}{%
  \newcommand{\flashcards@flushbacks}{%
    \flashcards@lineskip@zero%
    \noindent\raggedright\par%
    \setcounter{flashcards@row}{0}
    \whiledo{\value{flashcards@row} < \cardrows}{%
      \stepcounter{flashcards@row}%
      \setcounter{flashcards@col}{\cardcolumns}
      \whiledo{\value{flashcards@col} > 0}{%
        \flashcards@gridbox{\usebox{%
          \csname flashcardBackR\roman{flashcards@row}%
                  C\roman{flashcards@col}\endcsname}}%
        \global\expandafter\setbox
          \csname flashcardBackR\roman{flashcards@row}%
                  C\roman{flashcards@col}\endcsname%
        \hbox{\flashcards@gridbox{%
          \parbox[t][\cardheight]
                 [c]{\cardwidth}%
                 {\rule{\cardwidth}{0pt}%
                  \rule{0pt}{\cardheight}}}}%
        \addtocounter{flashcards@col}{-1}%
      }
      \noindent\raggedright\par%
    }
    \clearpage%
    \flashcards@lineskip@restore%
    \setcounter{flashcards@row}{1}%
    \setcounter{flashcards@col}{1}%
  }
}{%
  \newcommand{\flashcards@flushbacks}{}%
}
%
\AtEndDocument{%
  \ifthenelse{\value{flashcards@row} = 1}{%
    \ifthenelse{\value{flashcards@col} = 1}{}{%
  \flashcards@flush}}{\flashcards@flush}%
}
%    \end{macrocode}
%
% \subsection*{User Commands and Environments}
%
%    \begin{macrocode}
%
\newcommand{\cardfrontstyle}[2][]
  {\renewcommand{\flashcards@ps@front}
                {\csname flashcards@ps@front@#2\endcsname}
   \ifthenelse{\equal{#1}{}}{}{%
     \renewcommand{\flashcards@format@front}{#1}}}
%
\newcommand{\cardbackstyle}[2][]
  {\renewcommand{\flashcards@ps@back@begin}
                {\csname flashcards@ps@back@begin@#2\endcsname}
   \renewcommand{\flashcards@ps@back@end}
                {\csname flashcards@ps@back@end@#2\endcsname}
   \ifthenelse{\equal{#1}{}}{}{%
     \renewcommand{\flashcards@format@back}{#1}}}
%
\newcommand{\cardfrontheadstyle}[2][]
  {\renewcommand{\flashcards@ps@front@head}
                {\csname flashcards@ps@front@head@#2\endcsname}
   \ifthenelse{\equal{#1}{}}{}{%
     \renewcommand{\flashcards@format@front@head}{#1}}}
%
\newcommand{\cardfrontfootstyle}[2][]
  {\renewcommand{\flashcards@ps@front@foot}
                {\csname flashcards@ps@front@foot@#2\endcsname}
   \ifthenelse{\equal{#1}{}}{}{%
     \renewcommand{\flashcards@format@front@foot}{#1}}}
%
\newcommand{\cardfrontfoot}[1]
  {\renewcommand{\flashcards@frontfoot}{#1}}
%
\newenvironment{flashcard}[2][]{%
  \setlength{\cardinnerwidth}{\cardwidth}%
  \addtolength{\cardinnerwidth}{-2\cardmargin}%
  \setlength{\cardinnerheight}{\cardheight}%
  \addtolength{\cardinnerheight}{-2\cardmargin}%
  \ifthenelse{\boolean{flashcards@fronts}}{%
    \global\expandafter\setbox%
      \csname flashcardFrontR\roman{flashcards@row}%
              C\roman{flashcards@col}\endcsname%
      \hbox{\begingroup\aftergroup}%
        \begin{minipage}[t][\cardheight]
                        [c]{\cardwidth}%
          \begin{center}%
            \flashcards@beginframebox%
              \begin{minipage}[t][\cardinnerheight]
                              [t]{\cardinnerwidth}%
                \flashcards@ps@front{\flashcards@frontfoot}{#1}{#2}%
              \end{minipage}%
            \flashcards@endframebox%
          \end{center}%
        \end{minipage}%
      \endgroup%
  }{\@gobble{#1}}%
  \global\expandafter\setbox%
    \csname flashcardBackR\roman{flashcards@row}%
            C\roman{flashcards@col}\endcsname%
    \hbox{\begingroup\aftergroup}%
      \begin{minipage}[t][\cardheight]
                      [c]{\cardwidth}%
        \begin{center}%
          \flashcards@beginframebox%
            \begin{minipage}[t][\cardinnerheight]
                            [t]{\cardinnerwidth}%
               \flashcards@ps@back@begin%
}{%
               \flashcards@ps@back@end%
            \end{minipage}%
          \flashcards@endframebox%
        \end{center}%
      \end{minipage}%
    \endgroup%
  \stepcounter{flashcards@col}%
  \ifthenelse{\value{flashcards@col} > \cardcolumns}{%
    \stepcounter{flashcards@row}%
    \ifthenelse{\value{flashcards@row} > \cardrows}{%
      \flashcards@flush%
    }{%
      \setcounter{flashcards@col}{1}%
    }%
  }{}%
}
%</flashcards>
%    \end{macrocode}
%
% \section*{Paper Types}
%   A separate configuration file specifies the details of each
%   paper type.
%
% \subsection*{Avery5371 Business Cards}
%   The $5 \times 2$ business card stock I have been using.  It goes
%   by many other names as well, depending on color and quantity.
%
%    \begin{macrocode}
%<*avery5371>
\newcommand{\cardpapermode}{portrait}
\newcommand{\cardpaper}{letterpaper}
\newcommand{\cardrows}{5}
\newcommand{\cardcolumns}{2}
\setlength{\cardheight}{2.0in}
\setlength{\cardwidth}{3.5in}
\setlength{\topoffset}{0.50in}
\setlength{\oddoffset}{0.75in}
\setlength{\evenoffset}{0.75in}
%</avery5371>
%    \end{macrocode}
%
% \subsection*{Avery5388 Index Cards}
%   Perforated index card stock.
%
%    \begin{macrocode}
%<*avery5388>
\newcommand{\cardpapermode}{portrait}
\newcommand{\cardpaper}{letterpaper}
\newcommand{\cardrows}{3}
\newcommand{\cardcolumns}{1}
\setlength{\cardheight}{3.0in}
\setlength{\cardwidth}{5.0in}
\setlength{\topoffset}{1.0in}
\setlength{\oddoffset}{1.75in}
\setlength{\evenoffset}{1.75in}
%</avery5388>
%    \end{macrocode}
%

\endinput

% \Finale
