% \iffalse meta-comment
% --------------------------------------------------------------
% Part of the TeXPower bundle
% Copyright (C) 1999-2004 Stephan Lehmke
%
% 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.
% --------------------------------------------------------------
%
% powersem.dtx,v 1.3 2005/03/28 22:31:01 hansfn Exp
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{powersem.dtx}
%</driver>
%<powersem>\NeedsTeXFormat{LaTeX2e}
%<powersem>\ProvidesClass{powersem}
%<*powersem>
    [2004/07/27 v0.8a Create online Presentations with seminar.]
%</powersem>
%
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{powersem.dtx}
\end{document}
%</driver>
%
% \fi
%
% \CheckSum{366}
%
% \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         \~}
%
%
% \GetFileInfo{powersem.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \title{The \textsf{powersem} class\thanks{This document
%   corresponds to \textsf{powersem}~\fileversion, dated \filedate.}}
% \author{ Stephan Lehmke \\ \texttt{Stephan.Lehmke@cs.uni-dortmund.de}}
%
% \maketitle
%
% \tableofcontents
%
% \section{Introduction}
%
% The user documentation is found in \texttt{manual.tex} and the FAQ.
% Only the implementation documentation is covered in this document.
%
% Make seminar ready for the Third Millennium ;-)
% This class loads seminar and tries to fix some problems which occur when trying to create dynamic presentations with
% the texpower package. 
%
% Some new features helpful for dynamic presentations are also added.
%
% This class is part of the TeXPower bundle, to be found at\\ % |http://texpower.sourceforge.net/|
%
% The TeXPower bundle also contains a package \texttt{fixseminar.sty} which applies some more fixes, in particular for
% hyperref. These can not be applied here because they have to be made after hyperref is loaded.
%
% \StopEventually{\PrintChanges\PrintIndex}
%
% \section{Implementation}
%
% \changes{v0.1}{1999/10/18}{First version. So far it doesn't do much more than load seminar.}
%
% \changes{v0.2}{2000/03/28}{Force seminar to treat \cs{paperwidth} and \cs{paperheight} in a
% sensible manner.}
%
% \changes{v0.3}{2000/05/10}{Added option `calcdimensions'.}
%
% \changes{v0.4}{2000/06/16}{Now separates text from footnotes when option `display' is given.}
%
% \changes{v0.5}{2000/06/26}{\cs{@colht} is ignored by seminar, which is bad. Added a patch to
% \cs{set@slidesize}.  calcdimensions now handles slide frames.}
%
% \changes{v0.5a}{2000/07/03}{The footnote patch with option display effectively disabled setting
% \cs{centerslidestrue}. Fixed.}
%
% \changes{v0.6}{2001/11/10}{seminar's \cs{output@slide} kernel copied (from seminar.bg2) and
% modified for better color handling and to remove some overfull \cs{vbox} warnings.  There was
% another underfull vbox warning lurking in the footnote patch. Removed.  New option truepagenumbers
% for cooperation with texpower in case `fragmented' slide numbers (like 3.5.1) are used.  Make
% seminar's form of raggedright lines (controlled by \cs{raggedslides}) active in parboxes and
% minipages (and p columns in tables or arrays).}
%
% \changes{v0.7}{2002/11/22}{Inserted \cs{nointerlineskip} in page building code to heal a slight
% problem with vertical spacing.  A small modification was neccessary wrt the KOMA option because
% with fixseminar v0.0.4, pdflatex slides can now be rotated.}
%
% \changes{v0.8}{2003/05/06}{Some fixes provided by Pascal Kockaert to (hopefully) get better
% behaviour with seminar's ``article'' option - many thanks!}
%
% \changes{v0.8a}{2004/07/27}{Moved to dtx format. No other code changes.}
%
%    \begin{macrocode}
\RequirePackage{ifthen}
%    \end{macrocode}
%
% The display option is understood by all relevant classes and packages from the TeXPower bundle. It means that
% `dynamic' features are to be turned on.
% There is a boolean register display (as defined in ifthen.sty) which is set by this option and can be used to
% differentiate between slides for display and slides for printout.
% Notes are disabled automatically.
%    \begin{macrocode}
\newboolean{display}
\DeclareOption{display}
{\setboolean{display}{true}\PassOptionsToClass{slidesonly}{seminar}}
%    \end{macrocode}
%
% The truepagenumbers option makes powersem count pages with the counter page, independently of the counter slide. This
% enables proper working of TeXPowers navigation buttons (some of which calculate relative page numbers) even when the
% counter slide is reset frequently (for slide numberings of the type |<l>.<n>.<m>|).
%    \begin{macrocode}
\newboolean{truepn@PS}
\DeclareOption{truepagenumbers}{\setboolean{truepn@PS}{true}}
%    \end{macrocode}
%
% The KOMA option tells powersem to load scrartcl (from the KOMA suite of document classes) instead of article.
%    \begin{macrocode}
\newboolean{BaseClass@PS}
\DeclareOption{KOMA}
{\setboolean{BaseClass@PS}{true}\providecommand{\baseclass}{scrartcl}}
%    \end{macrocode}
%
% The UseBaseClass option is more neutral: It tells powersem to load the class |\baseclass| (initially article) instead of
% article. 
%    \begin{macrocode}
\DeclareOption{UseBaseClass}
{\setboolean{BaseClass@PS}{true}\providecommand{\baseclass}{article}}
%    \end{macrocode}
%
% The reportclass option tells powersem to load the class |\baseclass| (initially report) instead of
% article. 
%    \begin{macrocode}
\DeclareOption{reportclass}
{\setboolean{BaseClass@PS}{true}\providecommand{\baseclass}{report}}
%    \end{macrocode}
%
% The bookclass option tells powersem to load the class |\baseclass| (initially report) instead of
% article. 
%    \begin{macrocode}
\DeclareOption{bookclass}
{\setboolean{BaseClass@PS}{true}\providecommand{\baseclass}{book}}
%    \end{macrocode}
%
% We need to redefine the a4paper option which is broken in seminar.cls
%    \begin{macrocode}
\DeclareOption{a4paper}{\PassOptionsToClass{a4}{seminar}}
%    \end{macrocode}
%
% The calcdimensions option tells powersem to automatically calculate slidewidth and slideheight from paper dimensions
% and margins.
%    \begin{macrocode}
\newboolean{calcdim@PS}
\DeclareOption{calcdimensions}{\setboolean{calcdim@PS}{true}}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{seminar}}

\ProcessOptions
%    \end{macrocode}
%
% Now we need to hack a little to make seminar load |\baseclass| instead of article (if one of the respectice options was
% given). 
%    \begin{macrocode}
\let\oldLC@PS=\LoadClass

\ifthenelse{\boolean{BaseClass@PS}}
{%
  \def\article@PS{article}
%    \end{macrocode}
% Make |\PassOptionsToClass| and |\LoadClass| use |\baseclass|...
%    \begin{macrocode}
  \let\oldPOTC@PS=\PassOptionsToClass
  \def\PassOptionsToClass#1#2%
  {\edef\cls@PS{#2}%
   \ifx\article@PS\cls@PS\oldPOTC@PS{#1}{\baseclass}%
   \else\oldPOTC@PS{#1}{#2}%
   \fi}
%    \end{macrocode}
% Furthermore, seminar redefines |\paperheight| and |\paperwidth|, saving their value in |\sem@paperheight| and
% |\sem@paperwidth|. We undo this so the paper dimension calculation of typearea can be used.
%    \begin{macrocode}
  \renewcommand{\LoadClass}[2][]%
  {%
    \edef\cls@PS{#2}%
    \ifx\article@PS\cls@PS
      \let\paperheight\sem@paperheight\let\paperwidth\sem@paperwidth
      \oldLC@PS[#1]{\baseclass}%
      \ifarticle\else\portraittrue\fi
     \else
      \oldLC@PS[#1]{#2}%
    \fi
  }%
} 
{}
%    \end{macrocode}
%
% Finally, the seminar class and some bug fixes are loaded.
%    \begin{macrocode}
\oldLC@PS{seminar}

\AtBeginDocument
{%
\input{seminar.bug}%
\input{seminar.bg2}%
}

\expandafter\def\expandafter\set@slidesize\expandafter
{\set@slidesize\@colht\vsize}

\g@addto@macro\@arrayparboxrestore\slide@rightskip

\ifthenelse{\boolean{truepn@PS}}{\truepagenumbers}{}

\AtBeginDocument{%
\ifthenelse{\boolean{BaseClass@PS}}{\sliderotation{none}}{}}
%    \end{macrocode} 
%
% Make some changes in the seminar kernel to hopefully get better handling of text colors and avoid overfull box
% warnings when |\slidetopmargin| and |\slidebottommargin| are set too small.
%    \begin{macrocode}
\AtBeginDocument{%
\ifarticle
\else
  \def\output@slide{%
    \begingroup
      \hoffset=-\inverseslidesmag in
      \voffset=-\inverseslidesmag in
      \setslidelength\@tempdima{%
        \ifportrait\paperwidth\else\paperheight\fi}%
      \setslidelength\@tempdimb{%
        \ifportrait\paperheight\else\paperwidth\fi}%
      \ifrotateheaders
        \@ifrotateslide{%
          \dimen@=\@tempdima
          \@tempdima=\@tempdimb
          \@tempdimb=\dimen@}%
      \fi
      % \oddsidemargin, \evensidemargin, \headheight, \footheight
      % used for scratch:
      \setslidelength\headheight\slidetopmargin
      \setslidelength\footheight\slidebottommargin
      \ifautoslidemargins
        \textwidth=\wd\@slidebox
        \oddsidemargin=\@tempdima
        \advance\oddsidemargin-\textwidth
        \divide\oddsidemargin 2
      \else
        \setslidelength\oddsidemargin\slideleftmargin
        \setslidelength\evensidemargin\sliderightmargin
        \textwidth=\@tempdima
        \advance\textwidth-\oddsidemargin
        \advance\textwidth-\evensidemargin
      \fi
      \setbox\@slidebox=\hbox to \@tempdima{{%    
%    \end{macrocode}
% All double \{\{ around box contents added for better color handling (STL).
%    \begin{macrocode}
      %                                                         
        \kern\oddsidemargin
        \vbox to\@tempdimb{{%
          \ifnum\fancyput@flag>-1
            \hbox{\kern-\oddsidemargin\do@fancyput}%
          \fi
          \let\label\@gobble
          \let\index\@gobble
          \let\glossary\@gobble
          \vbox to\headheight{{%
            \vfill
            \color@hbox
            \normalcolor
           \slideheadfont\relax%\strut         Removed (STL)
           \hb@xt@\textwidth{\@oddhead}%
            \color@endbox
            \kern\z@}}%
          \nointerlineskip
          \vss
          \hbox to\textwidth{{\hss\box\@slidebox\hss}}%
          \vss
          \nointerlineskip
          \vbox to\footheight{{%
            \vfill
              \color@hbox
              \normalcolor
             \slidefootfont\relax%\strut         Removed (STL)
             \hb@xt@\textwidth{\@oddfoot}%
              \color@endbox
            \vfill}}%
        }}\hss}}%
      \ifrotateheaders\@ifrotateslide\rotate@slide\fi
      \insert@specials
      \shipout\box\@slidebox
    \endgroup
    \let\firstmark\botmark
    \ifthenelse{\boolean{truepn@PS}}{\stepcounter{page}}{}%
%    \end{macrocode} 
% The above will seriously upset notes! (STL)
%    \begin{macrocode} 
    }%
  \@ifundefined{fancyput@flag}{\def\fancyput@flag{-1}}{}%
\fi
}
%    \end{macrocode} 
%
% When producing slides to be displayed interactively, we must make absolutely sure that interactive building of slides
% doesn't move text which has already been set. So slides are not to be centered. 
%    \begin{macrocode}
\ifthenelse{\boolean{display}}
{%
  \centerslidesfalse
  \extraslideheight{0pt}%
  \renewcommand{\slideshrink}{0}%
  \def\@makeslide{%
    \ifcenterslides
      \setbox\@slidebox\vbox{{%
        \@begindvi % added 1997/04/15 SPQR
        \unvbox\@cclv
        \ifvoid\slide@footins\else
          \vskip\skip\slide@footins
          \footnoterule
          \unvbox\slide@footins
        \fi
        \vskip\z@}}
     \else
      \setbox\@slidebox\vbox to \slide@vsize{{%
        \@begindvi % added 1997/04/15 SPQR
        \unvbox\@cclv
        \ifvoid\slide@footins\vfil\else
          \vfil\vskip\skip\slide@footins
          \footnoterule
          \unvbox\slide@footins
        \fi
        \vskip\z@}}%
    \fi
    }%
  }
{}
%    \end{macrocode} 
%
% If powersem is asked to calculate the slide dimensions...
%    \begin{macrocode}
\def\relax@PS{\relax}

\ifthenelse{\boolean{calcdim@PS}}
{%
  \AtBeginDocument
  {%
    \setlength{\slidewidth}{\paperwidth}%
    \advance\slidewidth by -\slideleftmargin\relax
    \advance\slidewidth by -\sliderightmargin\relax
    \ifx\theslideframe\relax@PS
     \else
      \advance\slidewidth by -2\slideframewidth\relax
      \advance\slidewidth by -2\slideframesep\relax
    \fi
    \setlength{\slideheight}{\paperheight}%
    \advance\slideheight by -\slidetopmargin\relax
    \advance\slideheight by -\slidebottommargin\relax
    \ifx\theslideframe\relax@PS
     \else
      \advance\slideheight by -2\slideframewidth\relax
      \advance\slideheight by -2\slideframesep\relax
    \fi
    }%
  }
{}

\AtBeginDocument
{%
  \@ifundefined{headwidth}{}
  {%
    \setslidelength{\headwidth}{\paperwidth}%
    \addtoslidelength{\headwidth}{-\slideleftmargin}%
    \addtoslidelength{\headwidth}{-\sliderightmargin}%
  }%
}
%    \end{macrocode} 
% \Finale
\endinput
