Quarto reveal.js clean

A minimal and elegant presentation theme

Danilo Freire

Emory University

08 September, 2024

Example slide

This is a subtitle

Before we dive a bit deeper, here is a simple example of the clean theme in action.

  • No pictures or anything fancy. Just text for the moment.

Next, we’ll take a brief tour of some theme components.

  • We’ll use the same basic structure as the original LaTeX slides.
  • Note that the full suite of Reveal.js features are available for this Quarto implementation, even if we don’t cover everything here.

Before you proceed…

Requirements for the coding examples in this demo

R libraries

While the clean theme is language agnostic, we will use several R coding examples in this demo to highlight some advanced theme features.

You will need the following libraries if you’d like to render the template “as-is”:

install.packages(c("modelsummary", "gt", "fixest", "pdftools", "tinytex", "threejs"))

TinyTex

While reveal.js presentations are HTML format, we will show an example of how to embed LaTeX tables as images. This requires a working Tex distribution, of which TinyTex provides by far the easiest and lightest integration with Quarto. More details here.

quarto install tinytex

Components

Components

Ordered and Unordered Lists

Here we have an unordered list.

  • first item
    • sub-item
  • second item

And next we have an ordered one.

  1. first item
    1. sub-item
  2. second item

Components

Alerts & Cross-refs

To emphasize specific words or text, you can:

  • Use the default .alert class, e.g. important note.
  • Use the .fg class for custom colour, e.g. important note.
  • Use the .bg class for custom background, e.g. important note.

Components

Animate elements with .fragment

Fragments are a way to animate elements onto the slide.

Fade in

Semi fade out

Fade out

Highlight red


Components

Nested fragments

Fragments can also be nested.

Fade in > Highlight red > Highlight blue > Semi fade out

Fade in > Highlight red > Semi fade out

Components

Cross-references & Citations

To cross-reference, you have several options, for example:

  • Beamer-like .button class provided by this theme, e.g. Appendix
  • Quarto’s native cross-ref syntax, e.g., “See Section 4.3.”

Citations follow the standard Quarto format and be sourced from BibLaTex, BibTeX, or CLS files. For example:

Components

Blocks

Quarto provides dedicated environments for theorems, lemmas, and so forth.

But in presentation format, it’s arguably more effective just to use a Callout Block.

Regression Specification

The main specification is as follows:

\[ y_{it} = X_{it} \beta + \mu_i + \varepsilon_{it} \]

Components

Multicolumn I: Text only

Column 1

Here is a long sentence that will wrap onto the next line as it hits the column width, and continue this way until it stops.

Column 2

Some other text in another column.

A second paragraph.

Multicolumn support is very flexible and we can continue with a single full span column in the same slide.

Components

Multicolumn II: Text and figures

Text about the figure

  • A point about the figure that is potentially important.
  • Another point about the figure that is also potentially important.

Note that sub- and multi-panel figures are also natively supported by Quarto. See here.

Components

Multicolumn III: Code and output

#| echo: false
#| label: fig-pairs
#| fig-cap: "Pairwise scatterplot" 
#| fig-asp: 1
#| output-location: column

palette("Classic Tableau")

par(
  family = "HersheySans",
  las = 1, pch = 19, cex = 1.5
)

pairs(
  iris[,1:4],
  col=iris$Species
)

Components

Multicolumn IV: Code and output with tabset

#| echo: false
#| eval: true
#| label: fig-tabset
#| fig-cap: "Pairwise scatterplot" 
#| fig-asp: 1
#| out-width: 90%
palette("Classic Tableau")

par(
  family = "HersheySans",
  las = 1, pch = 19, cex = 1.5
)

pairs(
  iris[,1:4],
  col=iris$Species
)
#| echo: true
#| eval: false
#| label: fig-tabset2
#| output-location: default

palette("Classic Tableau")

par(
  family = "HersheySans",
  las = 1, pch = 19, cex = 1.5
)

pairs(
  iris[,1:4],
  col=iris$Species
)

Tables

Tables

Regression example

Quarto offers excellent table support, with further customization via user libraries. Let’s illustrate with a regression example:

#| echo: true

library(fixest)

mods = feols(
  rating ~ complaints + privileges + learning + csw0(raises + critical) + advance,
  data = attitude
)

