diff options
author | Karl Berry <karl@freefriends.org> | 2016-08-23 16:45:43 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-08-23 16:45:43 +0000 |
commit | dbaf5dc8b5ab0af4d93ec0d70ca70f72ab0d76ca (patch) | |
tree | 3edef261e1fc5fb284f0bfb5d56b2f7998c19861 /Master | |
parent | d73710f127ca9ba9ae3e6cea23dd8a616c053bea (diff) |
beamerswitch
git-svn-id: svn://tug.org/texlive/trunk@41914 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
15 files changed, 3490 insertions, 2 deletions
diff --git a/Master/texmf-dist/doc/latex/beamerswitch/Makefile b/Master/texmf-dist/doc/latex/beamerswitch/Makefile new file mode 100644 index 00000000000..533b127c14f --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/Makefile @@ -0,0 +1,50 @@ +NAME = beamerswitch +SHELL = bash +PWD = $(shell pwd) +TEMP := $(shell mktemp -d -t tmp.XXXXXXXXXX) +TDIR = $(TEMP)/$(NAME) +VERS = $(shell ltxfileinfo -v $(NAME).dtx) +LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL) +UTREE = $(shell kpsewhich --var-value TEXMFHOME) + +.PHONY: clean distclean inst install uninst uninstall zip ctan + +all: $(NAME).pdf $(NAME)-example.pdf clean + @exit 0 +$(NAME).cls $(NAME)-example.tex: $(NAME).dtx + lualatex -synctex=1 -shell-escape -interaction=batchmode $(NAME).dtx >/dev/null +$(NAME).pdf: $(NAME).dtx + latexmk -silent -lualatex -synctex=1 -shell-escape -interaction=batchmode $(NAME).dtx >/dev/null +$(NAME)-example.pdf $(NAME)-example-trans.pdf $(NAME)-example-handout.pdf $(NAME)-example-article.pdf: $(NAME).cls $(NAME)-example.tex + latexmk -silent -lualatex -synctex=1 -shell-escape -interaction=batchmode $(NAME)-example.tex >/dev/null +clean: + rm -f $(NAME){,-example,-example-article,-example-handout,-example-trans}.{aux,bbl,bcf,blg,doc,fdb_latexmk,fls,glo,gls,hd,idx,ilg,ind,listing,log,nav,out,run.xml,snm,synctex.gz,tcbtemp,toc,vrb} + rm -rf _minted-$(NAME) +distclean: clean + rm -f $(NAME).{pdf,ins,cls} $(NAME)-example.{tex,pdf} $(NAME)-example-{article,handout,trans}.pdf +inst: all + mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME) + cp $(NAME).dtx $(NAME).ins $(UTREE)/source/latex/$(NAME) + cp $(NAME).cls $(UTREE)/tex/latex/$(NAME) + cp $(NAME).pdf $(NAME)-example.{tex,pdf} $(NAME)-example-trans.pdf $(NAME)-example-handout.pdf $(NAME)-example-article.pdf README.md $(UTREE)/doc/latex/$(NAME) + mktexlsr +uninst: + rm -r $(UTREE)/{tex,source,doc}/latex/$(NAME) + mktexlsr +install: all + sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME) + sudo cp $(NAME).dtx $(NAME).ins $(LOCAL)/source/latex/$(NAME) + sudo cp $(NAME).cls $(LOCAL)/tex/latex/$(NAME) + sudo cp $(NAME).pdf $(NAME)-example.pdf $(NAME)-example-trans.pdf $(NAME)-example-handout.pdf $(NAME)-example-article.pdf README.md $(LOCAL)/doc/latex/$(NAME) + mktexlsr +uninstall: + sudo rm -r $(LOCAL)/{tex,source,doc}/latex/$(NAME) + mktexlsr +zip: all + mkdir $(TDIR) + cp $(NAME).{pdf,dtx} $(NAME)-example.{tex,pdf} $(NAME)-example-trans.pdf $(NAME)-example-handout.pdf $(NAME)-example-article.pdf $(NAME).cls README.md Makefile $(TDIR) + cd $(TEMP); zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME) +ctan: all + mkdir $(TDIR) + cp $(NAME).{pdf,dtx} $(NAME)-example.pdf $(NAME)-example-trans.pdf $(NAME)-example-handout.pdf $(NAME)-example-article.pdf README.md Makefile $(TDIR) + cd $(TEMP); zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME) diff --git a/Master/texmf-dist/doc/latex/beamerswitch/README.md b/Master/texmf-dist/doc/latex/beamerswitch/README.md new file mode 100644 index 00000000000..b39c964a8e7 --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/README.md @@ -0,0 +1,82 @@ +# beamerswitch: Convenient mode selection in Beamer documents + +This class is a wrapper around the `beamer` class to make it easier to use the +same document to generate the different forms of the presentation: the slides +themselves, an abbreviated slide set for transparencies or online reference, +an n-up handout version, and a transcript or set of notes using the `article` +class. + +## Installation + +### Dependencies + +To compile the documentation you will need to have the `minted` package working, +which in turn relies on Python 2.6+ and Pygments. See the documentation of that +package for details. + +There is an example file that demonstrates the features of the class. +The class itself depends only on packages easily available through TeX +distributions and CTAN. One feature relies on `latexmk` though you can work +around that if you have the patience. + +Note that the zip file on the [Releases] page on GitHub contains all the files +you need, pre-compiled. + +[Releases]: https://github.com/alex-ball/beamerswitch/releases + +### Automated way + +A makefile is provided which you can use with the Make utility: + + * Running `make` generates the class file and documentation. + * Running `make inst` installs the files to your home TeX tree. + * Running `make install` installs the files to the local TeX tree. + * Running `make uninst` uninstalls the files to your home TeX tree. + * Running `make uninstall` uninstalls the files to the local TeX tree. + +### Manual way + +To install the class from scratch, follow these instructions. If you have +downloaded the zip file from the [Releases] page on GitHub, you can skip the +first two steps. + + 1. Process `beamerswitch.dtx` with your favourite version of LaTeX with shell + escape enabled (as required by `minted` for typesetting the listings). You + will also need to run it through `makeindex`. This will generate the class + file and the main documentation (DVI or PDF), plus an example file + `beamerswitch-example.tex`. + + 2. Process `beamerswitch-example.tex` with your favourite version of LaTeX. If + you enable shell escape and have `latexmk` installed you will end up with + another four documents (DVI or PDF). Otherwise you will get one. + + 3. To install the files, create the following folders in your chosen TeX tree + and copy the files across as shown (read `.pdf` as `.dvi` if that is what + you generated): + + * `source/latex/beamerswitch`: + `beamerswitch.dtx`, + (`beamerswitch.ins`) + * `tex/latex/beamerswitch`: + `beamerswitch.cls` + * `doc/latex/beamerswitch`: + `beamerswitch.pdf`, + `beamerswitch-example.tex`, + `beamerswitch-example.pdf`, + `beamerswitch-example-article.pdf`, + `beamerswitch-example-handout.pdf`, + `beamerswitch-example-trans.pdf` + +## Licence + +Copyright 2016 Alex Ball. + +This work consists of the file beamerswitch.dtx and a Makefile. + +This work may be distributed and/or modified under the conditions of the +[LaTeX Project Public License (LPPL)](http://www.latex-project.org/lppl.txt), +either version 1.3c of this license or (at your option) any later version. + +This work is "maintained" (as per LPPL maintenance status) by +[Alex Ball](http://alexball.me.uk/). + diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-article.pdf b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-article.pdf Binary files differnew file mode 100644 index 00000000000..f71c227da88 --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-article.pdf diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-handout.pdf b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-handout.pdf Binary files differnew file mode 100644 index 00000000000..88a721e7f2c --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-handout.pdf diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-trans.pdf b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-trans.pdf Binary files differnew file mode 100644 index 00000000000..8c44105c572 --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example-trans.pdf diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.pdf b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.pdf Binary files differnew file mode 100644 index 00000000000..59c3fb2621c --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.pdf diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.tex b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.tex new file mode 100644 index 00000000000..f1dfc37a9c0 --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch-example.tex @@ -0,0 +1,82 @@ +%% +%% This is file `beamerswitch-example.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% beamerswitch.dtx (with options: `example') +%% ---------------------------------------------------------------- +%% beamerswitch --- Convenient mode selection in Beamer documents +%% Author: Alex Ball +%% E-mail: a.j.ball@bath.ac.uk +%% License: Released under the LaTeX Project Public License v1.3c or later +%% See: http://www.latex-project.org/lppl.txt +%% ---------------------------------------------------------------- +%% +\PassOptionsToClass{a4paper,12pt}{article} +\PassOptionsToClass{14pt}{beamer} +\documentclass[also={trans,handout,article}]{beamerswitch} +\handoutlayout{nup=3plus,border=1pt} +\articlelayout{maketitle,frametitles=none} +\usepackage[british]{babel} +\mode<article>{ + \usepackage[hmargin=3cm,vmargin=2.5cm]{geometry} +} +\mode<presentation>{ + \usefonttheme{professionalfonts} +} +\mode<handout>{ + \usecolortheme{dove} +} +\usepackage{libertine} + +\title{A demonstration of the \textsf{beamerswitch} class} +\subtitle{Testing features} +\author{Alex Ball} +\institute{University of Life} +\date{1 September 2016} +\subject{A LaTeX class} +\keywords{CTAN, literate programming} + +\begin{document} + \begin{frame} + \maketitle + \end{frame} + + This very brief demonstration shows how to use the \textsf{beamerswitch} class. + It allows easy switching between four \textsf{beamer} modes: + + \begin{frame}{Beamer modes} + \begin{itemize}[<+->] + \item \textbf{beamer:} regular slides + \item \textbf{trans:} slides suitable for printing on transparencies + \item \textbf{handout:} slides suitable for printing on paper + \item \textbf{article:} transcript, paper, notes or other article-style + document based on the slides + \end{itemize} + \end{frame} + + Notice how the text outside frames is only shown in article mode. Also, + + \begin{frame}{Features shown in this example} + \begin{itemize}[<+->] + \item Different class options are passed to the \textsf{beamer} and + \textsf{article} classes. + \item The `trans' and `handout' versions do not have the intermediate + slides used by the `beamer' version for uncovering content. + \item The handout has three slides to a page with room for handwritten + notes at the side, and is in black and white. + \end{itemize} + + \uncover<+->{See the source code of this example to see how it was done.} + \end{frame} + + This PDF also has title and author information saved in the metadata (look + at the properties in your PDF viewer). + + Happy {\LaTeX}ing! +\end{document} +%% +%% Copyright (C) 2016 by Alex Ball <a.j.ball@bath.ac.uk> +%% +%% End of file `beamerswitch-example.tex'. diff --git a/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch.pdf b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch.pdf Binary files differnew file mode 100644 index 00000000000..418ad7bf717 --- /dev/null +++ b/Master/texmf-dist/doc/latex/beamerswitch/beamerswitch.pdf diff --git a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx new file mode 100644 index 00000000000..ed9996a4ba4 --- /dev/null +++ b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx @@ -0,0 +1,2318 @@ +% \iffalse meta-comment +%<*internal> +\iffalse +%</internal> +%<*readme> +# beamerswitch: Convenient mode selection in Beamer documents + +This class is a wrapper around the `beamer` class to make it easier to use the +same document to generate the different forms of the presentation: the slides +themselves, an abbreviated slide set for transparencies or online reference, +an n-up handout version, and a transcript or set of notes using the `article` +class. + +## Installation + +### Dependencies + +To compile the documentation you will need to have the `minted` package working, +which in turn relies on Python 2.6+ and Pygments. See the documentation of that +package for details. + +There is an example file that demonstrates the features of the class. +The class itself depends only on packages easily available through TeX +distributions and CTAN. One feature relies on `latexmk` though you can work +around that if you have the patience. + +Note that the zip file on the [Releases] page on GitHub contains all the files +you need, pre-compiled. + +[Releases]: https://github.com/alex-ball/beamerswitch/releases + +### Automated way + +A makefile is provided which you can use with the Make utility: + + * Running `make` generates the class file and documentation. + * Running `make inst` installs the files to your home TeX tree. + * Running `make install` installs the files to the local TeX tree. + * Running `make uninst` uninstalls the files to your home TeX tree. + * Running `make uninstall` uninstalls the files to the local TeX tree. + +### Manual way + +To install the class from scratch, follow these instructions. If you have +downloaded the zip file from the [Releases] page on GitHub, you can skip the +first two steps. + + 1. Process `beamerswitch.dtx` with your favourite version of LaTeX with shell + escape enabled (as required by `minted` for typesetting the listings). You + will also need to run it through `makeindex`. This will generate the class + file and the main documentation (DVI or PDF), plus an example file + `beamerswitch-example.tex`. + + 2. Process `beamerswitch-example.tex` with your favourite version of LaTeX. If + you enable shell escape and have `latexmk` installed you will end up with + another four documents (DVI or PDF). Otherwise you will get one. + + 3. To install the files, create the following folders in your chosen TeX tree + and copy the files across as shown (read `.pdf` as `.dvi` if that is what + you generated): + + * `source/latex/beamerswitch`: + `beamerswitch.dtx`, + (`beamerswitch.ins`) + * `tex/latex/beamerswitch`: + `beamerswitch.cls` + * `doc/latex/beamerswitch`: + `beamerswitch.pdf`, + `beamerswitch-example.tex`, + `beamerswitch-example.pdf`, + `beamerswitch-example-article.pdf`, + `beamerswitch-example-handout.pdf`, + `beamerswitch-example-trans.pdf` + +## Licence + +Copyright 2016 Alex Ball. + +This work consists of the file beamerswitch.dtx and a Makefile. + +This work may be distributed and/or modified under the conditions of the +[LaTeX Project Public License (LPPL)](http://www.latex-project.org/lppl.txt), +either version 1.3c of this license or (at your option) any later version. + +This work is "maintained" (as per LPPL maintenance status) by +[Alex Ball](http://alexball.me.uk/). + +%</readme> +%<*example> +\PassOptionsToClass{a4paper,12pt}{article} +\PassOptionsToClass{14pt}{beamer} +\documentclass[also={trans,handout,article}]{beamerswitch} +\handoutlayout{nup=3plus,border=1pt} +\articlelayout{maketitle,frametitles=none} +\usepackage[british]{babel} +\mode<article>{ + \usepackage[hmargin=3cm,vmargin=2.5cm]{geometry} +} +\mode<presentation>{ + \usefonttheme{professionalfonts} +} +\mode<handout>{ + \usecolortheme{dove} +} +\usepackage{libertine} + +\title{A demonstration of the \textsf{beamerswitch} class} +\subtitle{Testing features} +\author{Alex Ball} +\institute{University of Life} +\date{1 September 2016} +\subject{A LaTeX class} +\keywords{CTAN, literate programming} + +\begin{document} + \begin{frame} + \maketitle + \end{frame} + + This very brief demonstration shows how to use the \textsf{beamerswitch} class. + It allows easy switching between four \textsf{beamer} modes: + + \begin{frame}{Beamer modes} + \begin{itemize}[<+->] + \item \textbf{beamer:} regular slides + \item \textbf{trans:} slides suitable for printing on transparencies + \item \textbf{handout:} slides suitable for printing on paper + \item \textbf{article:} transcript, paper, notes or other article-style + document based on the slides + \end{itemize} + \end{frame} + + Notice how the text outside frames is only shown in article mode. Also, + + \begin{frame}{Features shown in this example} + \begin{itemize}[<+->] + \item Different class options are passed to the \textsf{beamer} and + \textsf{article} classes. + \item The `trans' and `handout' versions do not have the intermediate + slides used by the `beamer' version for uncovering content. + \item The handout has three slides to a page with room for handwritten + notes at the side, and is in black and white. + \end{itemize} + + \uncover<+->{See the source code of this example to see how it was done.} + \end{frame} + + This PDF also has title and author information saved in the metadata (look + at the properties in your PDF viewer). + + Happy {\LaTeX}ing! +\end{document} +%</example> +%<*internal> +\fi +\def\nameofplainTeX{plain} +\ifx\fmtname\nameofplainTeX\else + \expandafter\begingroup +\fi +%</internal> +%<*install> +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble +---------------------------------------------------------------- +beamerswitch --- Convenient mode selection in Beamer documents +Author: Alex Ball +E-mail: a.j.ball@bath.ac.uk +License: Released under the LaTeX Project Public License v1.3c or later +See: http://www.latex-project.org/lppl.txt +---------------------------------------------------------------- + +\endpreamble +\postamble + +Copyright (C) 2016 by Alex Ball <a.j.ball@bath.ac.uk> +\endpostamble + +\usedir{tex/latex/\jobname} +\generate{ + \file{\jobname.cls}{\from{\jobname.dtx}{class}} +} +\usedir{doc/latex/\jobname} +\generate{ + \file{\jobname-example.tex}{\from{\jobname.dtx}{example}} +} +%</install> +%<install>\endbatchfile +%<*internal> +\usedir{source/latex/\jobname} +\generate{ + \file{\jobname.ins}{\from{\jobname.dtx}{install}} +} +\nopreamble\nopostamble +\usedir{doc/latex/\jobname} +\generate{ + \file{README.md}{\from{\jobname.dtx}{readme}} +} +\ifx\fmtname\nameofplainTeX + \expandafter\endbatchfile +\else + \expandafter\endgroup +\fi +%</internal> +%<*driver> +\ProvidesFile{beamerswitch.dtx} +%</driver> +%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<class>\ProvidesClass{beamerswitch} +%<*class> + [2016/08/19 v1.1 Convenient mode selection in Beamer documents] +%</class> +%<*driver> +\documentclass[12pt]{article} +% Page Layout +\usepackage[a4paper,hmargin=30mm,vmargin=25mm,nohead]{geometry} +% Typography +\usepackage[charter,expert]{mathdesign} +\makeatletter +\def\hrulefill{\leavevmode\leaders \hrule height \rulethickness \hfill\kern\z@} +\makeatother +\usepackage{iftex} +\ifPDFTeX + \usepackage[utf8]{inputenc} + \usepackage[T1]{fontenc} + \usepackage[scaled=0.96,sups]{XCharter} + \usepackage[scaled=0.95,tabular]{sourcesanspro} + \usepackage[varl,varqu]{zi4} +\else + \usepackage{fontspec} + \setmainfont + [Scale=0.96 + ,Ligatures=TeX + ]% + {XCharter} + \setsansfont + [Scale=MatchLowercase + ,Ligatures=TeX + ,StylisticSet=4 + ,BoldFont={Source Sans Pro Bold} + ,ItalicFont={Source Sans Pro Italic} + ,BoldItalicFont={Source Sans Pro Bold Italic} + ]% + {Source Sans Pro} + \setmonofont + [Scale=MatchLowercase + ,RawFeature={extend=0.83} + ,BoldFont={Source Code Pro Bold} + ,BoldItalicFont={Source Code Pro Bold} + ,AutoFakeSlant=0.2 + ,ItalicFeatures={StylisticSet=2,StylisticSet=3} + ,BoldItalicFeatures={FakeSlant=0.2,StylisticSet=2,StylisticSet=3} + ]% + {Source Code Pro} +\fi +% Improving the look of the documentation +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\usepackage{multicol} +\usepackage{enumitem} +\setlist[itemize]{% + topsep={6pt plus 2pt minus 1pt},% + partopsep={0pt plus 0.05em},% + itemsep={0.2em plus 0.05em minus 0.05em},% + parsep={0pt plus 0.05em},% +} +\usepackage[bookmarks,raiselinks,pageanchor,hyperindex,colorlinks]{hyperref} +\usepackage{etoolbox} +\usepackage{tcolorbox,doc} +\makeatletter +\renewenvironment{theglossary}{% + \bgroup + \glossary@prologue + \GlossaryParms \let\item\@idxitem \ignorespaces +}{% + \egroup +} +\makeatother +\tcbuselibrary{documentation,breakable,minted} +\colorlet{Option}{violet} +\colorlet{Command}{red!75!black} +\colorlet{Environment}{blue!75!black} +\colorlet{Value}{olive!75!black} +\colorlet{Color}{cyan!75!black} +\tcbset + { listing engine=minted + , minted options= + { breaklines + , fontsize=\footnotesize + , linenos + , numbersep=20pt + , firstnumber=last + } + , index format=pgf + , color command=Command + , color environment=Environment + , color key=Option + , color value=Value + , color color=Color + } +\renewcommand{\theFancyVerbLine}{\footnotesize\itshape\color{gray}\arabic{FancyVerbLine}} +\let\tcbcs=\cs +\renewcommand*{\cs}[1]{\textcolor{Command}{\tcbcs{#1}}} +\def\sqbrackets#1{% + \texttt{\textcolor{Option}{[}#1\textcolor{Option}{]}}} +\def\brackets#1{% + \texttt{\textcolor{Environment}{\char`\{}#1\textcolor{Environment}{\char`\}}}} +\def\marg#1{% + \textcolor{Environment}{\ttfamily\char`\{}\meta{#1}\textcolor{Environment}{\ttfamily\char`\}}} +\newcommand*{\env}[1]{\textcolor{Environment}{\ttfamily #1}} +\newcommand*{\key}[1]{\textcolor{Option}{\ttfamily #1}} +\newcommand*{\val}[1]{\textcolor{Value}{\ttfamily #1}} +\renewenvironment{macro}[1]{% + \def\MyName{#1}% + \index{\MyName@\tcbIndexPrintComC {\MyName}|(emph}% +}{% + \ifdef{\MyName}{}{% + \errmessage{You have closed a macro environment you have not opened on \the\inputlineno.}% + } + \index{\MyName@\tcbIndexPrintComC {\MyName}|)}% +} +\renewenvironment{environment}[1]{% + \def\MyName{#1}% + \index{\MyName@\tcbIndexPrintEnvCA {\MyName}|(emph}% + \index{Environments!\MyName@\tcbIndexPrintEnvC {\MyName}|(emph}% +}{% + \ifdef{\MyName}{}{% + \errmessage{You have closed an environment environment you have not opened on \the\inputlineno.}% + } + \index{Environments!\MyName@\tcbIndexPrintEnvC {\MyName}|)}% + \index{\MyName@\tcbIndexPrintEnvCA {\MyName}|)}% +} +\newenvironment{optionkey}[1]{% + \def\MyName{#1}% + \index{\MyName@\tcbIndexPrintKeyCA {\MyName}|(emph}% + \index{Keys!\MyName@\tcbIndexPrintKeyC {\MyName}|(emph}% +}{% + \ifdef{\MyName}{}{% + \errmessage{You have closed an optionkey environment you have not opened on \the\inputlineno.}% + } + \index{Keys!\MyName@\tcbIndexPrintKeyC {\MyName}|)}% + \index{\MyName@\tcbIndexPrintKeyCA {\MyName}|)}% +} +\newenvironment{optionvalue}[1]{% + \def\MyName{#1}% + \index{\MyName@\tcbIndexPrintValCA {\MyName}|(emph}% + \index{Values!\MyName@\tcbIndexPrintValC {\MyName}|(emph}% +}{% + \ifdef{\MyName}{}{% + \errmessage{You have closed an optionvalue environment you have not opened on \the\inputlineno.}% + } + \index{Values!\MyName@\tcbIndexPrintValC {\MyName}|)}% + \index{\MyName@\tcbIndexPrintValCA {\MyName}|)}% +} +\makeatletter +\newcommand{\resetmintedformat}{% + % Comments + \expandafter\def\csname PYGdefault@tok@c\endcsname{\let\PYGdefault@it=\textit\def\PYGdefault@tc####1{\textcolor{gray}{####1}}} + % Command sequences + \expandafter\def\csname PYGdefault@tok@k\endcsname{\def\PYGdefault@tc####1{\textcolor{Command}{####1}}} + % Optional arguments + \expandafter\def\csname PYGdefault@tok@na\endcsname{\def\PYGdefault@tc####1{\textcolor{Option}{####1}}} + % Braces + \expandafter\def\csname PYGdefault@tok@nb\endcsname{\def\PYGdefault@tc####1{\textcolor{Environment}{####1}}} +} +\apptocmd{\minted@checkstyle}{\resetmintedformat}{}{} +\makeatother +\newcommand{\pkg}[1]{\href{http://www.ctan.org/pkg/#1}{\textsf{#1}}} +\MakeShortVerb{\|} +\makeatletter +\let\PrintMacroName\@gobble +\let\PrintEnvName\@gobble +\renewenvironment{tcb@manual@entry}{\begin{list}{}{% + \setlength{\topsep}{0pt} + \setlength{\partopsep}{0pt} + \setlength{\leftmargin}{\kvtcb@doc@left}% + \setlength{\itemindent}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\rightmargin}{\kvtcb@doc@right}% + }\item}{\end{list}} +\makeatother +% This bit inspired by ydoc +\makeatletter +\newwrite\ydocwrite +\def\ydocfname{\jobname.tcbtemp} +\def\ydoc@catcodes{% + \let\do\@makeother + \dospecials + \catcode`\\=\active + \catcode`\^^M=\active + \catcode`\ =\active +} +\def\macrocode{% + \begingroup + \ydoc@catcodes + \macro@code +} +\def\endmacrocode{} +\begingroup +\endlinechar\m@ne +\@firstofone{% +\catcode`\|=0\relax +\catcode`\(=1\relax +\catcode`\)=2\relax +\catcode`\*=14\relax +\catcode`\{=12\relax +\catcode`\}=12\relax +\catcode`\ =12\relax +\catcode`\%=12\relax +\catcode`\\=\active +\catcode`\^^M=\active +\catcode`\ =\active +}* +|gdef|macro@code#1^^M% \end{macrocode}(* +|endgroup|expandafter|macro@@code|expandafter(|ydoc@removeline#1|noexpand|lastlinemacro)* +)* +|gdef|ydoc@removeline#1^^M(|noexpand|firstlinemacro)* +|gdef|ydoc@defspecialmacros(* +|def^^M(|noexpand|newlinemacro)* +|def (|noexpand|spacemacro)* +|def\(|noexpand|bslashmacro)* +)* +|gdef|ydoc@defrevspecialmacros(* +|def|newlinemacro(|noexpand^^M)* +|def|spacemacro(|noexpand )* +|def|bslashmacro(|noexpand\)* +)* +|endgroup +\def\macro@@code#1{% + {\ydoc@defspecialmacros + \xdef\themacrocode{#1}}% + \PrintMacroCode + \end{macrocode}% +} +\def\PrintMacroCode{% + \begingroup + \let\firstlinemacro\empty + \let\lastlinemacro\empty + \def\newlinemacro{^^J}% + \let\bslashmacro\bslash + \let\spacemacro\space + \immediate\openout\ydocwrite=\ydocfname\relax + \immediate\write\ydocwrite{\themacrocode}% + \immediate\closeout\ydocwrite + \let\input\@input + \tcbinputlisting{breakable,listing only,docexample,listing file=\ydocfname}% + \endgroup +} +\makeatother + +\DisableCrossrefs +\makeindex +%\CodelineIndex +\RecordChanges +\begin{document} + +\GetFileInfo{\jobname.dtx} +\DoNotIndex{\documentclass,\newcommand,\newenvironment} + +\title{\textsf{beamerswitch} --- Convenient mode selection in Beamer documents} +\author{Alex Ball} +\date{Class \fileversion\ --- \filedate} + +\maketitle + +\begin{absquote} +This class is a wrapper around the \pkg{beamer} class to make it easier to use the +same document to generate the different forms of the presentation: the slides +themselves, an abbreviated slide set for transparencies or online reference, +an n-up handout version, and a transcript or set of notes using the \pkg{article} +class. + +To contact the author about this package, please visit the GitHub +page where the code is hosted: \url{https://github.com/alex-ball/beamerswitch}. +\end{absquote} + +\section{Introduction} + +With \pkg{beamer}, it is possible to typeset the same document code in different +ways to get different effects. The result you get depends on a potentially +confusing mix of options, modes, and indeed classes. + +Beamer has five modes for typesetting content. There are three modes that +produce regular slides: + +\begin{itemize} +\item + The \key{beamer} mode relates to the normal, default slide set. +\item + The \key{trans} class option switches to the mode of the same name. It is + intended for transparencies, but is really just an alternative mode that + ignores `bare' overlay specifications. +\item + The \key{handout} class option switches to the mode of the same name. It is + intended for print-friendly versions, but is really just another alternative + mode that ignores `bare' overlay specifications. +\end{itemize} + +The \pkg{beamer} manual shows how to use \key{handout} mode in conjunction +with \pkg{pgfpages} to get several slides on a single side of A4 (or Letter) +paper. + +Beamer can also produce a double-height or double-width slide set, with the +intention that each half will be shown on a different display (e.g. one for +the audience, one for the speaker). There are three variations of this, +activated using \cs{setbeameroption}: + +\begin{itemize} +\item + \key{show notes on second screen} uses the second screen for text marked up + using \cs{note}\marg{text}. +\item + \key{second mode text on second screen} uses the second screen for showing + the slide typeset in \key{second} mode rather than \key{beamer}. Unlike + \key{trans} and \key{handout}, \key{second} responds to `bare' overlay + specifications. +\item + \key{previous slide on second screen}, uses the second screen either for + showing the previous slide or, if the slide has the \key{typeset second} + option set, for showing the current slide typeset in \key{second} mode. +\end{itemize} + +The final variation is to use a different class altogether, such as +\pkg{article}, in conjunction with \pkg{beamerarticle}. In this case the content +is set free-flowing in \key{article} mode, without any of the frame furniture. + +The \pkg{beamer} manual suggests coping with all these variations by having the +document code in one file, and using it as input to other files that each set up +a different mode of operation. This is fine but a bit of a fiddle. It would be +nice to be able to get the same effect using a single file and, ideally, a +single command invocation. + +The \pkg{beamerswitch} class addresses this issue by acting as a wrapper around +the various options, and providing a common interface for switching between +modes. More specifically, it has three main functions: + +\begin{enumerate} +\item + To provide more choice of handout-mode layouts than \pkg{pgfpages} gives you + out-of-the-box. Additionally, I hope you will find the method for selecting + them more memorable. +\item + To enable you to switch to \key{article} mode with a simple change of class + option, instead of having to fiddle with commented-out \cs{documentclass} and + \cs{usepackage} lines. +\item + To allow you to override the \pkg{beamer} mode from the command line, by + choosing a given jobname suffix. Primarily this is to allow you to generate + the different versions programmatically. Indeed, the class provides facilities + for generating multiple versions with a single command. +\end{enumerate} + +\section{Dependencies} + +To use \pkg{beamerswitch}, you will need to have the following packages available +and reasonably up to date on your system. All of these ship with recent \TeX\ +distributions. + +\begin{multicols}{3} + \begin{itemize} + \item \pkg{beamer} + \item \pkg{etoolbox} + \item \pkg{hyperref} + \item \pkg{iftex} + \item \pkg{pgf} + \item \pkg{shellesc} + \item \pkg{xkeyval} + \item \pkg{xstring} + \end{itemize} +\end{multicols} + +One feature of the class uses \pkg{latexmk} by default, though you can configure +it to use something else if you need or want to. + +\section{Loading the class} + +The class is loaded in the usual way: + +\begin{tcolorbox}[docexample,fontupper=\small] +\cs{documentclass}\oarg{options}\brackets{beamerswitch} +\end{tcolorbox} + +The various options are described below. + +\subsection{Choosing the mode of the current run} + +The \pkg{beamerswitch} class, as explained above, does not do much itself but +rather helps you to switch between \pkg{beamer} modes, specifically +\key{article}, \key{beamer}, \key{trans} and \key{handout}. Note that it loads +\pkg{beamer} with the \key{ignorenonframetext} option, so that text outside +frames is only shown in \key{article} mode. + +The normal way of choosing the mode is to use the respective class options. + +\begin{docKey}{article}{}{no value, initially unset} + Switches to \key{article} mode, which uses the \pkg{article} class and + resembles a normal article. +\end{docKey} + +\begin{docKey}{beamer}{}{no value, initially set} + Switches to \key{beamer} mode, which uses the \pkg{beamer} class and + resembles a normal slideshow. +\end{docKey} + +\begin{docKey}{handout}{}{no value, initially unset} + Switches to \key{handout} mode, which uses the \pkg{beamer} class but uses a + different series of overlay specifications. It resembles a set of printed + pages with multiple slides shown on each page. +\end{docKey} + +\begin{docKey}{trans}{}{no value, initially unset} + Switches to \key{trans} mode, which uses the \pkg{beamer} class and + resembles a normal slideshow, but uses a different series of overlay + specifications. +\end{docKey} + +There is, however, a sneaky second way of setting the mode that overrides the +first, and that is to use the \cs{jobname}. By default, this is the name of your +\LaTeX\ file minus the \texttt{.tex} extension, but you can set it to something +else when you run \LaTeX. If you set the \cs{jobname} to end in one of the +following suffixes, the mode will automatically switch: + +\begin{itemize} + \item \texttt{-article} will switch to \key{article} mode. + \item \texttt{-handout} will switch to \key{handout} mode. + \item \texttt{-slides} will switch to \key{beamer} mode. + \item \texttt{-trans} will switch to \key{trans} mode. +\end{itemize} + +The idea is that you can keep your source document the same, but by running +\LaTeX\ with an alternative \cs{jobname}, you can get a different version out +with a meaningfully different file name. + +Of course, you may not want to use those suffixes. Perhaps you want them in +German; perhaps your document's file name already ends in one of them; perhaps +`article' or `trans' doesn't describe what you're using those modes for. The +suffixes are provided by the following commands: + +\begin{docCommand}{ArticleSuffix}{} + Holds the \cs{jobname} suffix that triggers \key{article} mode. +\end{docCommand} + +\begin{docCommand}{BeamerSuffix}{} + Holds the \cs{jobname} suffix that triggers \key{beamer} mode. +\end{docCommand} + +\begin{docCommand}{HandoutSuffix}{} + Holds the \cs{jobname} suffix that triggers \key{handout} mode. +\end{docCommand} + +\begin{docCommand}{TransSuffix}{} + Holds the \cs{jobname} suffix that triggers \key{trans} mode. +\end{docCommand} + +The CamelCase is an admittedly rather obscure signal to you that, if you want to +change them to something else, you should do so via \cs{newcommand} before +loading the class: + +\begin{dispListing} +\newcommand*{\ArticleSuffix}{-script} +\documentclass{beamerswitch} +\end{dispListing} + +\subsection{Using more than one mode at once} + +Another handy feature of the class is that it can spawn parallel compilations, +so you could in theory generate all four versions from a single command. It +achieves this magic by escaping to the shell and running \pkg{latexmk}. Thus +for it to work you need to run \LaTeX\ with shell escape enabled and you need +\pkg{latexmk} to be installed. + +\begin{docKey}{alsoarticle}{}{no value, initially unset} + Spawns a new compilation process in \key{article} mode. +\end{docKey} + +\begin{docKey}{alsobeamer}{}{no value, initially unset} + Spawns a new compilation process in \key{beamer} mode. +\end{docKey} + +\begin{docKey}{alsohandout}{}{no value, initially unset} + Spawns a new compilation process in \key{handout} mode. +\end{docKey} + +\begin{docKey}{alsotrans}{}{no value, initially unset} + Spawns a new compilation process in \key{trans} mode. +\end{docKey} + +\begin{docKey}{also}{=\marg{comma-separated list of modes}}{no default, initially empty} + Spawns compilation processes in each of the specified modes. Note that the + list has to be wrapped in braces, and only the four aforementioned modes are + recognized. +\end{docKey} + +If you would rather use a tool other than \pkg{latexmk} to managed your spawned +compilation processes, it is possible to do that. Bear in mind, though, that +\pkg{beamerswitch} is not clever enough to spot if you have already compiled the +other version on a previous run so you have to take care of that yourself. The +command that does the business is this: + +\begin{docCommand}{BeamerswitchSpawn}{\marg{suffix}} + Spawns a new compilation process with \meta{suffix} appended to the + \cs{jobname}. +\end{docCommand} + +See the \hyperref[sec:implementation]{Implementation} section below for the +default definition. Again, if you want to pre-define this to do something else, +you have to do it before loading the class: + +\begin{dispListing} +\newcommand{\BeamerswitchSpawn}[1]{% + \ShellEscape{...}% +} +\documentclass{beamerswitch} +\end{dispListing} + +\subsection{Improving compatibility} + +\begin{docKey}{nohyperref}{}{no value, initially unset} + The \pkg{beamer} class loads \pkg{hyperref} for you, but when you switch to \key{article} mode, \pkg{beamerarticle} doesn't, so it is easy for you to get + caught out. To protect you from this, \pkg{beamerswitch} \emph{does} load + \pkg{hyperref} in \key{article} mode, with the pleasing side effect that + \cs{subject} and \cs{keywords} then work as intended instead of throwing + errors. + + \medskip + To achieve this, the class has to load \pkg{hyperref} quite early on, which + can cause trouble with certain other packages. If you would rather + load \pkg{hyperref} yourself at a different point, use this option. +\end{docKey} + +\begin{docKey}{textinst}{}{no value, initially unset} + In all modes, patches the \cs{inst} command so that it prints its argument + using \cs{textsuperscript} instead of a mathematical superscript. This helps + avoid unnecessary font changes. +\end{docKey} + +\section{Setting the layout of the handouts} + +The class provides a simplified interface to the \pkg{pgfpages} package. By +default, it prints six slides to a side of A4 paper, but you can change this by +using the following command in the preamble. + +\begin{docCommand}{handoutlayout}{\marg{options}} + Configures the layout of the page when using \key{handout} mode. It has no + effect in other modes. The available \meta{options} are listed below. +\end{docCommand} + +\begin{docKey}{paper}{=\meta{paper size}}{no default, initially \val{a4paper}} + Selects the size of paper to use for \key{handout} mode. The value is passed + directly to \pkg{pgfpages}, so consult the documentation of that package for + the allowed values. You can find them under the documentation for the + \key{resize to} layout. +\end{docKey} + +\begin{docKey}{nup}{=\val{2}\textbar \val{3}\textbar \val{3plus}\textbar \val{4}\textbar \val{4plus}\textbar \val{6}\textbar \val{8}}{no default, initially \val{6}} + Selects how many slides are shown on a single page in \key{handout} mode. + The `plus' layouts leave blank space for recipients to make handwritten notes + next to each slide. The effects of the various values are shown in Figure~\ref{fig:layouts} on page~\pageref{fig:layouts}. Note that the \docValue{2}, + \docValue{3plus}, \docValue{4} and \docValue{6} layouts are intended for + slides in the usual 4:3 aspect ratio, while the \docValue{3}, \docValue{4plus} + and \docValue{8} layouts are intended for widescreen slides. +\end{docKey} + +\newtcolorbox{pseudopage}[1][]% +{sharp corners + ,width=7.1em + ,halign=flush center + ,height=10em + ,valign=center + ,size=fbox + ,boxrule=0.5mm + ,colback=yellow!5 + ,#1 +} +\newtcolorbox{pseudoslide}[1][]% +{nobeforeafter + ,width=3em + ,halign=flush center + ,height=2.25em + ,valign=center + ,size=fbox + ,boxrule=0.5mm + ,colframe=ExampleFrame + ,colback=ExampleBack + ,#1 +} +\newtcolorbox{pseudowideslide}[1][]% +{nobeforeafter + ,width=3em + ,halign=flush center + ,height=1.69em + ,valign=center + ,size=fbox + ,boxrule=0.5mm + ,colframe=ExampleFrame + ,colback=ExampleBack + ,#1 +} +\begin{figure}[t!] + \centering + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage} + \begin{pseudoslide}[width=6em,height=4.5em] + \texttt{1} + \end{pseudoslide}\par\smallskip + \begin{pseudoslide}[width=6em,height=4.5em] + \texttt{2} + \end{pseudoslide} + \end{pseudopage} + \par + (a) \key{nup}=\val{2} + \end{minipage} + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage} + \begin{pseudowideslide}[width=4.89em,height=2.75em] + \texttt{1} + \end{pseudowideslide} + \par\smallskip + \begin{pseudowideslide}[width=4.89em,height=2.75em] + \texttt{2} + \end{pseudowideslide} + \par\smallskip + \begin{pseudowideslide}[width=4.89em,height=2.75em] + \texttt{3} + \end{pseudowideslide} + \end{pseudopage} + \par + (b) \key{nup}=\val{3} + \end{minipage} + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage}[halign=flush left] + \begin{pseudoslide}\texttt{1}\end{pseudoslide} + \par\medskip + \begin{pseudoslide}\texttt{2}\end{pseudoslide} + \par\medskip + \begin{pseudoslide}\texttt{3}\end{pseudoslide} + \end{pseudopage} + \par + (c) \key{nup}=\val{3plus} + \end{minipage} + \par\bigskip + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage}[width=10em,height=7.1em] + \begin{pseudoslide}[width=4em,height=3em] + \texttt{1} + \end{pseudoslide}\enspace + \begin{pseudoslide}[width=4em,height=3em] + \texttt{2} + \end{pseudoslide}\par\smallskip + \begin{pseudoslide}[width=4em,height=3em] + \texttt{3} + \end{pseudoslide}\enspace + \begin{pseudoslide}[width=4em,height=3em] + \texttt{4} + \end{pseudoslide} + \end{pseudopage} + \par + (d) \key{nup}=\val{4} + \end{minipage} + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage}[halign=flush left] + \begin{pseudowideslide}\texttt{1}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{2}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{3}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{4}\end{pseudowideslide} + \end{pseudopage} + \par + (e) \key{nup}=\val{4plus} + \end{minipage} + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage} + \begin{pseudoslide}\texttt{1}\end{pseudoslide} + \begin{pseudoslide}\texttt{2}\end{pseudoslide} + \par\medskip + \begin{pseudoslide}\texttt{3}\end{pseudoslide} + \begin{pseudoslide}\texttt{4}\end{pseudoslide} + \par\medskip + \begin{pseudoslide}\texttt{5}\end{pseudoslide} + \begin{pseudoslide}\texttt{6}\end{pseudoslide} + \end{pseudopage} + \par + (f) \key{nup}=\val{6} + \end{minipage} + \par\bigskip + \begin{minipage}[b]{11em} + \centering + \begin{pseudopage} + \begin{pseudowideslide}\texttt{1}\end{pseudowideslide} + \begin{pseudowideslide}\texttt{2}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{3}\end{pseudowideslide} + \begin{pseudowideslide}\texttt{4}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{5}\end{pseudowideslide} + \begin{pseudowideslide}\texttt{6}\end{pseudowideslide} + \par\medskip + \begin{pseudowideslide}\texttt{7}\end{pseudowideslide} + \begin{pseudowideslide}\texttt{8}\end{pseudowideslide} + \end{pseudopage} + \par + (g) \key{nup}=\val{8} + \end{minipage} + \par + \caption{Handout layouts provided by \pkg{beamerswitch}} + \label{fig:layouts} +\end{figure} + +\begin{docKey}{border}{=\meta{length}}{default 0.4pt, initially 0pt} + Puts a rectangular border of thickness \meta{length} around each slide. Note + that the borders are drawn regardless of whether a slide is actually printed, + so you may end up with empty boxes on the last page. +\end{docKey} + +\begin{docKey}{pnos}{}{no value, initially unset} + Adds page numbers to the bottom of each page. +\end{docKey} + +\section{Changing the look of article mode} + +Some additional options can be set by using the following command in the +preamble. + +\begin{docCommand}{articlelayout}{\marg{options}} + Configures the appearance of \key{article} mode. It has no effect in other + modes. The available \meta{options} are listed below. +\end{docCommand} + +\begin{docKey}{maketitle}{}{no value, initially unset} + In \key{article} mode, adjusts the \cs{maketitle} routine: + \begin{itemize} + \item + The title is printed closer to the top margin. + \item + The subtitle is shown joined to the title using a colon (rather than on a + new line). + \item + The institute is shown directly beneath the author name, similar to the + \pkg{beamer} layout, so you can use \cs{inst} just as in \pkg{beamer} to tie + authors to their affiliations. + \end{itemize} + + If you have \pkg{xparse} (and hence \pkg{expl3}) installed, the class will + detect cases where your title ends in a character like `?' and will not add a + colon to it in that case. You can also suppress the colon manually with the + following code (add it \emph{after} using \cs{title} if automatic detection is + in effect): + +\begin{dispListing} +\toggletrue{titlepunct} +\end{dispListing} +\end{docKey} + +\begin{docKey}{frametitles}{=\val{para}\textbar\val{margin}\textbar\val{none}}{no default, initially \val{para}} + In \key{article} mode, affects how frame titles are printed. By default, + \pkg{beamerarticle} prints them as paragraph headings, represented by + the value \docValue{para}. To have them printed in the margin (using + \cs{marginpar}), use \docValue{margin}. To omit them altogether, use the value + \docValue{none}. +\end{docKey} + +\section{Tips for further configuration} + +There are some other ways to customize the behaviour of the various modes. + +You can use the standard \LaTeX\ methods for customizing how the \pkg{article} +and \pkg{beamer} classes are loaded: + +\begin{dispListing} +\PassOptionsToClass{a4paper,11pt}{article} % for article mode +\PassOptionsToClass{utf8}{beamer} % for beamer, handout, trans modes +\documentclass{beamerswitch} +\end{dispListing} + +And of course there is the standard \pkg{beamer} way of passing different +options to different modes: + +\begin{dispListing} +\documentclass{beamerswitch} +\mode<article>{ + \usepackage[utf8]{inputenc} +} +\mode<beamer>{ + \setbeameroption{second mode text on second screen} +} +\end{dispListing} + +\section{Feedback} + +I hope you find this class useful. Please report any bugs and add any +suggestions for improvements or new features to the +\href{https://github.com/alex-ball/beamerswitch/issues}{Issue Tracker} on GitHub. + +\StopEventually{^^A + \PrintChanges + \printindex +} + +\newpage +\section{Implementation}\label{sec:implementation} + +\setcounter{FancyVerbLine}{18}% +\DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% \iffalse +%<*class> +% \fi +% +% \subsection{Dependencies} +% +% We use the following packages: +% \begin{itemize} +% \item +% \pkg{xkeyval} with \pkg{xkvltxp} for setting options +% \item +% \pkg{etoolbox} for command patches and list processing +% \item +% \pkg{xstring} for comparisons +% \item +% \pkg{shellesc} for running parallel compilations +% \item +% \pkg{iftex} for determining which engine to use +% \end{itemize} +% +% \begin{macrocode} +\RequirePackage{xkeyval,xkvltxp,etoolbox,xstring,shellesc,iftex} +% \end{macrocode} +% +% \subsection{Class options} +% +% We recognize four main modes of operation: `beamer', `trans', `handout', and +% `article'. +% +% \begin{optionkey}{beamer} +% The \key{beamer} option triggers beamer mode. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{beamer}[true]{% + \ifbool{DC@beamerswitch@beamer}{% + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{handout=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{trans} +% The \key{trans} option triggers trans mode. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{trans}[true]{% + \ifbool{DC@beamerswitch@trans}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{handout=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{handout} +% The \key{handout} option triggers handout mode. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{handout}[true]{% + \ifbool{DC@beamerswitch@handout}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{article} +% The \key{article} option triggers article mode. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{article}[true]{% + \ifbool{DC@beamerswitch@article}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{handout=false} + }{}% +} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{also} +% \begin{optionkey}{alsobeamer} +% \begin{optionkey}{alsotrans} +% \begin{optionkey}{alsohandout} +% \begin{optionkey}{alsoarticle} +% \begin{macro}{beamerswitch@SetAlso} +% The \key{also} option allows the user to specify a set of alternative modes +% to typeset in parallel, in a comma-separated list. Alternatively, the user +% can specify the Boolean \key{also*} options directly. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{alsobeamer}[true]{} +\define@boolkey[DC]{beamerswitch}{alsotrans}[true]{} +\define@boolkey[DC]{beamerswitch}{alsohandout}[true]{} +\define@boolkey[DC]{beamerswitch}{alsoarticle}[true]{} +\newcommand{\beamerswitch@SetAlso}[1]{% + \key@ifundefined[DC]{beamerswitch}{also#1}{% + \ClassWarning{beamerswitch}{`#1' is not a valid value for option `also'}% + }{% + \setkeys[DC]{beamerswitch}{also#1}% + }% +} +\define@key[DC]{beamerswitch}{also}{% + \forcsvlist{\beamerswitch@SetAlso}{#1}% +} +% \end{macrocode} +% \end{macro} +% \end{optionkey} +% \end{optionkey} +% \end{optionkey} +% \end{optionkey} +% \end{optionkey} +% +% \begin{optionkey}{nohyperref} +% The \key{nohyperref} option stops the class from loading the \pkg{hyperref} +% package in article mode. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{nohyperref}[true]{} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{textinst} +% The \key{textinst} option adjusts the superscript used for institution +% markers. +% +% \begin{macrocode} +\define@boolkey[DC]{beamerswitch}{textinst}[true]{} +% \end{macrocode} +% \end{optionkey} +% +% The default behaviour is to use beamer mode only. +% +% \begin{macrocode} +\setkeys[DC]{beamerswitch}{beamer=true,alsobeamer=false,alsotrans=false,% + alsohandout=false,alsoarticle=false} +% \end{macrocode} +% +% Now we process the options given by the user. +% +% \begin{macrocode} +\ProcessOptionsX[DC]<beamerswitch> +% \end{macrocode} +% +% \subsection{Jobname-based mode switching} +% +% \begin{macro}{BeamerSuffix} +% \begin{macro}{TransSuffix} +% \begin{macro}{HandoutSuffix} +% \begin{macro}{ArticleSuffix} +% We define some default values for the special suffixes. +% +% \begin{macrocode} +\providecommand*{\BeamerSuffix}{-slides} +\providecommand*{\TransSuffix}{-trans} +\providecommand*{\HandoutSuffix}{-handout} +\providecommand*{\ArticleSuffix}{-article} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{BeamerswitchSpawn} +% We provide a special routine for spawning new \LaTeX\ processes. We allow +% for the possibility of the user overriding this routine with another one, +% perhaps using a different automation tool. +% +% \begin{macrocode} +\providecommand{\BeamerswitchSpawn}[1]{% + \ifbool{PDFTeX}{% + \ShellEscape{latexmk -silent -pdf -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ifbool{LuaTeX}{% + \ShellEscape{latexmk -silent -lualatex -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ifbool{XeTeX}{% + \ShellEscape{latexmk -silent -xelatex -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ShellEscape{latexmk -silent -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }% + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% We check for special jobnames and use them to override the above mode-related +% options. Note that if this happens, the \key{also*} options are ignored. +% +% \begin{macrocode} +\IfEndWith*{\jobname}{\BeamerSuffix}{% + \setkeys[DC]{beamerswitch}{beamer=true} +}{% + \IfEndWith*{\jobname}{\TransSuffix}{% + \setkeys[DC]{beamerswitch}{trans=true} + }{% + \IfEndWith*{\jobname}{\HandoutSuffix}{% + \setkeys[DC]{beamerswitch}{handout=true} + }{% + \IfEndWith*{\jobname}{\ArticleSuffix}{% + \setkeys[DC]{beamerswitch}{article=true} + }{% + \ifbool{DC@beamerswitch@alsobeamer}{% + \BeamerswitchSpawn{\BeamerSuffix}% + }{} + \ifbool{DC@beamerswitch@alsotrans}{% + \BeamerswitchSpawn{\TransSuffix}% + }{} + \ifbool{DC@beamerswitch@alsohandout}{% + \BeamerswitchSpawn{\HandoutSuffix}% + }{} + \ifbool{DC@beamerswitch@alsoarticle}{% + \BeamerswitchSpawn{\ArticleSuffix}% + }{} + }% + }% + }% +}% +% \end{macrocode} +% +% \subsection{Setting up modes} +% +% For article mode, we load the \pkg{article} class and the \pkg{beamerarticle} +% support package. Apologies for anyone hoping for \pkg{scrartcl} or +% \pkg{memoir} alternatives. +% +% \begin{macrocode} +\ifbool{DC@beamerswitch@article}{% + \LoadClass{article} + \RequirePackage{beamerarticle} +% \end{macrocode} +% +% It seems as though \pkg{beamerarticle} expects \pkg{hyperref} to be loaded, +% but doesn't actually do it itself. So we oblige, using the default options +% specified by \pkg{beamer}. +% +% \begin{macrocode} + \ifbool{DC@beamerswitch@nohyperref}{}{% + \RequirePackage[bookmarks=true,% + bookmarksopen=true,% + pdfborder={0 0 0},% + pdfhighlight={/N},% + linkbordercolor={.5 .5 .5}]{hyperref}% + } +% \end{macrocode} +% +% While \pkg{beamer} takes care of adding presentation metadata to the PDF +% properties, \pkg{beamerarticle} misses the title and author properties. (It +% does manage to set the subject and keywords, though.) We achieve parity with +% some additional \cs{hypersetup}. Note that \pkg{beamerarticle} appends the +% subtitle to \cs{@title} with a linebreak and this does odd things in the +% context of \key{pdftitle}, so we fix it with \cs{pdfstringdefDisableCommands}. +% +% \begin{macrocode} + \AtBeginDocument{% + \@ifpackageloaded{hyperref}{% + \pdfstringdefDisableCommands{\def\\<#1>#2{ - #2}} + \begingroup + \hypersetup{pdftitle={\@title}}% + \def\and{\unskip, }% + \let\thanks=\@gobble + \let\inst=\@gobble + \hypersetup{pdfauthor={\@author}}% + \endgroup + }{}% + } +}{% +% \end{macrocode} +% +% +% For the presentation modes, we load the \pkg{beamer} class with appropriate +% options. Since we are targeting users wanting different versions of their +% presentations with the same code, we activate \key{ignorenonframetext}. +% +% \begin{macrocode} + \ifbool{DC@beamerswitch@handout}{% + \LoadClass[ignorenonframetext,handout]{beamer} +% \end{macrocode} +% +% Handout mode lays multiple slides out on a single page. For this we use +% \pkg{pgfpages}. The actual configuration is handled later. +% +% \begin{macrocode} + \RequirePackage{pgfpages} +% \end{macrocode} +% +% We also activate \key{ignorenonframetext} for the other two modes. +% +% \begin{macrocode} + }{% + \ifbool{DC@beamerswitch@trans}{% + \LoadClass[ignorenonframetext,trans]{beamer} + }{% + \LoadClass[ignorenonframetext]{beamer} + }% + } +} +% \end{macrocode} +% +% \subsection{Mode-independent layout} +% +% We implement the option that formats institution markers in text mode rather +% than math mode. +% +% \begin{macrocode} +\ifbool{DC@beamerswitch@textinst}{% + \def\beamer@insttitle#1{\textsuperscript{#1}} + \def\beamer@instinst#1{\textsuperscript{#1}\ignorespaces} +}{} +% \end{macrocode} +% +% \subsection{Handout layout} +% +% \begin{macro}{beamerswitch@Border} +% We set up a command for drawing borders around the slides in handout mode. +% This is initially set up to do nothing. +% +% \begin{macrocode} +\newcommand*{\beamerswitch@Border}{\relax} +% \end{macrocode} +% \end{macro} +% +% Though \pkg{pgfpages} defines some perfectly fine layouts, we need to add +% configurability to the existing ones and provide some new ones. +% +% The `1 by 2' layout is similar to the normal \key{2 on 1} layout. +% +% \begin{macrocode} +\mode<handout>{% + \pgfpagesdeclarelayout{1 by 2} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=2,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \fi + } +% \end{macrocode} +% +% The `1 by 3' layout is similar to the `1 by 2', but with an extra row. +% +% \begin{macrocode} + \pgfpagesdeclarelayout{1 by 3} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=3,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } +% \end{macrocode} +% +% The `1 by 3 narrow' layout is like the `1 by 3' layout but restricted to the +% left (or top) half of the page. +% +% \begin{macrocode} + \pgfpagesdeclarelayout{1 by 3 narrow} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=3,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } +% \end{macrocode} +% +% The `2 by 2' layout is similar to the normal \key{4 on 1} layout. +% +% \begin{macrocode} + \pgfpagesdeclarelayout{2 by 2} + { + \edef\pgfpageoptionheight{\the\paperheight} + \edef\pgfpageoptionwidth{\the\paperwidth} + \edef\pgfpageoptionborder{0pt} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=4,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth% + } + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + } +% \end{macrocode} +% +% The `1 by 4 narrow' layout puts four slides in a column on the left half of +% the page (or in a row on the top half). +% +% \begin{macrocode} + \pgfpagesdeclarelayout{1 by 4 narrow} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=4,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \fi + } +% \end{macrocode} +% +% The `2 by 3' layout positions the slides as three rows of two slides each. +% +% \begin{macrocode} + \pgfpagesdeclarelayout{2 by 3} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=6,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } +% \end{macrocode} +% +% The `2 by 4' layout layout positions the slides as four rows of two slides each. +% +% \begin{macrocode} + \pgfpagesdeclarelayout{2 by 4} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=8,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{7} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{8} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{7} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{8} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \fi + } +} +% \end{macrocode} +% +% \begin{optionkey}{paper} +% \begin{macro}{beamerswitch@handoutpaper} +% In theory it would be nice to anticipate the paper size that the article mode +% would use, and pass that as an option to \cs{pgfpagesuselayout} but as that's +% unlikely to be clean code, we settle here for setting it with an option. +% +% \begin{macrocode} +\define@key[HL]{beamerswitch}{paper}{% + \def\beamerswitch@handoutpaper{#1}% +} +% \end{macrocode} +% \end{macro} +% \end{optionkey} +% +% \begin{optionkey}{nup} +% \begin{optionvalue}{2} +% \begin{optionvalue}{3} +% \begin{optionvalue}{3plus} +% \begin{optionvalue}{4} +% \begin{optionvalue}{4plus} +% \begin{optionvalue}{6} +% \begin{optionvalue}{8} +% The \key{nup} option specifies how many slides to include per page. +% The `plus' keyword indicates a layout with additional gaps for writing. +% +% \begin{macrocode} +\newcounter{beamerswitch@nupcase} +\define@choicekey+[HL]{beamerswitch}{nup}[\val\nr]{2, 3, 3plus, 4, 4plus, 6, 8}{% + \setcounter{beamerswitch@nupcase}{\nr} +}{% + \ClassWarning{beamerswitch}{Value of `nup' not recognized. + Allowed values are 2, 3, 3plus, 4, 4plus, 6, and 8.}% +} +% \end{macrocode} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionvalue} +% \end{optionkey} +% +% \begin{optionkey}{border} +% The \key{borders} option switches on borders around the slides on handout +% pages (and gaps where slides would appear if there were enough). The value +% is used to set the width of the border. +% +% \begin{macrocode} +\define@key[HL]{beamerswitch}{border}[0.4pt]{% + \RequirePackage{pgf}% + \renewcommand*{\beamerswitch@Border}{\pgfsetlinewidth{#1}\pgfstroke}% +} +% \end{macrocode} +% \end{optionkey} +% +% \begin{optionkey}{pnos} +% The \key{pnos} option switches on page numbers for handout pages. +% +% \begin{macrocode} +\define@boolkey[HL]{beamerswitch}{pnos}[true]{} +% \end{macrocode} +% \end{optionkey} +% +% \begin{macro}{handoutlayout} +% \begin{macro}{beamerswitch@nup} +% We set up the \cs{handoutlayout} command for applying these options. +% +% \begin{macrocode} +\newcommand*{\handoutlayout}[1]{% + \only<handout>{% + \setkeys[HL]{beamerswitch}{#1}% + \ifcase\value{beamerswitch@nupcase}\relax + \def\beamerswitch@nup{2} + \pgfpagesuselayout{1 by 2}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{3} + \pgfpagesuselayout{1 by 3}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{3} + \pgfpagesuselayout{1 by 3 narrow}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{4} + \pgfpagesuselayout{2 by 2}[\beamerswitch@handoutpaper,landscape,border shrink=5mm]% + \or + \def\beamerswitch@nup{4} + \pgfpagesuselayout{1 by 4 narrow}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{6} + \pgfpagesuselayout{2 by 3}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{8} + \pgfpagesuselayout{2 by 4}[\beamerswitch@handoutpaper,border shrink=5mm]% + \fi + \ifbool{HL@beamerswitch@pnos}{% + \def\pgfsys@endpicture{% + \raisebox{5mm}[0pt][0pt]{% + \makebox[\pgfphysicalwidth]{% + \the\numexpr\value{page}/\beamerswitch@nup\relax + }% + }% + }% + }{}% + }% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +% +% We initialize the class with a layout of six slides on A4 paper. +% +% \begin{macrocode} +\handoutlayout{paper=a4paper,nup=6} +% \end{macrocode} +% +% \subsection{Article layout} +% +% We provide some options for configuring the appearance of article mode. +% +% \begin{optionkey}{maketitle} +% The \key{maketitle} option triggers adjustments in how the title block is +% printed. +% +% \begin{macrocode} +\define@boolkey[AL]{beamerswitch}{maketitle}[true]{} +% \end{macrocode} +% \end{optionkey} +% +% One will be to join the title and subtitle with a colon. There is an edge case +% where, if the user provides a title that ends in `!' or `?' \emph{and} +% provides a subtitle while this option is in effect, they will end up with +% clashing punctuation in the middle of the displayed title (`!:' or `?:'). We +% therefore introduce a toggle that, if set true, suppresses the additional +% colon. +% +% \begin{macrocode} +\newtoggle{titlepunct} +% \end{macrocode} +% +% \begin{macro}{bsw@punct@test} +% Of course, we would rather not bother the user with this, so we introduce a +% command for testing the title for final punctuation. +% +% The only way I can seem to do this is by switching to \pkg{expl3} syntax. +% Rather than introduce extra hard dependencies to cope with what will probably +% be quite a rare issue, we make the dependency soft: it will only be applied +% if \pkg{xparse} is available. If there is demand for it, we could introduce +% a class option to switch this code on or off, but let's see how we go. +% +% \begin{macrocode} +\IfFileExists{xparse.sty}{\@tempswatrue}{\@tempswafalse} +\if@tempswa + \RequirePackage{xparse} + \ExplSyntaxOn + \NewDocumentCommand{\bsw@punct@test}{m}{\l_bsw_punct_test:n {#1}} + \cs_new_protected:Nn \l_bsw_punct_test:n + { + \str_case_x:nnTF { \str_item:nn {#1} {-1} } + { + { , } { } + { ; } { } + { : } { } + { . } { } + { ! } { } + { ? } { } + } + { \global\toggletrue{titlepunct} } + { \global\togglefalse{titlepunct} } + } + \ExplSyntaxOff +% \end{macrocode} +% +% We insert this test into the definitions for \cs{title} introduced by +% \pkg{beamer}\slash\pkg{beamerarticle}. +% +% \begin{macrocode} + \mode<article>{% + \renewcommand{\title}[2][]{\beamer@origtitle{#2}\bsw@punct@test{#2}} + } + \mode<presentation>{% + \long\def\beamer@title[#1]#2{% + \def\inserttitle{#2}% + \def\beamer@shorttitle{#1}% + \bsw@punct@test{#2}% + } + } +\else + \wlog{Beamerswitch: Auto-detection of title punctuation not available.} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{optionkey}{frametitles} +% \begin{macro}{beamerswitch@articleframetitles} +% We offer some alternatives for handling frame titles in article mode. +% \begin{itemize} +% \item +% \val{para} is what \pkg{beamerarticle} normally does. +% \item +% \val{margin} puts the frame titles in the margin. +% \item +% \val{none} gets rid of them entirely. +% \end{itemize} +% +% \begin{macrocode} +\define@choicekey+[AL]{beamerswitch}{frametitles}{para, margin, none}{% + \def\beamerswitch@articleframetitles{#1}% +}{% + \ClassWarning{beamerswitch}{Value of `frametitles' not recognized. + Allowed values are para, margin, and none.}% +} +% \end{macrocode} +% \end{macro} +% \end{optionkey} +% +% \begin{macro}{articlelayout} +% We provide a command for setting these options. +% +% \begin{macrocode} +\newcommand{\articlelayout}[1]{% + \setkeys[AL]{beamerswitch}{#1}% +% \end{macrocode} +% +% The following options are mode specific. +% +% \begin{macrocode} + \mode<article>{% +% \end{macrocode} +% +% Personally I find slide titles somewhat intrusive in article mode. They can +% easily end up duplicating section headings in running text, or captions in +% figures. You may have other ideas, so we keep this behaviour configurable. +% +% The \val{margin} value is implemented using \cs{marginpar}. +% +% \begin{macrocode} + \ifcsstring{beamerswitch@articleframetitles}{margin}{% + \setbeamertemplate{frametitle}{% + \marginpar[% + \raggedleft\noindent\emshape\textbf{\insertframetitle}\par + \noindent\insertframesubtitle\par + ]{% + \raggedright\noindent\emshape\textbf{\insertframetitle}\par + \noindent\insertframesubtitle\par + }% + } + }{% + \ifcsstring{beamerswitch@articleframetitles}{none}{% + \setbeamertemplate{frametitle}{} + }{% + \ifcsstring{beamerswitch@articleframetitles}{para}{% + \setbeamertemplate{frametitle}[default] + }{}% + }% + } +% \end{macrocode} +% +% This is where we make our adjustments to \cs{maketitle}. We start by joining +% the subtitle to the title by means of a colon instead of a newline. +% +% \begin{macrocode} + \ifbool{AL@beamerswitch@maketitle}{% + \renewcommand{\subtitle}[2][]{% + \def\insertsubtitle{##2}\gappto\@title{\iftoggle{titlepunct}{}{:} ##2}% + } +% \end{macrocode} +% +% We add support for printing the institute information. +% +% \begin{macrocode} + \ifundef{\beamer@originstitute}{% + \renewcommand{\institute}[2][]{\def\insertinstitute{##2}}% + }{% + \renewcommand{\institute}[2][]{\def\insertinstitute{##2}\beamer@originstitute{##2}}% + }% +% \end{macrocode} +% +% Our first change to \cs{maketitle} itself is to remove the initial vertical +% space. +% +% \begin{macrocode} + \def\@maketitle{% + \newpage + \null + \begin{center}% + \let\footnote\thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {% + \large\lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par + }% +% \end{macrocode} +% +% The other is to add in a row for the institute information. +% +% \begin{macrocode} + \ifdefvoid{\insertinstitute}{}{% + {% + \normalsize\lineskip .5em% + \begin{tabular}[t]{c}% + \insertinstitute + \end{tabular}\par + }% + }% + \vskip 1em% + {\large \@date}% + \end{center}% + \par\vskip 1.5em% + }% + }{}% + }% +% \end{macrocode} +% +% For consistency, if the \key{maketitle} option has been passed, we change the +% PDF metadata in the other modes to use the colon convention for joining the +% title and subtitle. +% +% \begin{macrocode} + \mode<presentation>{% + \ifbool{AL@beamerswitch@maketitle}{% + \ifbool{beamer@autopdfinfo}{% + \patchcmd{\beamer@firstminutepatches}{% + \inserttitle\ifx\insertsubtitle\@empty\else\ - \insertsubtitle\fi + }{% + \inserttitle\ifx\insertsubtitle\@empty\else\iftoggle{titlepunct}{}{:} \insertsubtitle\fi + }{}{}% + }{}% + }{}% + }% +} +% \end{macrocode} +% \end{macro} +% +% There is no more. +% +% \begin{macrocode} +\endinput +% \end{macrocode} +% \iffalse +%</class> +% \fi +%\Finale diff --git a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins new file mode 100644 index 00000000000..d59e171ef16 --- /dev/null +++ b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins @@ -0,0 +1,46 @@ +%% +%% This is file `beamerswitch.ins', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% beamerswitch.dtx (with options: `install') +%% ---------------------------------------------------------------- +%% beamerswitch --- Convenient mode selection in Beamer documents +%% Author: Alex Ball +%% E-mail: a.j.ball@bath.ac.uk +%% License: Released under the LaTeX Project Public License v1.3c or later +%% See: http://www.latex-project.org/lppl.txt +%% ---------------------------------------------------------------- +%% +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble +---------------------------------------------------------------- +beamerswitch --- Convenient mode selection in Beamer documents +Author: Alex Ball +E-mail: a.j.ball@bath.ac.uk +License: Released under the LaTeX Project Public License v1.3c or later +See: http://www.latex-project.org/lppl.txt +---------------------------------------------------------------- + +\endpreamble +\postamble + +Copyright (C) 2016 by Alex Ball <a.j.ball@bath.ac.uk> +\endpostamble + +\usedir{tex/latex/\jobname} +\generate{ + \file{\jobname.cls}{\from{\jobname.dtx}{class}} +} +\usedir{doc/latex/\jobname} +\generate{ + \file{\jobname-example.tex}{\from{\jobname.dtx}{example}} +} +\endbatchfile +%% +%% Copyright (C) 2016 by Alex Ball <a.j.ball@bath.ac.uk> +%% +%% End of file `beamerswitch.ins'. diff --git a/Master/texmf-dist/tex/latex/beamerswitch/beamerswitch.cls b/Master/texmf-dist/tex/latex/beamerswitch/beamerswitch.cls new file mode 100644 index 00000000000..d03752548c1 --- /dev/null +++ b/Master/texmf-dist/tex/latex/beamerswitch/beamerswitch.cls @@ -0,0 +1,909 @@ +%% +%% This is file `beamerswitch.cls', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% beamerswitch.dtx (with options: `class') +%% ---------------------------------------------------------------- +%% beamerswitch --- Convenient mode selection in Beamer documents +%% Author: Alex Ball +%% E-mail: a.j.ball@bath.ac.uk +%% License: Released under the LaTeX Project Public License v1.3c or later +%% See: http://www.latex-project.org/lppl.txt +%% ---------------------------------------------------------------- +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesClass{beamerswitch} + [2016/08/19 v1.1 Convenient mode selection in Beamer documents] +\RequirePackage{xkeyval,xkvltxp,etoolbox,xstring,shellesc,iftex} +\define@boolkey[DC]{beamerswitch}{beamer}[true]{% + \ifbool{DC@beamerswitch@beamer}{% + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{handout=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +\define@boolkey[DC]{beamerswitch}{trans}[true]{% + \ifbool{DC@beamerswitch@trans}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{handout=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +\define@boolkey[DC]{beamerswitch}{handout}[true]{% + \ifbool{DC@beamerswitch@handout}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{article=false} + }{}% +} +\define@boolkey[DC]{beamerswitch}{article}[true]{% + \ifbool{DC@beamerswitch@article}{% + \setkeys[DC]{beamerswitch}{beamer=false} + \setkeys[DC]{beamerswitch}{trans=false} + \setkeys[DC]{beamerswitch}{handout=false} + }{}% +} +\define@boolkey[DC]{beamerswitch}{alsobeamer}[true]{} +\define@boolkey[DC]{beamerswitch}{alsotrans}[true]{} +\define@boolkey[DC]{beamerswitch}{alsohandout}[true]{} +\define@boolkey[DC]{beamerswitch}{alsoarticle}[true]{} +\newcommand{\beamerswitch@SetAlso}[1]{% + \key@ifundefined[DC]{beamerswitch}{also#1}{% + \ClassWarning{beamerswitch}{`#1' is not a valid value for option `also'}% + }{% + \setkeys[DC]{beamerswitch}{also#1}% + }% +} +\define@key[DC]{beamerswitch}{also}{% + \forcsvlist{\beamerswitch@SetAlso}{#1}% +} +\define@boolkey[DC]{beamerswitch}{nohyperref}[true]{} +\define@boolkey[DC]{beamerswitch}{textinst}[true]{} +\setkeys[DC]{beamerswitch}{beamer=true,alsobeamer=false,alsotrans=false,% + alsohandout=false,alsoarticle=false} +\ProcessOptionsX[DC]<beamerswitch> +\providecommand*{\BeamerSuffix}{-slides} +\providecommand*{\TransSuffix}{-trans} +\providecommand*{\HandoutSuffix}{-handout} +\providecommand*{\ArticleSuffix}{-article} +\providecommand{\BeamerswitchSpawn}[1]{% + \ifbool{PDFTeX}{% + \ShellEscape{latexmk -silent -pdf -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ifbool{LuaTeX}{% + \ShellEscape{latexmk -silent -lualatex -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ifbool{XeTeX}{% + \ShellEscape{latexmk -silent -xelatex -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }{% + \ShellEscape{latexmk -silent -synctex=1 -interaction=batchmode -jobname=\jobname#1 \jobname} + }% + }% + }% +} +\IfEndWith*{\jobname}{\BeamerSuffix}{% + \setkeys[DC]{beamerswitch}{beamer=true} +}{% + \IfEndWith*{\jobname}{\TransSuffix}{% + \setkeys[DC]{beamerswitch}{trans=true} + }{% + \IfEndWith*{\jobname}{\HandoutSuffix}{% + \setkeys[DC]{beamerswitch}{handout=true} + }{% + \IfEndWith*{\jobname}{\ArticleSuffix}{% + \setkeys[DC]{beamerswitch}{article=true} + }{% + \ifbool{DC@beamerswitch@alsobeamer}{% + \BeamerswitchSpawn{\BeamerSuffix}% + }{} + \ifbool{DC@beamerswitch@alsotrans}{% + \BeamerswitchSpawn{\TransSuffix}% + }{} + \ifbool{DC@beamerswitch@alsohandout}{% + \BeamerswitchSpawn{\HandoutSuffix}% + }{} + \ifbool{DC@beamerswitch@alsoarticle}{% + \BeamerswitchSpawn{\ArticleSuffix}% + }{} + }% + }% + }% +}% +\ifbool{DC@beamerswitch@article}{% + \LoadClass{article} + \RequirePackage{beamerarticle} + \ifbool{DC@beamerswitch@nohyperref}{}{% + \RequirePackage[bookmarks=true,% + bookmarksopen=true,% + pdfborder={0 0 0},% + pdfhighlight={/N},% + linkbordercolor={.5 .5 .5}]{hyperref}% + } + \AtBeginDocument{% + \@ifpackageloaded{hyperref}{% + \pdfstringdefDisableCommands{\def\\<#1>#2{ - #2}} + \begingroup + \hypersetup{pdftitle={\@title}}% + \def\and{\unskip, }% + \let\thanks=\@gobble + \let\inst=\@gobble + \hypersetup{pdfauthor={\@author}}% + \endgroup + }{}% + } +}{% + \ifbool{DC@beamerswitch@handout}{% + \LoadClass[ignorenonframetext,handout]{beamer} + \RequirePackage{pgfpages} + }{% + \ifbool{DC@beamerswitch@trans}{% + \LoadClass[ignorenonframetext,trans]{beamer} + }{% + \LoadClass[ignorenonframetext]{beamer} + }% + } +} +\ifbool{DC@beamerswitch@textinst}{% + \def\beamer@insttitle#1{\textsuperscript{#1}} + \def\beamer@instinst#1{\textsuperscript{#1}\ignorespaces} +}{} +\newcommand*{\beamerswitch@Border}{\relax} +\mode<handout>{% + \pgfpagesdeclarelayout{1 by 2} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=2,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \fi + } + \pgfpagesdeclarelayout{1 by 3} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=3,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } + \pgfpagesdeclarelayout{1 by 3 narrow} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=3,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } + \pgfpagesdeclarelayout{2 by 2} + { + \edef\pgfpageoptionheight{\the\paperheight} + \edef\pgfpageoptionwidth{\the\paperwidth} + \edef\pgfpageoptionborder{0pt} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=4,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth% + } + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + } + \pgfpagesdeclarelayout{1 by 4 narrow} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=4,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \fi + } + \pgfpagesdeclarelayout{2 by 3} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=6,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.167\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.333\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.833\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.833\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.333\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.167\pgfphysicalheight}% + }% + \fi + } + \pgfpagesdeclarelayout{2 by 4} + { + \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default + \edef\pgfpageoptionwidth{\the\paperheight} + \def\pgfpageoptionborder{0pt} + \def\pgfpageoptionfirstshipout{1} + } + { + \pgfpagesphysicalpageoptions + {% + logical pages=8,% + physical height=\pgfpageoptionheight,% + physical width=\pgfpageoptionwidth,% + current logical shipout=\pgfpageoptionfirstshipout% + } + \ifdim\paperheight>\paperwidth\relax + % put side-by-side + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.125\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.375\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{7} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.625\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{8} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.25\pgfphysicalwidth,% + resized height=.5\pgfphysicalheight,% + center=\pgfpoint{.875\pgfphysicalwidth}{.25\pgfphysicalheight}% + }% + \else + % stack on top of one another + \pgfpageslogicalpageoptions{1} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{2} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.875\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{3} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{4} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25\pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.625\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{5} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{6} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.375\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{7} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \pgfpageslogicalpageoptions{8} + {% + border shrink=\pgfpageoptionborder,% + border code=\beamerswitch@Border,% + resized width=.5\pgfphysicalwidth,% + resized height=.25 \pgfphysicalheight,% + center=\pgfpoint{.75\pgfphysicalwidth}{.125\pgfphysicalheight}% + }% + \fi + } +} +\define@key[HL]{beamerswitch}{paper}{% + \def\beamerswitch@handoutpaper{#1}% +} +\newcounter{beamerswitch@nupcase} +\define@choicekey+[HL]{beamerswitch}{nup}[\val\nr]{2, 3, 3plus, 4, 4plus, 6, 8}{% + \setcounter{beamerswitch@nupcase}{\nr} +}{% + \ClassWarning{beamerswitch}{Value of `nup' not recognized. + Allowed values are 2, 3, 3plus, 4, 4plus, 6, and 8.}% +} +\define@key[HL]{beamerswitch}{border}[0.4pt]{% + \RequirePackage{pgf}% + \renewcommand*{\beamerswitch@Border}{\pgfsetlinewidth{#1}\pgfstroke}% +} +\define@boolkey[HL]{beamerswitch}{pnos}[true]{} +\newcommand*{\handoutlayout}[1]{% + \only<handout>{% + \setkeys[HL]{beamerswitch}{#1}% + \ifcase\value{beamerswitch@nupcase}\relax + \def\beamerswitch@nup{2} + \pgfpagesuselayout{1 by 2}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{3} + \pgfpagesuselayout{1 by 3}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{3} + \pgfpagesuselayout{1 by 3 narrow}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{4} + \pgfpagesuselayout{2 by 2}[\beamerswitch@handoutpaper,landscape,border shrink=5mm]% + \or + \def\beamerswitch@nup{4} + \pgfpagesuselayout{1 by 4 narrow}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{6} + \pgfpagesuselayout{2 by 3}[\beamerswitch@handoutpaper,border shrink=5mm]% + \or + \def\beamerswitch@nup{8} + \pgfpagesuselayout{2 by 4}[\beamerswitch@handoutpaper,border shrink=5mm]% + \fi + \ifbool{HL@beamerswitch@pnos}{% + \def\pgfsys@endpicture{% + \raisebox{5mm}[0pt][0pt]{% + \makebox[\pgfphysicalwidth]{% + \the\numexpr\value{page}/\beamerswitch@nup\relax + }% + }% + }% + }{}% + }% +} +\handoutlayout{paper=a4paper,nup=6} +\define@boolkey[AL]{beamerswitch}{maketitle}[true]{} +\newtoggle{titlepunct} +\IfFileExists{xparse.sty}{\@tempswatrue}{\@tempswafalse} +\if@tempswa + \RequirePackage{xparse} + \ExplSyntaxOn + \NewDocumentCommand{\bsw@punct@test}{m}{\l_bsw_punct_test:n {#1}} + \cs_new_protected:Nn \l_bsw_punct_test:n + { + \str_case_x:nnTF { \str_item:nn {#1} {-1} } + { + { , } { } + { ; } { } + { : } { } + { . } { } + { ! } { } + { ? } { } + } + { \global\toggletrue{titlepunct} } + { \global\togglefalse{titlepunct} } + } + \ExplSyntaxOff + \mode<article>{% + \renewcommand{\title}[2][]{\beamer@origtitle{#2}\bsw@punct@test{#2}} + } + \mode<presentation>{% + \long\def\beamer@title[#1]#2{% + \def\inserttitle{#2}% + \def\beamer@shorttitle{#1}% + \bsw@punct@test{#2}% + } + } +\else + \wlog{Beamerswitch: Auto-detection of title punctuation not available.} +\fi +\define@choicekey+[AL]{beamerswitch}{frametitles}{para, margin, none}{% + \def\beamerswitch@articleframetitles{#1}% +}{% + \ClassWarning{beamerswitch}{Value of `frametitles' not recognized. + Allowed values are para, margin, and none.}% +} +\newcommand{\articlelayout}[1]{% + \setkeys[AL]{beamerswitch}{#1}% + \mode<article>{% + \ifcsstring{beamerswitch@articleframetitles}{margin}{% + \setbeamertemplate{frametitle}{% + \marginpar[% + \raggedleft\noindent\emshape\textbf{\insertframetitle}\par + \noindent\insertframesubtitle\par + ]{% + \raggedright\noindent\emshape\textbf{\insertframetitle}\par + \noindent\insertframesubtitle\par + }% + } + }{% + \ifcsstring{beamerswitch@articleframetitles}{none}{% + \setbeamertemplate{frametitle}{} + }{% + \ifcsstring{beamerswitch@articleframetitles}{para}{% + \setbeamertemplate{frametitle}[default] + }{}% + }% + } + \ifbool{AL@beamerswitch@maketitle}{% + \renewcommand{\subtitle}[2][]{% + \def\insertsubtitle{##2}\gappto\@title{\iftoggle{titlepunct}{}{:} ##2}% + } + \ifundef{\beamer@originstitute}{% + \renewcommand{\institute}[2][]{\def\insertinstitute{##2}}% + }{% + \renewcommand{\institute}[2][]{\def\insertinstitute{##2}\beamer@originstitute{##2}}% + }% + \def\@maketitle{% + \newpage + \null + \begin{center}% + \let\footnote\thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {% + \large\lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par + }% + \ifdefvoid{\insertinstitute}{}{% + {% + \normalsize\lineskip .5em% + \begin{tabular}[t]{c}% + \insertinstitute + \end{tabular}\par + }% + }% + \vskip 1em% + {\large \@date}% + \end{center}% + \par\vskip 1.5em% + }% + }{}% + }% + \mode<presentation>{% + \ifbool{AL@beamerswitch@maketitle}{% + \ifbool{beamer@autopdfinfo}{% + \patchcmd{\beamer@firstminutepatches}{% + \inserttitle\ifx\insertsubtitle\@empty\else\ - \insertsubtitle\fi + }{% + \inserttitle\ifx\insertsubtitle\@empty\else\iftoggle{titlepunct}{}{:} \insertsubtitle\fi + }{}{}% + }{}% + }{}% + }% +} +%% +%% Copyright (C) 2016 by Alex Ball <a.j.ball@bath.ac.uk> +%% +%% End of file `beamerswitch.cls'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index b0f2d5f01da..43d7824fca7 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -75,7 +75,7 @@ my @TLP_working = qw( bbcard bbding bbm bbm-macros bbold bbold-type1 bchart bclogo beamer beamer2thesis beamer-FUBerlin beamer-tut-pt beamer-verona beameraudience beamercolorthemeowl beamerdarkthemes beamerposter - beamersubframe + beamersubframe beamerswitch beamertheme-detlevcm beamertheme-epyt beamertheme-metropolis beamertheme-phnompenh beamertheme-upenn-bc beamerthemejltree diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 1830007f881..97939a5df43 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -152,7 +152,6 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'beamer', "&MAKEbeamer", 'beamer2thesis', "&MAKEflatten", 'beamer-contrib', "die 'skipping, use subdirs'", - 'beamerswitch', "die 'skipping, cannot extract, ->author 20aug16'", 'beamertheme-metropolis', "&MAKEflatten", 'beamertheme-upenn-bc', "&MAKEflatten", 'beebe', "die 'skipping, MAKEbeebe needs work, sorry'", @@ -2343,6 +2342,7 @@ my $core_latex = "$Master/texmf-dist/tex/latex"; 'basque-book' => 'latex', # requires interaction 'basque-date' => 'latex', # requires interaction 'bbold' => 'pdflatex', + 'beamerswitch' => 'tex', # no doc regen 'bguq' => 'latex', # requires interaction 'bhcexam' => 'latex', # requires interaction 'bosisio' => 'latex -translate-file=empty.tcx', # ^^, no 8-bit diff --git a/Master/tlpkg/tlpsrc/beamerswitch.tlpsrc b/Master/tlpkg/tlpsrc/beamerswitch.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/beamerswitch.tlpsrc diff --git a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc index d1a0df73ab7..c9b8c5e62c4 100644 --- a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc @@ -10,6 +10,7 @@ depend asyfig depend asypictureb depend autoarea depend bardiag +depend beamerswitch depend binarytree depend blochsphere depend bloques |