Slides con Quarto

(Web del curso aquí)

26 de junio de 2023

Intro


  1. ChatGPT puede hacer slides, pero Quarto también


  1. Quarto puede hacer slides de varios tipos (ppt, slidy, beamer)

  2. Nos centraremos en Revealjs

Revealjs is highly recommended unless you have specific requirements for Office or LaTeX output

Presentaciones con Quarto (genérico)


  • Las slides se escriben en QMD … así que ya sabemos 😉
  • Hay algunas especificidades que vamos a ver

  • Veremos primero aspectos comunes a todos los formatos de slides

  • Documentación oficial

Creación de unas nuevas transparencias

  1. Has de seguir la siguiente ruta de menús:
    File > New File > Quarto Presentation.
  2. Se abrirá una interfaz gráfica donde podrás elegir entre 3 formatos de slides (Revealjs, Beamer y ppt). También podrás poner título y autor.

En imágenes:


Creación de una nueva slide

  • Los títulos de primer nivel crean una nueva slide (y tb una nueva sección)

  • Los títulos de segundo nivel crean una nueva slide.

  • También se puede crear una nueva slide usando 3 o mas guiones cortos: ---


Extensión: modificar la generación de nuevas slides

Hay que usar slide-level: en el YAML. Por ejemplo:

---
title: "Mis slides"
format: revealjs 
---

