Presentation tools
Slide decks, “powerpoints”, beamer lore
2015-06-01 — 2025-11-12
Wherein presentation tools are surveyed in a systematic registry, Quarto is declared the preferred export path, and HTML slides are noted to permit animated GIFs and offline PDF export via decktape.
On tools for presentation.
1 Standard technology
The default options:
- Microsoft PowerPoint.
- Apple Keynote.
Both are a colossal waste of time: they add little to my research and suck energy into a black hole of worrying about niggly presentation and file-type compatibility issues. Last time I looked, both had a terrible workflow for typesetting mathematical equations; Keynote was abysmal in this area.
An alternative strategy might reuse the documentation, code, maths markup, and/or graphs from my actual research articles and code.
It turns out this isn’t hard as such; it’s merely harder than it should be. Read on for options.
Aside: I was going to try out the cloud-based Microsoft Sway, which addresses some of my PowerPoint irritations. However, it doesn’t support mathematics, so it’s once again a non-starter for me.
2 Quarto
My current preferred option is Quarto. See quarto. It’s similar to RMarkdown but has a more modern design and lots of extra features.
3 RMarkdown slides
RMarkdown slides are often secretly HTML slides, but that’s more of an implementation detail. They’re my default choice. They support web display, mathematical markup, code, and dynamic interaction. Recommended. My preferred output for RMarkdown is HTML slides, covered below, but it can also produce PDF slides, and, crucially, PowerPoint.
3.1 RMarkdown to PowerPoint
RMarkdown will export to PowerPoint (thanks, pandoc).
The main trick is the speaker notes, which look like this:
This is the same as reveal.js but not the same as the speaker notes for remark.js/xaringan, so switching between them isn’t seamless.
NB: Mathematical markup is supported, but not LaTeX macros of any kind.
Still, it’s not too nasty.
3.2 RMarkdown HTML
RMarkdown renders to various HTML slide systems. It supports a whole lot of backends. A de facto standard is Reveal, which I usually use.
It can be clunky (e.g. image and text side-by-side can be painful), but it does the job.
Remark.js achieves support via xaringan, which is Yihui Xie’s favourite system. Xaringan has luxuries such as presenter notes and interactive style generator, although it uses a slightly different syntax and parser, so some things will format differently or even break if we switch between Reveal and Remark.
My R IDE is VS Code rather than the more typical RStudio, so I use this script to launch the slide viewer:
I save it in serve.R and execute it as
The smart-ish web server helpfully updates the browser when I update the slides.
4 Gamma
I begrudgingly admit I’m fascinated by the a16z pitch and philosophical position statement, Powerpoint is your therapist, Gamma is your coach:
I cannot understate how important it is to start with the prompt box, as the framing device that shapes your approach to the problem at hand. In contrast to the “start by editing empty slides” format, the prompt box is a native interface for opening up your lateral thinking.
At this critical stage of the product, you’re just trying to explain yourself. You are not concerned with the problem of “any given slide has to stand up to scrutiny as to whether you have the authority to present it.” You don’t need the salve of jump cuts and fractally compartmentalized bullet points to deal with the intractable problem of mandate constraints, because at this moment it’s just you and the AI, and you just need it to appreciate what’s going on - non-judgmentally, no-stress. It’s not your boss. It’s a robot that just wants to understand.
5 Mercury
Mercury allows you to add interactive widgets in Python notebooks, so you can share notebooks as web applications. Forget about rewriting notebooks to web frameworks just to share your results. Mercury offers a set of widgets with simple re-execution of cells.
It’s implemented as a specialized Jupyter front-end.
6 LaTeX slides
Beamer, the LaTeX slide thingy, works. It’s hard to make a very exciting design or even use a modern font, but that’s perhaps a feature. It reassures the audience that we’re performing the rituals of academia in a right and proper fashion by using 80s signifiers.
Note that BibTeX does not work with beamer. BibLaTeX, by contrast, seems to.
Fun fact: Knitr does support beamer slides too, although why would we want to do that? “Combine the expressiveness of Markdown with the simplicity of LaTeX” sounds to me like trolling.
There’s no hope of making beamer match my corporate style guide in any sensible timeframe, but I could pick the closest approximation by looking at the example theme matrix. OTOH, who actually meets corporate style guidelines? No academic I know does at any conference I’ve been to.
7 Native PDF slides
Generate a PDF using our choice of PDF technology. Display the PDF in presentation mode using our choice of PDF viewer. Reasonably universal, but not many conveniences.
AFAICT, this can’t play multimedia reliably.
7.1 Scribus
Scribus is a good open-source desktop publisher (think InDesign but free and occasionally broken). I discovered it while writing posters, and it has many features for PDFs: an adequate built-in LaTeX math renderer, good vector-graphics support, and it will even render arbitrary graphs from weird command-line software automagically via render frames.
8 HTML slides
HTML slides are powerful because they leverage the capabilities of web browsers, which are a ubiquitous execution platform these days. Many of the systems mentioned above output to HTML slides, but we can also use them bareback, writing plain HTML. I’ve done that and it’s not too hard.
Pros
- Free
- Can include animated GIFs and other crap I’ve found on the internet
- Slides are more-or-less self-formatting
- Easy to automatically generate slides from my statistical software.
They have shortcomings — my two main ones are:
- Some formatting isn’t drag-and-droppable, and fiddling with CSS to get it right is neither fun nor easy
- Sometimes I accidentally include an external resource, then need to give a presentation in an office with no internet access.
A useful tool for HTML slides is decktape: PDF exporter for HTML presentations. This also helps remedy that last shortcoming.
reveal.js and remark.js are the best I have tried. Reveal.js seems more popular, although a little over-engineered. There are many additional options listed below.
8.1 Reveal.js
reveal.js is the poster child for HTML slides. The online editor makes it easier to collaborate with my colleagues who aren’t HTML nerds.
- Git source code
- It has a GUI theme editor.
- There is a commercial spinoff GUI slide editor slides.com.
- Jupyter notebooks support reveal.js.
- Note that R Markdown supports reveal.js.
Creating themes seems to require us to fork reveal’s GitHub repo for full generality, which feels a bit weird. Although in principle we can still inject those CSS stylesheets as made famous by the web, right? Either way, in practice theming can be a rabbit hole of flex-box and responsive media queries.
If a PDF export is needed, an adequate method is as follows:
Presentations can be exported to PDF via a special print stylesheet.
Note: This feature has only been confirmed to work in Google Chrome and Chromium.
Instructions
- Open your presentation with print-pdf included in the query string, for example: http://localhost:8000/?print-pdf. You can test this at revealjs.com/demo?print-pdf.
- Open the in-browser print dialog (CTRL/CMD+P).
- Change the Destination setting to Save as PDF.
- Change the Layout to Landscape.
- Change the Margins to None.
- Enable the Background graphics option.
- Click Save
Alternatively, the generic PDF exporter decktape also works.
See also sundry workflow notes.
Speaker notes require the following header configuration:
After that, either of these seems to work as notes:
For the speaker notes to work, a local webserver is required — I use serve.R above.
8.2 Remark.js
remark.js is mostly similar to Reveal.js, but more minimalist, maybe, and a little tidier. For me it’s mostly relevant as the backend for xaringan for R HTML slides. It wasn’t immediately obvious which dialects of Markdown remark.js supports (not pandoc!). Specifically, it supports gfm and commonmark. The documentation for the former is superior.
8.3 Shower
Shower Presentation Engine is a do-over for HTML slides.
It has more modern math support and a two-column mode. On the downside, it doesn’t support speaker notes (unless you count mouseover footers). It’s also a backend to RMarkdown, via rmdshower.
8.4 Other HTML slide systems
- The classic is Eric Meyer’s S5, although it’s showing its age. No longer recommended.
- Also foundational and elegant, but no longer maintained, deck.js …
- marp is an integrated Markdown presentation writer
- MarkDeck - presentations as code promises good offline support
- impress.js does Prezi-style fancy slide animations. Documentation is basic
- DZslides isn’t my favourite but it’s worth mentioning because it’s used as a knitr example, although one could instead use S5 or, more modern still, reveal.js.
- an interactive tutorial on making interactive tutorials using d3.js (which would also work fine with
reveal.js, presumably.) - wunderpresentation turns other things into presentations. At the moment it notably supports Trello.
9 Quarto
See quarto.
10 Jupyter
Jupyter supports reveal.js HTML slide output. TBD.
10.1 RISE
In addition to the basic reveal.js integration, there’s a convenient (though slightly restricted) version of reveal that lets us display and interact with jupyter notebooks as slideshows via RISE.
Customisation of style etc for RISE:
- Use nbextensions_configurator; this tool offers an interactive way to enable, disable and tweak all notebook extensions — see screenshot below;
- Define settings in JSON files, typically by using Python scripts;
- Embed settings in a specific notebook’s metadata;
- Provide your own CSS file(s), which can supersede the styling of the various DOM pieces.
PDF export is clunky but works.
I haven’t used this for a while, but last time I found it annoying because Jupyter is already clunky. I don’t need any additional clunk.

