Created: February 9, 2023

Last modified: July 23, 2025

presentation software

Powerpoint sucks for many reasons that I don’t really need to elaborate on here. Keynote is certainly better especially since it can sort-of do latex equations that don’t look terrible. But ultimately it’s still opaque non-free software that is not moldable to my needs. I immediately want to rule out proprietary software (powerpoint, keynote) for several reasons:

When creating presentations, there’s tradeoffs between a programmatic versus GUI editing workflow. Perhaps the most popular programmatic slide workflow uses beamer. Given that my talks and posters are technical, it was inevitable that I would end up making them in latex with beamer. However, I’ve found that this process is just needlessly painful and for something as visual as a talk or poster should be. It’s difficult to write beamer and/or tikz with the same efficiency of a good GUI like inkscape since one inevitably spends a decent amount of time compiling and fixing bugs. Especially when one is pressed for time, completion with some visual imperfection is always better than being left with nothing but compilation errors. Using org mode to export to beamer helps a fair bit with the efficiency, but I find that ultimately, not creating these talks and posters in a visual medium encourages bad practices such as too much text and no visual flow through the concepts. Furthermore, there’s much less flexibility for achieving “what the eye sees is right, not what is exact” (e.g. kerning in large font titles) and the most painfully obvious place this manifests is the inability to easily arbitrarily lay out content. Thus beamer slides inevitably are either single or double column layouts. Animations are just a hack, and result in needlessly large PDFs. There’s no support for video. The only advantages are that it is code so one has access to loops, re-usability, parametrization.

But I want to try as much as possible to keep everything as vector graphics, since that goes a long way to making talks and posters look more polished. With all this in mind, that leaves me with pretty much one tool with the chops to do this sort of work: inkscape!

Given inkscape is a general purpose tool, there’s really a whole world of possible workflows one could imagine. Creating posters is more straight forward here, but for creating slides there’s the older and not very maintained jessyink which is a builtin inkscape extension, then there’s sozi which is an external program with a slicker interface that seems a bit more focused on “prezi-like” presentations. Also now that inkscape has multipage support, one could just export to pdf and use whatever software one used for beamer presentations. One could also use reveal.js with inkscape layers and such using something like this. Finally one could pretty easily roll their own jessyink with some simple javascript like this.

After considering these options, I decided to give jessyink a serious try, since it’s built into inkscape, has a nice slide overview, and seems like I should be able to hack on it without too much trouble. I also liked that it ends up as a self contained svg making it easy move around and throw up on a website (reveal.js would also fit some of the bills here, but seems more complex to figure out how to work well, but does have a presenter view which jessyink lacks).

In my searching I also came across this older interesting project called inkmacs by the person that started the xwidgets effort that relies on dbus. However, I never ended up trying to update some of the ideas for the newer dbus support in inkscape.

I tried the textext inkscape extension, but I found it couldn’t really compete with the custom ob-latex I wrote which just calls org-latex-preview which uses dvisvgm. It would be nice if the external editor and recompile everything textext issues were implemented, since I think they could potentially really help my workflow.

For faster iteration of my slides/posters, I tried using the external <image> embed of svgs in the inkscape document. This was great for not having to re-import figures when I update them (which really helps when working on last minute research update talks where it’s nice to have slides put together earlier then keep working on debugging figures up to the last minute). I heavily used my custom ob-latex.el patch to generate svg’s from latex using dvisvgm and then included them by path. I thought I would rely on inkscapes Extensions > Images > Embed Images option to generate a self contained file with everything at the end. However, I found it was easier to just throw all the assets in a folder on this site and present from there. Ultimately, the presentations I created using this method were really painful to make with a lot more clicking around in inkscape GUI than I wanted to deal with. Furthermore, there’s a tension.

See also: Useful Information: Using JessyInk to create presentations

Alright I’m gonna try to jump ship to reveal.js via org-reval since I think being more programatic will always be helpful. Leave inkscape for what it’s best at: making figures…

videos in jessyink

For more thoughts see My current workflows

Good advice on animation

https://academia.stackexchange.com/questions/185470/should-i-reveal-my-slides-bit-by-bit-when-giving-a-presentation-lecture Why I should be able to live without animating bullet point lists and that should encourage better presentations…

On the migration to reveal.js

I guess I haven’t written much about this. But everything is working much soother and I’m overall much happier. One pain point is exporting pdfs (still better than exporting page by page in inkscape and this way I can also export animated pdfs as backups for things like March meeting.) That’s partly due to firefox’s broken handling of @page{size: 1920px 1080px;} with print to pdf. See https://bugzilla.mozilla.org/show_bug.cgi?id=286443 and linked bugs, in particular this one: https://bugzilla.mozilla.org/show_bug.cgi?id=1963877.

Also it might make a cool project to try to implement the subset of reveal.js I care about in scheme using hoot!