From 0b2d2e8f227b67eda60e63b425d8a47d3960e37e Mon Sep 17 00:00:00 2001 From: Midgard <2885-Midgard@users.noreply.framagit.org> Date: Mon, 8 Jun 2020 00:23:21 +0200 Subject: [PATCH] Write initial SVG slide article --- blog/svg-slides.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 blog/svg-slides.md diff --git a/blog/svg-slides.md b/blog/svg-slides.md new file mode 100644 index 0000000..12d518f --- /dev/null +++ b/blog/svg-slides.md @@ -0,0 +1,82 @@ +title: SVG + Makefile = slide deck +summary: "You don't need LibreOffice to prepare your presentation -- or: an introduction to makefiles" +published: 2020-06-02 + +--- + +Text-based slides are boring and not effective. While preparing a presentation for my intermediary +thesis' defence, I wanted to create something that would support my story better. I wanted to use +graphics instead of words so the language centres of my dear audience's brains could focus on my +speech rather than reading. Rather than importing slide-sized graphics in a GUI, I thought +a makefile would be a nice way to do the trick. + +Makefiles these days are commonly used as a shell script with multiple entry points. You give it a +filename, and it will build that file if its dependencies have been changed. Traditionally +makefiles are used for C programs, but there's no reason you can't use them for any build you want. +Even this website is updated with a makefile! Want to join me and write one together? + +## Writing the makefile +Putting the name of our output file in variables will make it easier to change it later. +```makefile +OUTPUT = slides.pdf +``` + +We'll make a list of SVGs in the current directory, and convert it into a list of PDFs targets. +Sorting is necessary to be able to place your slides like you want. The `$(:=)` construct is used +to go from `%.svg` to `build/%.pdf`. +```makefile +SLIDES ::= $(sort $(wildcard *.svg)) +SLIDES_PDF ::= $(SLIDES:%.svg=build/%.pdf) +``` + +I love this next rule. It teaches make that it should use Inkscape if it needs to create a PDF. +`$@` refers to the target (`build/….pdf`), and `$<` refers to the first dependency (`….svg`). +Inkscape's `-A filename` option exports to PDF without opening the GUI. +**TODO: isn't there a way to automatically depend on all parent directories?** +```makefile +build/%.pdf: %.svg build + inkscape -A "$@" "$<" +``` + +Now we tell make that the final output can be created from the individual slides. + +Make will recursively make sure that all dependencies are up to date. Because we add the SVG source +file as a dependency, it will know that the individual PDF files have to be rebuilt if their source +was changed. And if any slide was changed, the end result will be updated too. But if there was no +change, it won't. Nothing is rebuilt unnecessarily! + +**TODO: DRY** +**TODO: Do we need to fix sh's space disease here?** +```makefile +$(OUTPUT): $(SLIDES_PDF) + pdfjoin $(SLIDES_PDF) -o "$@" +``` + +If you look at the `build/%.pdf` rule, you see that it depends on `build`. With this simple, final +rule, make will know how to create this directory. +```makefile +build: + mkdir -p "$@" +``` + +It is common to create a `clean` to clean up. Since `clean` is not a file, we have to mark the +target as "phony". +```makefile +.PHONY: clean + +clean: + rm -rf "$(OUTPUT)" build/ +``` + +This concludes the Makefile portion of this post. + +**TODO: write about first rule being the default** +**TODO: split into 2 posts?** + +## Creating and presenting slides +Create one SVG per slide, you can do that in Inkscape. Set the document size to something with the +desired aspect ratio. In my experience this is 16:9 for newer projectors and 4:3 for older models. + +To use the resulting slide deck during your presentation, I can recommend +[pdfpc](https://pdfpc.github.io/). But any old PDF viewer that has a fullscreen mode will work, of +course.