% BEGIN semlayer.doc
%%
\def\fileversion{1.0}
\def\filedate{93/04/01}
%%
%% LaTeX style option `semlayer.sty'.
%% For use with LaTeX v2.09 and the `seminar' document style.
%%
%% COPYRIGHT 1993, by Timothy Van Zandt, tvz@Princeton.EDU
%% See seminar.sty or seminar.doc for copying restrictions.
%%
% **************************************************************************
% This is `semlayer.doc', which contains the documented code for
% `semlayer.sty'. You can use it in this form as the input file
% `semlayer.sty'. You can also create a stripped input file using
% sem-make.tex. You can print the documented code using sem-code.tex.
% sem-make.tex and sem-code.tex are distributed with seminar.sty.
% **************************************************************************
%
% \EndDocPreamble
%
% \CheckSum{276}
% \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         \~}
%
%
% \section{Overlays}
%
% The main thing that the "\process@slide" macro does is successively send the
% main slide and then each overlay and layer to a slide output routine. In
% order to make the definition of that macro easier to understand, we first
% set up the overlays interface.
%
% Overlays must be implemented by some extra macros, such as in
% "semcolor.sty". Specifically, the commands "\@overlay" and "\make@overlay"
% should be defined.
%
% The reason for including the interface in "seminar.sty" is to encourage
% those who implement overlays to use a uniform interface, and to illustrate
% how overlays work. To be honest, though, it may not be possible to implement
% overlays without PostScript or a graphics language with similar capabilities
% using the interface that is defined here and without rewriting the basic
% slides macros.
%
% This system of overlays is so good and the system using invisible fonts is
% so lousy, that no special provisions have been made for supporting the
% latter. Actually, overlay should (and could easily) be implemented as \TeX{}
% primitives, saving everyone a lot of trouble.
%
% The system for overlays is not explained here in great detail. See
% "semcolor.sty" and "pstricks.tex" for an example of how overlays can be
% implemented.
%
%    \begin{macrocode}
\addto@hook\before@newslide{%
  \global\def\overlay@list{}%
  \setcounter{overlay}{0}}
%    \end{macrocode}
%
% \begin{macro}{\process@slide,\overlay@loop,\layer@loop}
% "\process@slide" is the beginning of the ``output'' routine for slides.
% "\@slidebox" is copied to "\@@slidebox". The "\make@overlay#1" macro should
% set "\@slidebox" to the contents of "\@@slidebox", but with only the
% material for overlay "#1" visible.
%    \begin{macrocode}
\newbox\@@slidebox
\def\process@@slide{%
  \ifx\overlay@list\@empty
    \finish@slide
    \output@slide
  \else
    \setbox\@@slidebox\box\@slidebox
    \make@overlay{0}%
    \finish@slide
    \output@slide
    {\let\theoverlay\theslide\layer@loop{0}}%
    \overlay@loop
  \fi}
\def\overlay@loop{%
  \begingroup
    \overlay@prep
    \c@overlay=1
    \@whilenum\c@overlay<10
      \do{%
        \test@member{\the\c@overlay}{\overlay@list}%
        \if@test
          \make@overlay{\the\c@overlay}%
          \finish@slide
          \output@slide
        \fi
        \layer@loop{\the\c@overlay}%
        \advance\c@overlay by 1}%
  \endgroup}
\def\layer@loop#1{%
  \begingroup
    \layer@prep
    \@for\currlayer:=\layer@list\do{%
    \test@member{#1-\currlayer}{\overlay@list}%
      \if@test
        \make@overlay{#1-\currlayer}%
        \finish@slide
        \output@slide
      \fi}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\layer@prep,\overlay@prep}
%    \begin{macrocode}
\def\layer@prep{%
  \ifarticle\pagestyle{\layer@pagestyle}\fi
  \let\thepage\thelayer
  \ifx\thelayerframe\@empty\else\let\theslideframe\thelayerframe\fi
  \let\slidelabel\layerlabel}
\def\overlay@prep{%
  \ifarticle\pagestyle{\overlay@pagestyle}\fi
  \let\thepage\theoverlay
  \ifx\theoverlayframe\@empty\else\let\theslideframe\theoverlayframe\fi
  \let\slidelabel\overlaylabel}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\layerframe,\overlayframe}
%    \begin{macrocode}
\def\layerframe{\@slideframe{layer}}
\def\overlayframe{\@slideframe{overlay}}
\def\thelayerframe{}
\def\theoverlayframe{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\overlaylabel,\layerlabel}
%    \begin{macrocode}
\def\overlaylabel{\bf Overlay \theoverlay}
\def\layerlabel{\bf Layer \thelayer}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\theoverlay,\thelayer}
%    \begin{macrocode}
\newcounter{overlay}
\def\theoverlay{\theslide-\alph{overlay}}
\def\currlayer{}
\def\thelayer{\theoverlay-\currlayer}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifoverlays,\iflayers}
% Overlays and layers can be turned on and off independently.
%    \begin{macrocode}
\newif\ifoverlays
\newif\iflayers
\@ifundefined{@overlay}%
  {\let\@overlay\relax}%
  {\ifarticle\else\overlaystrue\layerstrue\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\nooverlays@err,\@overlay}
% "\@overlay" is set to "\relax" if it is not defined, for easy error
% detection.
%    \begin{macrocode}
\def\nooverlays@err{%
  \@seminarerr{You need to use additional macros for overlays,
    e.g., semcolor.sty}\@ehd
  \global\overlaysfalse
  \global\layersfalse}
\@ifundefined{@overlay}{}{}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\overlay}
% The "\overlay" command starts by checking that the argument is a number
% between 0 and 9. If so, "\@overlay" is invoked. Except for overlay 0, the
% counter for cross-references is set to "overlay", and its value is set to
% the argument of "\overlay".
%    \begin{macrocode}
\def\overlay#1{%
  \ifoverlays\ifx\@overlay\relax\nooverlays@err\fi\fi
  \ifslide
    \@tempcnta=#1
    \@testfalse
    \ifnum\@tempcnta>-1 \ifnum\@tempcnta<10 \@testtrue\fi\fi
    \if@test
      \c@overlay=\@tempcnta
      \ifnum\c@overlay=0
        \advance\c@slide by -1
        \refstepcounter{slide}%
      \else
        \advance\c@overlay by -1
        \refstepcounter{overlay}%
        \ifoverlays
          \xdef\overlay@list{\overlay@list,\the\c@overlay}%
        \fi
      \fi
      \ifoverlays
        \@overlay{\the\c@overlay}%
      \fi
    \else
      \@seminarerr{\string\overlay\space argument must be
        an integer between 0 and 9}\@eha
    \fi
  \else
    \@seminarerr{\string\overlay\space can only be used
      in slide environments}\@eha
  \fi
  \ignorespaces}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\colorlayers}
% Color layers use the same mechanism as overlays; only the interface differs.
%    \begin{macrocode}
\def\colorlayers#1{%
  \edef\@tempc{#1}%
  \edef\layer@list{\layer@list,#1}%
  \def\@tempa##1{%
    \@namedef{##1}{%
      \iflayers\ifx\@overlay\relax\nooverlays@err\fi\fi
      \ifslide
        \iflayers
          \xdef\overlay@list{\overlay@list,\the\c@overlay-##1}%
          \@overlay{\the\c@overlay-##1}%
        \fi
      \else
        \@seminarerr{Color layer `##1' can only be used in
          slide environments}\@eha
      \fi}}
  \@for\@tempb:=\@tempc\do{%
    \expandafter\@tempa\expandafter{\@tempb}}}
\def\layer@list{}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\layerpagestyle,\overlaypagestyle}
%    \begin{macrocode}
\def\overlaypagestyle#1{\@ifgoodps{#1}{\edef\overlay@pagestyle{#1}}}
\def\layerpagestyle#1{\@ifgoodps{#1}{\edef\layer@pagestyle{#1}}}
\overlaypagestyle{}
\layerpagestyle{}
%    \end{macrocode}
% \end{macro}
%
\endinput
% END semlayer.doc
