% \iffalse meta-comment %<*internal> \iffalse % %<*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–2022 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/). % %<*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
{ \usepackage[hmargin=3cm,vmargin=2.5cm]{geometry} } \mode{ \usefonttheme{professionalfonts} } \mode{ \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} % %<*internal> \fi \def\nameofplainTeX{plain} \ifx\fmtname\nameofplainTeX\else \expandafter\begingroup \fi % %<*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-2022 by Alex Ball \endpostamble \usedir{tex/latex/\jobname} \generate{ \file{\jobname.cls}{\from{\jobname.dtx}{class}} } \usedir{doc/latex/\jobname} \generate{ \file{\jobname-example.tex}{\from{\jobname.dtx}{example}} } % %\endbatchfile %<*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 % %<*driver> \ProvidesFile{beamerswitch.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesClass{beamerswitch} %<*class> [2022/08/20 v1.9 Convenient mode selection in Beamer documents] % %<*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{}\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{% \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}{articleclass}{=\meta{class}}{default and initially \val{article}} Selects the \meta{class} to use when in \key{article} mode. \end{docKey} \begin{docKey}{articleoptions}{=\marg{options}}{default and initially empty} Passes the \meta{options} to the underlying class (selected by \key{articleclass}) 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*{\SpawnedLuaTeX}{\SpawnedCompiler -m lualatex} % needs v1.6.0+ \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
{ \usepackage[utf8]{inputenc} } \mode{ \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} % % \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 % \item % \pkg{expl3} for cleaning options passed onward to underlying classes. % \end{itemize} % % \begin{macrocode} \RequirePackage{xkeyval,xkvltxp,etoolbox,xstring,shellesc,iftex,expl3} % \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.9}{2022/08/20}{Add \key{articleclass} option.} % \begin{optionkey}{articleclass} % % The \key{articleclass} option allows the class used for article mode % to be customized. % % \begin{macrocode} \define@cmdkey[DC]{beamerswitch}{articleclass}[article]{} % \end{macrocode} % \end{optionkey} % % \changes{v1.8}{2021/04/12}{Add \key{articleoptions} option.} % \begin{optionkey}{articleoptions} % % The \key{articleoptions} will passed to the class used for % \key{article} mode. % % \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,articleclass,% articleoptions} % \end{macrocode} % % Now we process the options given by the user. % % \begin{macrocode} \ProcessOptionsX[DC] % \end{macrocode} % % We remove problematic whitespace from \key{articleoptions} and % \key{beameroptions}. % % \begin{macrocode} \ExplSyntaxOn \tl_replace_all:Nnn \cmdDC@beamerswitch@articleoptions { ,~ } { , } \tl_replace_all:Nnn \cmdDC@beamerswitch@beameroptions { ,~ } { , } \ExplSyntaxOff % \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} % % \begin{macro}{beamer@insttitle} % \begin{macro}{beamer@andtitle} % \begin{macro}{beamer@instinst} % \begin{macro}{beamer@andinst} % For article mode, we load the class selected by the \key{articleclass} % option and require the \pkg{beamerarticle} support package. % 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}{% \cmdDC@beamerswitch@articleclass} \LoadClass{\cmdDC@beamerswitch@articleclass} \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 the % appropriate mode option as well those chosen using \key{beameroptions}. % % Handout mode lays multiple slides out on a single page. For this we use % \pkg{pgfpages}. The actual configuration is handled later. % % \begin{macrocode} \ifbool{DC@beamerswitch@handout}{% \PassOptionsToClass{\cmdDC@beamerswitch@beameroptions}{beamer} \LoadClass[handout]{beamer} \RequirePackage{pgfpages} }{% \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{% \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{% \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
{% \renewcommand{\title}[2][]{\beamer@origtitle{#2}\bsw@punct@test{#2}} } \mode{% \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
{% % \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{% \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 % % \fi %\Finale