😎 Give your xaringan slides some style
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

240 lines
15KB

  1. #' @param text_color Text Color. Defaults to #000. Modifies the `body` element.
  2. #' @param header_color Header Color. Defaults to #000. Modifies the `h1, h2, h3` elements.
  3. #' @param background_color Slide Background Color. Defaults to #FFF. Modifies the `.remark-slide-content` class.
  4. #' @param link_color Link Color. Defaults to rgb(249, 38, 114). Modifies the `a, a > code` elements.
  5. #' @param text_bold_color Bold Text Color. Defaults to `NULL`. Modifies the `strong` element.
  6. #' @param text_slide_number_color Slide Number Color. Defaults to `inverse_background_color`. Modifies the `.remark-slide-number` class.
  7. #' @param padding Slide Padding in `top right [bottom left]` format. Defaults to 16px 64px 16px 64px. Modifies the `.remark-slide-content` class.
  8. #' @param background_image Background image applied to each *and every* slide. Set `title_slide_background_image = "none"` to remove the background image from the title slide. Defaults to `NULL`. Modifies the `.remark-slide-content` class.
  9. #' @param background_size Background image size, requires `background_image` to be set. If `background_image` is set, `background_size` will default to `cover` so the backround fills the screen. If both `background_image` and `background_position` are set, will default to 100 percent. Defaults to `NULL`. Modifies the `.remark-slide-content` class.
  10. #' @param background_position Background image position, requires `background_image` to be set, and it is recommended to adjust `background_size`. Defaults to `NULL`. Modifies the `.remark-slide-content` class.
  11. #' @param code_highlight_color Code Line Highlight. Defaults to rgba(255,255,0,0.5). Modifies the `.remark-code-line-highlighted` class.
  12. #' @param code_inline_color Inline Code Color. Defaults to #000. Modifies the `.remark-inline-code` class.
  13. #' @param code_inline_background_color Inline Code Background Color. Defaults to `NULL`. Modifies the `.remark-inline-code` class.
  14. #' @param code_inline_font_size Inline Code Text Font Size. Defaults to 1rem. Modifies the `.remark-inline-code` class.
  15. #' @param inverse_background_color Inverse Background Color. Defaults to #272822. Modifies the `.inverse` class.
  16. #' @param inverse_text_color Inverse Text Color. Defaults to #d6d6d6. Modifies the `.inverse` class.
  17. #' @param inverse_text_shadow Enables Shadow on text of inverse slides. Defaults to `FALSE`. Modifies the `.inverse` class.
  18. #' @param inverse_header_color Inverse Header Color. Defaults to #f3f3f3. Modifies the `.inverse h1, .inverse h2, .inverse h3` classes.
  19. #' @param title_slide_text_color Title Slide Text Color. Defaults to `inverse_text_color`. Modifies the `.title-slide` class.
  20. #' @param title_slide_background_color Title Slide Background Color. Defaults to `inverse_background_color`. Modifies the `.title-slide` class.
  21. #' @param title_slide_background_image Title Slide Background Image URL. Defaults to `NULL`. Modifies the `.title-slide` class.
  22. #' @param title_slide_background_size Title Slide Background Image Size, defaults to "cover" if background image is set. Defaults to `NULL`. Modifies the `.title-slide` class.
  23. #' @param title_slide_background_position Title Slide Background Image Position. Defaults to `NULL`. Modifies the `.title-slide` class.
  24. #' @param footnote_color Footnote text color (if `NA`, then it will be the same color as `text_color`). Defaults to `NULL`. Modifies the `.footnote` class.
  25. #' @param footnote_font_size Footnote font size. Defaults to 0.9rem. Modifies the `.footnote` class.
  26. #' @param footnote_position_bottom Footnote location from bottom of screen. Defaults to 60px. Modifies the `.footnote` class.
  27. #' @param left_column_subtle_color Left Column Text (not last). Defaults to #777. Modifies the `.left-column h2, .left-column h3` classes.
  28. #' @param left_column_selected_color Left Column Current Selection. Defaults to #000. Modifies the `.left-column h2:last-of-type, .left-column h3:last-child` classes.
  29. #' @param blockquote_left_border_color Blockquote Left Border Color. Defaults to lightgray. Modifies the `blockquote` element.
  30. #' @param table_border_color Table top/bottom border. Defaults to #666. Modifies the `table: border-top, border-bottom` elements.
  31. #' @param table_row_border_color Table row inner bottom border. Defaults to #ddd. Modifies the `table thead th: border-bottom` elements.
  32. #' @param table_row_even_background_color Table Even Row Background Color. Defaults to #eee. Modifies the `thead, tfoot, tr:nth-child(even)` elements.
  33. #' @param base_font_size Base Font Size for All Slide Elements (must be `px`). Defaults to 20px. Modifies the `html` element.
  34. #' @param text_font_size Slide Body Text Font Size. Defaults to 1rem. Modifies the `.remark-slide-content` class.
  35. #' @param header_h1_font_size h1 Header Text Font Size. Defaults to 2.75rem. Modifies the `.remark-slide-content h1` class.
  36. #' @param header_h2_font_size h2 Header Text Font Size. Defaults to 2.25rem. Modifies the `.remark-slide-content h2` class.
  37. #' @param header_h3_font_size h3 Header Text Font Size. Defaults to 1.75rem. Modifies the `.remark-slide-content h3` class.
  38. #' @param header_background_auto Add background under slide title automatically for h1 header elements. If not enabled, use `class: header_background` to enable. Defaults to `FALSE`.
  39. #' @param header_background_color Background Color for h1 Header with Background. Defaults to `header_color`. Modifies the `.remark-slide-content h1` class.
  40. #' @param header_background_text_color Text Color for h1 Header with Background. Defaults to `background_color`. Modifies the `.remark-slide-content h1` class.
  41. #' @param header_background_padding Padding for h1 Header with Background. Defaults to `NULL`. Modifies the `.remark-slide-content h1` class.
  42. #' @param header_background_content_padding_top Top Padding for Content in Slide with Header with Background. Defaults to 7rem. Modifies the `.remark-slide-content` class.
  43. #' @param header_background_ignore_classes Slide Classes Where Header with Background will not be Applied. Defaults to `c('normal', 'inverse', 'title', 'middle', 'bottom')`. Modifies the `.remark-slide-content` class.
  44. #' @param text_slide_number_font_size Slide Number Text Font Size. Defaults to 0.9rem. Modifies the `.remark-slide-number` class.
  45. #' @param text_font_google Use `google_font()` to specify body font. Defaults to `NULL`. Modifies the `body` element.
  46. #' @param text_font_family Body Text Font Family. Defaults to 'Droid Serif'. Modifies the `body` element.
  47. #' @param text_font_weight Body Text Font Weight. Defaults to normal. Modifies the `body` element.
  48. #' @param text_font_url Body Text Font URL(s). Defaults to https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic. Modifies the `@import url()` elements.
  49. #' @param text_font_family_fallback Body Text Font Fallbacks. Defaults to 'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC'. Modifies the `body` element.
  50. #' @param text_font_base Body Text Base Font (Total Failure Fallback). Defaults to serif. Modifies the `body` element.
  51. #' @param header_font_google Use `google_font()` to specify header font. Defaults to `NULL`. Modifies the `body` element.
  52. #' @param header_font_family Header Font Family. Defaults to 'Yanone Kaffeesatz'. Modifies the `h1, h2, h3` elements.
  53. #' @param header_font_weight Header Font Weight. Defaults to normal. Modifies the `h1, h2, h3` elements.
  54. #' @param header_font_url Header Font URL. Defaults to https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz. Modifies the `@import url` elements.
  55. #' @param code_font_google Use `google_font()` to specify code font. Defaults to `NULL`. Modifies the `body` element.
  56. #' @param code_font_family Code Font Family. Defaults to 'Source Code Pro'. Modifies the `.remark-code, .remark-inline-code` classes.
  57. #' @param code_font_size Code Text Font Size. Defaults to 0.9rem. Modifies the `.remark-inline` class.
  58. #' @param code_font_url Code Font URL. Defaults to https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700. Modifies the `@import url` elements.
  59. #' @param code_font_family_fallback Code Font Fallback. Defaults to 'Lucida Console', Monaco. Modifies the `.remark-code, .remark-inline-code` classes.
  60. #' @param colors A named vector of custom colors. The names of the colors
  61. #' become CSS variables and classes that can be used within your slides.
  62. #' For example, `colors = c(blue = "#bad4ed")` adds a CSS variable
  63. #' `--blue`, a `.blue` CSS class that applies the color to the text or
  64. #' foreground color, and a `.bg-blue` CSS class that applies the color
  65. #' to the background.
  66. #' @template extra_css
  67. #' @param outfile Customized xaringan CSS output file name, default is "xaringan-themer.css"
  68. #' @family themes
  69. #' @template style_xaringan
  70. #' @export
  71. style_xaringan <- function(
  72. text_color = "#000",
  73. header_color = "#000",
  74. background_color = "#FFF",
  75. link_color = "rgb(249, 38, 114)",
  76. text_bold_color = NULL,
  77. text_slide_number_color = inverse_background_color,
  78. padding = "16px 64px 16px 64px",
  79. background_image = NULL,
  80. background_size = NULL,
  81. background_position = NULL,
  82. code_highlight_color = "rgba(255,255,0,0.5)",
  83. code_inline_color = "#000",
  84. code_inline_background_color = NULL,
  85. code_inline_font_size = "1rem",
  86. inverse_background_color = "#272822",
  87. inverse_text_color = "#d6d6d6",
  88. inverse_text_shadow = FALSE,
  89. inverse_header_color = "#f3f3f3",
  90. title_slide_text_color = inverse_text_color,
  91. title_slide_background_color = inverse_background_color,
  92. title_slide_background_image = NULL,
  93. title_slide_background_size = NULL,
  94. title_slide_background_position = NULL,
  95. footnote_color = NULL,
  96. footnote_font_size = "0.9rem",
  97. footnote_position_bottom = "60px",
  98. left_column_subtle_color = "#777",
  99. left_column_selected_color = "#000",
  100. blockquote_left_border_color = "lightgray",
  101. table_border_color = "#666",
  102. table_row_border_color = "#ddd",
  103. table_row_even_background_color = "#eee",
  104. base_font_size = "20px",
  105. text_font_size = "1rem",
  106. header_h1_font_size = "2.75rem",
  107. header_h2_font_size = "2.25rem",
  108. header_h3_font_size = "1.75rem",
  109. header_background_auto = FALSE,
  110. header_background_color = header_color,
  111. header_background_text_color = background_color,
  112. header_background_padding = NULL,
  113. header_background_content_padding_top = "7rem",
  114. header_background_ignore_classes = c('normal', 'inverse', 'title', 'middle', 'bottom'),
  115. text_slide_number_font_size = "0.9rem",
  116. text_font_google = NULL,
  117. text_font_family = "'Droid Serif'",
  118. text_font_weight = "normal",
  119. text_font_url = "https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic",
  120. text_font_family_fallback = "'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC'",
  121. text_font_base = "serif",
  122. header_font_google = NULL,
  123. header_font_family = "'Yanone Kaffeesatz'",
  124. header_font_weight = "normal",
  125. header_font_url = "https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz",
  126. code_font_google = NULL,
  127. code_font_family = "'Source Code Pro'",
  128. code_font_size = "0.9rem",
  129. code_font_url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700",
  130. code_font_family_fallback = "'Lucida Console', Monaco",
  131. colors = NULL,
  132. extra_css = NULL,
  133. extra_fonts = NULL,
  134. outfile = "xaringan-themer.css"
  135. ) {
  136. # DO NOT EDIT - Generated from inst/scripts/generate_theme_functions.R
  137. # Make sure font names are wrapped in quotes if they have spaces
  138. f_args <- names(formals(sys.function()))
  139. for (var in f_args[grepl("font_family$", f_args)]) {
  140. eval(parse(text = paste0(var, "<-quote_elements_w_spaces(", var, ")")))
  141. # set an is_google flag default of FALSE that is possibly overwritten later
  142. eval(parse(text = paste0(sub("font_family$", "font_is_google", var), "<-0")))
  143. }
  144. # Warn if base_font_size isn't absolute
  145. css_abs_units <- c("cm", "mm", "Q", "in", "pc", "pt", "px")
  146. if (!grepl(paste(tolower(css_abs_units), collapse = "|"), tolower(base_font_size))) {
  147. warning(
  148. glue::glue(
  149. "Base font size '{base_font_size}' is not in absolute units. ",
  150. "For best results, specify the `base_font_size` using absolute CSS units: ",
  151. "{paste(css_abs_units, collapse = ', ')}"
  152. ),
  153. call. = FALSE,
  154. immediate. = TRUE
  155. )
  156. }
  157. # Use font_..._google args to overwrite font args
  158. for (var in f_args[grepl("font_google$", f_args)]) {
  159. gf <- eval(parse(text = var))
  160. if (is.null(gf)) next
  161. if (!inherits(gf, "google_font")) {
  162. stop("`", var, "` must be set using `google_font()`.")
  163. }
  164. group <- strsplit(var, "_")[[1]][1]
  165. if (group == "text") {
  166. text_font_family <- quote_elements_w_spaces(gf$family)
  167. text_font_weight <- gf$weights %||% "normal"
  168. text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1] - 1)
  169. text_font_url <- gf$url
  170. } else {
  171. for (thing in c("family", "url")) {
  172. eval(parse(text = paste0(group, "_font_", thing, " <- gf$", quote_elements_w_spaces(thing))))
  173. }
  174. }
  175. eval(parse(text = paste0(group, "_font_is_google <- 1")))
  176. }
  177. extra_font_imports <- if (is.null(extra_fonts)) "" else list2fonts(extra_fonts)
  178. extra_font_imports <- paste(extra_font_imports, collapse = "\n")
  179. # convert NA arguments to NULL
  180. for (var in f_args) {
  181. val <- eval(parse(text = var))
  182. if (is.null(val)) next
  183. val <- val[!is.na(val)]
  184. is_na <- length(val) == 0
  185. if (is_na) assign(var, NULL)
  186. }
  187. # prepare variables for template
  188. body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ", ")
  189. background_size_fallback <- if (is.null(background_position)) "cover" else "100%"
  190. background_size <- background_image %??% (background_size %||% background_size_fallback)
  191. title_slide_background_size <- title_slide_background_size %||% (
  192. title_slide_background_image %??% "cover"
  193. )
  194. table_row_even_background_color <- table_row_even_background_color %||% background_color
  195. lapply(names(formals()), function(n) assign(n, get(n), envir = xaringanthemer_env))
  196. xaringanthemer_version <- utils::packageVersion("xaringanthemer")
  197. # prepare header background object
  198. needs_leading_dot <- !grepl("^\\.", header_background_ignore_classes)
  199. header_background_ignore_classes[needs_leading_dot] <- paste0(
  200. ".",
  201. header_background_ignore_classes[needs_leading_dot]
  202. )
  203. header_background_ignore_classes <- purrr::map(
  204. header_background_ignore_classes,
  205. ~ list(class = .)
  206. )
  207. if (is.null(header_background_padding)) {
  208. slide_padding <- css_get_padding(padding)
  209. header_background_padding <- paste(
  210. "2rem", slide_padding$right, "1.5rem", slide_padding$left
  211. )
  212. }
  213. header_background <- list(
  214. auto = header_background_auto,
  215. background_color = header_background_color,
  216. text_color = header_background_text_color,
  217. padding = header_background_padding,
  218. content_padding_top = header_background_content_padding_top,
  219. ignore = header_background_ignore_classes
  220. )
  221. colors <- prepare_colors(colors)
  222. tf <- system.file("resources", "template.css", package = "xaringanthemer")
  223. template <- readLines(tf, warn = FALSE)
  224. template <- paste(template, collapse = "\n")
  225. x <- whisker::whisker.render(template)
  226. writeLines(x, con = outfile)
  227. if (!is.null(extra_css)) style_extra_css(extra_css, outfile)
  228. outfile
  229. }