Skip to content

Instantly share code, notes, and snippets.

@sebastiansauer
Forked from lmullen/Makefile
Created June 22, 2016 21:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebastiansauer/2df47ec7c7bd55e8ba5a97dad60674ba to your computer and use it in GitHub Desktop.
Save sebastiansauer/2df47ec7c7bd55e8ba5a97dad60674ba to your computer and use it in GitHub Desktop.
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. }

Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment