Specify at least one CSS file (snap.css
) and one JS
script (snap.js
) in YAML metadata:
You will learn more about snap.css
and
snap.js
at the end of this presentation.
Equivalently, you can specify them in the arguments of
litedown::mark()
:
but I recommend that you specify these options in YAML metadata instead.
There are two ways to create a new slide:
---
).##
).You must choose only one way, i.e., either use horizontal rules to separate all slides, or avoid horizontal rules but only use section headings.
The first way is more flexible—you don’t have to start a slide with a section heading.
f: Fullscreen mode (press Esc
to exit).
The scroll bar will be hidden in the fullscreen mode. You can also use
the keyboard shortcut of your browser, e.g., fn + F
in
Chrome on macOS.
o: Overview mode
Slides become thumbnails, to make it easier to glance over multiple slides at once.
Press o again to go back to presentation mode.
Alternatively, you can click on a slide while holding the
Alt
key to toggle the overview mode and navigate to the
clicked slide. Basically, Alt + Click
is like zoom
in/out.
m: Mirror mode
Slides are mirrored.1
Press m again to resume.
You can pass more CSS files to the css
option, e.g., if
you have extra.css
under the same directory as the Markdown
input file:
If your input document is .Rmd
, you can also embed CSS
directly in a css
code chunk:
Below is a CSS code chunk in which we defined the font families for this presentation:
body {
font-family: Georgia, serif;
}
.slide h1, .slide h2 {
font-family: Baskerville, Garamond, serif;
}
code {
font-family: Consolas, "Andale Mono", monospace;
font-weight: bold;
}
When the Markdown option number_sections
is enabled, all
sections are numbered. You can hide all numbers via CSS:
For this presentation, only section numbers for level-two headings are displayed:
If you enable the table of contents (TOC) by setting the option
toc: true
, you will get a TOC slide after the title slide.
It uses a two-column layout by default. You can custom its styles via
the CSS selector #TOC
. For example, you can use three
columns:
Or define the TOC title by:
Or shorten TOC (hide lower-level headings):
For this presentation, we don’t hide lower-level headings in TOC but
just make them more compact (display: inline;
):
#TOC li ul li {
display: inline;
border-left: 0.2em dotted #ccc;
padding-left: 0.2em;
}
#TOC li ul li a {
color: #666;
text-decoration: none;
}
Media | Width | Mode | Font size | Overview columns |
---|---|---|---|---|
Super large devices | ≥ 1800px | ↓ | ↓ | 4 |
Larger desktops | ≥ 1400px | ↓ | ↓ | 3 |
Desktops | ≥ 992px | Slides | 200% | 2 |
Phones and tablets | < 992px | Article | 100% | N/A |
You can resize your browser window to see the effect (also try to press o and test the overview mode). If you are on a mobile device, you should see a normal continuous page, since you cannot adjust the window size.
When the slides are printed, the font size will be reduced.
To save space, the presentation is printed as a continuous document instead of slides.
If you want borders on slides, print them from the overview mode.
To customize style for printing, you may define CSS rules in:
If you need to print each slide on a separate page, you may include the following CSS and may need to tweak the paper size and font size. The PDF will not have exactly the same appearance as HTML.
@page {
size: a4 landscape;
margin: 0;
}
@media print {
.slide {
font-size: 1.8em;
page-break-after: always;
}
}
You can add more attributes to a slide via an HTML comment that
starts with #
(Cmd / Ctrl + Shift + C
in
RStudio’s visual Markdown editor), e.g.,
The syntax is just HTML. These attributes will be added to the slide container:
inverse
: Apply a dark background and invert the
slide color.
center
: Center all elements horizontally.
middle
: Center all elements vertically.
fade
: Fade a slide (50% opacity) and apply grid
lines to the background (can be useful for de-emphasizing a
slide).
You can define your own arbitrary class names (e.g.,
<!--# class="large" -->
) and corresponding CSS rules
(e.g., .large { font-size: 150%; }
).
The background is (nearly) black and the text is white.
The font size is 30% larger.
Everything is centered both vertically and horizontally.
Of course, you don’t have to use both classes at the same time. Depending on how you want to center content, you can use one of these classes.
This slide is not important. You do not need to read it carefully. You can even take a nap, since the speaker is boring.
We use the style
attribute to introduce a background
image to this slide. You can learn more about the
background-image
property here.
Believe it or not, this slide is editable because we have enabled the
contenteditable
attribute. If you find any mistake on your
slide during your presentation, you can click on it and edit any
text.
Note that your edits will not be saved, though.
They are placed in
<span class="page-number"></span>
at the bottom
right of all slides.
If you click on a page number, the URL of the presentation will be
appended by a hash of the form #N
, where N
is
the page number. You can share this URL with other people when you want
to point them to a specific page in the slides.
A timer is added to the bottom left in
<span class="timer"></span>
by default. If you
want a countdown timer, you can add a custom
<span>
to your document (in Markdown, you can use a
raw HTML block ```{=html}
), and specify the total number of
seconds in the attribute data-total
, e.g.,
The timer will start when the presentation becomes fullscreen. To restart the timer, click on it.
For the countdown timer, when the time is up, the timer will start to blink.
When the height of a slide exceeds the window height, you need to be
careful because it can be easy to accidentally scroll to the next page
as you approach the bottom of the slide. If you move from an oversized
slide to the next slide by accident, you will not be able to
move back to the bottom of the previous slide directly! Instead, you
will always be navigated to the top of the previous slide if you want to
go back. When you are on a long slide, I recommend that you use your
mouse wheel or the Down
arrow key to scroll at small steps,
instead of using the PageDown
key to scroll over to the
next screen at once.
Because of this hassle, you may not really want to make a slide lengthy, but it may be unavoidable when you have lengthy content to show on one slide and it cannot be broken. Below is a toy example (the output block cannot be split onto two slides):
1
2
3
4
5
6
7
8
9
10
The page will switch between the slides and article mode depending on the ratio of the window height to width, Rw = Hw/Ww.
If Rw is greater than the screen height/width ratio Rs = Hs/Ws, the page will be in the article mode.
If Rw ≤ Rs, the page will be in the slides mode.
That means when the window is too narrow, the page will be a continuous article. If the window is wide enough (at least 992px), it will show the slides.
The aspect ratio of slides is determined by your screen aspect ratio by default. The content will fit all available space on the screen when the slides are full-screen (press f). If you present the slides directly with your own computer, this may not be a problem since you know if all content fits well on your own screen. However, if you connect your computer to a projector or present the slides on another computer, you’d better know the screen resolution beforehand, because the aspect ratio may be different, and your slides can look different on that screen.
You can fix the aspect ratio by setting the CSS variable
--slide-ratio
, e.g.,
For best results in the slide mode, set the browser zooming level to 100%. Zooming out (< 100%) is usually okay. Zooming in (> 100%) may lead to slides being cut off at the margin.
Unlike PDF, HTML slides may not look exactly the same in different web browsers or on different devices. For example, text may be rendered via system fonts, and different systems may have different fonts. To ensure the same fonts are used on different devices, you may use web fonts (e.g., Google Fonts).
You may print the slides to PDF in advance. In case you have trouble with HTML slides when presenting from a different device, you may use the PDF copy (of course, you will lose features that rely on HTML/CSS/JS).
How does this HTML presentation work under the hood?
This can be generated from Markdown.
The script snap.js
converts HTML to a structure more convenient to style as slides:
<div class="slide-container">
<div class="slide">
<h2>First slide</h2>
<p>Content</p>
</div>
<div class="slide">
<h2>Second slide</h2>
<p>More content</p>
</div>
</div>
The core technique is CSS
Scroll Snap. The full CSS is snap.css
,
and the essential rules are:
The JS and CSS code can be used outside the R package litedown, too. You just need to have the correct HTML structure. Then in your HTML document:
<script src="https://cdn.jsdelivr.net/npm/@xiee/utils@VERSION/js/snap.min.js" defer></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/combine/npm/@xiee/utils@VERSION/css/default.min.css,npm/@xiee/utils@VERSION/css/snap.min.css">
Remember to substitute VERSION
with an appropriate version
(e.g., 1.11.0
). You can omit @VERSION
to use
the latest version but it is not recommended because future updates
might break your old slides.
Both the JS and CSS are quite lightweight (total size is 12.7 Kb when uncompressed) and have no dependencies. They were written from scratch.
I developed the xaringan in package 2016 and have used it since then. It still works perfectly, but now I prefer more lightweight frameworks.
Most of presentation features that I need are included in 381
lines of JS/CSS code (default.css
/ snap.js
/
snap.css
).
This simple presentation framework is highly customizable. Customizing slides can be addictive if you know HTML/CSS/JS.
Learn more about the Markdown syntax at https://yihui.org/litedown/.
Github repo: https://github.com/yihui/litedown (you can find the Rmd source of this presentation in the repo)