Search code examples
rlatexr-markdownmarkdownbeamer

How to employ a custom beamer theme, template and includes in a beamer presentation generated with R markdown?


R markdown presentations with output format beamer can make use of

  • Classical LaTex beamer themes such as Copenhagen or Madrid or employ custom beamer themes.
  • Templates , i.e. a template.tex
  • Includes, e.g. in_header: preamble.tex, before_body: before_body.texand after_body: after_body.tex

which can be implemented in the rmarkdown::beamer_presentation through the YAML-header as follows:

theme: "THEMENAME"
template: template.tex
includes:
  in_header: preamble.tex
  before_body: before_body.tex
  after_body: after_body.tex

Question I: What are the specific purposes of these files listed above?

I got provided with a custom themes for beamer, containing beamerthemeTHEMENAME.sty, beamercolorthemeTHEMENAME.sty, beamerfontthemeTHEMENAME.sty, beamerinnerthemeTHEMENAME.sty, beamerouterthemeTHEMENAME.sty. Sourcing this template within my YAML header does not lead to the presentation looking too close to any beamer presentation generated straight with LaTex and applying the custom theme.

As an example, in the beamerouterthemeTHEMENAME.sty, a new titleframe is defined, which can then be called at the beginning of the LaTex presentation with \titleframe. I did not succeed in applying this custom frame-type in the rmarkdown::beamer_presentation.

Question II: Applying a LaTex beamer theme in an rmarkdown::beamer_presentation, which contents to modify or enhance the presentation

  • would have to be adapted or
  • moved from the beamer theme to template.tex and includes

such that they are applied to the presentation in rmarkdown just as in LaTex?

Question III: Can the final files of the custom theme, the template.tex, and the includes be moved to a sub-folder for the neater organization of the presentation folder and still be loaded correctly

MWE & issues remaining

  • Can not use the following frame templates defined in beamerouterthemeTHEMENAME.sty: \titleframe, \tocframe, \closingframe
  • footline defined in beamerouterthemeTHEMENAME.sty:
    • Succeeded in linking the page numbers to the appendix .
    • Would be nice to link the logo to the table of contents slide

MWE.Rmd

---
title: "MWE"
subtitle: "Beamer presnetation with R-markdown"
institute: "some place"
date: "`r format(Sys.time(), '%B %d, %Y')`"
output:
  # beamer_presentation: default
  bookdown::pdf_book:
    base_format: rmarkdown::beamer_presentation
    # includes:
    #   in_header: preamble.tex
    theme: "THEMENAME"
    latex_engine: xelatex
    toc: false
    slide_level: 2
---


​```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
​```

# Random presentation

## TOC - Table of Contents {.unnumbered}

\tableofcontents
\label{contents}

## Slide with Bullets

- Bullet 1
- Bullet 2
- Bullet 3

## Apendix
\appendix

beamerthemeTHEMENAME.sty

\usepackage[utf8]{inputenc}

% Tizk, textpos, graphics
\RequirePackage{tikz}
\RequirePackage{textpos}
\RequirePackage{xcolor}
\RequirePackage{booktabs}

% Beamer settings
\usecolortheme{THEMENAME}
\useoutertheme{THEMENAME}
\setbeamertemplate{navigation symbols}{}

\mode<all>

beamercolorthemeTHEMENAME.sty

\mode<presentation>
\definecolor{THEMECOL}{RGB}{162,48,47}  % red
\definecolor{THEMEgray}{RGB}{110,110,101}% gray

\colorlet{titlefgcolor}{THEMECOL} % color of box
\colorlet{titlebgcolor}{THEMEgray} % color of box

\setbeamercolor*{title}{fg=THEMECOL}    % presentation title 
\setbeamercolor*{author}{fg=THEMECOL}   % author
\setbeamercolor*{date}{fg=THEMECOL} % date
\mode<all>

beamerouterthemeTHEMENAME.sty

\mode<presentation>