Por defecto, los títulos de primer(#) y segundo nivel (##) crean nuevas slides

---
title: "Mis slides"
format: 
  revealjs:   
  slide-level: 3
---

Con este yaml, los títulos de tercer nivel (con ###) también crearían una nueva slide


Pausas en la presentación

  • Por defecto, los elementos de una slide se muestran todos de golpe


⚠️ Para crear pausas en la presentación has de usar las siguientes marcas: . . .

    (es decir, tres puntos separados por espacios)


  • Por ejemplo:
## Una nueva slide

Contenido nº 1

. . . 

Contenido nº 2
(para ver el Contenido nº 2 habrá que dar al avance página)

Listas incrementales

  • Por defecto las listas se muestran de golpe
  • Si quieres que se muestren elemento a elemento, puedes controlarlo desde el YAML:
title: "My Presentation"
format:
  revealjs:
    incremental: true   
  • Se puede ir intercalando listas incrementales, y no-incrementales, con los siguientes fenced div’s:

Lista incremental :


::: {.incremental}
- First we take Manhatan,
- then we take Berlin
:::

Lista no-incremental :


::: {.nonincremental}
- First we take Manhatan,
- then we take Berlin
:::

Columas multiples

  • Como puedes ver, se puede generar contenido en varias columnas. Para ello hay que usar “un fenced div con clase columns”.

To put material in side by side columns, you can use a native div container with class .columns, containing two or more div containers with class .column and a width attribute. – Documentacion oficial de Quarto

  • Por ejemplo:
:::: {.columns}

::: {.column width="40%"}
Mi contenido en la primera columna
:::

::: {.column width="60%"}
Contenido en la segunda columna
:::

::::


Revealjs slides


  • reveal.js es un open source HTML presentation framework
  • A mi me gustan: en mi opinión tienen unas cuantas ventajas


  • Documentación oficial aquí

  • Listado (extenso) de opciones aquí

Revealjs slides (elementos básicos)


  • Elementos “básicos”, que mejoran bastante las slides

Revealjs: Slide background


  • Las slides mejoran bastante estéticamente si en alguna de ellas cambiamos el fondo. La documentación está aquí
  • Se pueden usar los siguientes elementos: color, imagen, vídeo e iframe. Por ejemplo:

## Título de la slide {background-color="aquamarine"}

## Título de la slide {background-color="#A9339A"}


Extensión: Opciones más complejas

## Slide Title {background-video="video.mp4" background-video-loop="true" background-video-muted="true"}

## Slide Title {background-color="black" background-image="https://placekitten.com/100/100" background-size="100px" background-repeat="repeat"}

## Slide Title {background-iframe="https://www.uv.es"}

Slide Backgrounds: ejemplo 1 (color)

Para poner un color de fondo:


## Slide Backgrounds: ejemplo 1 (color) {background-color="aquamarine"}

Slide Backgrounds: ejemplo 2 (imagen)

Para poner una imagen de fondo:


## Slide Backgrounds: ejemplo 2 (imagen) {background-image="imagenes/perro_blanco.jpg" background-size="cover"}

Se pueden hacer cosas muy chulas como:

Revealjs: Tabsets


  • Por ejemplo este tabset

Oro parece, plátano es …

😀

  • se ha creado con este código:
::: {.panel-tabset}
## Adivinanza

Oro parece, platano es ...

## Solución

😀
:::


Revealjs: Numeración de las slides

  • Por defecto las slides están numeradas
---
format:
  revealjs:
    slide-number: true #- {true, false}
---
  • Puedes hacer que una slide no se cuente:
## Título de la slide  {visibility="uncounted"}


  • Puedes hacer cosas más complejas. Documentación oficial aquí
---
format:
  revealjs:
    slide-number: c/t   #- current/total {c/t, c, ...}
---

Revealjs: tunear con themes

  • Podemos cambiar la apariencia de las slides usando los themes.

  • Listado de themes aquí.

  • Para ello tenemos que incluir en el YAML el theme que queremos:
---
title: "Presentation"
format:
  revealjs: 
    theme: dark
---


Hay extensiones para tunear

Revealjs slides (más elementos)


  • “Más elementos”, que no son imprescindibles

Revealjs: la primera slide

  • La primera slide se crea automáticamente si pones un título en el YAML

    • En ese caso, la 1ª slide contendrá los metadatos: title, subtitle, author, institute, date
  • La apariencia de la primera slide dependerá del tema elegido. Listado de themes aquí.


  • Tenemos muchas opciones para personalizar las slides y, en concreto, para tunear la primera slide

Revealjs: tuneando la primera slide

Extensión: modificar el aspecto de la primera slide con YAML

Aquí tienes algunas opciones en el YAML para la primera slide

---
title: "Mys slides"
format:
  revealjs: 
    theme: default
    center-title-slide: true                #- centrado vertical
title-slide-attributes:
  data-background-color: "#562457"          #- color del backgroung
  data-background-image: imagenes/my_imagen.jpg  #- ruta a imagén
  data-background-size: cover               #- {cover, contain}
  data-background-opacity: "0.4"
---


Extensión: modificar el aspecto de la primera slide manualmente

# My slides {background-image="imagenes/my_imagen.jpg" background-size="cover" background-color="#4f6952" background-opacity="0.5"}

<h2>Tuneando la primera slide</h2>

<h3>Pedro J. Pérez \| 2023-04-04</h3>

Revealjs: Content overflow

Si el contenido que queremos poner es mucho y no se ajusta, no cabe en la slide, tenemos varias posibilidades:


  1. Usar la .smaller class al crear la slide:

## Título de la slide {.smaller}


  1. Modificar el YAML para hacer las slides “scrollables”:
---
title: "My Presentation"
format:
  revealjs:
      scrollable: true
---      

Revealjs: Transiciones

  • Documentación oficial aquí
Transition Description
none No transition (switch instantly)
fade Cross fade
slide Slide horizontally
convex Slide at a convex angle
concave Slide at a concave angle
zoom Scale the incoming slide so it grows in from the center of the screen.
---
title: "Presentation"
format:
  revealjs:
    transition: slide      #- transiciones de las slide: {none, fade, slide, convex, concave, or zoom}
    transition-speed: fast #- {default, fast, slow}
---

Revealjs: Transiciones

  • Las transiciones se pueden fijar para una slide:
## Título de la slide {transition="convex" transition-speed="slow"}
  • y hacerlas más complejas
## Título de la slide {transition="fade-in slide-out"}

Revealjs: Auto-animaciones

  • Se puede auto-animar 2 slides próximas. Documentación aquí

# {auto-animate=true}

¿Esto te gusta?

## {auto-animate=true}

¿Esto te gusta?

Sí, esto me gusta

## {auto-animate=true}

Sí, esto me gusta **MUCHO**


  • Se pueden usar las siguientes propiedades CSS: position, font-size, line-height, color, background-color, padding y margin.
## {auto-animate=true}

::: {style="margin-top: 100px;"}
Contenido auto-anímado
:::

## {auto-animate=true}

::: {style="margin-top: 200px; font-size: 3em; color: red;"}
Contenido auto-anímado
:::


Revealjs: Auto-animaciones (chunks)

  • También se puede auto-animar chunks de código. Documentación aquí
## {auto-animate="true"}

```r
#######- Hagamos un ggplot
library(ggplot2)
ggplot(iris) +
```

## {auto-animate=true}

```r
#######- Hagamos un ggplot
library(ggplot2)
ggplot(iris) +
  geom_point(aes(x = Sepal.Length, 
                 y = Petal.Length, 
                 color = Species))
```

Revealjs: Asides

  • Los “asides” son similares a las notas al píe de página, pero no llevan numeración.


  • Su sintaxis es:
::: aside
El contenido de un aside se colocará al final de la slides, justo encima de las notas al píe
:::

Revealjs: Más cosas

  • Puedes ocultar una slide:
## Título de la slide  {visibility="hidden"}


  • Tamaño de las slides. Documentación oficial aquí

Revealjs: Alineación de los títulos

  • Los títulos de primer nivel (#) aparecen verticalmente centrados

  • Los títulos de segundo nivel (##) aparecen en el margen superior

  • Todo se puede cambiar con CSS, o . . .
  • Si quieres alinear un título a la derecha, una posibilidad es:
::: {style="text-align: right;"}

<h2>Right aligned!</h2>

### Right aligned  tb!
:::

Right aligned!

Right aligned tb!

Revealjs: ajustar texto con “r-fit-text”

NO

QUIERO!!

::: r-fit-text
NO

QUIERO!!
:::

Revealjs: Fragments

  • Los fragments se usan para resaltar o mostrar poco a poco algunos elementos de una slide: cada elemento con clase .fragment aparecerá sólo cuando avancemos a la siguiente slide. Documentación aquí. Hay muchas clases de fragments
::: {.fragment}
Fade in
:::

::: {.fragment .fade-out}
Fade out
:::

::: {.fragment .highlight-red}
Highlight red
:::

::: {.fragment .fade-in-then-out}
Fade in, then out
:::

::: {.fragment .fade-up}
Slide up while fading in
:::

Fade in

Fade out

Highlight red

Fade in, then out

Slide up while fading in

Revealjs: Fragments en spans

  • El uso más directo que veo a los fragments es usarlos con spans para hacer esto:
Esto es muy [importante!!]{.fragment .highlight-red}


Esto es muy importante!!


  • Otro ejemplo:
Los datos indican que [Quarto]{.fragment .highlight-green} mientras que [Rmarkdown]{.fragment .fade-in} va desapareciendo


Los datos indican que Quarto crece mucho, mientras que Rmarkdown va desapareciendo

Revealjs: Imágenes

  • Por defecto se alinean a la izquierda
![](imagenes/perro_goya.jpg){fig-align="center"}

Imágenes: con o sin Stretch

  • Por defecto, Revealjs hace que las imágenes se ajusten al espacio vertical que queda en la slide.
  • Puedes desactivar esta opción en el YAML y/o en slide o imagen concreta. Documentación aquí
  • En el YAML
format: 
  revealjs:
    auto-stretch: false
  • En una slide o imagen concreta
## Nueva slide {.nostretch}

![](imagenes/imagen_ababol.jpg){.nostretch}

Imágenes: Stack layout


::: {.r-stack}
![](imagenes/perro_blanco.jpg){.fragment width="350"}

![](imagenes/perro_goya.jpg){.fragment width="400"}
:::

Imágenes: Posición absoluta

![](imagenes/perro_goya.jpg){.absolute top=500 left=0 width="250" height="100"}

![](imagenes/perro_blanco.jpg){.absolute top=50 right=50 height="250"}

![](imagenes/imagen_ababol.jpg){.absolute bottom=30 right=-100 width="300" height="300"}

Revealjs: Código

Documentación aquí

Chunks: code line-highlighting

  • Podemos hacer que se enfaticen ciertas lineas de los chunks. Para ello has de poner ciertas opciones dentro de los chunks:
#| code-line-numbers: "3"
library(ggplot2)
mtcars |> 
  ggplot(aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = "loess", formula = "y~x")
#| code-line-numbers: "|4"
library(ggplot2)
mtcars |> 
  ggplot(aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = "loess", formula = "y~x")
#| code-line-numbers: "|3|5|"
library(ggplot2)
mtcars |> 
  ggplot(aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = "loess", formula = "y~x")
  • Documentación oficial aquí. Un buen post sobre el tema, con otras opciones de sintáxis.

Chunks: Output location

  • La opción: #| output-location: nos ayuda a colocar el código y los resultados side-by-side. Tiene los siguientes valores: {column-fragment, column, fragment, slide}
  • La opción que más me gusta es: #| output-location: column-fragment, porque coloca el chunk y el resultado side-by-side y los separa por una pausa. Documentación oficial aquí. Mine Çetinkaya-Rundel lo explica aquí
```{r}
#| output-location: column-fragment
library(ggplot2)
mtcars |> 
  ggplot(aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = "loess", formula = "y~x")
```

Revealjs: tuneando las slides


  • Lo mejor es elegir un “theme”

  • Hay otras opciones

Revealjs: tunear con themes

  • Podemos cambiar la apariencia de las slides usando los themes.

  • Listado de themes aquí.

  • Para ello tenemos que incluir en el YAML el theme que queremos:
---
title: "Presentation"
format:
  revealjs: 
    theme: dark
---


Hay extensiones para tunear

Revealjs: Ejemplos de presentaciones


Revealjs: otras opciones de tuneado


  • Podemos cambiar la apariencia con CSS

  • … y con SASS

Tunear con CSS: ejemplo 1 (fenced divs), sacado de aquí

1) Si incluyes este trozo de CSS, que define la clase “.big-text” en un archivo .css o .scss

  .big-text {
  font-size: 88px;
   }

2) y lo referencias en el yaml de las slides con

     - theme: [default, assets/my_styles.scss]     o con

     - css: assets/my_styles.css

3) Entonces, puedes usar el siguiente fenced div con clase “.big-text”:

::: {.big-text}
    Un párrafo con el texto muy grande
:::

   Para conseguir que lo que escribas dentro del fenced div se vea muy grande, tal como ves abajo:

Un párrafo con el texto muy grande

Tunear con CSS: ejemplo 2 (spans)

  • Ejemplo 2 (sacado de aquí)

  • Para tunear un elemento dentro de una frase tenemos que usar spans


  • La sintaxis es: [span]{.class}


  • De forma que,

    • si escribes esto: Esta mañana ha llovido [mucho]{.big-text}
  • verás esto: Esta mañana ha llovido mucho

Revealjs: “truquillos”


Revealjs: Trucos para usar durante una presentación


Por ejemplo:

  • Tenemos el “hamburger menu” para movernos por las slides
  • Podemos hacer ZOOM en cualquier elemento o trozo de las slides. Solo hay que mantener presionada la tecla ALT y clickar en el ratón. En Linux es la tecla CTRL
  • O: permite hacer una overview de las slides. Para moverte por las slides en modo overview “usa las flechitas”
  • F: slides a pantalla completa
  • CTRL-SHIFT-F : permite buscar palabras dentro de las slides. Dando a ENTER avanzas a la siguiente coincidencia. Además, Si lo haces mientras las slides están en overview te marcará todas las coincidencias

Revealjs: EXTRAS

Documentación aquí y aquí

Otros formatos


  • Beamer

  • Power Point

  • Slidy

Beamer slides


Beamer slides

  • Beamer es un formato de slides, basadas en Latex, muy popular en el mundo académico
  • Quarto puede hacer Beamer slides. Sólo hay que usar los menús o este yaml:
---
title: "My Presentation"
format: beamer
---


  • La apariencia visual de las slides vendrá determinada por el theme y el colortheme. Aquí y aquí tienes ayuda para elegirlos. Por ejemplo:
---
title: "Presentation"
format: 
  beamer: 
    aspectratio: 32
    navigation: horizontal
    theme: metropolis
    colortheme: lily
---

Beamer slides (documentación)


Más de slides


Algunos truquillos

Algunos truquillos

  • Poner varios autores: una solución aquí