% \iffalse meta-comment
%<*internal>
\iffalse
%</internal>
%<*readme>
# beamerswitch: Convenient mode selection in Beamer documents

This class is a wrapper around the [beamer](http://ctan.org/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 `article` class.

## Installation

### Dependencies

To compile the documentation you will need to have the
[minted](http://ctan.org/pkg/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](http://ctan.org/pkg/latexmk) though you
can work around that if you have the patience.

Note that the zip file on the
[Releases](https://github.com/alex-ball/beamerswitch/releases) page on GitHub
contains all the files you need, pre-compiled. You can also avoid the hassle by
installing the class from your TeX distribution's package manager.

### Managed way

The latest stable release of the beamerswitch class has been packaged for
TeX Live and MiKTeX. If you are running TeX Live and have `tlmgr`
installed, you can install the package simply by running
`tlmgr install beamerswitch`. If you are running MiKTeX, you can install the
package by running `mpm --install=beamerswitch`. Both `tlmgr` and `mpm` have
GUI versions that you might find friendlier.

### Automated way

A makefile is provided which you can use with the Make utility:

  * Running `make beamerswitch.cls` just generates the class file (and a few
    others).
  * Running `make` generates the class file and documentation.
  * Running `make inst` generates and installs the files to your home TeX tree.
    (To undo, run `make uninst`.)
  * Running `make install` generates and installs the files to the local TeX
    tree. (To undo, run `make uninstall`.)
  * Running `make clean` removes auxiliary files from the working directory.
  * Running `make distclean` removes the generated from the working directory
    files as well.

### 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 three steps.

 1. Run `tex beamerswitch.dtx` to generate the class file and the example file
    `beamerswitch-example.tex`. (You can safely skip this step if you are
    confident about step 2.)

 2. Compile `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 main
    documentation (DVI or PDF).

 3. Compile `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.

 4. 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`

 5. You may then have to update your installation's file name database
    before TeX and friends can see the files.

## Licence

Copyright 2016–2021 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>
\documentclass[%
  beameroptions={ignorenonframetext,14pt},
  articleoptions={a4paper,12pt},
  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\inst{1}}
\institute{\inst{1}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:  ab318@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-2021 by Alex Ball <ab318@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>
    [2021/04/12 v1.8 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,raster}
\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
    }
  , documentation minted options=
    { breaklines
    , fontsize=\small
    , breakbefore=\{\[
    , breakafter=/\}\]
    , breakbeforesymbolpre={}
    }
  , index format=pgf
  , color command=Command
  , color environment=Environment
  , color key=Option
  , color value=Value
  , color color=Color
  , colbacktitle=ExampleFrame!33!ExampleBack
  }
\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}}

\makeatletter
\renewenvironment{macro}[1]{%
  \StrSubstitute{#1}{\detokenize{@}}{"@}[\MyName]%
  \edef\saved@macroname{\expandafter\string\csname #1\endcsname}%
  \let\saved@indexname\saved@macroname
  \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]{%
  \StrSubstitute{#1}{\detokenize{@}}{"@}[\MyName]%
  \edef\saved@macroname{#1}%
  \let\saved@indexname\saved@macroname
  \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}|)}%
}
\makeatother
\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
\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}

\changes{v1.2}{2016/05/22}{Add `Quick start guide' section.}
\section{Quick start guide}

Here are the key facts:

\begin{itemize}
\item
  The \pkg{beamerswitch} class makes it easier to switch between
  \pkg{beamer} modes.
\item
  It is aimed at you if you want to generate handouts from your
  presentation, whether printouts of your slides or something more like a paper
  or article.
\item
  It is \emph{not} a drop-in replacement for \pkg{beamer}.
\end{itemize}

If you have an existing \pkg{beamer} presentation and want convert it to use
\pkg{beamerswitch} instead, here's what you need to do.

\begin{enumerate}
\item
  Replace the class \pkg{beamer} with \pkg{beamerswitch}.

  Wrap any class options you have specified in braces and turn them into the
  value of the \key{beameroptions} option:

  \begin{tcbraster}[raster equal height=rows]
\begin{dispListing*}{title=Before,coltitle=black,fonttitle=\sffamily}
\documentclass[10pt]{beamer}
\end{dispListing*}
\begin{dispListing*}{title=After,coltitle=black,fonttitle=\sffamily}
\documentclass[beameroptions={10pt}]{beamerswitch}
\end{dispListing*}
  \end{tcbraster}

  If you didn't specify any options, then give \key{beameroptions} a blank
  value:

  \begin{tcbraster}[raster equal height=rows]
\begin{dispListing*}{title=Before,coltitle=black,fonttitle=\sffamily}
\documentclass{beamer}
\end{dispListing*}
\begin{dispListing*}{title=After,coltitle=black,fonttitle=\sffamily}
\documentclass[beameroptions={}]{beamerswitch}
\end{dispListing*}
  \end{tcbraster}

  If you only specified \key{ignorenonframetext}, then you don't
  need \key{beameroptions}:

  \begin{tcbraster}[raster equal height=rows]
\begin{dispListing*}{title=Before,coltitle=black,fonttitle=\sffamily}
\documentclass[ignorenonframetext]{beamer}
\end{dispListing*}
\begin{dispListing*}{title=After,coltitle=black,fonttitle=\sffamily}
\documentclass{beamerswitch}
\end{dispListing*}
  \end{tcbraster}

\item
  Wrap any preamble content intended only for your slides (like \cs{usetheme}
  or \cs{usepackage} commands) with `\cs{mode}\texttt{<presentation>}\meta{\dots}'
  or something more specific, as required.
\end{enumerate}

In summary, here is an example:

\begin{tcbraster}[raster equal height=rows]
\begin{dispListing*}{title=Before,coltitle=black,fonttitle=\sffamily}
\documentclass[10pt]{beamer}


\usetheme{metropolis}

\title{Test presentation}
\begin{document}
  \maketitle
\end{document}
\end{dispListing*}
\begin{dispListing*}{title=After,coltitle=black,fonttitle=\sffamily}
\documentclass[beameroptions={10pt}]{beamerswitch}
\mode<presentation>{%
  \usetheme{metropolis}
}
\title{Test presentation}
\begin{document}
  \maketitle
\end{document}
\end{dispListing*}
\end{tcbraster}

At this point the document should compile exactly as before.

If you intend to use article mode at all, I strongly suggest that you
proceed by converting your document body so it that works with \pkg{beamer}'s
\key{ignorenonframetext} option in place. That means making sure all slide
content is in a \env{frame} environment, new command definitions are moved
to the preamble, and so on.

Lastly, read through the rest of this manual and see what \pkg{beamerswitch} can
do for you!

\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{Passing options to the underlying classes}

\begin{docKey}{articleoptions}{=\marg{options}}{default and initially empty}
  Passes the \meta{options} to the \pkg{article} class when in \key{article}
  mode.
\end{docKey}

\begin{docKey}{beameroptions}{=\marg{options}}{default and initially \val{ignorenonframetext}}
  Passes the \meta{options} to the \pkg{beamer} class when in \key{beamer},
  \key{handout} or \key{trans} mode. Do not specify \val{handout} or \val{trans}
  among the options as \pkg{beamerswitch} handles those for you. Note that the
  default behaviour is to pass the \val{ignorenonframetext} option, so remember
  to include it yourself if you start specifying other options.
\end{docKey}


\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}.

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:

\changes{v1.1}{2016/08/19}{Improve documentation of \cs{BeamerswitchSpawn}, \cs{handoutlayout} and \cs{articlelayout}.}
\begin{docCommand}{BeamerswitchSpawn}{\marg{suffix}}
  Spawns a new compilation process with \meta{suffix} appended to the
  \cs{jobname}.
\end{docCommand}

By default, \cs{BeamerswitchSpawn} checks which \LaTeX\ engine you are running,
and then runs the matching one of \cs{SpawnedPDFTeX}, \cs{SpawnedXeTeX},
\cs{SpawnedLuaTeX}, or if all the tests fail, \cs{SpawnedTeX}, with the converted
\cs{jobname}. These commands all add an engine-selecting option to a base
command, \cs{SpawnedCompiler}, which by default is \pkg{latexmk} with synctex
enabled, shell escape disabled and interaction set to batch mode. See the
\hyperref[sec:switching]{Implementation} section below for details.

Any of these commands can be pre-defined to something else, depending on what
you want to do. So, for example, if you want to change the base \pkg{latexmk}
options, pre-define \cs{SpawnedCompiler} to \texttt{latexmk} plus your chosen
options:

\begin{dispListing}
\newcommand*{\SpawnedCompiler}{%
  latexmk -silent -shell-escape -interaction=nonstopmode}
\documentclass{beamerswitch}
\end{dispListing}

If you want to switch to using \texttt{rubber}, say, pre-define
\cs{SpawnedPDFTeX} and friends accordingly (perhaps taking advantage of
\cs{SpawnedCompiler} to reduce repetition):

\begin{dispListing}
\newcommand*{\SpawnedCompiler}{rubber -q --synctex}
\newcommand*{\SpawnedPDFTeX}{\SpawnedCompiler -m pdftex}
\newcommand*{\SpawnedXeTeX}{\SpawnedCompiler -m xelatex}
\documentclass{beamerswitch}
\end{dispListing}

If you don't need the engine selection routine provided, you can replace it
by pre-defining \cs{BeamerswitchSpawn} to do whatever you need it to do instead:

\begin{dispListing}
\newcommand*{\BeamerswitchSpawn}[1]{%
  \ShellEscape{... -jobname=\jobname#1 \jobname}%
}
\documentclass{beamerswitch}
\end{dispListing}

If you want to use \pkg{arara} to compile everything, the class options won't
help you as \pkg{arara} does not let you change \cs{jobname}s on the command line.
That's no problem, though, because you can do it manually within your list of
directives:

\begin{dispListing}
% arara: lualatex
% arara: lualatex: { options: "-jobname beamerswitch-example-article" }
% arara: lualatex: { options: "-jobname beamerswitch-example-handout" }
% arara: lualatex: { options: "-jobname beamerswitch-example-trans" }
\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}

\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{1}\textbar \val{1plus}\textbar \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 \val{2}, \val{3plus}, \val{4}
  and \val{6} layouts are intended for slides in the usual 4:3 aspect ratio,
  while the \val{3}, \val{4plus} and \val{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!]
  \newcounter{subfig}%
  \def\sfno{\rule[-\bigskipamount]{0pt}{1em}\stepcounter{subfig}(\alph{subfig})\space}%
  \centering
  \begin{minipage}[b]{11em}
    \centering
    \begin{pseudopage}[width=10em,height=7.1em]
      \begin{pseudoslide}[width=8em,height=6em]
        \texttt{1}
      \end{pseudoslide}
    \end{pseudopage}
    \par
    \sfno\key{nup}=\docValue{1}
  \end{minipage}
  \begin{minipage}[b]{11em}
    \centering
    \begin{pseudopage}
      \begin{pseudoslide}[width=6em,height=4.5em]
        \texttt{1}
      \end{pseudoslide}\par\smallskip
      \vbox to 4.5em{}
    \end{pseudopage}
    \par
    \sfno\key{nup}=\docValue{1plus}
  \end{minipage}
  \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
    \sfno\key{nup}=\docValue{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
    \sfno\key{nup}=\docValue{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
    \sfno\key{nup}=\docValue{3plus}
  \end{minipage}
  \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
    \sfno\key{nup}=\docValue{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
    \sfno\key{nup}=\docValue{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
    \sfno\key{nup}=\docValue{6}
  \end{minipage}
  \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
    \sfno\key{nup}=\docValue{8}
  \end{minipage}
  \\
  \caption{Handout layouts provided by \pkg{beamerswitch}}
  \label{fig:layouts}
\end{figure}

\begin{docKey}{pnos}{}{no value, initially unset}
  Adds page numbers to the bottom of each page. The number appears at a distance
  of \cs{handoutpnobaseline} (initially 5mm) from the bottom edge of the page.
  You can change this before calling \cs{handoutlayout}, if you like, using the
  usual mechanisms (e.g.\@ \cs{setlength}).
\end{docKey}

\begin{docKey}{border}{=\meta{length}}{default 0.4pt, initially 0pt}
  Puts a rectangular border of thickness \meta{length} around each slide.
\end{docKey}

\begin{docKey}{margin}{=\meta{length}}{default 0pt, initially 5mm}
  Sets how much extra space to leave around each slide on the page. To achieve
  this it uses the \key{border shrink} option from \pkg{pgfpages}. If you add
  page numbers, this value will increase if necessary to prevent the number
  colliding with the slides, so treat it as a minimum.
\end{docKey}

\begin{docKey}{align}{}{no value, initially unset}
  When \key{margin} is non-zero, the effective page margins are approximately
  half the size of the gaps between slides (some additional white space comes
  from preserving the aspect ratio of the slides). When set, this option tweaks
  the positions of the slides so that the page margins are approximately the
  same as the interior gaps.
\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}{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}

\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}{instbreak}{=\meta{definition}}{no default, initially \cs{linebreak}}
   In \key{article} mode, defines how \cs{and} is rendered when
   \cs{insertinstitute} is used (such when the \key{maketitle} option is
   active). Another good \meta{definition} to use might be \cs{quad}.
\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, if you don't like the class facilities for
doing this:

\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
  \newpage
  \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}
%
% \changes{v1.8}{2021/04/12}{Add \key{beameroptions} option.}
% \begin{optionkey}{beameroptions}
%
% The \key{beameroptions} will passed to the \pkg{beamer} class.
%
%    \begin{macrocode}
\define@cmdkey[DC]{beamerswitch}{beameroptions}[ignorenonframetext]{}
%    \end{macrocode}
% \end{optionkey}
%
% \changes{v1.8}{2021/04/12}{Add \key{articleoptions} option.}
% \begin{optionkey}{articleoptions}
%
% The \key{articleoptions} will passed to the \pkg{article} class.
%
%    \begin{macrocode}
\define@cmdkey[DC]{beamerswitch}{articleoptions}[]{}
%    \end{macrocode}
% \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}
%
% \changes{v1.8}{2021/04/12}{Deprecate redundant \key{textinst} option.}
% \begin{optionkey}{textinst}
% The \key{textinst} option enforces \cs{textsuperscript} for institution
% markers. Recent versions of \pkg{beamer} do this by default.
%
%    \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,beameroptions,articleoptions}
%    \end{macrocode}
%
% Now we process the options given by the user.
%
%    \begin{macrocode}
\ProcessOptionsX[DC]<beamerswitch>
%    \end{macrocode}
%
% \subsection{Jobname-based mode switching}\label{sec: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}
% \changes{v1.3}{2017/12/10}{Decompose \cs{BeamerswitchSpawn} into further configurable macros.}
% \begin{macro}{SpawnedTeX}
% \begin{macro}{SpawnedPDFTeX}
% \begin{macro}{SpawnedXeTeX}
% \begin{macro}{SpawnedLuaTeX}
% \begin{macro}{SpawnedCompiler}
% 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; it should take one argument, being
% the jobname suffix.
%
%    \begin{macrocode}
\providecommand{\SpawnedCompiler}{latexmk -silent -synctex=1 -interaction=batchmode }
\providecommand{\SpawnedTeX}{\SpawnedCompiler}
\providecommand{\SpawnedPDFTeX}{\SpawnedCompiler -pdf }
\providecommand{\SpawnedLuaTeX}{\SpawnedCompiler -pdflua }
\providecommand{\SpawnedXeTeX}{\SpawnedCompiler -pdfxe }
\providecommand{\BeamerswitchSpawn}[1]{%
  \ifbool{PDFTeX}{%
    \ShellEscape{\SpawnedPDFTeX -jobname=\jobname#1 \jobname}
  }{%
    \ifbool{LuaTeX}{%
      \ShellEscape{\SpawnedLuaTeX -jobname=\jobname#1 \jobname}
    }{%
      \ifbool{XeTeX}{%
        \ShellEscape{\SpawnedXeTeX -jobname=\jobname#1 \jobname}
      }{%
        \ShellEscape{\SpawnedTeX -jobname=\jobname#1 \jobname}
      }%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{JobName}
% \changes{v1.6}{2019/06/06}{Fix bug triggered by spaces in job names.}
% We check for special jobnames and use them to override the above mode-related
% options. In certain circumstances, the jobname is wrapped in quote marks, so
% in that case we strip them off before running the tests.
%
%    \begin{macrocode}
\IfBeginWith*{\jobname}{"}{%
  \IfEndWith*{\jobname}{"}{%
    \StrGobbleLeft{\jobname}{1}[\JobName]%
    \StrGobbleRight{\JobName}{1}[\JobName]%
  }{\let\JobName\jobname}%
}{\let\JobName\jobname}
%    \end{macrocode}
% \end{macro}
%
% Now we run the tests. Note that the \key{also*} options are only acted upon
% if the all the tests fail.
%
%    \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{macro}{beamer@insttitle}
% \begin{macro}{beamer@andtitle}
% \begin{macro}{beamer@instinst}
% \begin{macro}{beamer@andinst}
% We also add some beamer base macros that are needed for the
%\cs{insertinstitute} command.
%
%    \begin{macrocode}
\ifbool{DC@beamerswitch@article}{%
  \PassOptionsToClass{\cmdDC@beamerswitch@articleoptions}{article}
  \LoadClass{article}
  \RequirePackage{beamerarticle}
  \def\beamer@insttitle#1{\textsuperscript{#1}}
  \def\beamer@andtitle{\quad}
  \def\beamer@instinst#1{\textsuperscript{#1}\ignorespaces}
  \def\beamer@andinst{\linebreak}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% 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}{%
    \PassOptionsToClass{\cmdDC@beamerswitch@beameroptions}{beamer}
    \LoadClass[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}{%
      \PassOptionsToClass{\cmdDC@beamerswitch@beameroptions}{beamer}
      \LoadClass[trans]{beamer}
    }{%
      \PassOptionsToClass{\cmdDC@beamerswitch@beameroptions}{beamer}
      \LoadClass{beamer}
    }%
  }
}
%    \end{macrocode}
%
% \subsection{Mode-independent layout}
%
% \begin{macro}{beamer@insttitle}
% \begin{macro}{beamer@instinst}
% We implement the option that formats institution markers in text mode rather
% than math mode in older versions of \pkg{beamer}.
%
%    \begin{macrocode}
\ifbool{DC@beamerswitch@textinst}{%
  \def\beamer@insttitle#1{\textsuperscript{#1}}
  \def\beamer@instinst#1{\textsuperscript{#1}\ignorespaces}
}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{handoutlayout}
% \subsection{Handout layout}
%
% \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}
\def\beamerswitch@handoutpaper{a4paper}
\define@key[HL]{beamerswitch}{paper}{%
  \def\beamerswitch@handoutpaper{#1}%
}
%    \end{macrocode}
% \end{macro}
% \end{optionkey}
%
% \begin{optionkey}{nup}
% \begin{optionvalue}{1}
% \begin{optionvalue}{1plus}
% \begin{optionvalue}{2}
% \begin{optionvalue}{3}
% \begin{optionvalue}{3plus}
% \begin{optionvalue}{4}
% \begin{optionvalue}{4plus}
% \begin{optionvalue}{6}
% \begin{optionvalue}{8}
% \changes{v1.7}{2020/06/06}{Add \key{nup}!=\val{1} option.}
% \changes{v1.7}{2020/06/06}{Add \key{nup}!=\val{1plus} option.}
% 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}
\setcounter{beamerswitch@nupcase}{7}
\define@choicekey+[HL]{beamerswitch}{nup}[\val\nr]{1, 1plus, 2, 3, 3plus, 4, 4plus, 6, 8}{%
  \setcounter{beamerswitch@nupcase}{\nr}
}{%
  \ClassWarning{beamerswitch}{Value of `nup' not recognized.
    Allowed values are 1, 1plus, 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{optionvalue}
% \end{optionvalue}
% \end{optionkey}
%
% \begin{optionkey}{border}
% \begin{macro}{beamerswitch@Border}
% \changes{v1.5}{2019/01/28}{Remove empty frames from end of handout.}
% 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.
%
% This is implemented as a PGF drawing command, which is initially set up to do
% nothing but gets filled out if the option is selected. As part of this, we
% calculate the number of the current slide (|handoutpno| gives the current page
% number minus one; \cs{beamerswitch@nup} is the number of slides per page;
% and \cs{pgf@cpn} gives the count of the current slide on the current page).
% If this exceeds the total number of slides, we suppress the border.
%
%    \begin{macrocode}
\newcommand*{\beamerswitch@Border}{\relax}
\define@key[HL]{beamerswitch}{border}[0.4pt]{%
  \RequirePackage{pgf}%
  \ifdimcomp{#1}{>}{0pt}{%
    \renewcommand*{\beamerswitch@Border}{%
      \ifnumcomp{(\value{handoutpno} * \beamerswitch@nup) + \the\pgf@cpn}%
        {>}{\beamer@endpageofdocument}{%
        \relax
      }{%
        \pgfsetlinewidth{#1}\pgfstroke
      }%
    }%
  }{%
    \renewcommand*{\beamerswitch@Border}{\relax}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{optionkey}
%
% \begin{optionkey}{margin}
% \changes{v1.4}{2018/08/29}{Make margins around slides a configurable size.}
% \begin{macro}{beamerswitch@margin}
% The \key{margin} option controls how much white space is added around each
% slide on handout pages. It corresponds to the \texttt{border shrink} option
% of \cs{pgfpagesuselayout}.
%
%    \begin{macrocode}
\newlength{\beamerswitch@margin}
\setlength{\beamerswitch@margin}{5mm}
\define@key[HL]{beamerswitch}{margin}[0pt]{%
  \setlength{\beamerswitch@margin}{#1}%
}
%    \end{macrocode}
% \end{macro}
% \end{optionkey}
%
% \begin{optionkey}{align}
% The \key{align} option chooses whether to rejig the positions of the slides
% on the page so that the effective page margin is the same as, rather than
% half, the space between adjacent slides.
%
%    \begin{macrocode}
\define@boolkey[HL]{beamerswitch}{align}[true]{}
%    \end{macrocode}
% \end{optionkey}
%
% \begin{optionkey}{pnos}
% \begin{macro}{handoutpnobaseline}
% The \key{pnos} option switches on page numbers for handout pages. The height
% at which the baseline of the number sits, relative to the bottom edge of the
% paper, is given by the length \cs{handoutpnobaseline}.
%
%    \begin{macrocode}
\newlength{\handoutpnobaseline}
\setlength{\handoutpnobaseline}{5mm}
\newcounter{handoutpno}
\define@boolkey[HL]{beamerswitch}{pnos}[true]{}
%    \end{macrocode}
% \end{macro}
% \end{optionkey}
%
% \begin{macro}{beamerswitch@footer}
% In order to implement the page numbers, we need to add a hook to the
% \pkg{pgfpages} shipout routine.
%
%    \begin{macrocode}
\def\beamerswitch@footer{}
\patchcmd{\pgfpages@buildshipoutbox}{%
  \pgfsys@endpicture
}{%
  \beamerswitch@footer\pgfsys@endpicture
}{}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{beamerswitch@pnoadjust}
% We set up the \cs{handoutlayout} command for applying these options.
%
% The hook \cs{beamerswitch@footer} is used to step the page number
% counter |handoutpno|; if page numering is active, it also places the
% number on the page centered and \cs{handoutpnobaseline} up from the
% bottom.
%
% The length \cs{beamerswitch@pnoadjust} is, conceptually, the height
% of the page number. When page numbers are active, the margin around
% slides is automatically increased to guarantee that the top of the
% page number will not be higher than the bottom of the lowest slide.
% Currently this does not account for extra whitespace arising from
% aspect ratio issues. When the \key{align} option is active, the margin
% at the bottom of the page is increased, but to save a register we
% make the adjustment to \cs{beamerswitch@pnoadjust} instead of a copy
% of \cs{beamerswitch@margin}.
%
%    \begin{macrocode}
\newlength{\beamerswitch@pnoadjust}
\newcommand*{\handoutlayout}[1]{%
  \only<handout>{%
    \setlength{\beamerswitch@pnoadjust}{1em}%
    \setkeys[HL]{beamerswitch}{#1}%
    \ifbool{HL@beamerswitch@pnos}{%
      \def\beamerswitch@footer{%
        \stepcounter{handoutpno}%
        \setbox0\vbox{\makebox[0pt][c]{\arabic{handoutpno}}}%
        \pgfsys@beginscope
        \pgflowlevel{\pgftransformshift{%
          \pgfpoint{.5\pgfphysicalwidth}{\handoutpnobaseline}}}%
        \wd0=0pt%
        \dp0=-\ht0%
        \pgfsys@hbox0%
        \pgfsys@endscope
      }%
      \ifbool{HL@beamerswitch@align}{%
        \ifcase\value{beamerswitch@nupcase}\relax
          \relax
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.333\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.333\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.5\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.5\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.333\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.6\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.5\beamerswitch@margin}%
        \or
          \addtolength{\beamerswitch@pnoadjust}{-0.6\beamerswitch@margin}%
        \fi
      }{}%
      \ifdimcomp{\beamerswitch@margin}{<}%
          {\handoutpnobaseline + \beamerswitch@pnoadjust}{%
        \setlength{\beamerswitch@margin}%
          {\the\dimexpr\handoutpnobaseline + \beamerswitch@pnoadjust\relax}%
      }{}%
    }{%
      \def\beamerswitch@footer{\stepcounter{handoutpno}}%
    }%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{beamerswitch@nup}
% The value of the \key{nup} option is used both to select the layout
% and set the value of \cs{beamerswitch@nup}. The latter is used to
% suppress unwanted borders and check if \cs{handoutlayout} has been
% called.
%
%    \begin{macrocode}
    \ifcase\value{beamerswitch@nupcase}\relax
      \def\beamerswitch@nup{1}%
      \pgfpagesuselayout{1 by 1}[\beamerswitch@handoutpaper,%
        landscape,border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{1}%
      \pgfpagesuselayout{1 by 1 narrow}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{2}%
      \pgfpagesuselayout{1 by 2}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{3}%
      \pgfpagesuselayout{1 by 3}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{3}%
      \pgfpagesuselayout{1 by 3 narrow}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{4}%
      \pgfpagesuselayout{2 by 2}[\beamerswitch@handoutpaper,%
        landscape,border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{4}%
      \pgfpagesuselayout{1 by 4 narrow}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{6}%
      \pgfpagesuselayout{2 by 3}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \or
      \def\beamerswitch@nup{8}%
      \pgfpagesuselayout{2 by 4}[\beamerswitch@handoutpaper,%
        border shrink=\the\beamerswitch@margin]%
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
% We initialize the class with the defaults set above.
%
%    \begin{macrocode}
\AtEndPreamble{%
  \ifdef{\beamerswitch@nup}{}{%
    \handoutlayout{}%
  }%
}
%    \end{macrocode}
%
% Though \pkg{pgfpages} defines some perfectly fine layouts, we need to add
% configurability to the existing ones and provide some new ones.
%
% \changes{v1.7}{2020/06/06}{Add `1 by 1' layout.}
% The `1 by 1' layout has a single slide per page.
%
%    \begin{macrocode}
\mode<handout>{%
  \pgfpagesdeclarelayout{1 by 1}
  {
    \edef\pgfpageoptionheight{\the\paperheight}
    \edef\pgfpageoptionwidth{\the\paperwidth}
    \edef\pgfpageoptionborder{0pt}
    \def\pgfpageoptionfirstshipout{1}
  }
  {
    \pgfpagesphysicalpageoptions
    {%
      logical pages=1,%
      physical height=\pgfpageoptionheight,%
      physical width=\pgfpageoptionwidth,%
      current logical shipout=\pgfpageoptionfirstshipout%
    }
    \pgfpageslogicalpageoptions{1}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=\pgfphysicalwidth,%
      resized height=\pgfphysicalheight,%
      center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}%
    }%
  }%
%    \end{macrocode}
%
% \changes{v1.7}{2020/06/06}{Add `1 by 1 narrow' layout.}
% The `1 by 1 narrow' layout is similar to the normal \key{2 on 1} layout, but
% there is a notes area instead of the second slide.
%
%    \begin{macrocode}
  \pgfpagesdeclarelayout{1 by 1 narrow}
  {
    \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
    \edef\pgfpageoptionwidth{\the\paperheight}
    \def\pgfpageoptionborder{0pt}
    \def\pgfpageoptionfirstshipout{1}
  }
  {
    \pgfpagesphysicalpageoptions
    {%
      logical pages=1,%
      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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \pgfpoint{.25\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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \fi
  }
%    \end{macrocode}
%
% The `1 by 2' layout is similar to the normal \key{2 on 1} layout.
%
%    \begin{macrocode}
  \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.167\pgfphysicalwidth + 0.5\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.833\pgfphysicalwidth - 0.5\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.833\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.167\pgfphysicalheight + 0.5\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.167\pgfphysicalwidth + 0.5\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.833\pgfphysicalwidth - 0.5\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.5\beamerswitch@margin}%
          {.833\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.5\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.5\beamerswitch@margin}%
          {.167\pgfphysicalheight + 0.5\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.125\pgfphysicalwidth + 0.6\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.375\pgfphysicalwidth + 0.2\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.625\pgfphysicalwidth - 0.2\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.875\pgfphysicalwidth - 0.6\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.875\pgfphysicalheight - 0.6\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.625\pgfphysicalheight - 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.375\pgfphysicalheight + 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.125\pgfphysicalheight + 0.6\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.167\pgfphysicalwidth + 0.5\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheigh - 0.333\beamerswitch@margint}%
      }{%
        \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.833\pgfphysicalwidth - 0.5\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.167\pgfphysicalwidth + 0.5\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.167\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{5}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{6}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.333\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.833\pgfphysicalwidth - 0.5\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.833\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=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.833\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.833\pgfphysicalheight - 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.833\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{5}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.167\pgfphysicalheight + 0.5\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{6}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.333\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.167\pgfphysicalheight + 0.5\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.125\pgfphysicalwidth + 0.6\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.375\pgfphysicalwidth + 0.2\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.625\pgfphysicalwidth - 0.2\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.875\pgfphysicalwidth - 0.6\beamerswitch@margin}%
          {.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{5}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.125\pgfphysicalwidth + 0.6\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.125\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{6}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.375\pgfphysicalwidth + 0.2\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.375\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{7}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.625\pgfphysicalwidth - 0.2\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \pgfpoint{.625\pgfphysicalwidth}{.25\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{8}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.25\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.875\pgfphysicalwidth - 0.6\beamerswitch@margin}%
          {.25\pgfphysicalheight + 0.333\beamerswitch@margin}%
      }{%
        \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=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.875\pgfphysicalheight - 0.6\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.875\pgfphysicalheight - 0.6\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.875\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{3}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.625\pgfphysicalheight - 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{4}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25\pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.625\pgfphysicalheight - 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.625\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{5}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.375\pgfphysicalheight + 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{6}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.375\pgfphysicalheight + 0.2\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.375\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{7}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}%
          {.125\pgfphysicalheight + 0.6\beamerswitch@margin}%
      }{%
        \pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}%
      }%
    }%
    \pgfpageslogicalpageoptions{8}
    {%
      border shrink=\pgfpageoptionborder,%
      border code=\beamerswitch@Border,%
      resized width=.5\pgfphysicalwidth,%
      resized height=.25 \pgfphysicalheight,%
      center=\ifbool{HL@beamerswitch@align}{%
        \pgfpoint{.75\pgfphysicalwidth - 0.333\beamerswitch@margin}%
          {.125\pgfphysicalheight + 0.6\beamerswitch@margin}%
      }{%
        \pgfpoint{.75\pgfphysicalwidth}{.125\pgfphysicalheight}%
      }%
    }%
    \fi
  }
}
%    \end{macrocode}
%
% \begin{macro}{articlelayout}
% \subsection{Article layout}
%
% We provide some options for configuring the appearance of article mode.
%
% \changes{v1.1}{2016/08/19}{Fix \key{maketitle} and \key{textinst} options.}
% \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}
% \changes{v1.6.1}{2020/01/20}{Update expl3 syntax.}
% 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_e: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{optionvalue}{para}
% \begin{optionvalue}{margin}
% \begin{optionvalue}{none}
% \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{optionvalue}
% \end{optionvalue}
% \end{optionvalue}
% \end{optionkey}
%
% \changes{v1.8}{2021/04/12}{Add \key{instbreak} option.}
% \begin{optionkey}{instbreak}
% \begin{macro}{beamerswitch@andinst}
% We offer an easy way of customizing how institutes are strung together.
%
%    \begin{macrocode}
\let\beamerswitch@andinst\beamer@andinst
\define@key[AL]{beamerswitch}{instbreak}{%
  \def\beamerswitch@andinst{#1}%
}
%    \end{macrocode}
% \end{macro}
% \end{optionkey}
%
% 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.
%
% \begin{optionvalue}{margin}
% \begin{optionvalue}{none}
% \begin{optionvalue}{para}
% The \val{margin} value is implemented using \cs{marginpar}.
%
%    \begin{macrocode}
    \ifcsstring{beamerswitch@articleframetitles}{margin}{%
      \setbeamertemplate{frametitle}{%
        \marginpar[%
          \raggedleft\noindent\itshape\textbf{\insertframetitle}\par
          \noindent\insertframesubtitle\par
        ]{%
          \raggedright\noindent\itshape\textbf{\insertframetitle}\par
          \noindent\insertframesubtitle\par
        }%
      }
    }{%
      \ifcsstring{beamerswitch@articleframetitles}{none}{%
        \setbeamertemplate{frametitle}{}
      }{%
        \ifcsstring{beamerswitch@articleframetitles}{para}{%
          \setbeamertemplate{frametitle}[default]
        }{}%
      }%
    }
%    \end{macrocode}
% \end{optionvalue}
% \end{optionvalue}
% \end{optionvalue}
%
% This is where the \key{instbreak} option takes effect.
%
%    \begin{macrocode}
    \let\beamer@andinst\beamerswitch@andinst
%    \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{\def\inst{\beamer@instinst}\def\and{\beamer@andinst}##2}}%
      }{%
        \renewcommand{\institute}[2][]{%
          \def\insertinstitute{\def\inst{\beamer@instinst}\def\and{\beamer@andinst}##2}%
          \beamer@originstitute{##2}}%
      }%
%    \end{macrocode}
%
% \changes{v1.1}{2016/08/19}{Remove personal customizations from \key{maketitle} code.}
% 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%
%    \end{macrocode}
%
% \changes{v1.8}{2021/04/12}{Ensure proper rendering of \cs{inst} and \cs{and}
%   in \cs{author}.}
% The second is to add the beamer definitions for \cs{inst} and \cs{and} in the
% author row.
%
%    \begin{macrocode}
            \begin{tabular}[t]{c}%
              \def\inst{\beamer@insttitle}\def\and{\beamer@andtitle}%
              \@author
            \end{tabular}\par
          }%
%    \end{macrocode}
%
% The third is to add in a row for the institute information.
%
%    \begin{macrocode}
          \ifdefvoid{\insertinstitute}{}{%
            {%
              \normalsize\lineskip .5em%
              \insertinstitute\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