% Redefine \insertshortinstitute to allow multiple lines
\makeatletter
\renewcommand{\insertshortinstitute}{\beamer@shortinstitute}
\makeatother

% Title frame
\def\titlefigure{img/my_bg}
\newlength\titleboxwidth
\setlength{\titleboxwidth}{0.33\textwidth}
\newcommand{\titleframe}{%
    {
        \setbeamertemplate{background}{
            \begin{tikzpicture}
            \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
            \ifx\titlefigure\empty
                \fill[titlebgcolor] (6.3mm,6.4mm) rectangle (\the\paperwidth-8.3mm,\the\paperheight-13mm);
            \else
                \node at (current page.center) [anchor=center,yshift=-3.5mm] {\includegraphics[width=\the\paperwidth-19mm]{\titlefigure}};
            \fi
            \node at (current page.north east) [anchor=base east, xshift=-8.3mm, yshift=-6.3mm, align=left, inner sep=0mm, font=\fontsize{5.5}{6.6}\selectfont] {
                \insertshortinstitute
            }; 
            \node at (current page.north west) [anchor=south west, inner sep=0mm, xshift=8.3mm, yshift=-8.6mm] {
                \includegraphics[height=3.8mm]{img/my_logo}
            }; 
            \end{tikzpicture}
        }
        \setbeamertemplate{footline}{}
        \begin{frame}[noframenumbering]
            \begin{tikzpicture}
                \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
                \node [
                    shift={(-11.5mm,-1.8mm)},
                    fill=titlefgcolor,
                    minimum width=0.46\paperwidth,
                    minimum height=18mm,
                    anchor=west,
                    inner sep=4mm
                    ] at (current page.west) {
                        \hspace*{9mm}
                        \begin{minipage}{\titleboxwidth}
                            \raggedright
                            \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle\\[3mm]
                            \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\
                            \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
                        \end{minipage}          
                    };
            \end{tikzpicture}
        \end{frame}
    }
}

% TOC frame
\newcommand{\tocframe}{%
    \begin{frame}
      \frametitle{Outline}
      \tableofcontents
    \end{frame}
}

% Section title frame
\AtBeginSection[]
{
    \begin{frame}
      \frametitle{Outline}
      \large
      \tableofcontents[currentsection] 
    \end{frame}
}

\newenvironment{closingframe}{
    \setbeamertemplate{background}{
        \begin{tikzpicture}
        \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
        \node at (current page.north west) [anchor=base west, xshift=8mm, yshift=-10mm, align=left] {
            \includegraphics[width=23mm]{img/my_logo.png}
        }; 
        \end{tikzpicture}
    }
    \setbeamertemplate{footline}{}
    \addtolength{\headsep}{10mm}
    \begin{frame}[noframenumbering]
}%
{
    \end{frame}
}%

% Footline
\setbeamertemplate{footline}{
    \leavevmode%
    \hyperlink{contents}{\includegraphics[width=12mm,trim=0mm 0.4mm 0mm 0mm]{img/my_logo.png}}
    \hfill
    \hyperlinkappendixstart{\insertframenumber/\inserttotalframenumber}
    \vspace{3mm}
}

\mode<all>

Solution

  • @Samcarter_is_at_topanswers.xyz is right. This is a broad question.

    The simplest response is yes, you can use the beamercolor...sty and associated files to create your custom beamer deck. I use RStudio as my R IDE and I wrote a "plugin" that allows me to generate a new custom beamer presentation just like you would generate any other new doc: i.e., File -> New file -> R Markdown -> From Template

    I keep the .sty files in home directory I call customtex or something, with a tex directory and a beamer dir.

    - companytex
        - tex
            - beamer [houses `.sty` files]
            - latex
    

    When I use From Template in RStudio, these files get copied into the specific location I determine, along with the new .Rmd file that is created.

    - reportdir
        - .Rmd file
        - figure dir
        - resources dir
            - images dir
            - theme dir
                - all of my `.sty` files for beamer generation
    

    When I click the Knit (or otherwise run render()), the custom .sty files are used as the template.