moon_reader: An R Markdown output format for remark.js slides

View source: R/render.R

moon_readerR Documentation

An R Markdown output format for remark.js slides


This output format produces an HTML file that contains the Markdown source (knitted from R Markdown) and JavaScript code to render slides. tsukuyomi() is an alias of moon_reader().


  css = c("default", "default-fonts"),
  self_contained = FALSE,
  seal = TRUE,
  yolo = FALSE,
  chakra = "",
  nature = list(),
  anchor_sections = FALSE,




A vector of CSS file paths. Two default CSS files (‘default.css’ and ‘default-fonts.css’) are provided in this package, which was borrowed from If the character vector css contains a value that does not end with .css, it is supposed to be a built-in CSS file in this package, e.g., for css = c('default', 'extra.css')), it means default.css in this package and a user-provided extra.css. To find out all built-in CSS files, use xaringan:::list_css(). With rmarkdown >= 2.8, Sass files (filenames ending with ‘.scss’ or ‘.sass’) can also be used, and they will be processed by the sass package, which needs to be installed.


Whether to produce a self-contained HTML file by embedding all external resources into the HTML file. See the ‘Note’ section below.


Whether to generate a title slide automatically using the YAML metadata of the R Markdown document (if FALSE, you should write the title slide by yourself).


Whether to insert the Mustache Karl (TM) randomly in the slides. TRUE means insert his picture on one slide, and if you want him to be on multiple slides, set yolo to a positive integer or a percentage (e.g. 0.3 means 30% of your slides will be the Mustache Karl). Alternatively, yolo can also be a list of the form list(times = n, img = path): n is the number of times to show an image, and path is the path to an image (by default, it is Karl).


A path to the remark.js library (can be either local or remote). Please note that if you use the default remote latest version of remark.js, your slides will not work when you do not have Internet access. They might also be broken after a newer version of remark.js is released. If these issues concern you, you should download remark.js locally (e.g., via summon_remark()), and use the local version instead.


(Nature transformation) A list of configurations to be passed to remark.create(), e.g. list(ratio = '16:9', navigation = list(click = TRUE)); see Besides the options provided by remark.js, you can also set autoplay to a number (the number of milliseconds) so the slides will be played every autoplay milliseconds; alternatively, autoplay can be a list of the form list(interval = N, loop = TRUE), so the slides will go to the next page every N milliseconds, and optionally go back to the first page to restart the play when loop = TRUE. You can also set countdown to a number (the number of milliseconds) to include a countdown timer on each slide. If using autoplay, you can optionally set countdown to TRUE to include a countdown equal to autoplay. To alter the set of classes applied to the title slide, you can optionally set titleSlideClass to a vector of classes; the default is c("center", "middle", "inverse").

anchor_sections, ...

For tsukuyomi(), arguments passed to moon_reader(); for moon_reader(), arguments passed to rmarkdown::html_document().


Tsukuyomi is a genjutsu to trap the target in an illusion on eye contact.

If you are unfamiliar with CSS, please see the xaringan wiki on Github providing CSS slide modification examples.


Do not stare at Karl's picture for too long after you turn on the yolo mode. I believe he has Sharingan.

For the option self_contained = TRUE, it encodes images as base64 data in the HTML output file. The image path should not contain the string ")" when the image is written with the syntax ![](PATH) or background-image: url(PATH), and should not contain the string "/>" when it is written with the syntax <img src="PATH" />. Rendering slides in the self-contained mode can be time-consuming when you have remote resources (such as images or JS libraries) in your slides because these resources need to be downloaded first. We strongly recommend that you download remark.js (via summon_remark()) and use a local copy instead of the default chakra argument when self_contained = TRUE, so remark.js does not need to be downloaded each time you compile your slides.

When the slides are previewed via xaringan::inf_mr(), self_contained will be temporarily changed to FALSE even if the author of the slides set it to TRUE. This will make it faster to preview slides locally (by avoiding downloading remote resources explicitly and base64 encoding them). You can always click the Knit button in RStudio or call rmarkdown::render() to render the slides in the self-contained mode (these approaches will respect the self_contained setting).

Each page has its own countdown timer (when the option countdown is set in nature), and the timer is (re)initialized whenever you navigate to a new page. If you need a global timer, you can use the presenter's mode (press P).



# rmarkdown::render('foo.Rmd', 'xaringan::moon_reader')

xaringan documentation built on Dec. 28, 2022, 1:35 a.m.