% \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
%\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%\ProvidesClass{mikoslides}[2012/01/28 v0.9 Jacobs slides]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{url,array,float}
\usepackage[show]{ed}
\usepackage{graphicx}
\usepackage[hyperref=auto,style=alphabetic]{biblatex}
\bibliography{kwarc}
\makeindex
\floatstyle{boxed}
\newfloat{exfig}{thp}{lop}
\floatname{exfig}{Example}
\def\tracissue#1{\cite{sTeX:online},
\hyperlink{http://trac.kwarc.info/sTeX/ticket/#1}{issue #1}}
\usepackage{hyperref}
\begin{document}\DocInput{mikoslides.dtx}\end{document}
%
% \fi
%
% \CheckSum{364}
%
% \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}
%
% \subsection{Package Options}\label{sec:user:options}
%
% The |mikoslides| class takes a variety of class options:\ednote{leaving out noproblems
% for the momeent until we decide what to do with it.}
% \begin{compactitem}
% \item q\DescribeMacro{showmeta}|showmeta|. If this is set, then the metadata keys are shown
% (see~\cite{Kohlhase:metakeys:ctan} for details and customization options).
% \item The options \DescribeMacro{slides}|slides|\DescribeMacro and {notes}|notes| switch
% between slides mode and notes mode (see Section~\ref{sec:user:notesslides}).
% \item If the option \DescribeMacro{sectocframes}|sectocframes| is given, then special
% frames with section table of contents are producedheaders \ednote{document the functionality}
% \end{compactitem}
%
% \subsection{Notes and Slides}\label{sec:user:notesslides}
%
% \subsection{Header and Footer Lines}\label{sec:user:headfootlines}
%
% \subsection{Colors and Highlighting}\label{sec:user:highlighting}
% The \DescribeMacro{\textwarning}|\textwarning| macro generates a warning sign: \includegraphics[width=1.2em]{dangerous-bend}
% \subsection{Front Matter, Titles, etc}\label{sec:user:matter}
%
% \subsection{Miscellaneous}\label{sec:user:misc}
%
% \section{Limitations}\label{sec:limitations}
%
% In this section we document known limitations. If you want to help alleviate them,
% please feel free to contact the package author. Some of them are currently discussed in
% the \sTeX TRAC~\cite{sTeX:online}.
% \begin{compactenum}
% \item the class should be divided into concerns. \tracissue{1684}
% \end{compactenum}
%
% \StopEventually{\newpage\PrintIndex\newpage\PrintChanges\printbibliography}
%
%\section{The Implementation}\label{sec:impl}
%
% The |mikoslides| package generates two files: the {\LaTeX} package (all the code between
% {\textsf{$\langle$*package$\rangle$}} and {\textsf{$\langle$/package$\rangle$}}) and the
% {\latexml} bindings (between {\textsf{$\langle$*ltxml$\rangle$ and
% $\langle$/ltxml$\rangle$}}). We keep the corresponding code fragments together,
% since the documentation applies to both of them and to prevent them from getting out of
% sync.
%
%\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;
%
% \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>
\DeclareOption{showmeta}{\PassOptionsToPackage{\CurrentOption}{metakeys}}
\newif\ifnotes\notesfalse
\newif\ifsectocframes\sectocframesfalse
\newif\ifproblems\problemstrue
\DeclareOption{notes}{\notestrue}
\DeclareOption{slides}{\notesfalse}
\DeclareOption{noproblems}{\problemsfalse}
\DeclareOption{sectocframes}{\sectocframestrue}
\ifnotes
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{omdoc}}
\else
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}}
\fi
\ProcessOptions
%
%<*ltxml>
RawTeX('\newif\ifnotes\notesfalse');
RawTeX('\newif\ifproblems\problemsfalse');
%
% \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{marginnote}
\RequirePackage[notheorems,noamsthm]{beamerarticle}
\else
\LoadClass[notheorems,noamsthm,10pt]{beamer}
\newcounter{Item}
\newcounter{paragraph}
\newcounter{subparagraph}
\newcounter{Hfootnote}
\usetheme{Jacobs}
\fi
%
%<*ltxml>
LoadClass('omdoc');
DefConstructor('\usetheme{}','');
%
% \end{macrocode}
%
% now, we load the remaining packages for both versions. \ednote{MK: eventually (when tikz
% support is fully realized in \latexml) get rid of the standalone package}
%
% \begin{macrocode}
%<*cls>
\RequirePackage{stex}
\RequirePackage{latexml}
\RequirePackage{amssymb}
\RequirePackage{tikz}
\usepgflibrary{shapes}\usetikzlibrary{arrows}
\RequirePackage{url}
\RequirePackage{amsmath}
\RequirePackage{comment}
\RequirePackage{standalone}
%
%<*ltxml>
RequirePackage('stex');
RequirePackage('latexml');
RequirePackage('amssymb');
RequirePackage('graphicx');
RequirePackage('tikz');
RequirePackage('amsmath');
%
% \end{macrocode}
%
% \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}
%
%<*ltxml>
DefRegister('\slidewidth' => Dimension('13.5cm'));
DefRegister('\slideheight' => Dimension('9cm'));
%
% \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
%
%<*ltxml>
DefEnvironment('{note}','#body');
%
% \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}
%
% \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}
\renewcommand\metakeys@show@keys[2]{\marginnote{{\scriptsize ##2}}}
\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}
%
%<*ltxml>
DefEnvironment('{frame}[]',
""
. "#body\n"
."\n\n",
afterDigestBegin=>sub {
$_[1]->setProperty(theory=>LookupValue('current_module')); });
%#$
% \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
%
%<*ltxml>
DefConstructor('\frametitle{}',
"\n#1");
%
% \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
%
%<*ltxml>
DefEnvironment('{problems}','#body');
%
% \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}}}}
%
% \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\STpresent#1{\textcolor{blue}{#1}}
\def\defemph#1{{\textcolor{magenta}{#1}}}
\def\notemph#1{{\textcolor{magenta}{#1}}}
\def\stDMemph#1{{\textcolor{blue}{#1}}}
\def\@@lec#1{(\textcolor{green}{#1})}
%
%<*ltxml>
#DefMacro('\defemph{}','{\textcolor{magenta}{#1}}');
#DefMacro('\notemph{}','{\textcolor{magenta}{#1}}');
%
% \end{macrocode}
%
% I like to use the dangerous bend symbol for warnings, so we provide it here.
% \begin{macro}{\textwarigrening}
% as the macro can be used quite often we put it into a box register, so that it is only
% loaded once.
% \begin{macrocode}
%<*cls>
\pgfdeclareimage[width=1.5em]{miko@dbend}{dangerous-bend}
\def\textwarning{\raisebox{-.05cm}{\pgfuseimage{miko@dbend}}\xspace}
%b
%<*ltxml>
DefMacro('\textwarning',"");
%
% \end{macrocode}
% \end{macro}
%
% \subsection{Front Matter, Titles, etc}
%
% We need to redefine the frontmatter macros inherited from the |beamer| class, since
% there they take an optional argument.
% \begin{macrocode}
%<*ltxml>
DefMacro('\title[]{}', '\@add@frontmatter{ltx:title}{#1}');
DefMacro('\date[]{}', '\@add@frontmatter{ltx:date}[role=creation]{#1}');
DefMacro('\author[]{}', sub { andSplit(T_CS('\@author'),$_[1]); });#$
% \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>
\newcommand\titleframe{\begin{frame}\titlepage\end{frame}}
\newenvironment{titleframewith}{\begin{frame}\titlepage}{\end{frame}}
\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}}
%
%<*ltxml>
DefConstructor('\titleframe',"titleframe elided here");
DefEnvironment('{titleframewith}',
"begin elided titleframe"
. "#body"
."end elided titleframe");
DefEnvironment('{titleslide}',"");
DefEnvironment('{titleslide}',"#body");
DefEnvironment('{ttitle}', "\n#body");
%
% \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}}
%
%<*ltxml>
%
% \end{macrocode}
% \begin{macrocode}
%<*cls>
\ifsectocframes
%\AtBeginChapter[]{\begin{frame}\frametitle{Chapter Outline}\tableofcontents[currentsection]\end{frame}}
%\AtBeginSection[]{\begin{frame}\frametitle{Section Outline}\tableofcontents[currentsection]\end{frame}}
%\AtBeginSubsection[]{\begin{frame}\frametitle{Subsection Outline}\tableofcontents[currentsubsection]\end{frame}}
%\AtBeginSubsubsection[]{\begin{frame}\frametitle{Subsubsection Outline}\tableofcontents[currentsubsubsection]\end{frame}}
\def\at@begin@omgroup#1{\message{atbeginomgroup}\begin{frame}\frametitle{Outline}\tableofcontents[section]\end{frame}}
\fi
%
%
% \subsection{Miscellaneous}
%
% the following macro is only to work around problems in the |tikz| support in \latexml.
% \begin{macrocode}
%<*cls>
\newcommand\tikzinput[2][]{\input{#2}}
%
%<*ltxml>
DefMacro('\tikzinput[] {}','\includegraphics[#1]{#2}');
%
% \end{macrocode}
% We need to disregard the columns macros introduced by the |beamer| class
% \begin{macrocode}
%<*ltxml>
DefEnvironment('{columns}','#body');
DefEnvironment('{column}{}','#body');
%
% \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',
""
. "?#1(#1)()"
. "",
beforeDigest=>sub {
Let('\group@item@maybe@unwrap','\group@item@unwrap');
#$_[0]->bgroup;
return; },
properties=>sub{ RefStepItemCounter(); });
#DefConstructor('\beamer@itemize@item[] OptionalBeamerOverlay',
# ""
# . "?#1(#1)()",
# properties=>sub{ RefStepItemCounter(); });
DefConstructor('\beamer@enumerate@item[] OptionalBeamerOverlay',
""
. "?#1(#1)()",
properties=>sub{ RefStepItemCounter(); });
DefConstructor('\beamer@description@item[] OptionalBeamerOverlay',
""
. "?#1(#1)()", # trust di and dt to autoclose
properties=>sub{ RefStepItemCounter(); });
%#$
% \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');
%
% \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}
%\ifnotes\else\sf\fi
%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 srcref