Presenting zpresent, a presentation framework for Emacs

September 2017

Once in a while, I give a presentation. Not too often. You probably do give more than I do. It's not a competition.

Presentations are a pain to make. "Traditional" presentation software requires you to simultaneously create content and determine its layout. So when you're thinking about how to phrase your seventeenth slide about the proper kind of switch to use in your mechanical keyboardCherry MX Green, you also have to use the mouse to drag that text box to the exact right pixel.

It would be easier if a presentation's content was separated from its layout, like HTML does for webpages. Ideally, presentations would be written in a structured, text-based input format. Luckily, in Emacs, there is a very popular structured text format: Org files! But let's put aside Org for now, and pretend it's not a loose end that I added in to call back later.

Many of my presentations involve code. It would be nice, when giving a presentation, to be able to present from inside Emacs, so I can easily switch between the presentation and a code demo, without having to un-fullscreen a window to find Emacs when switching to the demo, and upon going back to the presentation, switching to the presentation program and re-fullscreening it.

So I looked at existing presentation frameworks for Emacs. Some, like org-reveal or the built-in ox-beamer, render a separate presentation, like a reveal.js or LaTeX file that's the presentation. So they fail my goal of presenting inside Emacs.

Others, like org-present and org-tree-slide, present from within Emacs. They look like narrowed Org files, because they are narrowed Org files. That's nice for writing the presentation, but I want the presentation to look more like a traditional one, with a slide header, and nice layouts. epresent is close, but looks like a zoomed-in Org file. meta-presenter is similar, in that it looks like (and is) narrowed Markdown files.

So I wrote zpresent, a presentation framework that presents Org files in the style of a traditional presentation. The input looks like this:

* A presentation title.
:type:     title
:author:   me!
* A regular slide here
** Point one!
** Point two!
** Point four! (fooled you!)

Isn't that nicer? Not only can you ignore layout details, you can also use the power of Emacs and all its powerful commands to edit your presentation.

It's displayed as a "traditional" presentation, with a large title at the top, and some formatting to look good. Here's what it looks like:

An example of a zpresent slide, with headline and nested bullets.

It's still early in the project, but the input format is pretty stable. The project is built on top of org-parser, a library I wrote to parse Org files.

The software repository contains installation instructions.

There were some interesting takeaways from doing this project. I learned that the Org file format is incredibly complicated. For example, you can't add tags or properties to plain lists. I also added a macro and fixed a bug in dash before realizing I didn't actually need to use the macro I added.

Thanks to Karan Sagar for feedback on a draft.


< Move files in Emacs
tag: emacs


Testing Emacs code that modifies buffers >
tag: presentation


EmacsConf 2020 talk: WAVEing at Repetitive Repetitive Repetitive Music >