Tool time: org-mode and beamer
This year I’ve become a devoted user of org-mode for making presentations, using the excellent beamer package for LaTeX export. Although this tool set can produce great-looking slides, using open-source software, without using silly point-and-click tools, it does have a steep learning curve. Having gone through at least the initial phases of this curve, I hope that I can help out other folks in their presentation efforts by giving some pointers here.
There are two important files to create to make a presentation in this way: the org-mode file, and the beamer theme file. I am going to assume that you already know what LaTeX is, and that you already know how to use Emacs to edit text files, but I will start out by briefly describing as much of org-mode as I think you’ll need for this particular task. After that, I’ll talk about the org-mode file that you write to create a presentation, and finally I’ll describe the beamer theme file that you can use to customize your slide appearance.
Org-mode in a minute §
Org-mode is a crazy, beautiful, complicated swiss-army knife of an information
management system in Emacs. The basic idea behind org-mode is that it helps you
maintain semi-structured data using a bunch of text files containing outlines,
lists, and tables. Text files preserve the portability of your data, while
allowing you to make use of your accumulated Emacs-fu: moving around (C-a
,
C-e
, C-p
, M->
) remains the same, undo (C-_
) remains the same, swapping
characters (C-t
) words (M-t
) or lines (C-x C-t
) remains the same, killing
(C-w
, M-w
, C-k
) and yanking (C-y
, M-y
) … in short, all of these
things you already know about Emacs remain the same. Org-mode extends this basic
editing functionality by essentially adding a powerful “outline editing mode” on
top.
An org-mode document is usually divided into sections, each of which starts
with a title prefixed by a number of asterisk (*
) characters. A level 1 title,
for instance, might look like this:
* Introduction
while a level 3 title, followed by some text, might look like this:
*** Procedures of the Roman Senate
The Romans had a Senate.
- Senators *could not* engage in banking
- Any Senator could /filibuster/ a vote
Below each title comes one or more blocks of text, just like in a LaTeX document. In addition to simple text blocks, org-mode provide some basic text formatting tools—like Markdown or ReStructuredText—that allow you to write bulleted and numbered lists, bold text, and so forth, without all of the LaTeX-specific markup. Basically, writing with this level of org-mode is similar to writing a LaTeX document using Markdown.
Org-mode allows you to do all sorts of crazy stuff using the outline of your
document, but I won’t go into that here. I will mention that when you open an
org-mode document, org-mode by default collapses all of the sections in your
document. To cycle through expanding all of your document’s sections,
press S-<tab>
several times. (To toggle expansion of a single section, move
point to that section and press <tab>
.)
Finally, I will also note that the first several lines of an org-mode file
typically contain lines starting with #+
, which is a prefix indicating some
sort of metadata. The big three metadata elements are TITLE
, AUTHOR
, and
DATE
:
#+TITLE: Rain and Freedom in "Sometimes a Great Notion"
#+AUTHOR: Mildred Ratched
#+DATE: January 22, 1978
These metadata elements are used when you ask org-mode to publish your file to some other output format—in our case here, LaTeX.
So, now you have a tool that knows about metadata and sections, and allows you to edit text in an intelligent way. Sounds like the perfect place to start writing some slides!
To get started, create a single text file with Emacs, and turn on org-mode:
M-x org-mode
.
Header §
The header of an org-mode file, particularly one that is intended to be published using LaTeX, typically includes a bunch of metadata that will help produce the final document in just the right way. I usually use a header based more or less on the following template:
#+STARTUP: beamer
#+OPTIONS: toc:nil
#+DATE: A Conference, 2013
#+LaTeX_CLASS: beamer
#+LaTeX_CLASS_OPTIONS: [t]
#+LaTeX_HEADER: \usetheme{utcs}
#+LaTeX_HEADER: \usepackage{mathpazo}
#+LaTeX_HEADER: \usepackage{stmaryrd}
#+LaTeX_HEADER: \DeclareMathOperator*{\argmin}{arg\,min}
#+LaTeX_HEADER: \DeclareMathOperator*{\argmax}{arg\,max}
#+BEAMER_FRAME_LEVEL: 2
#+BEAMER_HEADER_EXTRA: \title[Slide Tools]{A Method for Making Slides Using Text Files}
#+BEAMER_HEADER_EXTRA: \author[Johnson, Wuzzy]{Leif Johnson, Fuzzy Wuzzy}
What do all of these things do? I’ll step through them briefly here.
Beamer document §
To tell org-mode that you want to create a beamer document, you’ll need to set a couple different header elements. First, and most important, you need to configure the LaTeX output to create a beamer document:
#+LaTeX_CLASS: beamer
This is just the standard mechanism for selecting the documentclass
in
exported LaTeX output.
#+STARTUP: beamer
Org-mode hasn’t figured out yet that if you are exporting a beamer document in LaTeX, then you are also probably writing a beamer document in org-mode. So this header tells org-mode to turn on beamer-specific functions when you load the document.
Presentation metadata §
There are several fields that you can set to specify what your presentation is about, who wrote it, and so forth. These elements naturally show up on the title slide of your presentation, but also, depending on your beamer theme settings, in the footer area of each slide.
Typically, org-mode uses the DATE
, TITLE
, and AUTHOR
fields for this
purpose, but when exporting slides, two of these metadata fields have some
drawbacks, so I recommend using this strategy instead:
#+DATE: Conference, 2013
#+BEAMER_HEADER_EXTRA: \title[Pose Coding and Regression]{Unified Losses for Multi-Modal Pose Coding and Regression}
#+BEAMER_HEADER_EXTRA: \author[Johnson, Cooper, Ballard]{Leif Johnson, Joseph Cooper, Dana Ballard}
Here I’ve ignored the standard org-mode TITLE
and AUTHOR
headers, because
org-mode doesn’t have a way to export short forms of these elements (the part
between square brackets). I’ve found the short title and author form to be
critical: typically my presentation titles are rather long, being based on a
computer science paper of some sort, and if exported without a short form these
elements will overflow the small-ish areas devoted to them in the slide footer.
It’s not critical, but I think having a little polish goes a long way in a
presentation.
Organization §
Org-mode has all sorts of ways of handling outlined documents, which I think are
generally really helpful. However, I don’t like having outlines in my
presentations, since they often serve as crutches to compensate for lack of a
coherent story. So, I disable the automatic table of contents using the standard
org-mode OPTIONS
header:
#+OPTIONS: toc:nil
There is also the question of how sections, subsections, and so forth will map onto beamer frames (slides). By default, all level 1 titles will create a new frame. However, you can change this behavior by telling org-mode which header level should start a new frame:
#+BEAMER_FRAME_LEVEL: 2
I like using 2 for this value because it allows you to group frames into logical chunks in your presentation. In addition, setting this value to 2 works better with beamer themes that include slide icons grouped by section. In the rest of this tutorial I’ll assume that you’ve set this value to 2.
Slide appearance §
By default, the content on a beamer frame is centered vertically. You can change this by passing document class options to LaTeX. For example, to align all frame content to the top by default, include this header line:
#+LaTeX_CLASS_OPTIONS: [t]
You can also use this field to select the font size for your slides; the default is 11 points, but you can set this to any value between 8 and 14.
Also, you will probably want to specify the beamer theme to use when laying out your slides. Beamer comes with many different available themes, but I think my slides end up looking a lot nicer if I am able to set things like colors and spacing more explicitly. For example, to use a theme file that matches the official University of Texas colors and includes the Computer Science Department as my institution, I use:
#+LaTeX_HEADER: \usetheme{utcs}
and then create a beamer theme file in the same directory as the org-mode file,
named beamerthemeutcs.sty
. I’ll talk more about this theme file at the end of
this tutorial.
Finally, this is a personal preference, but I think the Palatino font set and mathematics look really nice in a presentation. You can select them by supplying this standard header to LaTeX:
#+LaTeX_HEADER: \usepackage{mathpazo}
For that matter, you can include any LaTeX header information that you should desire using this metadata field. Go wild!
Frames §
A frame is, more or less, a slide. It has a title, an optional subtitle, and some content. Depending on your beamer theme, it might also appear with a sidebar or a footer, but those elements are added by the beamer theme you select and do not show up anywhere in your actual org-mode file.
Here’s a basic frame in an org-mode document:
** Napoleon's Infamous Campaign
\includegraphics{map.jpg}
- Crossed a river, August 1812
- Fled to Paris, December 1812
- Lost more than 90% of army
Title §
The title of your frame is just the section title, and the subtitle (if any) is
included by appending \\
to your section title. For example:
** Frame Title
Would just have a title, and
** Frame Title \\ Subtitle here
includes a subtitle as well.
Contents §
Following the title, you can include whatever content you like in your slide. In
the example above, I’ve included an image file (from the same directory as the
org-mode file) called map.jpg
, and followed it by a bulleted list with three
elements.
You can include multiple graphics in your frames. If you’d like several images to appear on the same line, keep the includes together:
\includegraphics[width=4cm]{map.jpg}
\hspace{1cm}
\includegraphics[height=3cm]{tallies.pdf}
Often, as above, it’s a good idea to control the width and/or height of your
included graphics. Be sure to remember that the exported size of a beamer frame
is 128mm by 96mm (this relatively small page size eliminates most of the need to
scale fonts in a strange way compared with standard LaTeX documents), and that
the title often takes up a good bit of the top of the frame. Finally, in the
example above, I’ve used the LaTeX \hspace{}
command to separate the two
images by a little bit—by default LaTeX will not insert any whitespace there.
If you’d like the images to appear one after another vertically, just put the two include statements in separate “paragraphs”:
\includegraphics[width=4cm]{map.jpg}
\centering
\includegraphics[height=3cm]{tallies.pdf}
As above, you can center an image horizontally by including the \centering
command.
Math §
You can insert math in your slides using the standard LaTeX tools:
\[ 0 = e^{i\frac{\tau}{2}} + 1 \]
Now we rewrite the above equation using $\frac{\tau}{2} = \pi$
Because it’s LaTeX, the math will be typeset beautifully, and it’s just as easy to edit as it is in your LaTeX documents!
Blocks §
I’ve found that you can get pretty far using just the tools above. However, there are times when you need a little more organizational power, or when you want to take advantage of the stylistic effects of a beamer “block.”
** Calvin or Hobbes? \\ Epistemology of cunning
Hobbes often lies in wait for Calvin:
*** Pouncing :B_example:
:PROPERTIES:
:BEAMER_env: example
:END:
\includegraphics{pounce.jpg}
Here, we’ve created a sub-title within our frame, and designated it as an “example” block. To do this with org-mode, you can either copy the text above and modify it as needed. Alternatively, write out the title:
*** Pouncing
then type C-c C-b
. This will bring up an org-mode menu that will let you
choose which type of block you’d like to use. (You can change the block type
later by using the same keypress.)
You can also configure blocks to appear in multiple columns on a slide. To do
this, add a :BEAMER_col:
field to the properties drawer of the block:
*** Pouncing :B_example:
:PROPERTIES:
:BEAMER_env: example
:BEAMER_col: 0.55
:END:
\includegraphics[width=4cm]{pounce.jpg}
*** Leaping :B_example:
:PROPERTIES:
:BEAMER_env: example
:BEAMER_col: 0.45
:END:
\includegraphics[width=3cm]{leap.jpg}
This will set up the blocks on your frame with the given widths (specified as a fraction of the frame width). Anything below a block title will be included in the block, until org-mode encounters the start of a new frame or a new block.
To include content that spans the entire frame after a columnized block or
blocks, create a new block using the ignoreheading
format that has a width of 1:
*** Leaping :B_ignoreheading:
:PROPERTIES:
:BEAMER_env: ignoreheading
:BEAMER_col: 1
:END:
This content will span the frame width
Progressive reveal and overlays §
You can specify that elements on your frames get displayed progressively, from what I can tell, in two different ways.
Probably the easiest is just to include \pause
in your slide wherever you want
to press a key to reveal the next thing on your slide. For instance, each
element on this slide will be revealed progressively:
* Slot Machine Madness
\pause
\includegraphics[width=3cm]{bandit.jpg}
\pause
- The house always wins
\pause
- Even when you take this fact into account
\pause
- So it's not a great idea to gamble
\pause
- Not even the lottery
This can get rather annoying if you intend to reveal every bullet in your entire presentation progressively, so there is another way to do it. Just add a header to the top of your org-mode file:
#+BEAMER: \beamerdefaultoverlayspecification{<+->}
This will reveal each bullet element in your slides progressively. It will not, however, reveal images and non-list-item text progressively (these will be visible from the get-go), so you might need to do some tweaking to get things just the way you want them.
Beamer gives you more control over exactly when things appear and disappear on
your slides, by including a special <N-M>
marker on elements that you want to
reveal progressively. The marker means that the element will first appear on the
N
th step of the reveal for that slide, and will remain in appearance up to the
M
th step. M
can be omitted if you want things to appear until the slide is
over, and N
can be +
if you want elements on the slide to be revealed in
sequence. (This is what the <+->
in the above default overlay specification
does.)
Just as an example, you might show elements in a list progressively:
- <1-> First element (first reveal onwards)
- <1-2> Second (first two reveals)
- <3-6> Third (third to sixth reveals
You get the idea.
Babel §
One of the neato features of org-mode is its ability to embed output from other
programs or programming languages, by including source code directly inside the
org-mode document. This feature is called “babel” in org-mode; it allows you
to, for example, use dot
to draw graphs that will be included in your exported
slides:
* The Numbers
#+BEGIN_dot numbers.pdf -Tpdf
digraph example {
complex -> real -> rational -> whole;
even -> whole [label="subset?"];
e -> real;
}
#+END_dot
Instead of including this messy source in your slides, org-mode will call the
dot
executable, passing it the code embedded between the BEGIN
and END
markers. dot
will draw a directed graph using this code, and then org-mode
will include the resulting PDF file in your slides!
TiKZ §
This babel embedding is a really nice feature, and can be used to include many other programming languages (Python, ruby, shell, etc.) or environments directly in your org-mode documents. I think it’s really the first exposure I’ve had to what might be called “literate programming.”
However, if you’re focused on including diagrams in slides, it’s pretty hard to beat another crazy, complicated, beautiful program : TiKZ. TiKZ is a vector drawing package for LaTeX that, like org-mode, can pretty much do anything you want it to do—provided you know how to convince it in the right way. I won’t get into TiKZ in this tutorial, but I recommend giving it a look if you find yourself needing vector graphics in your slides.
Beamer theme §
For further reading, here’s a nice cheat sheet (PDF) with some Beamer style information.