% \iffalse meta-comment
% A LaTeX Class for Jacobs University Slides
% Copyright (c) 2007 Michael Kohlhase, all rights reserved
%               this file is released under the
%               Gnu Library Public Licences (LGPL)
%
% The development version of this file can be found at
% https://svn.kwarc.info/repos/kwarc/projects/stex/sty/mikoslides.dtx
% \fi
% 
% \iffalse
%<cls>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<cls>\ProvidesClass{mikoslides}[2010/06/25 v0.9 Jacobs slides]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{url,array,float}
\usepackage[show]{ed}
\makeindex
\floatstyle{boxed}
\newfloat{exfig}{thp}{lop}
\floatname{exfig}{Example}
\begin{document}\DocInput{mikoslides.dtx}\end{document}
%</driver>
% \fi
% 
% \CheckSum{1}
% 
% \changes{v0.1}{2005/12/06}{Initial Version}
% \changes{v0.2}{2006/01/11}{course notes back on seminar}
% \changes{v0.3}{2007/05/16}{changing to jacobs logo}
% \changes{v0.4}{2007/10/16}{re-basing the whole thing on beamer}
% \changes{v0.4}{2008/09/06}{moving line-end-comment to \texttt{omdoc.dtx}}
% \changes{v0.5}{2009/06/17}{eliminating mytwocolumns, this is better done by \texttt{beamer.cls}}
% \changes{v0.9}{2010/06/18}{this is almost done}
% 
% \GetFileInfo{mikoslides.cls}
% \MakeShortVerb{\|}
%
% \def\twin#1#2{\index{#1!#2}\index{#2!#1}}
% \def\twintoo#1#2{{#1 #2}\twin{#1}{#2}}
% \def\atwin#1#2#3{\index{#1!#2!#3}\index{#3!#2 (#1)}}
% \def\atwintoo#1#2#3{{#1 #2 #3}\atwin{#1}{#2}{#3}}
%
%\def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}}
% \def\stex{\hbox{\raisebox{-.5ex}S\kern-.5ex\TeX}}
% \def\sTeX{\stex}
% \def\cnxml{\scshape{CNXml}}
% \def\connexions{\scshape{Connexions}}
% \def\element#1{{\ttfamily{#1}}}
% \def\snippet#1{{\ttfamily{#1}}}
% \def\cnxlatex{CNX\LaTeX}
% \def\mathml{{\scshape{MathML}}}
% \def\latexml{\hbox{{\LaTeX}ML}}
% \def\omdoc{OMDoc}
% \def\activemath{{\scshape{ActiveMath}}}
% 
% \title{Slides and Course Notes for Jacobs University\thanks{Version {\fileversion}
% (last revised {\filedate})}}
%    \author{Michael Kohlhase\\
%            Jacobs University, Bremen\\
%            \url{http://kwarc.info/kohlhase}}
% \maketitle
%
% \begin{abstract}
%   We present a document class from which we can generate both course slides and course
%   notes in a transparent way. Furthermore, we present a set of {\latexml} bindings for
%   these, so that we can also generate {\omdoc}-based course materials, e.g. for
%   inclusion in the {\activemath} system.
% \end{abstract}
% \tableofcontents\newpage
%\section{Introduction}
% This Document class is derived from |beamer.cls|, specializes it with Jacobs stuff and
% adds a notes version that is more suited to printing than the one supplied by
% |beamer.cls|.
% 
%\section{The User Interface}\label{sec:user}
% \StopEventually{\newpage\PrintChanges}
%
%\section{The Implementation}\label{sec:impl}
%
%\subsection{Initialization and Class Options}\label{sec:impl:init}
%
% For the {\latexml} bindings, we make sure the right perl packages are loaded.
%
%    \begin{macrocode}
%<*ltxml>
# -*- CPERL -*-
package LaTeXML::Package::Pool;
use strict;
use LaTeXML::Package;
%</ltxml>
%    \end{macrocode}
%
% For {\LaTeX} we define some Package Options and switches for the |mikoslides| class and activate
% them by passing them on to |beamer.cls| the appropriate packages.
%
%    \begin{macrocode}
%<*cls>
\newif\ifnotes\notesfalse
\newif\ifproblems\problemstrue
\DeclareOption{notes}{\notestrue}
\DeclareOption{slides}{\notesfalse}
\DeclareOption{noproblems}{\problemsfalse}
\ifnotes\else\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}}\fi
\ProcessOptions
%</cls>
%<*ltxml>
RawTeX('\newif\ifnotes\notesfalse');
RawTeX('\newif\ifproblems\problemsfalse');
%</ltxml>
%    \end{macrocode}
%
% Depending on the options, we either load the |article|-based |omdoc| or the |beamer| class. In the first
% case, we also have to make the |beamer|-specific things available to |article| via the
% |beamerarticle| package. We use options to avoid loading theorem-like environments,
% since we want to use our own from the $\sTeX$ packages. 
%    \begin{macrocode}
%<*cls>
\ifnotes
\LoadClass{omdoc}
\RequirePackage{a4wide}
\RequirePackage[notheorems,noamsthm]{beamerarticle}
\else
\LoadClass[notheorems,noamsthm,10pt]{beamer}
\newcounter{Item}
\newcounter{paragraph}
\newcounter{subparagraph}
\newcounter{Hfootnote}
\usetheme{Jacobs}
\fi
%</cls>
%<*ltxml>
LoadClass('omdoc');
%</ltxml>
%    \end{macrocode}
% 
% now, we load the remaining packages for both versions. 
%
%    \begin{macrocode}
%<*cls>
\RequirePackage{stex}
\RequirePackage{latexml}
\RequirePackage{amssymb}
\RequirePackage{tikz}
\usepgflibrary{shapes}\usetikzlibrary{arrows}
\RequirePackage{url}
\RequirePackage{amsmath}
\RequirePackage{comment}
%</cls>
%<*ltxml>
RequirePackage('stex'); 
RequirePackage('latexml');
RequirePackage('amssymb');
RequirePackage('graphicx');
RequirePackage('tikz');
RequirePackage('amsmath');
%</ltxml>
%    \end{macrocode}
% \begin{oldpart}{we do not seem to load this any more, what to do
% there?}% The |etex.sty| package is needed in the {\LaTeX}, since it makes the extended the number
% of internal registers of the |etex| program available for processing. These tend to run
% out with {\sTeX} otherwise.
% \end{oldpart}
% 
% \subsection{Notes and Slides}\label{sec:impl:noteslides}
%
% We define the sizes of slides in the notes. Somehow, we cannot get by with the same
% here. 
%
%    \begin{macrocode}
%<*cls>
\newcounter{slide}
\newlength{\slidewidth}\setlength{\slidewidth}{13.5cm}
\newlength{\slideheight}\setlength{\slideheight}{9cm}
%</cls>
%<*ltxml>
DefRegister('\slidewidth'     => Dimension('13.5cm'));
DefRegister('\slideheight'     => Dimension('9cm'));
%</ltxml>
%    \end{macrocode}
% 
% For course notes, we define the |note| environment to be a no-operation otherwise we declare the |note| environment as
% a comment via the |comment| package. 
% 
% \begin{environment}{note}
%    \begin{macrocode}
%<*cls>
\ifnotes\renewenvironment{note}{}{}\else\excludecomment{note}\fi
%</cls>
%<*ltxml>
DefEnvironment('{note}','#body');
%</ltxml>
%    \end{macrocode}
% \end{environment}
% 
%
% the next step is to set up the slide boxes in |article| mode. We set up sizes and
% provide a box register for the frames and a counter for the slides.
% 
%    \begin{macrocode}
%<*cls>
\ifnotes
\newlength{\slideframewidth}\setlength{\slideframewidth}{2pt}
\newsavebox{\myframebox}
%</cls>
%    \end{macrocode}
% 
% \begin{environment}{frame}
%   For the |frame| environment we construct a |lrbox| in the |\myframebox| register that
%   we can later put into an |\fbox| so that it looks like a slide.  Furthermore, we
%   redefine the |itenize| environment so that it looks more like the one in |beamer| with
%   |Jacobs| theme.
%    \begin{macrocode}
%<*cls>
\renewenvironment{frame}[1][]%
{\stepcounter{slide}
\def\itemize@level{outer}
\def\itemize@outer{outer}
\def\itemize@inner{inner}
\renewenvironment{itemize}
{\ifx\itemize@level\itemize@outer\def\itemize@label{$\rhd$}\fi
 \ifx\itemize@level\itemize@inner\def\itemize@label{$\scriptstyle\rhd$}\fi
  \begin{list}
    {\itemize@label}
    {\setlength{\labelsep}{.3em}\setlength{\labelwidth}{.5em}\setlength{\leftmargin}{1.5em}}
  \edef\itemize@level{\itemize@inner}}
{\end{list}}
 \noindent\hfill\begin{lrbox}{\myframebox}
   \begin{minipage}{\slidewidth}\sf}%
   {\miko@slidelabel\end{minipage}\end{lrbox}%
 \begin{center}\fbox{\usebox\myframebox}\end{center}\hfill}
