% \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