dict = c("rating"     = "Overall Rating",
         "complaints" = "Handling of Complaints",
         "privileges" = "No Special Priviledges",
         "learning"   = "Opportunity to Learn",
         "raises"     = "Performance-Based Raises",
         "critical"   = "Too Critical",
         "advance"    = "Advancement")

Regression table

modelsummary

If you use modelsummary with this Quarto theme, we advise setting the gt backend for a cleaner aesthetic. More details here.

#| echo: true
#| output-location: slide

library(modelsummary)
options(modelsummary_factory_default = "gt")

modelsummary(
  setNames(mods, c("(1)", "(2)")),
  coef_map = dict, stars = TRUE,
  gof_omit = "Adj|IC|F|Log|RMSE"
  ) |>
  gt::tab_spanner(
    label = "Dependent variable: Overall Rating",
    columns = 2:3
  )

Regression table

etable

fixest’s powerful native tabling functions were designed for LaTeX output. But we can use the markdown = TRUE option to make them work with this theme too. (Details here.) Quick notes:

  • Install the tinytex & pdftools packages first.
  • Set the R chunk option output: asis.
```{r}
#| output: asis

setFixest_etable(markdown = TRUE, drop = "Constant")
setFixest_dict(dict)

etable(mods, highlight = .("se" = "complaints"))
```

Regression table

etable (cont.)

#| output: asis

setFixest_etable(markdown = TRUE, drop = "Constant")
setFixest_dict(dict)

etable(mods, highlight = .("se" = "complaints"), arraystretch = 1.5)

Figures

Figure

Figure

Full-size Figures

You can use the {.background-image} container environment to completely fill the slide background with an image.

Ideally, your figure will be the same aspect ratio as the screen that you’re presenting on.

  • This can be a bit tricky because of the dynamic nature of reveal.js / HTML. But it’s probably something close to 16:9.
  • Aspect ratio can also matter for a regular full-frame images (previous slide).

Interactive plots

#| out-width: 75%

library(threejs)

# Approximate locations as factors
data(flights)
dest = factor(sprintf("%.2f:%.2f", flights[,3], flights[,4]))

# A table of destination frequencies
freq = sort(table(dest), decreasing=TRUE)

# The most frequent destinations in these data
frequent_destinations = names(freq)[1:10]

# Subset the flight data by destination frequency
idx = dest %in% frequent_destinations
frequent_flights = flights[idx, ]

# Lat/long and counts of frequent flights
ll = unique(frequent_flights[, 3:4])

# Plot frequent destinations as bars, and the flights to and from
# them as arcs. Adjust arc width and color by frequency.
globejs(lat=ll[, 1], long=ll[, 2], arcs=frequent_flights,
        # bodycolor="#aaaaff", arcsHeight=0.3, arcsLwd=2,
        bodycolor="#fff", arcsHeight=0.3, arcsLwd=2,
        arcsColor="#ffff00", arcsOpacity=0.15,
        atmosphere=TRUE, color="#fff", pointsize=0.5)

Note: Simple flight data example using threejs. There are many interactive plotting options beyond this. (More details.)

Summary

Summary

A minimal and elegant presentation theme

The Quarto reveal.js clean theme aims to be a minimal and elegant presention theme.

We have highlighted some theme-specific components. But all of the regular reveal.js functionality is supported (chalkboard, etc.)

Install the theme:

quarto install extension grantmcdermott/quarto-revealjs-clean

Use these demo slides as a template:

quarto use template grantmcdermott/quarto-revealjs-clean-demo

References

Fajgelbaum, Pablo D, Eduardo Morales, Juan Carlos Suarez Serrato, and Owen Zidar. 2018. “State Taxes and Spatial Misallocation,” 90.
Hsieh, Chang-Tai, and Enrico Moretti. 2019. “Housing Constraints and Spatial Misallocation.” American Economic Journal: Macroeconomics 11 (2): 39.
Moretti, Enrico. 2011. “Local Labor Markets.” In Handbook of Labor Economics. Vol. 4. Elsevier.
Suárez Serrato, Juan Carlos, and Owen Zidar. 2016. “Who Benefits from State Corporate Tax Cuts? A Local Labor Markets Approach with Heterogeneous Firms.” American Economic Review 106 (9).

Appendix

#| label: tbl-attsum
#| tbl-cap: Summary of the base R `attitude` dataset

modelsummary::datasummary_skim(attitude)

Back to main