%</cls>
%<*ltxml>
DefEnvironment('{frame}[]',
   "<omdoc:omgroup layout='slide' ?#locator(stex:srcref='#locator')()>"
  .  "#body\n"
  ."</omdoc:omgroup>\n\n",
 afterDigestBegin=>sub {
   $_[1]->setProperty(theory=>LookupValue('current_module')); });
%</ltxml>#$
%    \end{macrocode}
% \end{environment}
% 
% the next step is to set up the slide boxes in |article| mode.
% 
%    \begin{macrocode}
%<*cls>
\renewcommand{\frametitle}[1]{{\Large\bf\sf\color{blue}{#1}}}
\fi
\makeindex
%</cls>
%<*ltxml>
DefConstructor('\frametitle{}',
  "\n<omdoc:metadata ?#locator(stex:srcref='#locator')()><dc:title>#1</dc:title></omdoc:metadata>");
%</ltxml>
%    \end{macrocode}
% 
% We start by giving the {\latexml} binding for the |frame| environment from the |beamer|
% class. The |note| environment is used to blend out text in the |slides| mode. It does
% not have a counterpart in OMDoc.
%
%    \begin{macrocode}
%<*cls>
\ifproblems\newenvironment{problems}{}{}\else\excludecomment{problems}\fi
%</cls>
%<*ltxml>
DefEnvironment('{problems}','#body');
%</ltxml>
%    \end{macrocode}
%\ednote{subtitle is difficult to model in DC metadata. I guess that we want to collect
%the subtitle into dc:title}
%
% \subsection{Header and Footer Lines}\label{sec:impl:headfootlines}
%
% Now, we set up the infrastructure for the footer line of the slides, we use boxes for
% the logos, so that they are only loaded once, that considerably speeds up processing.
%    \begin{macrocode}
%<*cls>
\newlength{\slidelogoheight}
\ifnotes\setlength{\slidelogoheight}{.4cm}\else\setlength{\slidelogoheight}{1cm}\fi
\newsavebox{\slidelogo}\sbox{\slidelogo}{\includegraphics[height=\slidelogoheight]{jacobs-logo}}
%    \end{macrocode}
% 
% Now, we set up the copyright and licensing, the copyright remains with the author, but
% we use the Creative Commons Attribuition-ShareAlike license to strengthen den public
% domain. Here the problem is that we want a hyperref on the CC logo, if hyperref is
% loaded, and otherwise not. As hyperref is always loaded, we have to find out at the
% beginning of the document whether it is, set up a switch, and later in the footer line
% decide what to do. 
%
%    \begin{macrocode}
\def\source{Michael Kohlhase}% customize locally
\def\copyrightnotice{\footnotesize\copyright:\hspace{.3ex}{\source}}
\newsavebox{\cclogo}\sbox{\cclogo}{\includegraphics[height=\slidelogoheight]{cc_somerights}}
\newif\ifcchref\cchreffalse
\AtBeginDocument{\@ifpackageloaded{hyperref}{\cchreftrue}{\cchreffalse}}
\def\licensing{\ifcchref\href{http://creativecommons.org/licenses/by-sa/2.5/}{\usebox{\cclogo}}\else{\usebox{\cclogo}}\fi}
%    \end{macrocode}
% 
% Now, we set up the slide label for the |article| mode\ednote{see that we can use the
%   themes for the slides some day. This is all fake.}
%
% \begin{macro}{\slidelabel}
%    \begin{macrocode}
\newcommand{\miko@slidelabel}%
{\vbox to \slidelogoheight{\vss\hbox to \slidewidth%
{\licensing\hfill\copyrightnotice\hfill\arabic{slide}\hfill\usebox{\slidelogo}}}}
%</cls>
%    \end{macrocode}
% \end{macro}
% 
% \subsection{Colors and Highlighting}\label{sec:impl:highlighting}
%
% Now, we set up an infrastructure for highlighting phrases in slides. Note that we use
% content-oriented macros for highlighting rather than directly using color markup. 
% The first thing to to is to adapt the green so that it is dark enough for most beamers
%    \begin{macrocode}
%<*cls>
\AtBeginDocument{\definecolor{green}{rgb}{0,.5,0}\definecolor{purple}{cmyk}{.3,1,0,.17}}
%    \end{macrocode}
%
% We customize the |\defemph|, |\notemph|, and |\stDMemph| macros with colors for the use
% in the |statements| package. Furthermore we customize the |\@@lec| macro for the
% appearance of line end comments in |\lec|.
%
%    \begin{macrocode}
\def\defemph#1{{\textcolor{magenta}{#1}}}
\def\notemph#1{{\textcolor{magenta}{#1}}}
\def\stDMemph#1{{\textcolor{blue}{#1}}}
\def\@@lec#1{(\textcolor{green}{#1})}
%</cls>
%<*ltxml>
#DefMacro('\defemph{}','{\textcolor{magenta}{#1}}');
#DefMacro('\notemph{}','{\textcolor{magenta}{#1}}');
%</ltxml>
%    \end{macrocode}
%
% I like to use the dangerous bend symbol for warnings, so we provide it here.
%    \begin{macrocode}
%<*cls>
\def\textwarning{\raisebox{-.05cm}{\includegraphics[width=1.2em]{dangerous-bend}}\xspace}
%</cls>
%<*ltxml>
DefMacro('\textwarning',"");
%</ltxml>
%    \end{macrocode}
% Now, we specialize the slide environment that we have implemented above or inherited
% from |seminar.cls| for some abbreviations, e.g. separator slides and title slides.
%    \begin{macrocode}
%<*cls>
\newenvironment{ttitle}{\begin{center}\LARGE\begin{tabular}{|c|}\hline}%
 {\\\hline\end{tabular}\end{center}\vspace{1ex minus 1ex}}
\newenvironment{ttitlejoint}[1]%
{\newbox\boxwith\setbox\boxwith\hbox{\begin{tabular}{c}{\em joint work with}\\#1\end{tabular}}%
\begin{center}\LARGE\begin{tabular}{c}\color{red}}%
{\\\box\boxwith\end{tabular}\end{center}%
\vspace{1ex minus 1ex}}
%</cls>
%<*ltxml>
DefEnvironment('{titleslide}',"");
DefEnvironment('{titleslide}',"<omdoc:omgroup ?#locator(stex:srcref='#locator')()>#body</omdoc:omgroup>");
DefEnvironment('{ttitle}', "\n<Title>#body</Title>");
%</ltxml>
%    \end{macrocode}
%
%    \begin{macrocode}
%      Must be first command on slide to make positioning work.
%<*cls>
\newcommand{\putgraphicsat}[3]{%
 \begin{picture}(0,0)\put(#1){\includegraphics[#2]{#3}}\end{picture}}
\newcommand{\putat}[2]{%
 \begin{picture}(0,0)\put(#1){#2}\end{picture}}
%</cls>
%<*ltxml>
%</ltxml>
%    \end{macrocode}
%
% \subsection{Miscellaneous}
%
% Some shortcuts that use math symbols but are not mathematical at all; in particular,
% they should not be translated by {\latexml}.
%
%    \begin{macrocode}
%<*cls>
\newcommand\hateq{\ensuremath{\hat=}}
\newcommand\textleadsto{\ensuremath{\leadsto}}
%</cls>
%<*ltxml>
DefConstructor('\hateq',"=\x{03C2}");
DefConstructor('\textleadsto',"=\x{219D}");
%</ltxml>
%    \end{macrocode}
%
% We need to disregard the columns macros introduced by the |beamer| class
%    \begin{macrocode}
%<*ltxml>
DefEnvironment('{columns}','#body');
DefEnvironment('{column}{}','#body');
%</ltxml>
%    \end{macrocode}
%
% We also need to deal with overlay specifications introduced by the |beamer|
% class.\ednote{this is just to keep latexml quiet, no real functionality here.}
%
% \ednote{Deyan: We reuse the CMP itemizations defined in the omdoc.cls.ltxml binding,
%   adjusting the parameters to be overlay-sensitive }
%    \begin{macrocode}
%<*ltxml>
DefConstructor('\uncover','#1');
#Define a Beamer Overlay Parameter type
 DefParameterType('BeamerOverlay', sub {
   my ($gullet) = @_;
   my $tok = $gullet->readXToken;
   if (ref $tok && ToString($tok) eq '<') {
     $gullet->readUntil(T_OTHER('>'));
   } else {
     $gullet->unread($tok) if ref $tok;
     undef; }},
     reversion=> sub {
 (T_OTHER('<'), $_[0]->revert, T_OTHER('>'));
       });

#Take the "from" field of the overlay range
sub overlayFrom {
  return "" unless defined $_[0];
  my $overlay=ToString($_[0]); $overlay =~ /^(\d+)/; $1;}

#Reuse the CMP itemizations, only adjust the \item constructors.
DefMacro('\beamer@group@item[] OptionalBeamerOverlay IfBeginFollows', sub {
  my($gullet,$tag,$overlay,$needwrapper)=@_;
  $overlay=$overlay||T_OTHER("");
  ( T_CS('\group@item@maybe@unwrap'),
    ($needwrapper ? (Invocation(T_CS('\beamer@group@item@wrap'),$tag,$overlay)->unlist) : ()) ); });
DefConstructor('\beamer@group@item@wrap {} OptionalBeamerOverlay',
       "<omdoc:omtext ?#locator(stex:srcref='#locator')() ?#2(overlay='&overlayFrom(#2)')()>"
       . "?#1(<dc:title>#1</dc:title>)()"
               . "<omdoc:CMP ?#locator(stex:srcref='#locator')()><omdoc:p ?#locator(stex:srcref='#locator')()>",
       beforeDigest=>sub {
 Let('\group@item@maybe@unwrap','\group@item@unwrap');
 #$_[0]->bgroup;
 useCMPItemizations();
 return; },
       properties=>sub{ RefStepItemCounter(); });


DefConstructor('\beamer@itemize@item[] OptionalBeamerOverlay',
       "<omdoc:li ?#locator(stex:srcref='#locator')() ?#2(overlay='&overlayFrom(#2)')() >"
     . "?#1(<dc:title ?#locator(stex:srcref='#locator')()>#1</dc:title>)()",
       properties=>sub{ RefStepItemCounter(); });
DefConstructor('\beamer@enumerate@item[] OptionalBeamerOverlay',
       "<omdoc:li ?#locator(stex:srcref='#locator')() ?#2(overlay='&overlayFrom(#2)')() >"
     . "?#1(<dc:title ?#locator(stex:srcref='#locator')()>#1</dc:title>)()",
       properties=>sub{ RefStepItemCounter(); });
DefConstructor('\beamer@description@item[] OptionalBeamerOverlay',
       "<omdoc:di ?#locator(stex:srcref='#locator')()  ?#2(overlay='&overlayFrom(#2)')() >"
       . "?#1(<omdoc:dt ?#locator(stex:srcref='#locator')()>#1</omdoc:dt>)()<omdoc:dd>", # trust di and dt to autoclose
       properties=>sub{ RefStepItemCounter(); });

#We ALWAYS use the beamer itemizations for the slides:
Let('\CMP@itemize@item'=>'\beamer@itemize@item');
Let('\CMP@enumerate@item'=> '\beamer@enumerate@item');
Let('\CMP@description@item'=> '\beamer@description@item');
Let('\group@item' =>'\beamer@group@item');
Let('\itemize@item'=>'\beamer@group@item');
Let('\enumerate@item'=>'\beamer@group@item');
Let('\description@item'=>'\beamer@group@item');
Let('\only'=>'\beamer@group@item');
%</ltxml>#$
%    \end{macrocode}
% Now, some things that are imported from the |pgf| and |beamer| packages: 
%    \begin{macrocode}
%<*ltxml>
DefMacro('\putgraphicsat{}{}{}','\mygraphics[#2]{#3}');
DefMacro('\putat{}{}','#2');
%</ltxml>
%    \end{macrocode}
% 
% \subsection{Finale}
%
% Finally, we set the slide body font to the sans serife, and we terminate the {\latexml}
% bindings file with a success mark for perl.
%    \begin{macrocode}
%<cls>\ifnotes\else\sf\fi
%<ltxml>1;
%    \end{macrocode}
% \Finale
\endinput

% \iffalse
%%% Local Variables: 
%%% mode: doctex
%%% TeX-master: t
%%% End: 
% \fi

% LocalWords:  mikoslides dtx beamer omdoc notheorems noamsthm beamerarticle
% LocalWords:  graphicx slidelabel stex latexml amssymb tikz url CPERL  amsmath
% LocalWords:  LoadClass RequirePackage DefRegister DefEnvironment omgroup rgb
% LocalWords:  afterDigestBegin setProperty LookupValue DefConstructor hyperref
% LocalWords:  cmyk lec DefMacro titleslide ttitle RawTeX metadata etoolbox
% LocalWords:  noproblems linkcolor bookmarksopen citecolor urlcolor colorlinks
% LocalWords:  breaklinks plainpages pdfpagelabels locator srcref
