Skip to content

Instantly share code, notes, and snippets.

@lmullen lmullen/Makefile
Last active Jul 25, 2019

Embed
What would you like to do?
PDF slides and handouts using Pandoc and Beamer

Files to create slides and handouts from the same Markdown files using Pandoc and a custom Beamer template. Lots of ideas borrowed from Karl Browman's post. The Makefile will turn any *.md in the directory into PDF slides (*.md.slides.pdf) and PDF slides with notes for speaking or a handout (*.md.handout.pdf). The file default.beamer belongs in ~/.pandoc/templates. Use the metadata in the YAML header of the Markdown file to control various options. To get the handout to look right, use the \note{} macro after each slide in the Markdown file.

% Generated by my modifications to the default Pandoc beamer template.
% Karl Browman has a tutorial about how to make Beamer sane:
% http://kbroman.wordpress.com/2013/10/07/better-looking-latexbeamer-slides/
% 12pt by default; handout if the handout template variable is defined
\documentclass[$if(fontsize)$$fontsize$,$else$12pt,$endif$$if(handout)$handout,$endif$$if(beamer)$ignorenonframetext,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
% theme, colortheme, and fonttheme with sensible defaults
$if(theme)$
\usetheme{$theme$}
$else$
\usetheme{default}
$endif$
$if(colortheme)$
\usecolortheme{$colortheme$}
$else$
\usecolortheme{dove}
$endif$
$if(fonttheme)$
\usefonttheme{$fonttheme$}
$endif$
% if it is a handout show the notes text; otherwise don't
$if(handout)$
\setbeameroption{show notes}
\setbeamertemplate{note page}[plain]
$else$
\setbeameroption{hide notes}
\setbeamertemplate{note page}[plain]
$endif$
% Don't show things we don't want to see
\beamertemplatenavigationsymbolsempty
\hypersetup{pdfpagemode=UseNone} % don't show bookmarks on initial view
% Slide number in lower right
\definecolor{gray}{RGB}{155,155,155}
\setbeamertemplate{footline}{%
\raisebox{5pt}{\makebox[\paperwidth]{\hfill\makebox[20pt]{\color{gray}
\scriptsize\insertframenumber}}}\hspace*{5pt}}
% Space between paragraphs on notes page
\addtobeamertemplate{note page}{\setlength{\parskip}{12pt}}
% Color and shape of bullets
% \setbeamercolor{item}{fg=gray}
% \setbeamercolor{subitem}{fg=gray}
% \setbeamercolor{itemize/enumerate subbody}{fg=gray}
\setbeamertemplate{itemize item}{{\textendash}}
\setbeamertemplate{itemize subitem}{{\textendash}}
\setbeamerfont{itemize/enumerate subbody}{size=\footnotesize}
\setbeamerfont{itemize/enumerate subitem}{size=\footnotesize}
\usepackage{amssymb,amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e} % provides \textsubscript
\ifxetex
\usepackage{fontspec,xltxtra,xunicode}
\defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
\else
\ifluatex
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
\else
\usepackage[utf8]{inputenc}
\fi
\fi
$if(natbib)$
\usepackage{natbib}
\bibliographystyle{plainnat}
$endif$
$if(biblatex)$
\usepackage{biblatex}
$if(biblio-files)$
\bibliography{$biblio-files$}
$endif$
$endif$
$if(listings)$
\usepackage{listings}
$endif$
$if(lhs)$
\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
$endif$
$if(highlighting-macros)$
$highlighting-macros$
$endif$
$if(verbatim-in-note)$
\usepackage{fancyvrb}
$endif$
$if(tables)$
\usepackage{longtable}
% These lines are needed to make table captions work with longtable:
\makeatletter
\def\fnum@table{\tablename~\thetable}
\makeatother
$endif$
$if(url)$
\usepackage{url}
$endif$
$if(graphics)$
\usepackage{graphicx}
% Redefine \includegraphics so that, unless explicit options are
% given, the image width will not exceed the width of the page.
% Images get their normal width if they fit onto the page, but
% are scaled down if they would overflow the margins.
\makeatletter
\def\ScaleIfNeeded{%
\ifdim\Gin@nat@width>\linewidth
\linewidth
\else
\Gin@nat@width
\fi
}
\makeatother
\let\Oldincludegraphics\includegraphics
\renewcommand{\includegraphics}[2][]{\Oldincludegraphics[width=\ScaleIfNeeded]{#2}}
$endif$
% Comment these out if you don't want a slide with just the
% part/section/subsection/subsubsection title:
\AtBeginPart{
\let\insertpartnumber\relax
\let\partname\relax
\frame{\partpage}
}
\AtBeginSection{
\let\insertsectionnumber\relax
\let\sectionname\relax
\frame{\sectionpage}
}
\AtBeginSubsection{
\let\insertsubsectionnumber\relax
\let\subsectionname\relax
\frame{\subsectionpage}
}
$if(strikeout)$
\usepackage[normalem]{ulem}
% avoid problems with \sout in headers with hyperref:
\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
$endif$
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em} % prevent overfull lines
$if(numbersections)$
$else$
\setcounter{secnumdepth}{0}
$endif$
$if(verbatim-in-note)$
\VerbatimFootnotes % allows verbatim text in footnotes
$endif$
$if(lang)$
\usepackage[$lang$]{babel}
$endif$
$for(header-includes)$
$header-includes$
$endfor$
$if(title)$
\title{$title$}
$endif$
$if(subtitle)$
\subtitle{$subtitle$}
$endif$
$if(author)$
\author{$for(author)$$author$$sep$ \and $endfor$}
$endif$
$if(date)$
\date{$date$}
$endif$
$if(institute)$
\institute{$institute$}
$endif$
\begin{document}
$if(title)$
{
\setbeamertemplate{footline}{} % no page number here
\frame{
\titlepage
% Include a note for the title slide here, because we cannot do so in the
% Pandoc markdown file. If you want the title note to contain actual text,
% use the titlepage-note field in the YAML header. Otherwise, we use a
% non-breaking space so that it is not empty.
\note{$if(titlepage-note)$$titlepage-note$$else$~$endif$}
}
}
$endif$
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
\begin{frame}
\tableofcontents[hideallsubsections]
\end{frame}
$endif$
$body$
$if(natbib)$
$if(biblio-files)$
$if(biblio-title)$
$if(book-class)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$biblio-files$}
$endif$
$endif$
$if(biblatex)$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
$endif$
$for(include-after)$
$include-after$
$endfor$
\end{document}
SLIDES := $(patsubst %.md,%.md.slides.pdf,$(wildcard *.md))
HANDOUTS := $(patsubst %.md,%.md.handout.pdf,$(wildcard *.md))
all : $(SLIDES) $(HANDOUTS)
%.md.slides.pdf : %.md
pandoc $^ -t beamer --slide-level 2 -o $@
%.md.handout.pdf : %.md
pandoc $^ -t beamer --slide-level 2 -V handout -o $@
pdfnup $@ --nup 1x2 --no-landscape --keepinfo \
--paper letterpaper --frame true --scale 0.9 \
--suffix "nup"
mv $*.md.handout-nup.pdf $@
clobber :
rm -f $(SLIDES)
rm -f $(HANDOUTS)
author subtitle title titlepage-note institute fontsize
Lincoln Mullen
Doing DH Institute
Spatial History
This is a the note that goes on the title page. This talk is to be given at Doing DH.
George Mason University
17pt

Slide with text and a note

Regular text size

\tiny Jonathan Sarna, American Judaism (New Haven: Yale University Press, 2014)

\note{ NOTES: This is a note page and you ought to be able to tell. }

Slide with text and footnote

Surely this is true.^[Jane Doe, Says It Here (New York: Oxford University Press, 2050).]

\note{I am sure about this point.}

This is a heading

Regular text on a slide:

  • One
  • Two
  • Three

\note{ More notes:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. }

Code example

puts "Hello world."
def my_awesome_variable
  puts "My awesome variable"
end

\note{ This might be easier in R or Ruby. }

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@pavelrudnev

This comment has been minimized.

Copy link

commented Feb 5, 2015

This is very useful, thanks. I was wondering how one should go about changing the compiler: where do I declare that I want the slides to be compiled with, say, XeLaTeX?

@daaronr

This comment has been minimized.

Copy link

commented Dec 27, 2015

Some things were coming out in the original template that I have lost by tweaking too much, I cannot recover these.

  1. I want to get the 'highlighted quotes' back when I use the environment:

This is a quote

  1. Also, sublists are now using a smaller font, e.g.,
    List
  2. First element
    • Second element

The 'second element' is a smaller font.


My adapted template is here: https://dl.dropboxusercontent.com/u/91553/defaultbeamerdr.txt


Compiling the sample file here: https://dl.dropboxusercontent.com/u/91553/testnoteslides.md

with the command

pandoc testnoteslides.md -t beamer --slide-level=2 -o testnoteslides.pdf --verbose

@matthiasbeyer

This comment has been minimized.

Copy link

commented May 25, 2016

Hi there. May I take your code here and open a repository with it and license it under terms of https://creativecommons.org/licenses/by-sa/4.0/ ?

@hasufell

This comment has been minimized.

Copy link

commented Oct 27, 2016

Getting error:

ides/LBS_slides.md 
! Undefined control sequence.
<recently read> \tightlist 

l.139 \end{frame}

pandoc: Error producing PDF

had to add

\providecommand{\tightlist}{%
  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
@iphyer

This comment has been minimized.

Copy link

commented Mar 10, 2017

How to change background color?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.