1. Introducción

Los gráficos e infografías son, cada vez más, una parte importante de la mayoría de textos escritos, ya sean estos un informe técnico, un artículo de periódico o un TFG. En el caso de la ciencia de datos, como puede verse abajo en la infografía, el análisis y la exploración de los datos es un proceso iterativo en el que la visualización y la generación de gráficos ocupa un lugar destacado.

R for Data Science (http://r4ds.had.co.nz/)

R for Data Science (http://r4ds.had.co.nz/)

Uno de los instrumentos y tareas fundamentales de un científico de datos es la capacidad de realizar visualizaciones de datos apropiadas y convincentes. El análisis gráfico no solo ayuda en la exploración y comprensión de los datos, sino que es fundamental a la hora de mostrar las posibles relaciones entre variables, descubrir relaciones o patrones ocultos, y descartar o sugerir nuevas preguntas sobre los datos.

El entorno R tiene diversos sistemas para visualizar datos, los dos más utilizados son el sistema gráfico de R-base y el ecosistema asociado al paquete ggplot2. Por diversas razones, en el curso usaremos el entorno ggplot2 para hacer nuestros gráficos; de hecho, en la actualidad ggplot2, dada su rapidez en la iteración entre gráficos, versatilidad y la cuidada estética que tienen sus gráficos, se ha convertido, al menos por el momento, en el sistema estándar para hacer gráficos en R. Por ejemplo, ¿cómo creéis que hace la BBC sus gráficos?, evidentemente con R y ggplot2. Puedes ver uno de sus repositorios aquí y su cookbook aquí.

Con ggplot2 es sencillo hacer gráficos con calidad para ser publicados o mostrados, además de que, dada su sintaxis modular, hace sencillo el reutilizar los gráficos durante el proceso de análisis. El paquete ggplot2 fue inicialmente desarrollado por Hadley Wickham, pero actualmente el ecosistema ggplot es el resultado de toda una comunidad de usuarios que contribuye a enriquecer el sistema gráfico con sus extensiones y paquetes auxiliares.

En palabras de Hadley en su libro sobre ggplot2:

ggplot2 is an R package for producing statistical, or data, graphics, but it is unlike most other graphics packages because it has a deep underlying grammar. This grammar, based on the Grammar of Graphics (Wilkinson 2005), is made up of a set of independent components that can be composed in many different ways. This makes ggplot2 very powerful because you are not limited to a set of pre-specified graphics, but you can create new graphics that are precisely tailored for your problem. This may sound overwhelming, but because there is a simple set of core principles and very few special cases, ggplot2 is also easy to learn (although it may take a little time to forget your preconceptions from other graphics tools).

Sí, con ggplot2 es “fácil” hacer rápidamente gráficos de calidad, PERO dominar todos los detalles del paquete sí que es complicado, pero no nos hace falta conocerlo todo. Además, hay que tener en cuenta que ggplot2 es un paquete/entorno en constante evolución. Actualmente está en la versión 3.2.1. Bueno, en marzo de 2020 apareció la versión 3.3.0.

Para entender esta idea de la constante evolución y el papel que tiene la comunidad de usuarios en el desarrollo de R y sus paquetes puedes leer este tweet y las respuestas a él. En el tweet sólo se anuncia una pequeña mejora en como ggplot2 gestiona los títulos de los gráficos pero genera reacciones en la comunidad de usuarios.

La redes sociales pueden hacerse eco de la evolución de un paquete, pero donde habitualmente se produce la discusión/colaboración entre usuarios es en plataformas como Github. Por ejemplo, puedes ver como se gestó está pequeña mejora aquí. Fue la issue 3252 de ggplot2. Otro ejemplo, justo cuando estaba escribiendo este párrafo, leí este otro tweet anunciando otra mejora en ggplot2.

La página web de ggplot2 puedes encontrarla aquí. En ella puedes encontrar documentos de ayuda y la referencia oficial. Para darte cuenta de todo lo que se puede hacer con el ecosistema ggplot visita esta página donde podrás ver los 79 “paquetes auxiliares” o extensiones a ggplot2.

Para hacer “buenos” gráficos con ggplot2no sólo es necesario entender la sintaxis y los pormenores del paquete, sino que quizás se necesite algo más. Por ejemplo, algo de experiencia y cierta capacidad visual y estética; incluso hay quien dice que hacer buenos gráficos es un arte. Para intentar mejorar vuestros gráficos o evitar ciertos errores, aquí tenéis algunas reglas/consejos, y aquí un curso completo sobre visualización1 con bookdown incluido.

Entenderás muy bien que hacer buenos gráficos exige conocimiento y mucho trabajo al ver el video de este post, donde se ven las versiones previas para que al final saliese esta preciosura de gŕafico:

Otro ejemplo del making-of de un gráfico puedes verlo aquí.

Otros dos libros sobre visualización con el código de los ejemplos hechos con ggplot2, aquí y aquí. Finalmente, algunos consejos de la BBC sobre visualización.

Como también se aprende los errores, aquí tienes un articulo de The Economist donde muestran errores que ellos mismos han cometido haciendo gráficos. Además pueden descargarse los datos.


2. Ideas básicas sobre ggplot2

Ya se dijo que ggplot2 es un paquete R desarrollado por Hadley Wickham, aunque actualmente es el resultado de la colaboración de múltiples desarrolladores. ggplot2 implementa en R The Grammar of Graphics de L. Wilkinson, un sistema coherente para describir y construir gráficos. El énfasis de ggplot2 está en la exploración rápida de datos, especialmente de datos de alta dimensionalidad. Con ggplot2 es sencillo ir transformando el gráfico mientras se van analizando los datos.

Para empezar a entender la “filosofía” de ggplot2, os planteo una pregunta medio retórica: ¿qué vemos en el gráfico de abajo?

Pues sí, es un gráfico de puntos y nos ayuda a ver las relaciones que existen entre 3 variables. Estamos habituados a ello, pero vamos a pensar en el gráfico desde la óptica de “The Grammar of Graphics” implementada en el paquete ggplot2.

En nuestro gráfico se representan por medio de puntos, en el espacio X-Y, y mediante los distintos colores de los puntos, las observaciones de 3 variables. Bien, nada muy novedoso, todos los sistemas gráficos hacen este tipo de gráficos. Los gráficos de ggplot2 se realizan mediante la superposición de elementos/capas. Podemos pensar que el gráfico que hemos visto es una capa. ¿Cómo creamos este gráfico o capa en ggplot2?

Pues, una de las principales ideas para entender ggplot2 es que cada capa de un gráfico tiene 3 componentes o elementos principales:

  • los datos que se van a representar (sencillo, para hacer un gráfico hacen falta datos). Para ello utilizaremos generalmente la función ggplot()

  • un conjunto de propiedades estéticas asociadas a alguna variable del conjunto de datos. Por ejemplo, la variable Sepal.Lenght está asociada al eje X, ala posición en el eje X. Por su parte, el color de los puntos (otra característica visual o estética) está asociado a los valores de la variable Species. Es decir, usando la terminología de ggplot2, las distintas variables están asociadas o mapeadas a determinadas características estéticas. El mapeo de variables con estéticas se hará con la función aes() de aesthetics. (esto ya no es tan estándar, se explica en breve)

  • el elemento geométrico que se va a representar. En nuestro caso el elemento geométrico que se utiliza para representar los valores de las variables son los puntos, pero podrían haber sido las lineas o las barras … Para especificar el elemento geométrico que vamos a usar en nuestro gráfico se utiliza la familia de funciones geom_xx(); por ejemplo geom_point() si queremos puntos, geom_line() si queremos que las relaciones entre las variables se representen/visualicen como lineas.

Así en abstracto puede ser complicado entender del todo que quiere decir todo esto. Vamos a verlo con ejemplos concretos. De momento, para explicar las principales características de ggplot2 utilizaré un conjunto de datos famoso, pero odiado por algunos, por haber sido utilizado en numerosos ejemplos y cursos: el iris dataset.

El conjunto de datos iris contiene datos sobre 150 flores, en concreto sobre 150 lirios. iris tiene 5 variables, 4 de ellas miden la longitud y el ancho del pétalo y sépalo de los 150 lirios. Estas 4 primeras variables son cuantitativas y continuas; mientras que la quinta variable es categórica, indicando la clase o variedad de los lirios, ya que en los datos hay 3 especies distintas de lirios (setosa, versicolor y virginica). Con estos datos, con 3 de sus variables, se ha creado el gráfico que ves más arriba.


PRIMER GRÁFICO: Para comenzar nuestras andanzas con ggplot2 intentaremos replicar con código R el gráfico de arriba; aunque al principio sólo utilizaremos 2 variables: haremos un gráfico de puntos de la longitud del sépalo frente a la longitud del pétalo.

Hacer un gráfico con ggplot2 requiere de varias etapas,

  • la primera de ellas consiste en usar la función ggplot() para inicializar el gráfico.

  • en segundo lugar, tendremos que especificar que conjunto de datos usaremos en el gráfico.

  • en tercer lugar tendremos que especificar que variables irán asociadas a determinados elementos visuales o estéticos del gráfico

  • por último, en cuarto lugar, tendremos que especificar que tipo de gráfico o geometría usaremos para visualizar las observaciones.

Veámoslo más detenidamente.

En ggplot2, para hacer un gráfico se empieza SIEMPRE llamando a la función ggplot(). Si tecleamos ggplot() en la consola o en un script, parece que no ocurre nada, pero tras la llamada a la función ggplot(), R ha creado un objeto, un contenedor para nuestro futuro gráfico. Aún no vemos el gráfico, faltan cosas, pero ya lo hemos inicializado. Si quieres ver el objeto/contenedor que hemos creado con la llamada a ggplot() tienes que asignarle un nombre, así podrás verlo en la pestaña “Environment” de RStudio.

Para verlo tienes que hacer:

my_grafico <- ggplot()

my_grafico, es un objeto R, concretamente una lista con 9 elementos, que tendremos que ir “llenando” para hacer nuestro gráfico.

Generalmente, dentro de la función ggplot() se suele especificar el conjunto de datos que vas a utilizar para hacer el gráfico. A diferencia de los gráficos de R-base, ggplot2 no permite graficar vectores: los datos que se suministran han de ser SIEMPRE data.frames o similares.

ggplot(data = iris)
ggplot(iris)

Ya está, con cualquiera de las 2 instrucciones de arriba, son equivalentes2, ya hemos inicializado el gráfico y le hemos dicho que datos vamos a usar.

Dijimos que para comenzar haríamos un gráfico de puntos de la variable Sepal.Length frente a Petal.Length; así que tenemos que decirle a ggplot2 que variables de iris queremos visualizar y con que propiedades estéticas queremos asociar cada variable. Para ello utilizaremos la función aes() dentro de ggplot(). Lo hacemos con la siguiente expresión:

ggplot(iris, aes(x = Sepal.Length,  y = Petal.Length))

Aún no vemos el gráfico, pero con aes() le hemos dicho a R/ggplot2 que queremos asociar/mapear la variable Sepal.Length al eje x, y la variable Petal.Length al eje y. Fíjate que, en la pestaña de gráficos de RStudio, ya vemos los ejes del gráfico; además, fíjate que ggplot2 ya ha calculado para nosotros el rango de las variables para ajustar los ejes.

Al igual que antes, podemos omitir los nombres de las opciones de la función aes(). Esta función puede tener muchos argumentos (veremos algunos), pero los 2 primeros son siempre x (el eje x) y después y (el eje y o vertical de mi gráfico); es decir podríamos hacer lo siguiente que es más rápido de teclear.

ggplot(iris, aes(Sepal.Length, Petal.Length))

Con esta instrucción le estamos diciendo a ggplot2 que vamos a hacer un gráfico con los datos del data.frame iris y que vamos a asociar/conectar/mapear la variable Sepal.Length con el eje x, y la variable Petal.Length con el eje y del gráfico. Perfecto, pero entonces ¿por qué no vemos el gráfico? La razón estriba en que no le hemos dicho a ggplot2 qué tipo de gráfico queremos (de puntos, de lineas etc…). El tipo de gráfico se explicita con una familia de funciones: geom_xx() o geometrías. Hay muchas geometrías o tipos de gráficos que podemos usar. Ya lo veremos!!! Nosotros queremos hacer un gráfico de puntos, así que, de la familia de geometrías tenemos que usar geom_point(). Veámoslo.

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point()

Como vemos los puntos del gráfico se visualizan en color negro, con un tamaño, una transparencia y una forma determinadas. Obviamente todo esto se puede cambiar dentro de geom_point() con las opciones adecuadas. Por ejemplo:

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point(color = "red", size = 2, alpha = 0.2)

Ya casi está. No es tan complicado. Ya hemos visto las ideas fundamentales de la visualización con ggplot2:

  1. Los gráficos se inician con la función ggplot(). Generalmente aquí se especifican los datos (data.frame) que queremos utilizar

  2. La función aes() sirve para asociar/mappear variables con atributos/características estéticas del gráfico. De hecho el nombre del función aes() viene de aesthetics. Las aesthetics más importantes de un gráfico suelen ser los ejes x e y, por eso se ponen siempre al principio de aes(); es decir, son los 2 primeros argumentos de aes(). En nuestro ejemplo hemos asociado la variable Sepal.Length con el eje x, y la variable Petal.Length con el eje y. Veremos más aesthetics, como por ejemplo el color o el tamaño (de los puntos … o de las lineas o …)

  3. Con geom_**() elegimos el tipo o geometría de gráfico. Hay muchos tipos de gráficos, así que habrán muchos geoms. Por ejemplo: geom_point(), geom_line(), geom_ …

Estas 3 ideas son las principales para entender ggplot2. Después hay muchas más opciones y elementos que serán muy importantes para conseguir un buen gráfico, pero en cierta forma son secundarias; por ejemplo, los títulos, los ejes, las escalas, el tema etc… lo iremos viendo poco a poco.


Afiancemos las ideas principales de la visualización con ggplot2. ¿Piensa que hará la siguiente linea de código?

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_line()

La primera parte de la instrucción es igual a la anterior: queremos un gráfico con el data.frame iris y queremos asociar la variable Sepal.Length con el eje x, con la propiedad aesthetic eje x y Petal.Length con el eje y; pero le hemos pedido un gráfico de lineas (geom_line()). En este caso hacer un gráfico de lineas no tiene mucho sentido, pero si se lo pedimos a R, este nos hace caso y nos lo muestra.


Ya dije que una de las características importantes de ggplot2 es que funciona por capas que se van superponiendo; para ir añadiendo capas a nuestro gráfico tenemos que usar el símbolo +. Por ejemplo si quisiéramos ver los puntos y las lineas ¿Cómo lo hacemos?

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_line()


Tampoco son muy útiles la lineas en este gráfico.

Otra geometría o geom_() que se usa mucho es geom_smooth(). Probémosla:

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() +  geom_smooth()

Del gráfico puede inferirse que hay una relación, no lineal, pero sí directa o positiva entre la longitud del sépalo y del pétalo; pero también se aprecia que hay al menos dos grupos distintos de lirios. Hay un grupo de observaciones cuyo pétalo parece ser claramente menor que el del resto de lirios. Veamos si esto se debe o esta asociado al tipo de lirio, recuerda que hay 3 tipos de lirios, asociados a la variable iris$Species. Para verlo en nuestro gráfico lo que vamos a hacer es asociar/mapear la variable Species con la aesthetics color:

ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point() 

Pues parece que sí, que la especie de lirios “setosa” es más pequeña, al menos en longitud, del sépalo, pero sobre todo del pétalo.

La variable Species podríamos haberla asociado a la estética tamaño (size), o a la estética forma (shape) pero no sería tan útil ni quedaría tan bonito el gráfico. Fíjate que incluso R nos avisa de que asociar la propiedad o aesthetic tamaño con una variable categórica como Species no es muy recomendable.

ggplot(iris, aes(Sepal.Length, Petal.Length, size = Species)) + geom_point() 
#> Warning: Using size for a discrete variable is not advised.

También podemos asociar la variable Species a la estética “forma”(shape). Lo hacemos en la expresión de más abajo. Como veis, ahora las diferencias entre especies de lirios no se aprecian tan bien como cuando usábamos color = Species

ggplot(iris, aes(Sepal.Length, Petal.Length, shape = Species)) + geom_point() 

Os va a costar hacer gráficos, normal!!!, pero espero que la idea principal ya la tengáis. Lo que pasa es que no os he contado todo, en realidad es un poco más complejo y versátil. Lo medio explico en el siguiente apartado.


Más ideas sobre ggplot2

Ya tenéis las ideas principales para hacer gráficos con ggplot2, pero no os lo he contado todo, tampoco lo voy a hacer ahora, pero si contaré las cosas de una forma diferente para que tengáis más flexibilidad/versatilidad a la hora de hacer gráficos. Si queréis saber toda la verdad3 tendréis que ir al libro de Hadley, concretamente aquí.

La forma que os he contado de hacer gráficos ggplot2 es la que veréis habitualmente, yo también hago mis gráficos así, solo que para entender mejor el funcionamiento, la sintaxis de ggplot2, os lo tengo que contar otra vez de una forma un poco diferente o ampliada.

Un gráfico de ggplot2 se inicia llamando a la función ggplot() eso es cierto y también es verdad que generalmente dentro de ggplot() se indica el data.frame que vas a utilizar y con aes() que variables vas a usar y con que elementos visuales o estéticos quieres asociar cada una de la variables que vas a utilizar4. Correcto, pero …. en realidad un gráfico ggplot2 se hace por capas, cada capa se especifica con una función de la familia geom_xx(), así que en realidad los datos y las aes() se “deberían” especificar dentro de la función geom_xx()`.

Parece un poco de lío pero en cuanto lo entiendas es muy fácil y te puede dar más flexibilidad a la hora de hacer tus gráficos. Empecemos: ¿recuerdas que hacen las lineas/expresiones de abajo?

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() 
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_line()

Podemos pensar que las funciones que hacen la representación gráfica realmente son las geom_xx(); es ahí donde deberíamos especificar los datos y variables/estéticas que queremos usar, pero si no las especificamos en la función geom(), entonces, ggplot2 mirará a ver si existen, si están especificados, dentro de ggplot().

Ahora que ya sabemos el funcionamiento básico de ggplot2, veamos algunos detalles mediante algunos ejemplos. Hasta ahora hemos especificado el data.frame que queremos graficar con ggplot(data = my_df) o con ggplot(my_df) y las variables que queremos ver, y a que propiedad estética queremos asociarla, con la función aes() dentro de ggplot(). Si lo hacemos así, todos los geoms_xx() que utilicemos compartirán el conjunto de datos y las variables/estéticas a mappear y mostrar; pero a veces, en gráficos más complejos podemos querer hacer que cada geom_xx() muestre datos y/o variables distintas.

Entender que cada geom_xx() puede estar asociado a distintos data.frames y/o variables es importante para tener más versatilidad con ggplot2.Por ejemplo, las siguientes tres expresiones hacen el mismo gráfico. Se suele utilizar la primera expresión, pero la segunda y tercera expresiones son “más flexibles”, aunque es verdad que si sólo se utiliza un geom_xx() no ganamos nada por usar la segunda o tercera expresión, pero no será el caso si en nuestro gráfico necesitamos usar varios geom_xx()

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point()

ggplot(iris) + geom_point(aes(Sepal.Length, Petal.Length))

ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length))

Fíjate, como detalle, pero importante, que si utilizas la tercera expresión; es decir, si especificas los datos dentro de la función geom_xx(), es necesario poner el nombre del argumento ; es decir, debes poner data = iris, no puedes poner solo iris. Yo me olvido siempre de este detalle5.

En este caso (como el gráfico solo tiene una capa, como sólo usamos un geom(_xx)) no ganamos nada por usar la segunda o tercera expresión; PERO, cuando usemos varios geom_xx() esto nos dará muchas posibilidades para nuestro gráfico.

Intenta descubrir las diferencias y funcionamiento de las 3 siguientes instrucciones. Recuerda que puedes correr las instrucciones en R para ver que hacen exactamente.

ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point() + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point(aes(color = Species)) + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_smooth(aes(color = Species))

Veámoslas una a una:

  1. Los datos y las 3 variables/estéticas dentro de ggplot()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point() + geom_smooth()

En este caso los 2 geoms comparten el conjunto de datos (iris) y las variables/estéticas a graficar


  1. Los datos y 2 variables/estéticas dentro de ggplot(), pero una tercera variable (Species), asociada a la estética color, aparece solamente en geom_point()
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point(aes(color = Species)) + geom_smooth()


  1. Los datos y 2 variables/estéticas dentro de ggplot(), pero una tercera variable (Species), asociada a la estética color, aparece solamente en geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_smooth(aes(color = Species))

Espero, seguro!!, que te has dado cuenta de que si especificas el data.frame y las variables/estéticas dentro de ggplot() esto afectará a todos los geoms del gráfico; pero lo que se especifique dentro de un geom_xx() solo afecta a esa geometría.


Otro ejemplo para entenderlo, ¿por qué no funciona la siguiente expresión?

ggplot(iris) + geom_point(aes(Sepal.Length, Petal.Length)) + geom_smooth(aes(color = Species))

Pues porque para poder representar la linea suavizada se utiliza geom_smooth(), y geom_smooth() necesita como mínimo tener variables asociadas a las estéticas x e y. Como veis, dentro de geom_smooth() solo hemos especificado la estética “color” y tampoco hemos especificado en la función ggplot() que variables se asocian con x e y. Por lo tanto, geom_smooth() no puede hacer su trabajo, le faltan los “datos” de x e y para calcular/obtener la linea suavizada.

Vamos con otros ejemplos. La siguientes expresiones tampoco funcionarán6 si intentáis correrlas en vuestro ordenador. ¿Por qué?

ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length)) + geom_line(aes(Sepal.Length, Petal.Length))

ggplot(aes(Sepal.Length, Petal.Length)) + geom_point(data = iris) + geom_line()

ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length)) + geom_line()


Otro ejemplo: hagamos algo más marciano/complicado. Supón que quieres hacer un gráfico diferenciando los puntos por color para las tres especies de lirios, pero quieres que solo se vea la linea suavizada para las dos especies más grandes (virginica y versicolor). Los lirios más pequeños son los de la clase setosa. Igual se puede hacer de otra forma pero la que me viene a la cabeza es hacer lo siguiente:

Primero, crear un dataset que sólo contenga a los lirios grandes, los de las especies virginica y versicolor.

iris2 <- iris %>% filter(Species != "setosa") #- me quedo con los lirios que no son de clase "setosa"

Para después hacer el gráfico con cualquiera de las 2 expresiones siguientes. Prefiero la segunda porque hay que teclear/escribir menos, pero puede que sea más didáctica la primera.

ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_smooth(data = iris2, aes(Sepal.Length, Petal.Length) ) 

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point(aes(color = Species)) + geom_smooth(data = iris2)


Otro ejemplo más: ¿y si quisiéramos que las 2 especies grandes se representen con el mismo color? Hay varias soluciones, una de las más marcianas es la que propongo abajo. Es una solución rara, pero creo que os ayudará a entender ggplot2

Primero voy a crear un nuevo data.frame sólo con las observaciones de los lirios pequeños, los de la clase setosa.

iris_setosa <- iris %>% filter(Species == "setosa") #- me quedo con los lirios pequeños, los de clase "setosa"
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_point(data = iris_setosa, aes(color = Species)) + geom_smooth(data = iris2,aes(Sepal.Length, Petal.Length) )

Otra solución, quizás más lógica, consiste en primero agrupar las 2 especies de lirios grandes (versicolor y virginica) en una sola clase.

iris_solo_2_clases <- iris %>% mutate(Species_2 = ifelse(Species %in% c("versicolor", "virginica"), "versi_virgi", "setosa"))

Para después hacer el gráfico. Además el gráfico lo podemos hacer al menos de 2 maneras, la segunda mucho mejor, la primera expresión es un poco enrevesada:

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_point(data = iris_setosa, aes(color = Species)) + geom_smooth(data = iris_solo_2_clases,aes(Sepal.Length, Petal.Length, color = Species_2) )

ggplot(iris_solo_2_clases, aes(Sepal.Length, Petal.Length, color = Species_2)) + geom_point() + geom_smooth()

Como veis, en ggplot2 hay varias maneras de hacer el mismo gráfico. Esto al principio puede abrumar/molestar, pero muestra la flexibilidad de la sintaxis.

Para ir acabando con la “filosofía”/sintaxis/gramática de ggplot2 intenta imaginar que gráficos hacen las 6 expresiones de más abajo.

Si no puedes, recuerda que siempre puedes ejecutar las ordenes en el ordenador. Fíjate sobre todo en la tercera expresión

ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point() + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point(color = "purple") + geom_smooth()

ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point() + geom_smooth(color = "brown")
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() + geom_smooth(aes(color = Species))
ggplot(iris) + geom_point(aes(Sepal.Length, Petal.Length, color = Species) ) + geom_smooth(aes(Sepal.Length, Petal.Length, color = Species))


En la tercera expresión se especifica color = Species dentro de aes() en ggplot(), así que, de momento, todos los geoms del gráfico deberían diferenciar por especies de lirios usando el color, PERO, después se vuelve a usar el argumento color dentro de geom_point(), pero fíjate que no va dentro de de aes(), va fuera. Concretamente hacemos lo siguiente: geom_point(color = "purple"); es decir, para la capa de puntos, y solo para la capa de puntos que se crea con geom_point(), estamos asociando la estética color, no a una variable, sino a un color fijo. Sin embargo, para la otra capa del gráfico, la que resulta de usar geom_smooth() sigue siendo valido que la estética color está asociada a la variable Species.

Un detalle: imagina que en un gráfico en el que has fijado 3 estéticas dentro de ggplot(aes()). En principio las 3 estéticas afectarán a todos los geom_xx() que utilices en tu gráfico, pero si quisieras que, por ejemplo, la estética color no afectase a un geom concreto, podrías hacer lo siguiente: geom_xx(aes(color = NULL)).

Como puedes imaginar, aún tenemos que ver más elementos de ggplot2. Como mínimo los títulos y leyendas, los ejes, el tema, coordenadas, etc… vamos a ello!!


3. Elementos de un ggplot

Ya hemos presentado los principales elementos de los gráficos hechos con ggplot2, los que tienen que ver con la representación de las variables. Pero es evidente que un gráfico tiene muchos más elementos, y lógicamente hay que conocerlos un poco para poder ajustar los gráficos a nuestras necesidades y mejorar la calidad de nuestros gráficos.

Ejemplos de otros elementos son: títulos del gráfico y de los ejes, “theme” del gráfico, small multiples o faceting, anotaciones etc…

En está sección iremos más rápido. Se presentarán solamente algunos ejemplos, conceptos y/o aclaraciones. Si necesitas profundizar más en estos elementos, puedes acudir a la referencia oficial de ggplot2 o al bookdown de ggplot2.

Ya dijimos que los gráficos ggplot se componen de capas o layers. Para nosotros, hasta ahora, una capa estaba compuesta de 3 elementos:

  • un conjunto de datos

  • un conjunto de variables mapeadas con aes() a propiedades estéticas

  • una geometría, con geom_xx()

Es evidente que en todos los geoms no se pueden especificar todas las características estéticas. Por ejemplo si usas geom_point no podrás especificar la anchura o el tipo de las lineas, porque no estás usando lineas sino puntos. Para ver que estéticas admite cada geom tendrás que mirar la ayuda de cada geom. Al final de este post tienen un gráfico interactivo con el que se puede ver fácilmente que características estéticas admite cada geom. Por ejemplo geom_bar(), que sirve para hacer gráficos de barras, no admite mappear variables al eje Y, ya que en el eje Y se visualizan/mapean las frecuencias absolutas o relativas de la variable que se representa en el eje X.


Esto es lo básico que hay que saber, pero en realidad, una capa necesita de dos elementos más: una stat (o transformación estadística) y una posición. Estos dos últimos elementos son necesarios pero la verdad es que podríamos seguir haciendo gráficos con ggplot2 sin conocerlos. ¿Por qué? Pues porque si en una capa no los especificamos, lo hace ggplot2 por nosotros. Lo ha estado haciendo hasta ahora en todos los gráficos que llevamos hechos. Pero claro, saber como utilizar estos elementos nos dará más flexibilidad a la hora de hacer ggplots.

Generalmente las capas se van añadiendo con la familia de funciones geom_xx(), PERO también se pueden añadir capas con otra familia de funciones stat_xx().

Aparte de estos cinco elementos (datos, aes(), geom, stat y posición) los gráficos ggplot pueden tener más elementos. Veámoslos uno a uno.


3.1 Títulos del gráfico

Es evidente que un gráfico para ser efectivo y mostrar su mensaje con claridad debe tener un título y/o subtítulo ilustrativo y debe mostrar información relevante sobre que variables se grafican los ejes X e Y. Este tipo de elementos pueden modificarse de varias maneras, pero nos centraremos en la función labs().

Fíjate que con la función labs(), de labels, podemos cambiar los títulos del gráfico, de los ejes y también de las leyendas.

En los títulos (tanto del gráfico, como de los ejes y leyendas) también se pueden cambiar otras características; por ejemplo, cambiar el tamaño, la fuente o el color, pero eso será tarea de otra función de ggplot2: del grupo de funciones theme_(). Pero el tema o theme de los gráficos lo veremos en el siguiente apartado.

Tomemos el siguiente gráfico como referencia y sobre él iremos añadiendo elementos:

p <- ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) + geom_point()
p

Con la función labs() podemos añadirle un título, subtitulo, pie de gráfico o caption. También podemos cambiar el título de los ejes X e Y, así como también el titulo de la leyenda para color, o para otras estéticas que utilicemos en el gráfico.

Es suficiente con ver un ejemplo:

p + labs(title = "Gráfico 1: Longitud del sépalo frente al pétalo",
       subtitle = "(diferenciando por especie de lirio)",
       caption = "Datos provenientes del Iris dataset",
       x = "Longitud del sépalo",
       y = "Longitud del pétalo",
       color = "Especie de lirio")

Si quisieras eliminar completamente los títulos del eje X podrías hacerlo en el anterior chunk fijando x = NULL dentro de la función labs().

En lugar de usar la función labs(), también podemos utilizar las funciones auxiliares xlab() e ylab()

p + labs(color = NULL, x = NULL)  #- borra el título de la leyenda y del eje X
p + xlab(NULL) + ylab(NULL)       #- elimina títulos de los ejes X e Y

3.2 Themes

Themes control the display of all non-data elements of the plot. You can override all settings with a complete theme like theme_bw(), or choose to tweak individual settings by using theme() and the element_ functions. Use theme_set() to modify the active theme, affecting all future plots.

Para cambiar detalles de la apariencia del gráfico como el tamaño, fuentes y color de los títulos, pero también de los puntos, las lineas, el fondo del gráfico, la apariencia de las grid-lines, el lugar para las leyendas, etc… etc… contamos con las “funciones de tema”; todas ellas comienzan con theme_()

En general con las funciones theme_() podemos cambiar/ajustar cualquier elemento del gráfico, con la excepción de la propia representación de los datos (ya sabemos que esto se hacen con las funciones geom_()). Estos elementos afectan a la apariencia y detalles del gráfico, pero no a la relación entre variables que se muestra realmente en el gráfico.

Para empezar a entender que hacen las funciones relacionadas con el theme, señalar que ggplot2 incorpora un conjunto de “temas” que podemos utilizar para cambiar la apariencia del gráfico a nuestro gusto. Puedes verlos todos aquí. El tema que usa por defecto ggplot2 es theme_gray(). Veamos a los themes en acción:

p + theme_gray()   #- tema por defecto
p + theme_light()
p + theme_dark()
p + theme_classic()
p + theme_minimal()
p + theme_void()

El paquete de R ggthemes incorpora una amplia lista de temas adicionales, algunos de ellos tratan de replicar el estilo de corporaciones famosas como The Economist o Stata. En el tutorial no se ven bien los gráficos porque los he hecho pequeñitos, pero prueba a hacerlos tú mismo y verás que son good-looking. Veamos algunos:

library(ggthemes)
p + theme_economist()   
p + theme_fivethirtyeight()
p + theme_stata()
p + theme_solarized()

También podemos definir un tema propio para que el gráfico se ajuste los más posible a nuestras preferencias.

# define custom theme
my_theme <- theme(axis.text.x = 
                  element_text(colour = "grey20", size = 12, angle = 90, hjust = 0.5, vjust = 0.5) ,                   axis.text.y = element_text(colour = "grey20", size = 12) ,
                  text = element_text(size = 16))
p + my_theme

Se puede fijar el tema/theme de los gráficos con la función theme_set(). Por ejemplo:

theme_set(theme_minimal())  #- un tema concreto
theme_set(theme_minimal() + 
    theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())) #- un tema modificando algunas opciones, que ele eje x no muestre ticks ni escalas

Si quieres volver al theme por defecto:

theme_set(theme_gray())

Ejemplos de algunos elementos cuya apariencia que se pueden cambiar con theme()

p + theme(legend.position = "none")            #- que no aparezca leyenda
p + theme(legend.position = "bottom")          #- leyenda abajo
p + theme(legend.direction = "horizontal")     #- leyenda horizontal!!
p + theme(legend.title = element_text(size = 22))     #- título de la leyenda a 22
p + theme(legend.key.size = unit(2.4, "cm"))          #- tamaño de los cuadros de la leyenda


p + theme(text = element_text(size = 20, face = "bold"))         #- cambiar el tamaño de todos los elementos de texto
p + theme(text = element_text(face = "bold"))                    #- pone en negrita todos los elementos de texto

p + theme(axis.text.x = element_text(colour = "pink", size = 12, angle = 90, hjust = 0.5, vjust = 0.5)) # apariencia de la escala del eje x

p + theme(axis.title.y = element_text(size=25, angle = 45)) #- tamaño y angulo del texto del eje Y

p + theme(plot.subtitle = element_text(hjust = 3))   #- posición horizontal del subtitulo (si lo tuviese)
  
p + theme(plot.caption = element_text(hjust = 3))    #- posición vertical del pie de gráfico (si lo tuviese)

p + theme(panel.background = element_rect(fill = "green", colour = "pink", linetype = "longdash", size = 3.5))
p + theme(panel.background = element_blank())
p + theme(panel.background = NULL)


p + theme(plot.background = element_rect(fill = "pink", colour = "purple", linetype = "dotted", size = 7))

Si quieres ver todos las características que controla y que por tanto puedes modificar con theme(), usa la ayuda de la función theme() o ejecuta en R args(theme). Aunque casi mejor verlas en esta infografía de Henry Wang o en este post de Isabella Benabaye con las opciones que suele cambiar ella.

En general, si quieres cambiar algún elemento de un ggplot, has de hacer theme(elemento = element_text()). Si quieres eliminar por completo algún elemento del gráfico, por ejemplo las grid-lines del gráfico, harías theme(panel.grid = element_blank()).

Evidentemente todo esto es imposible de aprender, sólo tienes que saber que cualquier elemento del gráfico se puede cambiar y tienes que saber buscar e interpretar la ayuda.

Colores

Se poco de colores, pero claro si quieres cambiar la apariencia de los gráficos, has de saber los colores de R, así que:

  • Aquí tienes una guía para elegir color. Si solo quieres ver la lista de nombres de los colores en R ejecuta: aa <- as.data.frame(colours())

  • Si sabes el nombre del color que quieres, aquí, podrás buscarlo y ver su color y su codificación en RGB y Hex.

  • También es interesante el paquete paleteer que agrupa un conjunto amplio de paletas de colores para usar en R.


XKCD theme

Por último, no sé si conocéis el webcomic XKCD. Pues en R también hay un paquete y un theme para hacer gráficos al estilo XKCD. Es el paquete xkcd cuyo autor es Emilio Torres-Manzanera de la Universidad de Oviedo. Aquí podéis ver algunos gráficos hechos con este estilo en R.

Intenté hacer un gráfico con su theme, pero desafortunadamente no me salió; pero justo al día siguiente vi este tweet7 que hace algo parecido con datos de los Simpsons y su código sí me ha funcionado, además simula/construye el estilo XKCD desde cero.

Además, después vi que Evangelyne Reinolds hizo esta maravilla. Lo haremos en clase?! En este post puedes encontrar el código para reproducir una de las historias o viñetas de XKCD.


3.3 Small multiples o Facetting

El sistema gráfico de ggplot2 incorpora una técnica especial llamada “faceting” que permite dividir un gráfico en múltiples gráficos. Cada uno de esos múltiples gráficos se realiza sólo para las observaciones de una de los valores de una variable categórica (o factor) incluido en el conjunto de datos. Es más fácil hacerlo que explicarlo/escribirlo.

Por ejemplo, en iris tenemos la variable Species, que es categórica. Lo que se hace con el “facetting” es dividir el dataset en grupos y hacer el mismo gráfico para cada uno de los grupos. Los grupos se van a definir en función de los valores de la variable Species. Recuerda que hay tres tipos o especies de lirios.

Para hacer un “facetting graph” podemos usar las funciones facet_wrap() y facet_grid().

Por ejemplo, con la función facet_grid() puedes elegir entre hacer los small multiples por filas o por columnas. Empecemos haciendo un facetting por columnas. Además, con facet_grid() se pueden usar varias sintaxis, pero la que aparece en la cheatsheet actual de ggplot2 y, por tanto, la recomendada es las que ves en la segunda linea:

#p + facet_grid( . ~ Species)                # old sintaxis
p + facet_grid(cols = vars(Species))         # gráficos x columnas, separando por valores de 'Species'

Ahora por filas:

p + facet_grid(rows = vars(Species))         # gráficos x filas

}}\nrevealjs-plugins: [lightbox, pointer]\n # - lightbox\n # - pointer # hay q apretar q\n#css: assets/styles_slides_intro.css\n #theme: [moon, custom.scss]\nembed-resources: true\n---\n\n\n# Intro {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n- En el [I Congreso & XII Jornadas de Usuarios de R](http://r-es.org/12jr/) celebradas en Córdoba en noviembre de 2022 impartí el taller [Mi primer blog con Quarto](https://perezp44.github.io/taller.primer.blog/)\n\n. . .\n\n- Buena parte de estas slides provienen del taller, así que algunas se parecen un poco :wink:\n\n## Estructura del ... :wink: \"taller\" {.smaller}\n\n. . . \n\n
\n\n0. **Primeras ideas**, visionado de blogs\n\n. . .\n\n1. Creación de un blog básico: mi blog en 3 minutos\n\n2. **Tuneado básico** del blog.\n\n3. Convirtiendo el blog en una **web personal**\n\n
\n\n. . .\n\n4. Workflow: **creando posts**\n\n5. **Escribiendo** un post **con Quarto**\n\n. . .\n\n
\n\n6. Tuneado: **mejorando la web**\n\n. . .\n\n7. Gestión y **publicación** de la web/blog\n\n
\n\n## Objetivo(s) del taller\n\n
\n\n::: incremental\n- Aprender a **hacer websites/blogs con Quarto**\n\n
\n\n- **Aprender sobre Quarto** mientras vamos creando una web/blog\n\n
\n\n- Que salgáis todos con el bosquejo y la **intención de hacer** una web/blog!!\n\n
\n\n- ... y, si puede ser, **pasar un buen rato** :slightly_smiling_face: mientras aprendemos\n:::\n\n## Beneficios de tener un blog {.smaller}\n\n
\n\n- **Se aprende mucho!!**\n\n. . .\n\n- Es **fácil** (pocas barreras de entrada si ya usas Rmarkdown)\n\n- Es **divertido**\n\n. . .\n\n- Registrar análisis que haces que de otra forma olvidarías\n\n- Portafolio y contactos\n\n. . .\n\n- Productive procrastination (!!)\n\n. . .\n\n(Discursos más elaborados [aquí](https://www.rebeccabarter.com/blog/2020-02-03_blogger/) o [aquí](https://jozef.io/r914-one-year-r-blogging/) )\n\n. . .\n\n
\n\n### **Importante:**\n\n::: {.fragment}\n- El blog **no tiene que ser perfecto**. Mejor empezar con un blog sencillo\n:::\n\n::: {.fragment}\n- Los posts **tampoco tienen porqué estar perfectos** ... y [Jenny Bryan está de acuerdo conmigo](https://fosstodon.org/@jennybryan/110493030924022877)\n:::\n\n\n# Primeras ideas {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- Vamos a usar Quarto para **hacer un blog**\n\n- En realidad un blog no es más que un tipo (especial) de web\n\n
\n\n## Estructura de una web {.unnumbered background-color=\"#b8c2aa\" title-align=\"center\"}\n\n::: {columns}\n::: {.column width=\"69%\"}\n![](./imagenes/ss_05_img_01_estruct-web.png)\n:::\n\n::: {.column width=\"30%\"}\n**HEADER/Navbar**\n\n
\n\n**TITLE-block banner**\n\n


\n\n[**ARTICLE**]{.purple}\n\n



\n\n**Footer**\n:::\n:::\n\n## Ejemplos de blogs (hechos con Quarto) {.smaller}\n\n- [Mike Mahoney](https://www.mm218.dev/blog.html) (el repo [aqui](https://github.com/mikemahoney218/mm218.dev))\n\n- [Isabella Velásquez](https://ivelasq.rbind.io/about.html) (el repo [aqui](https://github.com/ivelasq/pipedream))\n\n- [Danielle Navarro](https://blog.djnavarro.net/) (el repo [aqui](https://github.com/djnavarro/quarto-blog))\n\n- [Jeff y Marc Dotson](https://occasionaldivergences.com/) (el repo [aqui](https://github.com/marcdotson/occasional-divergences))\n\n- [Layton R blog](https://graphdr.github.io/data-stories/) (el repo [aqui](https://github.com/graphdr/data-stories))\n\n- [R Lille](https://rlille.fr/) (el repo [aqui](https://github.com/RLille/rlille.fr))\n\n- [Drew Dimmery](https://ddimmery.com/)\n\n- [PA blog](https://www.paltmeyer.com/blog/) (el repo [aqui](https://github.com/pat-alt/pat-alt.github.io))\n\n- [Mario Angst](https://marioangst.com/en/)\n\n- [Matt Worthington](https://www.mrworthington.com/) (el repo [aqui](https://github.com/mrworthington/mrworthington.github.io))\n\n- [Ilya Kashnitsky](https://ikashnitsky.github.io/) (el repo [aquí](https://github.com/ikashnitsky/ikashnitsky.github.io))\n\n- [Rebecca Carter](https://www.rebeccabarter.com/) (el repo [aquí](https://github.com/rlbarter/personal-website-quarto))\n\n
\n\n#### Más opciones:\n\n- La [Gallery de Quarto](https://quarto.org/docs/gallery/#websites)\n\n## Ejemplos de webs (hechas con Quarto) {.smaller}\n\n- [Making shareable documents with Quarto](https://openscapes.github.io/quarto-website-tutorial/) y el [repo](https://github.com/openscapes/quarto-website-tutorial)\n\n- [Data in life](https://jhylin.github.io/Data_in_life_blog/) y el [repo](https://github.com/jhylin/Data_in_life_blog)\n\n- [Andrew Heiss](https://www.andrewheiss.com/) y el [repo](https://github.com/andrewheiss/ath-quarto)\n\n- [Program Evaluation for Public Service](https://evalsp23.classes.andrewheiss.com/) y el [repo](https://github.com/andrewheiss/evalsp23.classes.andrewheiss.com)\n\n- [Comparative Public Administration](https://compasp23.classes.andrewheiss.com/) y el [repo](https://github.com/andrewheiss/compasp23.classes.andrewheiss.com)\n\n- [Quantum Jitter](https://www.quantumjitter.com/) y el [repo](https://github.com/cgoo4/quantumjitter)\n\n- [Ella Kaye](https://ellakaye.co.uk/) y el [repo](https://github.com/EllaKaye/ellakaye.co.uk)\n\n- [Introduction to Regression and Data Science](https://sta-112-f22.github.io/website/) y el [repo](https://github.com/sta-112-f22/website)\n\n- [STA 199: Intro to Data Science](http://www2.stat.duke.edu/courses/Spring18/Sta199/) y el [repo]()\n\n- [ESPM 157: Data Science for Global Change Ecology](https://espm-157.carlboettiger.info/) y el [repo]()\n\n- [MAT555E-Statistical Data Analysis for Comp. Sciences](https://mat555e-fall22.github.io/) y el [repo](https://github.com/MAT555E-Fall22/MAT555E-Fall22.github.io)\n\n- [Antony Barja](https://ambarja.github.io/) y el [repo](https://github.com/ambarja/ambarja.github.io). Además tiene cursos sobre GIS\n\n- [The tidy trekker](https://thetidytrekker.com/about.html) y el [repo](https://github.com/Meghansaha/thetidytrekker-quarto)\n\n- [Real World Data Science](https://realworlddatascience.net/) y el [repo](https://github.com/realworlddatascience/realworlddatascience.github.io)\n\n- [Tidy Tales](https://tidytales.ca/) y el [repo](https://github.com/mccarthy-m-g/tidytales)\n\n
\n\n- Unas [plantillas](https://andreaczhang.github.io/qtwAcademic/index.html) para webs [personales](https://andreaczhang.github.io/qtwAcademic/articles/template_personal.html) y [académicas](https://andreaczhang.github.io/qtwAcademic/articles/template_course.html) (cursos y workshops)\n\n- Otras [plantillas](https://github.com/jonjoncardoso/quarto-template-for-university-courses) para webs académicas\n\n- Más [plantillas](https://github.com/juba/bookup-html), pero también para books, etc ...**Muy chulas**\n\n- Otras [plantillas](https://github.com/juba/bookup-html) para webs, pero también para books, etc ... (muy chulas)\n\n# 1. Creación de un blog básico con Quarto {background-color=\"#EEBF8B\"}\n\n(1ª parte del tutorial)\n\n::: {.callout-tip collapse=\"false\" appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- Veremos de forma rápida el **proceso de creación** y la **estructura de ficheros** de un blog creado con Quarto. La documentación oficial está [aquí](https://quarto.org/docs/websites/website-blog.html).\n\n- Alojaremos el blog en [Quarto Pub](https://quartopub.com). \n\n- Será un **blog básico pero completamente operativo**. Ya tendremos tiempo de mejorarlo, o tunearlo, en las siguientes secciones del taller.\n:::\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 1.1: Hemos de crear la carpeta que contendrá nuestro blog. \n\n**La carpeta la creará Quarto, pero tenemos 3 formas de hacerlo**:\n\n
\n\n###### A) Crear la carpeta (o Qproject) desde **RStudio**\n\n- En RStudio sigue la siguiente ruta de menús: \n\n `File > New Project > New Directory > Quarto Blog`\n \n- Mejor si llamas a la carpeta: `blog_prueba_00`\n\n\n\n
\n\n###### B) Crear la carpeta desde la **Terminal**\n\n\n- Has de ejecutar desde la Terminal:\n\n\n ::: {.cell}\n \n ```{.bash .cell-code code-line-numbers=\"false\"}\n quarto create-project blog_prueba_00 --type website --template blog \n ```\n :::\n\n
\n\n###### C) Usando un Qproject ya creado con **RStudio Cloud**\n\n- Tienes que ir [aquí](https://rstudio.cloud/content/4743159). Se abrirá Rstudio en el navegador con un Qproject llamado `blog_prueba_00`.\n\n- Has de tener cuenta en [RStudio Cloud](https://rstudio.cloud/). Haz una copia permanente y trabaja sobre ella\n\n
\n\nDe cualquiera de las 3 maneras **acabaremos teniendo una carpeta con todo o necesario para crear un blog**.\n:::\n\n\n\n\n------------------------------------------------------------------------\n\n## Contenido del Qproject\n\n::: { layout-ncol=1}\n![](./imagenes/tt_01/img_01.png){fig-align=\"center\" width=\"75%\"}\n\n:::\n\n\n\nLos **archivos importantes** ahora son 3:\n\n- `_quarto.yml`: especifica la estructura (y apariencia) de la web\n\n- `index.qmd` : generará (y dará formato) a la \"landing page\" o Home. Esta página será un listado de páginas (un blog)\n\n- `about.qmd` : una de la páginas del blog\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 1.2: Generación del blog\n\n- Ir al cuadrante superior-derecha de RStudio, pinchar en la pestaña `Build` y pinchar en `Render Website`.\n\n- De esta forma, se procesarán los archivos del Qproject y se creará el blog.\n\n- Podremos verlo en el cuadrante inferior-derecha de RStudio, concretamente en la pestaña `Viewer`.\n:::\n\n\n::: {.callout-warning collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Extensiones: formas alternativas de generar el blog\n\n- También podríamos haber generado el blog usando la Consola o la **Terminal** desde RStudio. \n\n- En ambos casos hay que estar en el Qproject \"blog_prueba_00\"; es decir, \"blog_prueba_00\" es el working directory\n\n- Desde la **Terminal**\n\n ::: {.cell}\n \n ```{.bash .cell-code code-line-numbers=\"false\"}\n quarto render \n ```\n :::\n \n- desde la **Consola** de R\n\n\n ::: {.cell}\n \n ```{.r .cell-code code-fold=\"false\" code-line-numbers=\"false\"}\n install.packages(\"quarto\") \n quarto::quarto_render(\"index.qmd\") \n ```\n :::\n\n:::\n\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Contenido del Qproject (tras procesar el blog)\n\n::: {layout-ncol=\"1\"}\n![](./imagenes/tt_01/img_05.png){fig-align=\"center\"}\n:::\n\n\n\n- Se han creado 2 subcarpetas: `_site` y `_freeze`\n\n- `_site` es la carpeta que contiene el blog.\n\n
\n\n------------------------------------------------------------------------\n\n## Ver el blog en local\n\n- `_site` es la carpeta que contiene el blog. Veamos su contenido\n\n- La página principal (o Home) de nuestro blog es el archivo `index.html`.\n\n- El archivo `index.html` ha sido generado por el fichero `index.qmd`.\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 1.3: Ver el blog\n\n- Enseguida publicaremos el blog en Quartopub, pero antes vamos a verlo en local.\n\n- Para ello solo tienes que pinchar en el archivo `./blog_prueba_00/_site/index.html`\n\n- Ese fichero es el que contiene la \"Landing Page\" o \"Home\" de nuestro blog.\n\n- Como ves el blog es muy sencillo, solo tiene 2 páginas: \n\n - la Home Page (que consiste en un listado de posts) \n \n - la página `About`\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Contenido de `index.qmd` {.smaller}\n\n- El archivo `index.qmd` genera `index.html`, la página principal (o Home) de nuestro blog\n\n::: {.callout-warning collapse=\"true\" appearance=\"default\" icon=\"false\" width=\"100%\"}\n#### Extensiones: ver el contenido del archivo `index.qmd`\n\nContenido del archivo `index.qmd` que genera a `index.html`:\n\n\n::: { layout-ncol=\"1\"}\n![](./imagenes/tt_01/img_08.png){fig-align=\"center\"}\n:::\n\n- Como vemos, el archivo `index.qmd` no tiene contenido, sólo contiene un `yaml` o encabezamiento\n\n- Ese encabezamiento genera una lista (`listing:`) con los contenidos (con los ficheros .qmd) que haya en la carpeta `posts`.\n\n- Sí, has imaginado bien, en la carpeta `posts` es donde estarán los ficheros .qmd que generarán los posts\n\n- El resto del yaml son opciones para nuestro blog. Por ejemplo, `sort: \"date desc\"` ordenará el listado de post de más reciente a más antiguo.\n\n- Lo iremos viendo\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Alojando el blog\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 1.4: Alojar el blog en Quarto Pub\n\nPara publicar nuestro blog en Quartopub sólo hay que:\n\n- teclear en la **Terminal** de RStudio (panel inferior-izquierda) lo siguiente: \n\n ::: {.cell}\n \n ```{.bash .cell-code code-fold=\"false\" code-line-numbers=\"false\"}\n quarto publish quarto-pub\n ```\n :::\n\n- Tras ejecutar lo anterior, se te pedirá que autorices en la Terminal.\n\n- Después se abrirá el navegador, tendrás que logearte en `Quarto Pub` y volverás a autorizar. Además te preguntarán el nombre del blog.\n\n:::\n\n\n\n- Puedes ver [aquí](https://pjperez.quarto.pub/blog_prueba_00/), como quedaría el blog una vez alojado en Internet.\n\n
\n\n::: {.callout-warning collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Extensiones: el fichero `_publish.yml`\n\nSi te fijas, tras haberse publicado el blog en \"Quarto Pub\", se habrá creado un **nuevo fichero** en nuestro Qproject: es el fichero `_publish.yml`. En él solamente están los metadatos necesarios para publicar y **actualizar nuestro blog**.\n\n::: {layout-ncol=1}\n![](./imagenes/tt_01/img_07.png){fig-align=\"center\"}\n\n:::\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-note collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Resumen (tutorial nº 1)\n\nEn este tutorial, la **segunda parte del taller**, hemos visto:\n\n- Como crear un Qproject con la estructura de carpetas y archivos necesaria para generar un blog básico\n\n- Hemos visto (de forma rápida) el contenido, los archivos, que hay en el Qproject. \n\n- El Qproject contiene 3 archivos que serán los importantes, los que trabajaremos en el próximo tutorial, concretamente: `_quarto_yml`, `index.qmd` y `about.qmd`\n\n- Hemos aprendido a generar el blog a través de RStudio, simplemente `Build > Render Website`\n\n- Hemos visto que el blog realmente se aloja en la carpeta `_site` y que la homepage es `index.html`\n\n- La homepage del blog es un listado de post (lógicamente, es un blog!!)\n\n- La homepage (`index.html`) es generada por el archivo `index.qmd`\n\n- El archivo `index.qmd` solo tiene `yaml`\n\n- Hemos publicado el blog en Quarto Pub\n\n:::\n\n\n\n\n
\n\n# 2. Tuneado básico del blog {background-color=\"#EEBF8B\"}\n\n(2ª parte del tutorial)\n\n::: {.callout-tip collapse=\"false\" appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- En esta segunda parte del taller vamos a **mejorar/tunear un poco nuestro blog**. Nos servirá para afianzar nuestro conocimiento de la estructura de ficheros del blog\n\n- En este tutorial nº 2, para hacer un **tuneado básico** del blog, modificaremos 3 archivos, concretamente los archivos: `_quarto.yml`, `index.qmd` y `about.qmd`. Iremos archivo por archivo\n\n- Finalmente modificaremos (un poco) el archivo `styles.css`\n\n- En el tutorial nº 6 se profundiza en el tuneado del blog\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Archivo `_quarto.yml` {.smaller}\n\n::: {layout-ncol=2}\n![Contenido original de `_quarto.yml`](./imagenes/tt_01/img_09.png){fig-align=\"center\"}\n\n![Así dejaremos el fichero `_quarto.yml`](./imagenes/tt_01/img_10.png){fig-align=\"center\"}\n:::\n\n\n\n\n------------------------------------------------------------------------\n\n## \n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.1: Modificar el contenido de `_quarto.yml`\n\n- Sustituye el contenido original del fichero `_quarto.yml` por el contenido del siguiente chunk.\n\n- Pon un título que te guste a tu blog (línea 5 `title: \"titulo-de-mi-blog\"`)\n\n- Pon tu usuario de Github y cuenta de Twitter (lineas 12 y 14: `href:`)\n\n- Pon tu email (línea 16: `href:`)\n\n\n\n````yaml\nproject:\n type: website\n\nwebsite:\n title: \"Mi blog (aún en pruebas)\"\n navbar:\n logo: \"profile.jpg\"\n right:\n - text: \"About me\"\n href: about.qmd\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:\"\n left: \n - text: \"Docencia\"\n href: docencia.qmd\n \nformat:\n html:\n theme: flatly \n css: styles.css\n toc: true\n highlight-style: a11y\n````\n\n\n:::\n\n\n\nAdemás:\n\n- **lineas 17-19**: añadimos la página/pestaña \"Docencia\" a la izquierda de la navbar, pero [estamos referenciando una archivo que aún no existe]{.underline}, el archivo `docencia.qmd` \n- **lineas 21-26**: modificamos el theme, ponemos TOC a los documentos, ..., **CSS**,\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.2: Crear el archivo `docencia.qmd`\n\n- Podríamos crear el archivo `docencia.qmd` con cualquier contenido, incluso podría ser un documento sin contenido, PERO, mejor si lo creas con el siguiente contenido:\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi docencia\"\n---\n\nMi docencia es:\n\n## curso 2021-2022\n\n- [Econometría](/pdfs/econometria.pdf)\n\n## curso 2022-2023\n\n- [Algebra](/pdfs/econometria.pdf)\n```\n:::\n\n:::\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.3: Crear el archivo `/pdfs/econometria.pdf`\n\n- Como puedes ver, en el archivo `docencia.qmd` se hace referencia al archivo `/pdfs/econometria.pdf`. Si quieres que el link funcione, tienes que crear dentro del Qproject, la subcarpeta `pdfs`, y dentro de ella el archivo `econometria.pdf`.\n\n- Puede ser cualquier pdf, siempre que se llame `econometria.pdf`\n\n:::\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.4: Volver a generar el blog\n\n- Una vez hechas las **tareas 2 y 3**, puedes crear de nuevo el blog con `Build > Web page`.\n\n:::\n\n\n\n------------------------------------------------------------------------\n\n## Archivo `index.qmd`\n\n::: {layout-ncol=2}\n![Contenido original de `index.qmd`](./imagenes/tt_01/img_11.png){fig-align=\"center\"}\n\n![Así dejaremos el fichero `index.qmd`](./imagenes/tt_01/img_12.png){fig-align=\"center\"}\n:::\n\n\n\n- De momento, **solo vamos a hacer cambios en la segunda linea**: cambiaremos el título.\n\n- Fíjate que [es el título del listado de posts]{.underline} (del blog), no de la página web.\n\n- Fijaros que `index.qmd` es un [archivo especial]{.underline}: \"sólo tiene yaml\". Es el que genera el listado de posts: es una \"listing page\"\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.5: Modificar el contenido de `index.qmd`\n\n- He cambiado la segunda linea (**title:**) para poner un nombre a la página con el listado de posts.\n\n- También podemos añadir una descripción (con **description:**).\n\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi listado de post\"\ndescription: |\n Estoy tratando de hacer mi blog\nlisting:\n contents: posts\n sort: \"date desc\"\n type: default\n categories: true\n sort-ui: false\n filter-ui: false\npage-layout: full\ntitle-block-banner: true\n---\n```\n:::\n\n:::\n\n\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Archivo `about.qmd` {.smaller}\n\n::: {layout-ncol=2}\n![Contenido original de `about.qmd`](./imagenes/tt_01/img_13.png){fig-align=\"center\"}\n\n![Así dejaremos el fichero `about.qmd`](./imagenes/tt_01/img_14.png){fig-align=\"center\"}\n:::\n\n\n\n- Si en el `yaml` se activa la opción `about:` (linea 4), entonces puedes usar unas **plantillas** que Quarto tiene disponibles para **crear About's pages**.\n\n- Como puedes ver [aquí](https://quarto.org/docs/websites/website-about.html#templates) hay **5 plantillas**: jolla, trestles, solana, marquee y broadside.\n\n- [Aquí](https://quarto.org/docs/websites/website-about.html) tienes la documentación oficial sobre estas plantillas.\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6: Modificar el contenido de `about.qmd`\n\n- Antes he dicho que solo modificaríamos la linea 5, pero mejor si lo complementamos con algunas acciones más, como el tamaño de la foto y su forma, por eso he añadido 2 lineas tras `template:trestles`.\n\n- Lógicamente estaría bien que sustituyeses la foto: se trata de cambiar `profile.jpg`, en la linea 3, por la ruta a tu foto.\n\n- Abajo tienes el código:\n\n::: {.cell}\n\n```{.r .cell-code}\n---\ntitle: Yo mismo\nimage: profile.jpg\nabout:\n template: trestles #- {jolla, solana, ...}\n image-width: 10em #- https://cybmeta.com/em-y-rem\n image-shape: round #- rectangle, round, rounded\n links:\n - icon: twitter\n text: Twitter\n href: https://twitter.com\n - icon: linkedin\n text: LinkedIn\n href: https://linkedin.com\n - icon: github\n text: Github\n href: https://github.com\n---\n \nHola, soy \"Yo mismo\". \n \nEstoy asistiendo al taller **Mi primer blog con Quarto** impartido en el [I Congreso & XII Jornadas de Usuarios de R](http://r-es.org/12jr/){target=\"_blank\"} celebradas en Córdoba (Spain), 23-25 de noviembre de 2022.\n \nEn un ratito ya piloto Quarto y genero my blog!!! 🙂\n```\n:::\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Archivo `styles.css`\n\n- Puedes cambiar la apariencia estética del blog usando los `themes` predefinidos en Quarto o puedes usar el archivo `styles.css`[^1]\n\n[^1]: Veremos en el tutorial nº 6 que también podremos usar archivos `.scss`\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.7: Modificar `styles.css`\n\n- Simplemente sustituye el contenido original del fichero `styles.css` por el contenido del siguiente chunk:\n\n\n````css\n/* css styles */\n\n\n/* justificar el texto */ \np, ul, ol {\n text-align: justify; } \n````\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-note collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Resumen (tutorial nº 2)\n\n- En esta tercera parte del taller hemos aprendido a **mejorar/tunear un poco nuestro blog**.\n\n- Hemos modificado 3 archivos: \n\n 1. `_quarto.yml`: hemos modificado el título del blog y la estructura de la barra de navegación; concretamente hemos añadido una página nueva.\n\n 2. `index.qmd`: construye la Home Page de nuestra web. La opción `listing:` hace que nuestra web es en realidad un blog.\n \n 3. `about.qmd`: hemos utilizado las plantillas de Quarto para configurar nuestra About page.\n\n- Finalmente hemos modificado (mínimamente) el archivo `styles.css`.\n\n\n:::\n\n\n\n
\n\n- [Aquí](https://pjperez.quarto.pub/blog_pruebas_01/) puedes ver **como quedaría el blog** tras haber modificado `_quarto.yml`, `index.qmd`, `about.qmd` y `styles.css`.\n\n------------------------------------------------------------------------\n\n## Práctica (tutorial nº 2) {background-color=\"#D3F3E7\"}\n\nEn esta sección dedicaremos un tiempo a la **práctica libre para que adaptes el blog a tus necesidades y gustos**. Por ejemplo puedes probar:\n\n
\n\n1. Añadir una **nueva página a la web** (`_quarto.yml`). Os doy una posibilidad en la siguiente slide\n\n
\n\n2. Modificar la **apariencia del blog** (realmente del listado de posts) jugando con las opciones que nos proporciona Quarto (`index.qmd`). Gracias YAML inteligence!!\n\n
\n\n3. Modificar la apariencia de la **página About** (`about.qmd`)\n\n------------------------------------------------------------------------\n\n::: {.callout-tip collapse=\"true\" appearance=\"default\" icon=\"false\"}\n\n#### Práctica 2.1: añadir una página más a nuestra web (`_quarto.yml`)\n\nEvidentemente puedes probar a añadir la página que quieras, pero te ofrezco la siguiente posibilidad:\n\n- Con las lineas 12 y siguientes crear una página más en nuestro blog. La página se llamará \"Más cosas\". Además, esta página nueva tiene la particularidad de que cuando recreemos el blog se convertirá en un desplegable con acceso a varias páginas: \"Docencia 2\", \"Docencia 3\" y \"Docencia 4\".\n\n- Fíjate que he puesto la nueva página a la izquierda (`left: `)\n\n- Además, puedes probar distintas opciones de `theme` (linea 34) y de `highlighting` (linea 38)\n\n- También puedes cambiar el color del fondo de la barra de navegación (linea 8)\n\n\n```yaml\nproject:\n type: website\n\nwebsite:\n title: \"Mi blog (aún en pruebas)\"\n navbar:\n logo: \"profile.jpg\"\n #background: \"#CCCCFF\" #- {“primary”, “secondary”, “danger”, “warning”, “light”, “dark”, or hex color} (el backgroung de la navbar)\n left: \n - text: \"Docencia\"\n href: docencia.qmd\n - text: \"Más cosas\"\n menu:\n - text: \"Docencia 2\"\n href: docencia.qmd\n - text: \"Docencia 3\"\n href: docencia.qmd\n - text: \"---\"\n - text: \"Docencia 4\"\n href: docencia.qmd\n right:\n - about.qmd\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:\"\n \n\nformat:\n html:\n #- https://quarto.org/docs/output-formats/html-themes.html\n theme: flatly \n css: styles.css\n toc: true\n #- https://quarto.org/docs/output-formats/html-code.html#highlighting\n highlight-style: a11y\n```\n:::\n\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-tip collapse=\"true\" appearance=\"default\" icon=\"false\"}\n\n#### Práctica 2.2: Modificar la **apariencia del blog** (`index.qmd`)\n\n- Se trata de cambiar las opciones predefinidas de tu archivo **index.qmd**\n\n- Con ello podremos cambiar la **apariencia del listado de posts**\n\n- Para ello tienes que ir jugando con las opciones que nos ha proporcionado la plantilla de Quarto en el fichero `index.qmd`. \n\n- la YAML inteligence te ayudará!! (vamos el autocompletado en el YAML)\n\n- No uses las opciones llamadas `custom`\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi listado de posts\"\ndescription: |\n Estoy tratando de hacer mi blog\nlisting:\n contents: posts\n sort: \"date desc\"\n type: default #- {default, table, grid, custom}\n categories: true\n sort-ui: false\n filter-ui: false\npage-layout: full #- {article, full, custom}\ntitle-block-banner: true #- {true, false}\n---\n\n```\n:::\n`\n\n:::\n\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-tip collapse=\"true\" appearance=\"default\" icon=\"false\"}\n\n#### Práctica 2.3: Modificar la **página About** (`about.qmd`)\n\n- Se trata de cambiar las opciones predefinidas de tu archivo **about.qmd**\n\n- Estaría bien que pusieses una foto tuya.\n\n- Poner los enlaces a tus redes sociales y email\n\n- Puedes adaptar el texto y dar algo de formato a la página.\n\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: Yo mismo\nimage: profile.jpg\nabout:\n template: trestles #- {jolla, solana, ...}\n image-width: 10em #- https://cybmeta.com/em-y-rem\n image-shape: round #- rectangle, round, rounded\n links:\n - icon: twitter\n text: Twitter\n href: https://twitter.com\n - icon: linkedin\n text: LinkedIn\n href: https://linkedin.com\n - icon: github\n text: Github\n href: https://github.com\n---\n \nHola, soy \"Yo mismo\". \n \nEstoy asistiendo al taller **Mi primer blog con Quarto** impartido en el [I Congreso & XII Jornadas de Usuarios de R](http://r-es.org/12jr/){target=\"_blank\"} celebradas en Córdoba (Spain), 23-25 de noviembre de 2022.\n \nEn un ratito ya piloto Quarto y genero my blog!!! 🙂\n```\n:::\n\n:::\n\n\n\n\n
\n\n# 3. Convertir el blog en web personal {background-color=\"#EEBF8B\"}\n\n(3ª parte del tutorial)\n\n::: {.callout-tip appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- Convertir nuestro blog en una web personal.\n\n- Haremos que la \"landing page\" o Home de nuestra web no sea una página con el listado de posts, sino que sea una página en la que se reciba a los futuros visitantes de nuestra web\n\n- Para ello solo tendremos que cambiar el nombre de dos ficheros y referenciar uno de ellos en `_quarto.yml`.\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.1: Renombrar el archivo index.qmd\n\n- Cambia el nombre del fichero `index.qmd` a `blog.qmd`\n\n- Ahora este archivo no está referenciado en `_quarto.yml`, por lo que no se mostraría si hacemos un rebuild^[Además, como nuestro Qproject ahora no tiene fichero `index.qmd` el rebuild no funcionaría].\n\n:::\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.2: Incluir `blog.qmd` en la web\n\n- Para que `blog.qmd`, la página que contiene el listado de posts, se muestre en nuestra web hay que refrenciarlo/incluirlo en `_quarto.yml`\n\n\n\n- Simplemente, tendríamos que modificar las lineas 8 y 9 que ahora están referenciando al fichero `about.qmd`. Por ejemplo podríamos **dejar las lineas 8 y 9 como se ve abajo** (a la derecha):\n\n\n\n![](./imagenes/tt_01/img_13gg-2.png){fig-align=\"center\"}\n\n- Para hacerlo, es mejor copiar el código de abajo y pegarlo en `_quarto.yml`\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-wrap code-line-numbers=\"true\"}\nproject:\n type: website\n\nwebsite:\n title: \"Mi blog (aún en pruebas)\"\n navbar:\n logo: \"profile.jpg\"\n #background: \"#CCCCFF\" #- {“primary”, “secondary”, “danger”, “warning”, “light”, “dark”, or hex color} (el backgroung de la navbar)\n left: \n - text: \"Docencia\"\n href: docencia.qmd\n - text: \"Más cosas\"\n menu:\n - text: \"Docencia 2\"\n href: docencia.qmd\n - text: \"Docencia 3\"\n href: docencia.qmd\n - text: \"---\"\n - text: \"Docencia 4\"\n href: docencia.qmd\n right:\n - text: \"Mi blog\"\n href: blog.qmd\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:\"\n \n\nformat:\n html:\n #- https://quarto.org/docs/output-formats/html-themes.html\n theme: flatly \n css: styles.css\n toc: true\n #- https://quarto.org/docs/output-formats/html-code.html#highlighting\n highlight-style: a11y\n```\n:::\n\n\n
\n\n:::\n\n- Aún no podemos refrescar la web porque ahora no tenemos archivo `index.qmd`. \n\n\n\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.3: Renombrar el archivo about.qmd\n\n- Cambia el nombre del fichero `about.qmd` a `index.qmd`, con lo que pasará ser nuestra \"landing page\". \n\n- Como el antiguo fichero `about` contenía nuestra foto parece que es un buen candidato a ser nuestra \"Home\"\n:::\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.4: Hacemos un rebuild de la web\n\n- Ahora ya tenemos fichero `index.qmd`, por lo que ya podemos hacer un rebuild de nuestra web y veremos la nueva estructura de nuestra web, con una foto nuestra en la \"landing page\".\n\n- Para ello: `Build > Render Website` en RStudio.\n:::\n\n\n\n# 4. Workflow: ¿cómo crear un post? {background-color=\"#EEBF8B\"}\n\n(4ª parte del tutorial)\n\n::: {.callout-tip collapse=\"false\" appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- Ver como podemos iniciar un nuevo post\n\n- (podemos marcar post todavía no acabados con `draft: true` en el yaml del post)\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## ¿Donde están los posts del blog?\n\n- Los ficheros `.qmd` que generan los posts están **en la carpeta `posts`** (de nuestro Qproject que genera el blog).\n\n- **Cada post** está en **una carpeta diferente**[^2]:\n\n[^2]: No es necesario que los posts estén cada uno en una carpeta, pero puede ser una buena práctica.\n\n::: {layout-ncol=1}\n\n![](./imagenes/tt_01/img_15-2.png){fig-align=\"center\"}\n:::\n\n\n\n- Veamos (en la siguiente slide) el contenido de `./posts/welcome/`\n\n------------------------------------------------------------------------\n\n## Contenido de cada subcarpeta de `./posts/`\n\n
\n\n- Por ejemplo de `./posts/welcome/`\n\n::: {layout-ncol=2}\n\n![Contenido de la carpeta `welcome` que genera el post titulado \"Welcome to my blog\"](./imagenes/tt_01/img_16.png){fig-align=\"center\"}\n\n![Contenido del archivo `index.qmd`\"](./imagenes/tt_01/img_17.png){fig-align=\"center\"}\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 4.1: Creando un nuevo post\n\n- Crea una nueva subcarpeta en `./posts/`\n\n- Ponle nombre, por ejemplo: \"my-primer-post\"\n\n- Copia en la carpeta que hemos creado el contenido de la carpeta de uno de los 2 posts. Por ejemplo copia los 2 archivos que hay en `./posts/welcome/` y pégalos en `./posts/my-primer-post/`; es decir, pegamos el archivo `index.qmd` y `tumbnail.jpg` en nuestra nueva carpeta.\n\n- Vuelve a regenerar el blog: `Build > Render Website` y verás que ahora nuestro blog ya tiene tres posts.\n:::\n\n\n\n\n-----------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 4.2: Modificando el tercer post\n\n- Modifica el contenido de `/.posts/my-primer-post/index.qmd`. Por ejemplo, puedes dejarlo así:\n\n\n````markdown\n---\ntitle: \"Mi primer post con Quarto\"\nauthor: \"Pedro J. Pérez\"\ndate: \"2022-10-25\"\ncategories: [R, quarto]\nimage: \"thumbnail.jpg\"\n---\n\nEste es mi **primer post** con Quarto!!!!\n\n```{{r}}\nsqrt(2 + 2)\n```\n\nVoy a poner una imagen:\n\n![](thumbnail.jpg)\n\n\nAcabé con mi primer post. FIN\n \n````\n\n- Sustituye `thumbnail.jpg` por otro archivo\n\n- La opción de yaml (linea 6): `image: \"thumbnail.jpg\"` nos permite elegir la imagen que acompañara al post en la listing page. \n\n\n\n- Vuelve a regenerar el blog: `Build > Render Website`\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-note collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Resumen (tutorial nº 4)\n\n- En esta **cuarta parte del taller** hemos visto como podemos generar/escribir nuevos posts para nuestro blog: solo hay replicar una de las carpetas de anteriores posts y cambiarle el nombre.\n\n\n
\n\n- Hemos visto como cambiar la imagen que acompaña a los posts en la \"listing page\".\n- Recuerda que podemos marcar un post con `draft: true` en el yaml del post.\n\n\n
\n\n- En el **siguiente tutorial** veremos en profundidad las posibilidades que nos ofrece Quarto para escribir nuestros posts.\n\n:::\n\n\n\n
\n\n# 5. Escribiendo posts: practicando con Quarto {background-color=\"#EEBF8B\"}\n\n(5ª parte del tutorial)\n\n::: {.callout-tip appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- Aprender a escribir nuestro posts con Quarto: con ficheros `.qmd`\n\n- Repasaremos las 3 partes de los documentos `.qmd`: yaml, texto, chunks\n\n- Además veremos: **layout**\n\n- Aprender a utilizar algunos truquillos de Quarto\n:::\n\n::: {.callout-warning appearance=\"default\" icon=\"true\"}\n\nVoy a **suponer que los asistentes al taller**, y posibles lectores de estos tutoriales, **conocen Rmarkdown** y han escrito algún documento `.Rmd`. En ese caso, el paso de `.Rmd` a `.qmd` es sencillo. \n\nEn cualquier caso, [aquí](https://quarto.org/docs/faq/rmarkdown.html) tienes unas FAQ's para usuarios de .Rmd que se preguntan si pasarse a Quarto, y [aquí](https://laderast.github.io/qmd_rmd/#/title-slide) unas slides sobre las diferencias entre `.qmd` y `.Rmd`.\n\nAquellos que no sepan qué es Rmarkdown pueden empezar por [aquí](https://perezp44.github.io/intro-ds-22-23-web/tutoriales/tt_07_Rmarkdown.html) o [aquí](https://perezp44.github.io/intro-ds-22-23-web/slides/slides_07_rmarkdown.html#1).\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Ficheros `.qmd`\n\n- Los ficheros `.qmd` tienen **3 partes**: YAML, texto y chunks de código.\n\n::: {layout-ncol=1}\n\n![](./imagenes/tt_01/img_19c.png){fig-align=\"center\"}\n:::\n\n\n\n- Veámoslas una a una\n\n# 1. YAML {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n## YAML: ideas importantes\n\n
\n\n- El encabezamiento o **YAML** sirve para fijar **opciones y metadatos** de nuestro documento.\n\n
\n\n- El `YAML` será procesado varias veces durante el procesado del documento: es leído por Quarto, knitr y Pandoc e **influirá en el output final**.\n\n
\n\n- El hecho de estar trabajando dentro de un **Qproject** nos da **mucha versatilidad** a la hora de especificar el YAML de nuestros documentos `.qmd`. Documentación oficial [aquí](https://quarto.org/docs/projects/quarto-projects.html)\n\n## El `yaml` de un post se puede especificar en **3 niveles** {background-color=\"#f7f5d2\"}\n\n. . .\n\n1. **Nivel proyecto**: todo Qproject tiene archivo `_quarto.yml`. Todo documento que se procese dentro del proyecto, heredará los metadatos definidos en `_quarto.yml`.\n\n. . .\n\n2. **Nivel carpeta**: si en una carpeta existe un documento `_metadata.yml`, los documentos de esa carpeta heredan sus metadatos. La carpeta `./posts/` de un blog suele tener un archivo `_metadata.yml`.\n\n. . .\n\n3. **Nivel documento**: en el yaml del propio documento `.qmd`\n\n
\n\n. . .\n\n- Si hay conflictos **prevalecen las opciones del nivel documento**, luego nivel carpeta y finalmente nivel proyecto.\n\n- **Documentación oficial** de Quarto con las **principales opciones** que se pueden fijar en el YAML para documentos html: [aquí](https://quarto.org/docs/output-formats/html-basics.html) y [aquí](https://quarto.org/docs/reference/formats/html.html)\n\n------------------------------------------------------------------------\n\n## YAML: tal como lo tenemos ahora {.smaller}\n\n::: {.panel-tabset}\n\n\n#### 1. nivel proyecto (_quarto.yml)\n\nAbajo el contenido del fichero `_quarto.yml` tal y como lo tenemos ahora en nuestro blog. Solo he añadido 3 comentarios para diferenciar entre secciones:\n\n\n![](./imagenes/tt_01/img_666a.png){fig-align=\"center\"}\n\n\n#### 2. nivel carpeta (_metadata.yml)\n\nAbajo el, contenido del fichero `./posts/_metadata.yml`. Afectará a todos los ficheros `.qmd` que haya en la carpeta `./posts/`\n\n![](./imagenes/tt_01/img_666b.png){fig-align=\"center\"}\n\n#### 3. nivel documento (index.qmd)\n\n![](./imagenes/tt_01/img_666c.png){fig-align=\"center\"}\n\n:::\n\n\n\n------------------------------------------------------------------------\n\n## YAML: NIVEL PROYECTO (opciones en `_quarto.yml`) {.smaller}\n\nEn `_quarto.yml` se suelen poner opciones referentes a 3 aspectos:\n\n::: panel-tabset\n#### 1. Sobre el propio Qproject\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-scroll code-line-numbers=\"true\"}\n# 1/ Opciones referentes al proyecto ----------------------------\nproject:\n type: website\n output-dir: docs #- podemos cambiar la carpeta donde se redirige el output (.html)\n # execute-dir: project #- cambiar el render directory: https://quarto.org/docs/projects/code-execution.html#working-dir\n```\n:::\n\n\n\n
\n\n- linea 4: podemos elegir la carpeta de destino de nuestro blog\n- linea 5: podemos cambiar el render directory de los `.qmd`\n\n
\n\nDocumentación oficial [aquí](https://quarto.org/docs/projects/quarto-projects.html).\n\n#### 2. Estructura de la página web\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-scroll code-line-numbers=\"true\"}\n#- 2/ Opciones referentes a la estructura de la web -----------------\nwebsite:\n title: \"Mi blog (aún en pruebas)\"\n favicon: profile.jpg\n #site-url: https://....\n #repo-url: https://....\n open-graph: true #-https://quarto.org/docs/websites/website-tools.html#twitter-cards\n twitter-card:\n creator: \"@tu-usuario-twitter\"\n card-style: summary_large_image\n navbar:\n logo: \"profile.jpg\"\n #background: primary #- pink\n right:\n - text: \"About me\"\n href: about.qmd\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:\"\n left: \n - icon: house-door\n href: index.html\n - text: \"Docencia\"\n href: docencia.qmd\n page-footer:\n left: \"© 2022 Pedro J. Pérez\"\n center: \"Hecho con [Quarto](https://quarto.org)\"\n right:\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:@uv.es\"\n```\n:::\n\n\n\n
\n\nComo ves, se añadirían elementos como:\n\n- lineas 28 a 37: se añade un pie de página al blog\n\n- lineas 24 y 25: Hemos añadido un elemento a la `navbar` concretamente el icono `Home`. La documentación oficial para elementos de navegación está [aquí](https://quarto.org/docs/websites/website-navigation.html)\n\n- linea 4: añadimos un favicon\n\n- lineas 5 y 6: el url de la web y del repo en Github\n\n- lineas 7-10: elementos de redes sociales. La documentación oficial para estos elementos esta [aquí](https://quarto.org/docs/websites/website-tools.html)\n\n
\n\n#### 3. Formato de salida de los documentos\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-scroll code-line-numbers=\"true\"}\n#- 3/ Opciones referentes al formato de salida ---------------------\nformat:\n html:\n theme: flatly \n css: styles.css\n toc: true\n highlight-style: a11y\n```\n:::\n\n\n\n
\n\nEn un blog/web el formato de salida es siempre `.html`; sin embargo podemos especificar otras opciones como por ejemplo sí los documentos (o páginas de la web, o post del blog) tienen un índice flotante, etc... Documentación oficial [aquí](https://quarto.org/docs/output-formats/html-basics.html) y [aquí](https://quarto.org/docs/reference/formats/html.html)\n:::\n\n------------------------------------------------------------------------\n\n## Un ejemplo \"completito\" de `_quarto.yml` {.smaller}\n\nSi quieres ver un documento `_quarto.yml` completito, ve [aquí](https://github.com/quarto-dev/quarto-web/blob/main/_quarto.yml). Pertenece a la [web de Quarto](https://quarto.org/docs/websites/).\n\n\n::: {.cell}\n\n:::\n\n\n
\n\n::: columns\n::: {.column width=\"48%\"}\n\n:::\n\n::: {.column width=\"48%\"}\n```yaml\nproject:\n type: website\n output-dir: _site\n resources:\n - \"/docs/download/_download.json\"\n - \"/docs/download/_prerelease.json\"\n - \"/_redirects\"\n\nwebsite:\n title: \"Quarto\"\n image: \"quarto.png\"\n favicon: \"favicon.png\"\n google-analytics: \"G-FV9Z7SDZ0M\"\n open-graph: true\n twitter-card: true\n site-url: https://quarto.org\n repo-url: https://github.com/quarto-dev/quarto-web\n repo-actions: [edit, issue]\n page-navigation: true\n search:\n algolia:\n index-name: prod_QUARTO\n application-id: ZPJB5I1QN7\n search-only-api-key: 41be6c1e0a7fea4a51b107810facf577\n analytics-events: true\n show-logo: true\n page-footer:\n left: |\n Proudly supported by\n [![](https://www.rstudio.com/wp-content/uploads/2018/10/RStudio-Logo-flat.svg){fig-alt=\"RStudio\" width=65px}](https://www.rstudio.com)\n center:\n - text: \"About\"\n href: about.qmd\n - text: \"FAQ\"\n href: docs/faq/index.qmd\n - text: \"License\"\n href: license.qmd\n - text: \"Trademark\"\n href: trademark.qmd\n right:\n - icon: twitter\n href: https://twitter.com/quarto_pub\n aria-label: Quarto Twitter\n - icon: github\n href: https://github.com/quarto-dev/quarto-cli\n aria-label: Quarto GitHub\n navbar:\n background: light\n logo: quarto.png\n logo-alt: \"Quarto logo.\"\n title: false\n collapse-below: lg\n left:\n - text: \"Overview\"\n href: index.qmd\n - text: \"Get Started\"\n href: docs/get-started/index.qmd\n - text: \"Guide\"\n href: docs/guide/index.qmd\n - text: Extensions\n href: docs/extensions/index.qmd\n - text: \"Reference\"\n href: docs/reference/index.qmd\n - text: \"Gallery\"\n href: docs/gallery/index.qmd\n - text: \"Blog\"\n href: docs/blog/index.qmd\n - text: \"Help\"\n menu:\n - text: \"Report a Bug\"\n icon: \"bug\"\n href: \"https://github.com/quarto-dev/quarto-cli/issues\"\n - text: \"Ask a Question\"\n icon: \"chat-right-text\"\n href: \"https://github.com/quarto-dev/quarto-cli/discussions\"\n - text: \"FAQ\"\n icon: \"question-circle\"\n href: docs/faq/index.qmd\n right:\n - icon: twitter\n href: https://twitter.com/quarto_pub\n aria-label: Quarto Twitter\n - icon: github\n href: https://github.com/quarto-dev/quarto-cli\n aria-label: Quarto GitHub\n\n sidebar:\n - id: get-started\n title: \"Get Started\"\n style: \"floating\"\n collapse-level: 2\n align: left\n contents:\n - docs/get-started/index.qmd\n - text: \"Tutorial: Hello, Quarto\"\n href: docs/get-started/hello/\n - text: \"Tutorial: Computations\"\n href: docs/get-started/computations/\n - text: \"Tutorial: Authoring\"\n href: docs/get-started/authoring/\n\n - id: guide\n collapse-level: 1\n contents:\n - text: \"Guide\"\n href: docs/guide/index.qmd\n - section: \"Authoring\"\n contents:\n - docs/authoring/markdown-basics.qmd\n - docs/authoring/figures.qmd\n - docs/authoring/tables.qmd\n - docs/authoring/diagrams.qmd\n - docs/authoring/videos.qmd\n - docs/authoring/callouts.qmd\n - docs/authoring/article-layout.qmd\n - section: \"Scholarly Writing\"\n contents:\n - docs/authoring/title-blocks.qmd\n - docs/authoring/footnotes-and-citations.qmd\n - docs/authoring/cross-references.qmd\n - docs/authoring/create-citeable-articles.qmd\n - docs/authoring/appendices.qmd\n - section: \"Computations\"\n contents:\n - docs/computations/python.qmd\n - docs/computations/r.qmd\n - docs/computations/julia.qmd\n - docs/computations/ojs.qmd\n - docs/computations/execution-options.qmd\n - docs/computations/parameters.qmd\n - section: \"Tools\"\n contents:\n - docs/tools/jupyter-lab.qmd\n - docs/tools/rstudio.qmd\n - docs/tools/vscode.qmd\n - docs/tools/text-editors.qmd\n - section: \"Visual Editor\"\n contents:\n - text: Editor Basics\n href: docs/visual-editor/index.qmd\n - docs/visual-editor/technical.qmd\n - docs/visual-editor/content.qmd\n - docs/visual-editor/options.qmd\n - docs/visual-editor/markdown.qmd\n - section: \"Documents\"\n contents:\n - section: \"HTML\"\n contents:\n - docs/output-formats/html-basics.qmd\n - docs/output-formats/html-code.qmd\n - docs/output-formats/html-themes.qmd\n - docs/output-formats/html-publishing.qmd\n - section: \"PDF\"\n contents:\n - docs/output-formats/pdf-basics.qmd\n - docs/output-formats/pdf-engine.qmd\n - section: \"MS Word\"\n contents:\n - docs/output-formats/ms-word.qmd\n - docs/output-formats/ms-word-templates.qmd\n - section: \"Markdown\"\n contents:\n - docs/output-formats/gfm.qmd\n - docs/output-formats/hugo.qmd\n - docs/output-formats/docusaurus.qmd\n - docs/output-formats/all-formats.qmd\n - section: \"Presentations\"\n contents:\n - text: \"Overview\"\n href: docs/presentations/index.qmd\n - section: docs/presentations/revealjs/index.qmd\n contents:\n - text: \"Reveal Basics\"\n href: docs/presentations/revealjs/index.qmd\n - docs/presentations/revealjs/presenting.qmd\n - docs/presentations/revealjs/advanced.qmd\n - docs/presentations/revealjs/themes.qmd\n - docs/presentations/powerpoint.qmd\n - docs/presentations/beamer.qmd\n - section: \"Websites\"\n href: docs/websites/website-basics.qmd\n contents:\n - docs/websites/website-basics.qmd\n - docs/websites/website-navigation.qmd\n - docs/websites/website-blog.qmd\n - docs/websites/website-search.qmd\n - docs/websites/website-tools.qmd\n - docs/websites/website-about.qmd\n - section: \"Listing Pages\"\n href: docs/websites/website-listings.qmd\n contents:\n - docs/websites/website-listings.qmd\n - docs/websites/website-listings-custom.qmd\n - section: \"Books\"\n href: docs/books/book-basics.qmd\n contents:\n - docs/books/book-basics.qmd\n - docs/books/book-structure.qmd\n - docs/books/book-crossrefs.qmd\n - text: \"Customizing Output\"\n href: docs/books/book-output.qmd\n - section: \"Interactivity\"\n contents:\n - text: \"Overview\"\n href: docs/interactive/index.qmd\n - section: docs/interactive/ojs/index.qmd\n contents:\n - text: \"Introduction\"\n href: docs/interactive/ojs/index.qmd\n - docs/interactive/ojs/libraries.qmd\n - docs/interactive/ojs/data-sources.qmd\n - docs/interactive/ojs/ojs-cells.qmd\n - docs/interactive/ojs/shiny.qmd\n - docs/interactive/ojs/code-reuse.qmd\n - section: \"Examples\"\n contents:\n - docs/interactive/ojs/examples/penguins.qmd\n - docs/interactive/ojs/examples/sunburst.qmd\n - docs/interactive/ojs/examples/arquero.qmd\n - docs/interactive/ojs/examples/population.qmd\n - docs/interactive/ojs/examples/noaa-co2.qmd\n - docs/interactive/ojs/examples/github.qmd\n - docs/interactive/ojs/examples/layout.qmd\n - section: \"Shiny\"\n contents:\n - text: \"K-Means\"\n href: https://jjallaire.shinyapps.io/kmeans-shiny-ojs/\n - text: \"Binning\"\n href: https://jjallaire.shinyapps.io/binning-shiny-ojs/\n - text: \"Data Binding\"\n href: https://jjallaire.shinyapps.io/data-shiny-ojs/\n - text: \"Covid Map\"\n href: https://jjallaire.shinyapps.io/covid19-bicartogram/\n - section: docs/interactive/shiny/index.qmd\n contents:\n - text: \"Introduction\"\n href: docs/interactive/shiny/index.qmd\n - docs/interactive/shiny/running.qmd\n - docs/interactive/shiny/execution.qmd\n - docs/interactive/shiny/resources.qmd\n - section: \"Examples\"\n contents:\n - text: \"Old Faithful\"\n href: https://jjallaire.shinyapps.io/shiny-old-faithful/\n - text: \"K-Means\"\n href: https://jjallaire.shinyapps.io/shiny-k-means/\n - text: \"Diamonds\"\n href: https://jjallaire.shinyapps.io/shiny-diamonds/\n - section: \"Widgets\"\n contents:\n - docs/interactive/widgets/jupyter.qmd\n - docs/interactive/widgets/htmlwidgets.qmd\n - docs/interactive/layout.qmd\n - section: \"Publishing\"\n contents:\n - docs/publishing/index.qmd\n - docs/publishing/quarto-pub.qmd\n - docs/publishing/github-pages.qmd\n - docs/publishing/rstudio-connect.qmd\n - docs/publishing/netlify.qmd\n - docs/publishing/other.qmd\n - text: \"Publishing with CI\"\n href: docs/publishing/ci.qmd\n - section: \"Projects\"\n contents:\n - docs/projects/quarto-projects.qmd\n - docs/projects/code-execution.qmd\n - docs/projects/profiles.qmd\n - docs/projects/environment.qmd\n - docs/projects/scripts.qmd\n - docs/projects/virtual-environments.qmd\n - section: \"Advanced\"\n contents:\n - docs/authoring/includes.qmd\n - docs/authoring/variables.qmd\n - docs/output-formats/page-layout.qmd\n - docs/authoring/language.qmd\n - docs/authoring/conditional.qmd\n - docs/extensions/nbfilter.qmd\n - id: extensions\n title: \"Extensions\"\n contents:\n - \"---\"\n - section: docs/extensions/index.qmd\n contents: \n - text: \"Shortcodes & Filters\"\n href: docs/extensions/listing-filters.qmd\n - text: \"Journal Articles\"\n href: docs/extensions/listing-journals.qmd\n - text: \"Custom Formats\"\n href: docs/extensions/listing-formats.qmd\n - text: \"Revealjs Extensions\"\n href: docs/extensions/listing-revealjs.qmd\n - docs/extensions/managing.qmd\n - \"---\"\n - section: docs/extensions/creating.qmd\n contents:\n - text: \"Overview\"\n href: docs/extensions/creating.qmd\n - docs/extensions/lua.qmd\n - docs/extensions/lua-api.qmd\n - text: \"Distribution\"\n href: docs/extensions/distributing.qmd\n - \"---\"\n - text: \"Shortcodes\"\n href: docs/extensions/shortcodes.qmd\n - text: \"Filters\"\n href: docs/extensions/filters.qmd\n - section: \"Journal Articles\"\n href: docs/journals/formats.qmd\n contents:\n - docs/journals/formats.qmd\n - docs/journals/templates.qmd\n - docs/journals/authors.qmd\n - docs/extensions/formats.qmd\n - docs/extensions/revealjs.qmd\n - docs/extensions/project-types.qmd\n - docs/extensions/starter-templates.qmd\n\n - id: reference\n title: \"Reference\"\n contents:\n - text: \"Reference\"\n href: docs/reference/index.qmd\n - section: \"Formats\"\n contents:\n - text: \"HTML\"\n href: docs/reference/formats/html.qmd\n - text: \"PDF\"\n href: docs/reference/formats/pdf.qmd\n - text: \"MS Word\"\n href: docs/reference/formats/docx.qmd\n - text: \"OpenOffice\"\n href: docs/reference/formats/odt.qmd\n - text: \"ePub\"\n href: docs/reference/formats/epub.qmd\n - section: \"Presentations\"\n contents:\n - text: \"Revealjs\"\n href: docs/reference/formats/presentations/revealjs.qmd\n - text: \"PowerPoint\"\n href: docs/reference/formats/presentations/pptx.qmd\n - text: \"Beamer\"\n href: docs/reference/formats/presentations/beamer.qmd\n - section: \"Markdown\"\n contents:\n - text: \"GitHub\"\n href: docs/reference/formats/markdown/gfm.qmd\n - text: \"CommonMark\"\n href: docs/reference/formats/markdown/commonmark.qmd\n - text: \"Markua\"\n href: docs/reference/formats/markdown/markua.qmd\n - section: \"Wikis\"\n contents:\n - text: \"MediaWiki\"\n href: docs/reference/formats/wiki/mediawiki.qmd\n - text: \"DokuWiki\"\n href: docs/reference/formats/wiki/dokuwiki.qmd\n - text: \"ZimWiki\"\n href: docs/reference/formats/wiki/zimwiki.qmd\n - text: \"Jira Wiki\"\n href: docs/reference/formats/wiki/jira.qmd\n - text: \"XWiki\"\n href: docs/reference/formats/wiki/xwiki.qmd\n - section: \"More Formats\"\n contents:\n - text: \"JATS\"\n href: docs/reference/formats/jats.qmd\n - text: \"Jupyter\"\n href: docs/reference/formats/ipynb.qmd\n - text: \"ConTeXt\"\n href: docs/reference/formats/context.qmd\n - text: \"RTF\"\n href: docs/reference/formats/rtf.qmd\n - text: \"reST\"\n href: docs/reference/formats/rst.qmd\n - text: \"AsciiDoc\"\n href: docs/reference/formats/asciidoc.qmd\n - text: \"Org-Mode\"\n href: docs/reference/formats/org.qmd\n - text: \"Muse\"\n href: docs/reference/formats/muse.qmd\n - text: \"GNU TexInfo\"\n href: docs/reference/formats/texinfo.qmd\n - text: \"Groff Man Page\"\n href: docs/reference/formats/man.qmd\n - text: \"Groff Manuscript\"\n href: docs/reference/formats/ms.qmd\n - text: \"Haddock markup\"\n href: docs/reference/formats/haddock.qmd\n - text: \"OPML\"\n href: docs/reference/formats/opml.qmd\n - text: \"Textile\"\n href: docs/reference/formats/textile.qmd\n - text: \"DocBook\"\n href: docs/reference/formats/docbook.qmd\n - text: \"InDesign\"\n href: docs/reference/formats/icml.qmd\n - text: \"TEI Simple\"\n href: docs/reference/formats/tei.qmd\n - text: \"FictionBook\"\n href: docs/reference/formats/fb2.qmd\n - section: \"Code Cells\"\n contents:\n - text: \"Jupyter\"\n href: docs/reference/cells/cells-jupyter.qmd\n - text: \"Knitr\"\n href: docs/reference/cells/cells-knitr.qmd\n - text: \"Observable\"\n href: docs/reference/cells/cells-ojs.qmd\n - section: \"Projects\"\n contents:\n - text: \"Options\"\n href: docs/reference/projects/options.qmd\n - text: \"Websites\"\n href: docs/reference/projects/websites.qmd\n - text: \"Books\"\n href: docs/reference/projects/books.qmd\n - section: \"More\"\n contents:\n - text: \"Dates\"\n href: docs/reference/dates.qmd\n - text: \"Globs\"\n href: docs/reference/globs.qmd\n - text: \"Citations\"\n href: docs/reference/metadata/citation.qmd\n\nbibliography: references.bib\n\nformat:\n html:\n toc: true\n theme:\n light: [cosmo, theme.scss]\n code-copy: true\n code-overflow: wrap\n css: styles.css\n include-after-body: js.html\n\nfilters:\n - filters/tools-tabset.lua\n\n\nfreeze: true\n\neditor: visual\n\nprofile:\n group: \n - [rc, prerelease]\n```\n\n\n:::\n:::\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 5.1: Modificar `_quarto.yml`\n\n- Tenemos que dejar el archivo `_quarto.yml` así:\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-scroll code-line-numbers=\"true\"}\n# 1/ Opciones referentes al proyecto ----------------------------\nproject:\n type: website\n output-dir: _site \n \n#- 2/ Opciones referentes a la estructura de la web -----------------\nwebsite:\n title: \"Mi blog (aún en pruebas)\"\n navbar:\n logo: \"profile.jpg\"\n #background: \"#CCCCFF\" #- {“primary”, “secondary”, “danger”, “warning”, “light”, “dark”, or hex color} (el backgroung de la navbar)\n right:\n - text: \"Mi blog\"\n href: blog.qmd\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:\"\n left: \n - icon: house-door\n href: index.html\n - text: \"Docencia\"\n href: docencia.qmd\n #- text: \"Docencia\"\n #href: docencia.qmd\n page-footer:\n left: \"© 2022 Pedro J. Pérez\"\n center: \"Hecho con [Quarto](https://quarto.org)\"\n right:\n - icon: github\n href: https://github.com/\n - icon: twitter\n href: https://twitter.com/\n - icon: envelope\n url: \"mailto:@uv.es\"\n\n#- 3/ Opciones referentes al formato de salida ---------------------\nformat:\n html:\n #- https://quarto.org/docs/output-formats/html-themes.html\n theme: flatly \n css: styles.css\n toc: true\n #- https://quarto.org/docs/output-formats/html-code.html#highlighting\n highlight-style: a11y \n```\n:::\n\n\n:::\n\n\n\n\n\n\n------------------------------------------------------------------------\n\n### YAML nivel carpeta\n\n- Abajo el, contenido del fichero `./posts/_metadata.yml` de nuestro blog\n\n![](./imagenes/tt_01/img_24.png){fig-align=\"center\"}\n\n\n\n\n------------------------------------------------------------------------\n\n### YAML nivel carpeta\n\n
\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 5.2: Modificar `./posts/_metadata.yml` \n\n- Tenemos que dejar el archivo `./posts/_metadata.yml` así:\n\n\n::: {.cell}\n\n```{.r .cell-code .code-overflow-scroll code-line-numbers=\"true\"}\n# IMPORTANTE: options specified here will apply to all posts in this folder\n\n# freeze: controla la ejecución de los .qmd durante un global project render\n# https://quarto.org/docs/projects/code-execution.html#freeze)\nfreeze: auto #- {false, true, auto}\n\n#- Quarto incluye un title-block al principio de los artículos con elementos como: title, subtitle, authors, date, doi, and abstract.\n\n# title-block-banner: pone un banner en el title-block: pondrá el title, subtitle, description, y categories dentro del banner\n# https://quarto.org/docs/authoring/title-blocks.html#title-banners\ntitle-block-banner: true #- {true, false, \"#FFDDFF\", \"image.jpg\"}\n\n# title-block-style: modifica el estilo del title-block\n# https://quarto.org/docs/authoring/title-blocks.html\ntitle-block-style: default #- {default, plain, none}\n\n# tb se puede especificar el color del texto dentro del banner\ntitle-block-banner-color: red\n```\n:::\n\n **IMPORTANTE**: las opciones que especifiques en `_metadata.yml` afectarán a todos los .qmd de la carpeta.\n\n- `freeze (linea 5): {false, true, auto}` controla la ejecución de los .qmd durante el procesado completo del Qproject. Documentación [aquí](https://quarto.org/docs/projects/code-execution.html#freeze).\n\n- `title-block-banner (linea 11): {true, false, \"#FFDDFF\", \"image.jpg\"}` controla la presencia y apariencia de los \"banners\" para dar más importancia a los títulos de los posts. Puedes controlar el color, incluso poner una imagen. Documentación [aquí](https://quarto.org/docs/authoring/title-blocks.html#title-banners). \n\n- `title-block-style (linea 15): {default, plain, none}` modifica el estilo del title-block\n\n\n- `title-block-banner-color(linea 18): {black, \"#FFDDFF\"}` controla el color del título del post\n\n:::\n\n\n\n------------------------------------------------------------------------\n\n### YAML: nivel documento\n\n
\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 5.3: Modificar encabezamiento de `./posts/my-primer-post/index.qmd` \n\n- Tenemos que dejar el archivo `./posts/my-primer-post/index.qmd` así:\n\n\n````markdown\n---\ntitle: \"Mi primer post con Quarto\"\ndescription: |\n Estoy aprendiendo Quarto\nauthor:\n - name: Pedro J. Pérez\n url: https://www.wikidata.org\n affiliation: Universitat de València\n affiliation-url: https://www.uv.es\n orcid: 0000-xxxx\ndate: \"2022-10-25\"\ncategories: [R, quarto]\n#title-block-banner: true #- {true, false }\ntitle-block-banner: thumbnail.jpg\ntitle-block-banner-color: green\n---\n\nEste es mi **primer post** con Quarto!!!!\n\n```{{r}}\nsqrt(2 + 2)\n```\n\nVoy a poner una imagen:\n\n![](thumbnail.jpg)\n\nAcabé con mi primer post. FIN\n \n````\n\n- Sustituye `thumbnail.jpg` por otro archivo\n\n\n- Vuelve a regenerar el blog: `Build > Render Website`\n:::\n\n\n\n# 2. TEXTO (o narrativas) {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n### Texto (o narrativas) {.smaller}\n\n- Se escribe (al igual que `.Rmd`) en **markdown**. [Aquí](https://quarto.org/docs/authoring/markdown-basics.html) la documentación oficial de Quarto.\n\n- Sintaxis básica de `markdown`\n\n::: { layout-ncol=1}\n\n![](./imagenes/tt_01/img_20_markdown.png){fig-align=\"center\" width=\"100%\"}\n\n:::\n\n\n\n
\n\n# 3. CHUNKS {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n### CHUNKS\n\n**Comportamiento similar** a los documentos `.Rmd`. La documentación oficial está [aquí](https://quarto.org/docs/computations/execution-options.html)\n\n
\n\n##### Principales diferencias con .Rmd\n\n- En ficheros `.qmd`, **las opciones de los chunks se pueden especificar globalmente en el YAML** y a nivel individual en cada uno de los chunks.\n\n- En los **chunks individuales** ahora se se utiliza la **sintaxis YAML** (`key: value`) en lineas dentro del chunk que empiezan con `#|`. Por ejemplo:\n\n\n![](./imagenes/tt_01/img_22.png){fig-align=\"center\"}\n\n\n\n\n------------------------------------------------------------------------\n\n### CHUNKS\n\n- Las principales opciones son: **echo**, **eval**, **warning**, **error**, **output** e **include**. [Aquí](https://quarto.org/docs/computations/execution-options.html#output-options) la documentación oficial.\n\n- `echo`: además de los típicos true y false, ahora **incorpora un nuevo valor `fenced`** que facilita mostrar las marcas de los chunks en el documento final. Documentación [aquí](https://quarto.org/docs/computations/execution-options.html#fenced-echo).\n\n- Además, si usamos `knitr` para ejecutar los chunks, entonces podemos usar todas las [opciones nativas de `knitr`](https://yihui.org/knitr/options/), como: collapse, fig.width, comment, etc ... Más información [aquí](https://quarto.org/docs/computations/execution-options.html#knitr-options). Un ejemplo:\n\n\n![](./imagenes/tt_01/img_23.png){fig-align=\"center\"}\n\n\n\n![](./imagenes/tt_01/img_23.png){fig-align=\"center\"}\n\n\n\n\n- Hay **más opciones para los chunks**. Por ejemplo:\n\n - hacer **folding code** con `#| code-fold: true`\n\n - si el código es muy largo, puedes usar `#| code-overflow: wrap` o scroll\n\n - puedes hacer que se muestren los **números de linea** con `#| code-line-numbers: true`\n\nLa documentación oficial la tienes [aquí](https://quarto.org/docs/output-formats/html-code.html).\n\n# 4. Elementos básicos para escribir {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n### Elementos básicos para escribir\n\n
\n\nPara escribir en Markdown, además de texto, tenemos los siguientes elementos básicos:\n\n\n\n- Links (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#links-images))\n\n- Listas (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#lists)) \n\n- Tablas (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#tables)) \n\n- Código (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#source-code)) \n\n- Ecuaciones (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#equations)). Editor de ecuaciones [aquí](https://www.latex4technics.com/) o [aquí](http://www.sciweavers.org/free-online-latex-equation-editor).\n\n\n- Imágenes (documentación [aquí](https://quarto.org/docs/authoring/figures.html)) y sus [opciones](https://quarto.org/docs/computations/execution-options.html#figure-options)\n\n\n
\n\nEl [editor visual](https://www.rstudio.com/blog/exploring-rstudio-visual-markdown-editor/) facilita la introducción de estos elementos en tus documentos. En [esta charla](https://www.youtube.com/watch?v=6p4vOKS6Xls) de Mine Çetinkaya-Rundel se aprecia fácilmente la **utilidad del editor visual**.\n\n\n\n# 5. Más elementos para \"escribir\" {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n### Más elementos para \"escribir\"\n\nAdemás de los elementos básicos de escritura que nos ofrece la sintaxis básica de `markdown`, **Quarto nos ofrece más posibilidades**. Por ejemplo:\n\n
\n\n\n\n- Layout (documentación [aquí](https://quarto.org/docs/authoring/article-layout.html))\n\n- Imágenes (documentación [aquí](https://quarto.org/docs/authoring/figures.html)) y sus [opciones](https://quarto.org/docs/computations/execution-options.html#figure-options)\n\n- Extensiones (documentación [aquí](https://quarto.org/docs/extensions/starter-templates.html)) . Listado de extensiones oficiales [aquí](https://quarto.org/docs/extensions/listing-filters.html)\n\n- Shortcodes (documentación [aquí](https://quarto.org/docs/extensions/shortcodes.html))\n\n- Callout blocks (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#callout-blocks)) \n\n- Divs & spans (documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#divs-and-spans)) \n\n\n
\n\nVeamos algunos de estos elementos con un poco de detalle. Después lo recordaremos con una Práctica.\n\n\n\n\n\n# Veamos algunos de estos elementos con un poco de detalle. {.unnumbered background-color=\"#b8c2aa\"}\n\n

\n\n(Después lo recordaremos con una Práctica)\n\n------------------------------------------------------------------------\n\n\n\n#### Layouts {.unnumbered}\n\n\n- Además de yaml, texto y chunk, para escribir con Quarto **conviene conocer la estructura o layout de las páginas web** que generamos con Quarto. Documentación [aquí](https://quarto.org/docs/authoring/article-layout.html).\n\n. . . \n\n- Nuestra páginas web tienen [2 zonas si la miramos en horizontal]{.underline}: la **sidebar** y la zona reservada para **el artículo**. Puedes verlo [aquí](https://quarto.org/docs/output-formats/page-layout.html#html-page-layout)\n\n- A su vez, [la zona del artículo se divide en 2]{.underline}: **body** y **margin**.\n\n. . . \n\n- La versión 1.3 de Quarto, aún no disponible, permitirá controlar estos componentes del layout. Puedes verlo [aquí](https://quarto.org/docs/output-formats/page-layout.html#grid-customization)\n\n\n. . . \n\n- Además, el layout puede venir afectado por la opción `page-layout: full` que tiene 3 opciones: article, full y custom \n\n
\n\n> :warning: **Importante!!**\n\n- Usando **divs** se puede hacer que **alguna sección de nuestra página ocupe un espacio mayor al habitual**; es decir, mayor al espacio habitualmente reservado para el body.\n\n\n- Veamos las **posibilidades que tenemos de layout** con [este post](/blog/21_layouts.html){target=\"_blank\"} del blog del curso \n\n
\n\n\n---\n\n#### Imágenes {.unnumbered}\n\n- Conocemos ya la sintaxis básica para insertar imágenes `![]()`; ahora veremos posibilidades más avanzadas\n\n- Veamos como **insertar imágenes** con [este post](/blog/24_imagenes.html){target=\"_blank\"} del blog del curso\n\n
\n\n\n---\n\n#### Extensiones {.unnumbered}\n\n- Una de las novedades de Quarto es la posibilidad de usar **extensiones**. Las extensiones se escriben en lenguaje [Lua](https://es.wikipedia.org/wiki/Lua). \n\n- Para ver como **instalar y usar extensiones** vamos a ir, otra vez, a otro de los post del blog del curso: concretamente [aquí](/blog/23_extensiones.html){target=\"_blank\"} \n\n\n
\n\n\n\n---\n\n#### Shortcodes {.unnumbered}\n\n- Un shortcode es un código (una etiqueta, un elemento) que podemos **insertar** para añadir algún tipo de **contenido sin tener que escribirlo directamente**.\n\n- Son muy **útiles** para insertar **contenido que se repite**\n\n\n- Podemos verlo en [este post](https://perezp44.github.io/intro.to.quarto/blog/22_shortcodes.html) del blog del curso o en la [documentación oficial](https://quarto.org/docs/extensions/shortcodes.html)\n\n\n---\n\n\n#### Faltan 2 elementos {.unnumbered}\n\n\n
\n\n- **Callout blocks**: documentación [aquí](https://quarto.org/docs/authoring/callouts.html)\n\n
\n\n- **Divs** y **spans**: documentación [aquí](https://quarto.org/docs/authoring/markdown-basics.html#divs-and-spans)\n\n\n\n\n\n------------------------------------------------------------------------\n\n::: {.callout-note collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Resumen (tutorial nº 5)\n\n- La **quinta parte del taller** se ocupa de la **escritura de posts** para el blog. \n\n- Los posts **se han de escribir en formato `.qmd`**; por lo tanto, se repasan los fundamentos \"teóricos\" necesarios para escribir este tipo de documentos.\n\n- Nos apoyamos en nuestro **conocimiento previo de la sintaxis Rmarkdown**.\n\n- Se repasan las posibilidades de configurar los documentos por medio de **los 3 niveles de YAML** que pueden afectar a un documento.\n\n- **Los 3 YAML's** son: Nivel proyecto (`_quarto.yml`), nivel carpeta (`_metadata.yml`) y nivel documento (en el propio encabezamiento del archivo)\n\n- El **texto** en ficheros `.qmd` es muy similar al de los documentos `.qmd`. Aparecen algunos elementos nuevos como los Call-outs.\n\n- El **código** sí presenta novedades: nueva sintaxis con `#|` y posibilidad de determinar opciones de los chunks en el YAML.\n\n- Para poder escribir en `.qmd` **hay que practicar**. Lo haremos con una tarea donde veremos, entre otras cosas:\n\n - Algunas de las opciones de **layout**.\n\n - Ver como instalar y usar **extensiones**.\n \n - Opciones avanzadas para **insertar imágenes**.\n\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-tip collapse=\"true\" appearance=\"default\" icon=\"false\"}\n\n#### Práctica 5.1: Crear un post para tu blog con la siguiente plantilla.\n\nVamos a crear un nuevo post para practicar algunos de los elementos de escritura que hemos visto. Para ello:\n\n- Crea una nueva subcarpeta en la carpeta `./posts/`. Por ejemplo llámala: `./posts/my-segundo-post` y copia allí los documentos que haya en la carpeta de otro blog. Es decir, en la nueva subcarpeta que has creado debe haber un fichero `index.qmd` y una imagen `thumbnail.jpg`.\n\n- Sustituye el contenido del archivo `index.qmd` por el contenido del siguiente chunk y haz un render de `./posts/my-segundo-post/index.qmd` para ver como quedaría una vez procesado.\n\n\n###### Contenido para sustituir en `./posts/my-segundo-post/index.qmd`\n\n\n````markdown\n---\ntitle: \"Mi Segundo post con Quarto\"\nauthor: \"Nosotros\"\ndate: 2022-10-25\ncategories: [R, quarto, ejemplos]\nimage: \"thumbnail.jpg\"\n#subtitle: | \n# Practicando con Quarto\ndescription: |\n Estamos viendo algunos elementos para escribir con Quarto.\n---\n\nEste ya es mi segundo post con Quarto. En él voy a hacer lo siguiente:\n\n\n## Insertar 2 imágenes side-by-side\n\n\n## Inserta un tweet\n\n\n## Inserta un `tab-set`\n\n\n## Inserta un call-out\n\n\n## Inserta un gráfico en el margen\n\n\n
\n\nPrueba superada!!\n\n\nAcabé con mi segundo post. FIN\n \n````\n\n:::\n\n\n\n\nLas soluciones a la Práctica están [aquí](/blog/66_soluciones-practica-5-1.html){target=\"_blank\"}\n\n
\n\n# 6. Tuneado del blog {background-color=\"#EEBF8B\"}\n\n(6ª parte del tutorial)\n\n::: {.callout-tip appearance=\"default\" icon=\"false\"}\n## ¿Qué haremos en este tutorial?\n\n- Ver distintas opciones para adaptar el blog a nuestras necesidades\n\n\n- En concreto veremos 3 formas de hacerlo: a través de opciones de Quarto en el yaml, con CSS y con SASS\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n## Intro\n\n- Quarto utiliza el framework [Bootstrap 5](https://keepcoding.io/blog/que-es-bootstrap-5/) al generar sus documentos `.html`.\n\n- Además, incorpora 25 themes del [Bootswatch project](https://bootswatch.com/) que le dan a nuestro blog/web una apariencia profesional y cuidada.\n\n\n
\n\n. . . \n\n- Creo que es mejor **comenzar con un blog sencillo** usando las plantillas, o **themes**, que nos ofrece Quarto pero, si queremos modificar la apariencia de nuestro blog, podemos hacerlo de **3 formas**:\n\n. . . \n\n| 1. Utilizando las opciones disponibles en Quarto para el `yaml`\n\n| 2. Utilizando CSS\n\n| 3. Utilizando SASS\n\n# 1. Utilizando opciones del YAML {.unnumbered background-color=\"#b8c2aa\"}\n\n
\n\n- En el [tutorial nº 6](https://perezp44.github.io/taller.primer.blog/taller/06_taller_tuneado-del-blog.html){target=\"_blank\"} (del taller que impartí en Córdoba) repasamos las distintas opciones que tenemos disponibles para poder cambiar a través de opciones en los YAML's (recuerda los 3 niveles).\n\n- Aquí solo pondré la **documentación relevante** junta y **destacaré algunas de las opciones** disponibles.\n\n------------------------------------------------------------------------\n\n## Documentación oficial\n\n##### (sobre opciones disponibles en los YAML's)\n\n
\n\n- Referentes al **proyecto**: [aquí](https://quarto.org/docs/projects/quarto-projects.html#shared-metadata)\n\n- Referentes a la **estructura de la web**: [aquí](https://quarto.org/docs/websites/website-navigation.html) y [aquí](https://quarto.org/docs/websites/)\n\n- Referentes a la **estética**: [aquí](https://quarto.org/docs/output-formats/html-basics.html) y [aquí](https://quarto.org/docs/reference/formats/html.html)\n\n- Referentes a las **Listing Pages**: [aquí](https://quarto.org/docs/websites/website-listings.html)\n\n- Referentes a las **About Pages**: [aquí](https://quarto.org/docs/websites/website-about.html)\n\n# Algunas opciones de YAML {.unnumbered background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n## Algunas opciones de YAML: **lang**\n\n- Si te has fijado, los metadatos de los documentos aparecen en inglés.\n\n- Por ejemplo, pone \"Author\" en lugar de \"Autor\" o \"Autora\".\n\n. . . \n\n
\n\n#### Hagamos algunos cambios\n\n- Si quisiéramos cambiar específicamente la opción de autor, tendríamos que poner en el YAML:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlanguage: \n title-block-author-single: \"Autora\"\n```\n:::\n\n\n- Podemos cambiar todas las opciones especificando en el YAML `lang: es`.\n\n- La documentación oficial está [aquí](https://quarto.org/docs/authoring/language.html) y [aquí](https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/language/_language.yml) todos los elementos que se pueden modificar. Y [aquí](https://github.com/quarto-dev/quarto-cli/tree/main/src/resources/language) los ficheros específicos para diferentes idiomas. [Aquí](https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/language/_language-es.yml) el documento para el castellano.\n\n
\n\n- Si quisieras usar tu propio documento tendrías que poner en el YAML: `language: custom.yml` (lógicamente el fichero `custom.yml` tendría que existir y estar en la ruta correcta).\n\n- ¿Probamos a hacerlo?\n\n------------------------------------------------------------------------\n\n## Otras opciones para tunear desde el YAML\n\n- **TOC**: es importante tenerlo a nuestro gusto. [Aquí](https://quarto.org/docs/reference/formats/html.html#table-of-contents) tienes las opciones que puedes ajustar con opciones en el yaml\n\n- **Chunks**: [aquí](https://quarto.org/docs/reference/formats/html.html#code) tienes las opciones que puedes ajustar desde el YAML\n\n- **Resizing de los thumbnails**. Un [gist](https://gist.github.com/perezp44/fc5a3853039fd29ff94c5b8488fea0a1#file-resize_thumbnails-r) para hacerlo.\n\n- **Algunas opciones de tuneado** que puedes implementar desde el YAML. Prueba a poner estas opciones en el archivo `_quarto.yml`. Nuestro blog **empeorará bastante**. Más opciones [aquí](https://quarto.org/docs/output-formats/html-themes.html#basic-options).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfontcolor: green #- color del texto\nlinkcolor: purple #- color de los enlaces\nmonobackgroundcolor: red #- color de los cuadros de resultados de evaluar código\nfontsize: 0.6em #- tamaño del texto (más pequeño de lo normal: 1)\nlinestretch: 2.3 #- tamaño entre las lineas (1.6 es lo \"normal\")\n```\n:::\n\n\n## 2. Utilizando CSS {.unnumbered background-color=\"#b8c2aa\"}\n\n
\n\n- La apariencia visual del blog puede cambiarse utilizando CSS.\n\n- Veamos un ejemplo con el siguiente [post](/blog/25_css.html){target=\"_blank\"}\n\n## 3. Utilizando SASS {.unnumbered background-color=\"#b8c2aa\"}\n\n
\n\n- La documentación oficial [aquí](https://quarto.org/docs/output-formats/html-themes.html#sass-variables)\n\n- [Aquí](https://quarto.org/docs/output-formats/html-themes-more.html) la documentación oficial de Quarto sobre los Bootswatch Sass Theme Files.\n\n- Bootstrap define unas 1.400 variables con las que controlar fuentes, colores, etc ... . Puedes verlas [aquí](https://github.com/twbs/bootstrap/blob/main/scss/_variables.scss)\n\n- [Aquí](https://github.com/quarto-dev/quarto-cli/tree/main/src/resources/formats/html/bootstrap/themes) están los ficheros `.scss` de los 25 built-in Bootswatch themes.\n\n
\n\n- **Otras referencias**, por ejemplo: [Customizing Quarto Websites: Make your website stand out using SASS](https://ucsb-meds.github.io/customizing-quarto-websites/#/title-slide) o [este video](https://www.youtube.com/watch?v=ErRX8plZpQE)\n\n- Una pequeña práctica en el [tutorial nº6](https://perezp44.github.io/taller.primer.blog/taller/06_taller_tuneado-del-blog.html#sass){target=\"_blank\"} del taller \"Mi primer blog con Quarto\".\n\n# Publicando el blog {.unnumbered background-color=\"#b8c2aa\"}\n\n
\n\n- La [documentación oficial](https://quarto.org/docs/publishing/) de Quarto. \n\n. . . \n\n- Si lo publicamos en [Quarto Pub](https://quarto.org/docs/publishing/quarto-pub.html), ejecutar en la Terminal: `quarto publish quarto-pub`\n\n. . . \n\n- En [Github Pages](https://quarto.org/docs/publishing/github-pages.html)\n\n. . . \n\n- En la Universitat de València. \n\n. . .\n\n\n| - Un post que lo explica [aquí](){target=\"_blank\"}\n\n\n\n# Fin!! {.unnumbered .centered background-color=\"#562457\"}\n\n- Muchas gracias por la atención :slightly_smiling_face:\n\n- Espero que el taller haya salido OK :white_check_mark:\n\n- Si alguien motivado por el taller acaba haciéndose un blog, **please que me avise** (pedro.j.perez\\@uv.es) :mailbox:\n\n
\n\n- Big thanks to all the Posit/Quarto team !!!! 👏🏼👏🏼 🙌🏼\n\n
\n\n- Bye 👋🏼 👋🏼 , nos vemos en las próximas Jornadas en ...\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" ], "includes": { "include-after-body": [ "\n\n\n" ] }, "engineDependencies": {}, "preserve": {}, "postProcess": true } }Fy![XFy![@:Aexecute-resultsizFy![XFy![@4[<Afigure-revealjskFy![XFy![@4>Alibs V Fy![X)#[@ /f;fAhtml.json{ "hash": "3e467a7ca7b83bc3dbb3e9ece778c880", "result": { "engine": "knitr", "markdown": "---\ntitle: \"Aprendiendo a escribir en QMD\"\n#date: 2023-09-04 #- ISO8601 YYYY-MM-DD format \nsubtitle: | \n {{< var my_subtitle2 >}}\ndate-format: long\nlang: es\nformat: \n revealjs:\n scrollable: true\n slide-level: 2\n height: 900\n width: 1600\n toc: false\n from: markdown+emoji #- usar emojis https://gist.github.com/rxaviers/7360908)\n center-title-slide: true\n title-slide-attributes: #- atributos para la slide de titulo\n data-background-color: \"#562457\" #- color de R-ladies\n #data-background-image: /imagenes/economia.gif\n #data-background-size: contain \n preview-links: auto #- true: abre un iframe en lugar de abrir ventana\n #multiplex: true #- para que puedas manejar las slides del publico\n link-external-newwindow: true\n transition: fade\n #height: 900\n #width: 1600\n fontcolor: \"#262d36\"\n highlight-style: a11y\n code-line-numbers: true\n number-sections: false\n slide-number: c/t # https://pandoc.org/MANUAL.html#structuring-the-slide-show\n incremental: false # https://quarto.org/docs/presentations/#incremental-lists\n#logo: imagenes/economia.gif\n#footer: |\n# {{< var webcurso >}}\nrevealjs-plugins: [pointer]\n # - lightbox\n # - pointer # hay q apretar q\n#css: assets/styles_slides_intro.css\n #theme: [moon, custom.scss]\nembed-resources: true\nlightbox: true\n---\n\n\n\n# ¿Que haremos en esta sección? {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- Aprender a **usar \"el entorno R\" para escribir**, para generar documentos\n\n---\n\n## Forma de trabajar con el \"entorno R\" \n\n- Ya sabéis que **R es un entorno** (y un lenguaje de programación) **para hacer estadística**\n\n. . . \n\n\n- En esta sección del curso nos centraremos en la última etapa: la **presentación de los resultados**, la generación de documentos\n\n![](./imagenes/ss_01_info-r4ds_01.png){fig-align=\"center\" width=\"55%\"}\n\n\n. . .\n\n- Los documentos que generemos serán **reproducibles**: generaremos directamente el documento final sin copiar ni pegar nada, sino **usando código**.\n\n- Para ello, hemos de aprender a escribir en **QMD** (Quarto Markdown) (❗❗)\n\n\n\n\n\n---\n\n\n## ¿Qué tipos de documentos haremos? {.color-header}\n\n- Haremos distintos tipos de documentos: **tutoriales**, **transparencias**, **páginas web**, **...**\n\n. . .\n\n\n - . . . aunque, con Quarto se pueden generar **documentos de muchos tipos** (artículos académicos, libros, tesis, cartas, cuadros de mando, etc ... etc ...) **y formatos** (html, pdf, epub, docx, beamer, pptx, etc ... etc ...). \n \n - Para verlo puedes visitar la [Quarto gallery](https://quarto.org/docs/gallery/){target=\"blank\"}\n\n. . .\n\n\n#### Algunos ejemplos:\n\n- **Tutoriales**: por ejemplo [este](https://quarto-dev.github.io/quarto-gallery/page-layout/tufte.html){target=\"blank\"} o [este](https://perezp44.github.io/web.Econometria.GADE/materiales/cuestionario_practicas.html){target=\"blank\"}\n\n- **Slides**: por ejemplo [estas](https://laderast.github.io/qmd_rmd/#/title-slide){target=\"blank\"} o [estas](https://apreshill.github.io/palmerpenguins-useR-2022/#/title-slide){target=\"blank\"}\n\n- **Páginas web**: por ejemplo [esta](https://nicar.r-journalism.com/), [esta](https://sta210-s22.github.io/website/){target=\"blank\"} o [esta](https://www.mm218.dev/){target=\"blank\"}\n\n- **Blogs**: por ejemplo [este](https://www.mrworthington.com/){target=\"blank\"} o [este](https://blog.djnavarro.net/){target=\"blank\"}\n\n\n\n\n\n\n# Primeras ideas (sobre Quarto){background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n¿Qué es Quarto?\n\n¿Cómo trabajaremos con Quarto?\n\n-----------------------------------------------------------------------\n\n## ¿Qué es **Quarto**?\n\n- No es un paquete, es **un programa de ordenador**\n\n\n. . .\n\n\n- Es un sistema para escribir, para generar **publicaciones científico-técnicas**, dentro del ecosistema R.\n\n. . . \n\n- Es la **segunda generación de Rmarkdown**\n\n\n
\n\n---\n\n## ¿Cómo interactuaremos con Quarto?\n\n

\n\n- No \"veremos\" a Quarto.\n\n- Daremos ordenes a Quarto a través de RStudio\n\n
\n\n. . .\n\n

\n\n#### Visualmente\n\n\n![](imagenes/ss_02_img_00_quarto-workflow.png){#fig-00 fig-align=\"center\" width=\"40%\"}\n\n---\n\n### Visualmente (pero más realista)\n\n
\n\n::: {columns}\n::: {.column width=\"42%\"}\n#### source code (escrito en QMD)\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_01.png){fig-align='center' width=100%}\n:::\n:::\n\n:::\n\n::: {.column width=\"13%\"}\n


\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_01a.png){fig-align='center' width=70%}\n:::\n:::\n\n:::\n\n::: {.column width=\"42%\"}\n#### output\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_01b.png){fig-align='center' width=100%}\n:::\n:::\n\n:::\n:::\n\n\n\n# Primeros pasos con Quarto {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n\n\n# Trabajaremos usando proyectos {background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n. . .\n\n
\n\nRepito, vamos a trabajar con proyectos, concretamente con ...\n\n
\n\n. . .\n\n... Quarto projects o **Qprojects**\n\n------------------------------------------------------------------------\n\n## ¿Qué es un **Q**project?\n\n- Es simplemente una **carpeta** donde tendremos los \"materiales\" que necesitemos para uno de nuestros proyectos\n\n. . .\n\n- Pero **usarlos tiene ventajas**. Puedes ver algunas en [este post de Jenny Bryan](https://www.tidyverse.org/blog/2017/12/workflow-vs-script/)\n\n- Para nosotros la principal ventaja consiste en que **podremos usar rutas relativas**\n\n
\n\n------------------------------------------------------------------------\n\n## ¿Cómo se crea un Qproject?\n\n- En RStudio has de seguir la siguiente ruta de menús: `File > New Project > New Directory > Quarto Project` , y ponerle un nombre a la carpeta del Qproject.\n\n. . .\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.3: Creación de un **Q**project\n\n- Simplemente tienes que crear un Qproject que se llame \"my_primer_qproject\"\n\n- Mejor si creas el Qproject en el Escritorio\n\n- Mira cuantos archivos hay en la carpeta del proyecto \n\n:::\n\n\n\n\n\n

\n\n------------------------------------------------------------------------\n\n## Dos cosillas sobre los Qprojects\n\n::: {columns}\n::: {.column width=\"65%\"}\n1. ¿Cómo abrirlos?\n - Siempre desde el fichero con icono azulito y extensión `.Rproj`\n:::\n\n::: {.column width=\"25%\"}\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_03a.png){fig-align='center' width=95%}\n:::\n:::\n\n:::\n:::\n\n. . .\n\n::: {columns}\n::: {.column width=\"65%\"}\n2. ¿Cómo saber si realmente estás dentro de un proyecto?\n - En la esquina superior-izquierda de tu RStudio verás el icono azulito junto al nombre de tu proyecto\n:::\n\n::: {.column width=\"25%\"}\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_03b.png){fig-align='center' width=95%}\n:::\n:::\n\n:::\n:::\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.4: Abriendo y cerrando **Q**project's\n\n- Cierra RStudio \n\n- Vuelve a abrir el Qproject `\"my_primer_qproject\"`\n\n- Asegúrate de que realmente \"estás\" en `\"my_primer_qproject\"`\n\n
\n\n- Borra todos los archivos del Qproject excepto el fichero `.Rproj`\n\n\n
\n\n:::\n\n\n\n# Creación de documentos `.qmd` {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n
\n\nVamos ya a crear nuestro primer fichero `.qmd`\n\n... eso sí, lo crearemos **dentro de un Qproject**\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.5: Crear un fichero `.qmd` (Un Quarto document)\n\n- En el Qproject `\"my_primer_qproject\"`, **crea un \"Quarto document\"**\n\n- Durante el proceso de creación te pedirá un \"Title\" y un \"Author\": pon lo que quieras\n\n::: {.fragment}\n- El fichero que acabamos de crear es nuestro **documento fuente**\n\n- Pégale un vistazo al documento fuente, antes de que Quarto lo procese, para intentar descubrir sus partes\n\n- De momento, es mejor que visualicemos el documento en formato \"Source\"\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](imagenes/ss_02_tarea_2_5_source.png){fig-align='center' width=32%}\n:::\n:::\n:::\n\n::: {.fragment}\n\n- Procesa (\"Render\") el documento `.qmd` que acabamos de crear. \n\n- Al intentar procesarlo te pedirá un nombre. **LLamalo `index`**\n\n- ¿Qué ha pasado finalmente?\n:::\n\n:::\n\n\n\n

\n\n##

Vamos a jugar un rato con RStudio {background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n. . .\n\n
\n\nNos servirá para familiarizarnos con :\n\n- la interfaz de Rstudio\n\n- los conceptos de **documento fuente** (.qmd) y **documento final** (.html, .pdf, etc...)\n\n
\n\n. . .\n\n... y empezar a entender la **sintaxis** de \"Quarto Markdown\"\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6a: Creamos un nuevo qmd: `\"prueba_01.qmd\"`\n\n- Vamos a crear un nuevo documento \".qmd\". \n\n- Procésalo. Esta vez llámalo `prueba_01.qmd`\n\n:::\n\n
\n\n\n\n::: {.fragment}\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6b: Reusamos `\"prueba_01.qmd\"` para crear un pdf\n\n- Vamos a reusar el fichero fuente `prueba_01.qmd` para generar un pdf. Para ello:\n\n - En el encabezamiento has de cambiar   \"`format: html`\"   por   \"`format: pdf`\"\n \n - **PERO** si al intentar procesarlo te dice que instales \"tinytex\", entonces para, **no lo hagas!!**, ya lo haremos en el descanso. Para ello tendrás que ejecutar en la Terminal `quarto install tinytext`\n:::\n:::\n\n\n\n\n
\n\n------------------------------------------------------------------------\n\n\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6c: Usamos `\"prueba_01.qmd\"` para generar unas slides\n\n- Reutiliza `\"prueba_01.qmd\"` para generar unas \"revealjs\" slides. Solo has de cambiar el formato de salida!!\n\n\n::: {.fragment}\n- Si avanzas aparecerá la solución. Inténtalo sin mirar la solución!!!!\n:::\n\n::: {.fragment}\n\n- La solución: \n\n```yaml\ntitle: \"prueba_01\"\nformat: revealjs\n``` \n\n:::\n:::\n\n
\n\n::: {.fragment}\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6d: Vamos a cambiar la apariencia visual de las slides\n\n- Vamos a cambiar el **theme** de las \"revealjs\" slides. Para ello:\n\n```yaml\ntitle: \"prueba_01\"\nformat:\n revealjs:\n theme: night\n``` \n\n
\n\n::: {.fragment}\n- Puedes probar otros themes de [este listado](https://quarto.org/docs/presentations/revealjs/themes.html#using-themes)\n:::\n\n:::\n\n:::\n\n\n
\n\n\n\n\n\n
\n\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.6e: Ahora vamos a cambiar el \"theme\" usado en el fichero `index.qmd`\n\n- El listado de \"themes\" lo tienes [aquí](https://quarto.org/docs/output-formats/html-themes.html)\n\n- Piensa bien cómo has de dejar el \"yaml\". Apóyate en lo que hemos hecho para las slides\n\n- La solución está más adelante, pero no la mires\n\n
\n\n::: {.fragment}\n- Solución: has de dejar el \"YAML\" del qmd como:\n\n```yaml\ntitle: \"Mi documento\"\nauthor: \"Nosotros\"\ndate: today\nformat:\n html:\n theme: sandstone\n``` \n:::\n \n:::\n \n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.7: Vamos a usar nuestro Qproject para generar una página web\n\n- Modifica el archivo `_quarto.yml` para que su contenido sea:\n\n
\n\n```yaml\nproject:\n type: website\n \nwebsite:\n navbar:\n right: \n - prueba_01.qmd\n```\n\n
\n\n- Para generar la página web tienes que hacer un \"Build > Render Project\"\n\n
\n\n:::\n\n\n\n
\n\n------------------------------------------------------------------------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.8: Añade una nueva página a nuestra página web\n\n- Pista: puedes reutilizar el contenido del fichero `index.qmd`\n\n:::\n\n\n\n\n. . . \n\n::: {.callout-important icon=\"false\"}\n#### Una solución a la Tarea 2.8\n\n\n```yaml\nproject:\n type: website\n \nwebsite:\n navbar:\n background: \"#DF55CB\"\n right: \n - text: \"Info\"\n href: index.qmd\n - text: \"Más Info\"\n href: index.qmd\n left: \n - icon: house-door\n href: index.qmd \n```\n\n:::\n\n
\n\n::: {.fragment}\n::: {.callout-important icon=\"false\"}\n#### Tarea 2.8b: Haz que se vean las slides en la web\n\n- Esta vez no hay solución\n\n:::\n:::\n\n\n\n
\n\n\n\n\n# Lo que ya sabemos {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n- Trabajamos con Qprojects\n\n- Documento fuente escrito en **Qmd** genera diferentes outputs\n\n------------------------------------------------------------------------\n\n## Para poder practicar lo que vayamos aprendiendo ... {background-color=\"#f7f8f5\"}\n\n

\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.0: Vamos a crear un nuevo Qproject\n\n- Cierra RStudio \n\n- Crea un nuevo Qproject llamado \"my_qproject\"\n\n- Inspecciona los documentos que hay dentro de \"my_qproject\"\n\n- Borra el archivo `my_qproject.qmd`\n\n- Crea un archivo `.qmd` llamado `prueba_01.qmd`\n\n
\n\n:::\n\n\n\n# Qmarkdown: guía rápida (`.qmd`) {background-color=\"#b8c2aa\"}\n\n------------------------------------------------------------------------\n\n## Los documentos `.qmd` tienen 3-4 partes {.smaller}\n\n1. Encabezamiento (**yaml** header) \n\n2. Trozos de **código** R (R chunks) \n\n3. **Texto** (escrito en Markdown) ...\n\n ... y **todo lo demás**: imágenes, links, ecuaciones, etc ...\n\n
\n\n. . .\n\n#### Un ejemplo\n\n\n:::: {columns}\n::: {.column width=\"48%\"}\n#### source code (escrito en QMD)\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_01.png){fig-align='center' width=120%}\n:::\n:::\n\n\n:::\n\n::: {.column width=\"48%\"}\n#### output\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![](./imagenes/ss_02_img_01b.png){fig-align='center' width=90%}\n:::\n:::\n\n:::\n::::\n\n\n\n

\n\n# (I): YAML {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n- Se utiliza para especificar metadatos (opciones) del documento final\n\n\n------------------------------------------------------------------------\n\n### (I) El encabezamiento o \"yaml header\"\n\n- Se (suele) poner al principio del documento, entre estas marcas: **`---`**\n\n- En el yaml son MUY importantes los **espacios y la indentación**\n\n\n
\n\n##### Ejemplos de yaml\n\n::: panel-tabset\n#### ejemplo 1\n\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi primer archivo qmd\"\ndate: \"2023-08-08\"\nformat: html\n---\n```\n:::\n\n\n#### ejemplo 2\n\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi primer archivo qmd\"\ndate: \"2023-08-08\"\nformat:\n html:\n toc: true\n toc-location: left\n---\n```\n:::\n\n\n#### ejemplo 3\n\n\n::: {.cell}\n\n```{.yaml .cell-code}\n---\ntitle: \"Mi primer archivo qmd\"\ndate: \"2023-08-08\"\nformat:\n html:\n toc: true\n toc-location: left\ntheme: sketchy #- hay 25 themes: https://quarto.org/docs/output-formats/html-themes.html\nembed-resources: true #- hace el documento auto-contenido\n---\n```\n:::\n\n:::\n\n\n\n\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.1: Vamos a jugar con el `yaml`\n\n- Utiliza el archivo `prueba_01.qmd` para probar como quedaría `prueba_01.html` al usar los 3 anteriores `yaml's`\n\n
\n\n- Una vez hayas probado a usar el tercer YAML, prueba algún otro `theme` de los 25 disponibles. [Aquí](https://quarto.org/docs/output-formats/html-themes.html) tienes el listado, y [aquí](https://druedin.com/2023/03/07/quarto-html-themes-gallery/) hay ejemplos para ver cómo quedan y decidir cual te gusta más.\n\n
\n\n:::\n\n\n\n\n\n# (II): CHUNKS {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n- En documentos `.qmd` **podemos incorporar código**\n\n- Código que puede ser **ejecutado** \n\n\n- Así se podrá **mostrar** en el documento final tanto el código como **los resultados** (de la evaluación del código)\n\n. . . \n\n- Esto es lo que permite que los documentos sean **reproducibles**\n\n\n- La documentación oficial está [aquí](https://quarto.org/docs/computations/execution-options.html)\n\n------------------------------------------------------------------------\n\n### (II) Code Blocks o chunks (código R)\n\n- Para que Quarto sepa qué partes del `.qmd` es **código R**, debe ir dentro de estas marcas:\n\n\n![](./imagenes/ss_03_img_01_chunk-00.png){fig-align=\"left\" width=\"15%\"}\n\n- Por ejemplo:\n\n![](./imagenes/ss_03_img_01_chunk-01.png){fig-align=\"left\" width=\"30%\"}\n\n- Cuando Quarto/`knitr` procesen el chunk, se interpretará como código R y **ejecutará las instrucciones**, de forma que, en el documento final, se **mostrará el output** generado por el chunk.\n\n![](./imagenes/ss_03_img_01_chunk-02.png){fig-align=\"left\" width=\"80%\"}\n\n

\n\n------------------------------------------------------------------------\n\n## (II) Chunks: los chunks pueden tener opciones.\n\n- Por ejemplo: \n

\n\n![](./imagenes/ss_03_img_01_chunk_04.png) \n\n\n. . .\n\n- Las **principales opciones** son: \n\n| Opción | (valor por defecto) | ¿Que hace? |\n|----|-------|------------------|\n| `echo` | true | Incluye el código en el documento final |\n| `eval` | true | Evalúa el código |\n| `warning` | true | Incluye los avisos en el documento final |\n| `message` | true | Incluye los mensajes |\n\n\n\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.2: Vamos a incorporar un chunk a nuestro `.qmd`\n\n- Utiliza el archivo `prueba_01.qmd` para insertar un chunk de código R con las siguientes instrucciones:\n\n\n ```{{r}}\n # install.packages(tidyverse)\n library(ggplot2)\n ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point()\n ```\n\n Si no tuvieses el paquete `tidyverse` instalado, puedes usar este otro chunk:\n\n\n ```{{r}}\n plot(iris$Petal.Length,iris$Petal.Width)\n ```\n\n\n::: {.fragment}\n\n::: {.callout-warning icon=\"false\"}\n#### Ayudita con las marcas de los chunks\n\n- Para incorporar las marcas que delimitan los chunks de código, puedes usar este atajo del teclado: {{< kbd Alt-Ctrl-I >}}\n\n:::\n\n:::\n\n
\n\n:::\n\n\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.2b: Vamos a jugar con la **opciones de los chunks**\n\n::: {.fragment}\n- Incorpora al chunk las siguientes opciones: `echo` y `eval`\n\n\n- ¿Cuales son las opciones por defecto para `echo` y `eval`?\n::: \n\n::: {.fragment}\n\n- Incorpora también al chunk las siguientes opciones: `message` y `label`\n\n:::\n\n
\n\n\n:::\n\n\n\n\n. . . \n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.2b: Una solución\n\n\n```{{r}}\n#| eval: true\n#| echo: true\n#| message: false\n#| label: my-primer-chunk\n\n# install.packages(tidyverse)\nlibrary(ggplot2)\nggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point()\n```\n\n
\n\n:::\n\n\n\n\n## (II) Chunks: opciones de los chunks en el YAML\n\n- En el YAML, podemos fijar los valores por defecto de las opciones de los chunks\n\n\n. . . \n\n- Se han de poner **anidadas dentro de** `execute: `\n\n. . . \n\n
\n\n###### Por ejemplo: \n\n\n::: {columns}\n::: {.column width=\"46%\"}\n###### .Qmd (chunk options en el chunk)\n\n![](./imagenes/ss_03_img_05b.png){fig-align=\"left\" width=\"100%\"}\n\n:::\n\n::: {.column width=\"46%\"}\n##### .Qmd (chunk options en el yaml)\n\n![](./imagenes/ss_03_img_05a.png){fig-align=\"left\" width=\"100%\"}\n::: \n:::\n\n
\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.3: **opciones de los chunks** en el YAML\n\n- Utiliza el archivo `prueba_01.qmd` para insertar las **opciones de los chunks en el YAML** del documento\n\n\n- Por ejemplo, indica en el YAML que   `echo: true`     pero     `eval: false`\n\n::: {.fragment}\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.3: Solución\n\n```yaml\nexecute:\n echo: true\n eval: false\n```\n:::\n:::\n\n
\n\n::: {.fragment}\n- ¿Se puede poner la opción `label: ` en el YAML?\n:::\n\n
\n\n::: {.fragment}\n\n::: {.callout-warning icon=\"false\"}\n#### Extensión: uso de la opción `include`\n\n- ¿Se puede poner la opción `include: ` en el YAML?\n:::\n:::\n\n
\n\n:::\n\n\n\n\n## (II) Chunks: otras opciones de Quarto para los chunks\n\n\nAhora, en Quarto, hay **más opciones para los chunks**. Documentación oficial [aquí](https://quarto.org/docs/output-formats/html-code.html). Por ejemplo:\n\n. . . \n\n
\n\n - Hacer **folding code** con `#| code-fold: true` \n \n - Puedes combinarlo con `#| code-summary: \"Para ver el código, pincha\"`\n \n
\n \n. . . \n \n - Si el código es muy largo, puedes usar `#| code-overflow: wrap` (o scroll)\n\n
\n\n. . . \n\n - Puedes hacer que se muestren los **números de linea** con `#| code-line-numbers: true`\n\n. . . \n\n\nTodas estas opciones **también pueden ir en el YAML**. \n\n\n\n---\n\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.4: Nuevas **opciones de los chunks**\n\n- Utiliza el archivo `prueba_01.qmd` para probar algunas de las nuevas opciones de los chunks en el YAML\n\n- Por ejemplo:\n\n\n```yaml\nformat:\n html:\n code-fold: true\n code-summary: \"Para ver el código, pincha\"\n code-line-numbers: true\n```\n
\n\n- Pudes también probar a usar la opción `code-tools: true` y ver que ocurre.\n\n
\n\nLa documentación oficial la tienes [aquí](https://quarto.org/docs/output-formats/html-code.html) y [aquí](https://quarto.org/docs/reference/cells/cells-knitr.html#code-output)\n\n\n
\n\n:::\n\n\n\n\n\n## (II) Código: inline code\n\n\n- La mayoría del código suele ir en los chunks, pero a veces necesitamos inline code ; es decir, código R dentro de nuestro texto.\n\n. . . \n\n
\n\n##### Por ejemplo\n\n::: {.incremental}\n\n- Si quiero describir un conjunto de datos puedo hacerlo escribiendo: \"El data.frame iris tiene 150 filas y 5 variables\" \n\n\n- Pero es **mejor hacerlo con inline code**. Para ello tienes que poner el código R dentro de estas marcas: `r ` \n\n\n- Habría que escribirlo así: \n\n\n - El data.frame iris tiene `r nrow(iris)` filas y `r ncol(iris)` variables.\n \n\n
\n\n- Documentación oficial de Quarto [aquí](https://quarto.org/docs/computations/execution-options.html#inline-code). (No hay mucho más)\n\n:::\n\n------\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.5: Código **inline**\n\n- Utiliza el archivo `prueba_01.qmd` para incorporar un párrafo de texto que contenga código inline.\n\n- Por ejemplo, puedes incorporar este párrafo:\n\n\n> Este archivo que estoy escribiendo lo hice el 26 de junio de 2023.\n\n \n pero lo que queremos es que la fecha se modifique cada vez que se procese el documento `prueba_01.qmd`\n\n\n
\n\n\n:::{.callout-warning icon=\"false\" }\n#### **Pista:** puedes probar a usar parte deel siguiente código R\n\n```r\nSys.Date()\nformat(Sys.Date(), \"%d %B, %Y\")\n```\n:::\n\n::: {.cell}\n\n:::\n\n
\n\n\n:::\n\n\n\n\n\n\n\n\n\n# (III) Texto {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- El texto (o narrativa) **se escribe en Markdown** (concretamente en [Pandoc's Markdown](https://pandoc.org/MANUAL.html#pandocs-markdown))\n\n. . . \n\n- Markdown es un **lenguaje de marcado ligero** con sintaxis sencilla que permite dar formato y estructura a un texto y convertirlo a `.html`\n\n\n. . . \n\n\n- Documentación oficial de Quarto [aquí](https://quarto.org/docs/authoring/markdown-basics.html) y su [documento fuente](https://github.com/quarto-dev/quarto-web/blob/main/docs/authoring/markdown-basics.qmd)\n\n- Una **fantástica guía sobre Markdown** [aquí](https://www.markdownguide.org/getting-started/)\n\n\n
\n\n\n\n## (III) Texto: ¿qué narices es esto de Markdown?\n\n. . . \n\n- Es un **lenguaje de marcas** diseñado para escribir fácilmente **para la web** y que también sea fácilmente legible.\n\n. . . \n\n- Markdown es un lenguaje **estoico** para escribir (para la web)\n\n. . . \n\n- Markdown fue creado por [John Grueber](https://daringfireball.net/projects/markdown/) y [Aaron Swartz](https://es.wikipedia.org/wiki/Aaron_Swartz) en 2004. Para saber más sobre Aaron Swartz puedes ver [este documental](https://www.youtube.com/watch?v=7jhdj0vKbYo).\n\n- Se creó con el objetivo de crear un formato de texto fácil de escribir y leer y que se convirtiera fácilmente en `.html`\n\n > Markdown is a text-to-HTML conversion tool for web writers.\n \n\n. . . \n\n- La ventaja de escribir en Markdown es que es un lenguaje muy fácil de aprender y que, como está basado en un formato de texto plano, es y será compatible con la mayoría de plataformas.\n\n. . . \n\n- En este otro [tutorial de Markdown](https://www.markdowntutorial.com/), se puede leer lo siguiente:\n\n> Markdown is a way to write for the web. It’s written in what nerds like to call “plaintext”. Plaintext is just the regular alphabet, with a few familiar symbols. Unlike cumbersome word processing applications, text written in Markdown can be easily shared between computers, mobile phones, and people. It’s quickly becoming the writing standard for academics, scientists, writers, and many more. Websites like GitHub and reddit use Markdown to style their comments.\n\n\n\n------------------------------------------------------------------------\n\n## (III) Texto: ideas básicas (otra vez)\n\n- En los documentos `.qmd`, **\"todo\"** lo que no es el yaml o un chunk, es texto. \n\n- En Quarto el texto se escribe en [Markdown](https://es.wikipedia.org/wiki/Markdown)\n\n- Como Quarto se basa en **pandoc**, se usa [\"Pandoc`s markdown\"](https://pandoc.org/MANUAL.html#pandocs-markdown), una versión revisada y extendida de la propuesta original de Grueber\n\n
\n\n- Tienes una fantástica guía de Markdown [aquí](https://www.markdownguide.org/), y [aquí](https://www.markdownguide.org/cheat-sheet/) una cheatsheet.\n\n\n## (III) Texto: Dando formato al texto \n\n. . . \n\n- Sintaxis básica de `markdown`\n\n+-----------------------------------+------------------------------+\n| Si escribes esto: | Se verá esto: |\n+===================================+==============================+\n| texto normal | texto normal |\n+-----------------------------------+------------------------------+\n| texto en **negrita** | texto en **negrita** |\n+-----------------------------------+------------------------------+\n| texto en *cursiva* | texto en *cursiva* |\n+-----------------------------------+------------------------------+\n| un superíndice^2^ | un superíndice^2^ |\n+-----------------------------------+------------------------------+\n| un subíndice~2~ | un subíndice~2~ |\n+-----------------------------------+------------------------------+\n| palabras ~~tachadas~~ | palabras ~~tachadas~~ |\n+-----------------------------------+------------------------------+\n| `verbatim code` | `verbatim code` |\n+-----------------------------------+------------------------------+\n| > un blockquote | > un blockquote |\n+-----------------------------------+------------------------------+\n+-----------------------------------+------------------------------+\n\n\n

\n\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.7: texto en markdown\n\nPara practicar a escribir con Markdown podemos:\n\n - Hacerlo en RStudio, por ejemplo podemos utilizar el archivo `prueba_01.qmd` para incorporar un párrafo que contenga los elementos que hemos visto en la tabla anterior\n \n \n - Alternativamente, podemos usar editores online como [este](https://dillinger.io/) o [este](https://vuejs.org/examples/#markdown)\n\n\n
\n\n\n- Aquí tienes un ejemplo:\n\n```markdown\nCuando quise darme cuenta la **clase había terminado** ....\n```\n\n
\n\n:::\n\n\n\n\n## (III) Texto: Dando formato al texto {background-color=\"#DCDCDC\"}\n\n- Más posibilidades:\n\n+-----------------------------------+------------------------------+\n| Si escribes esto: | Se verá esto: |\n+===================================+==============================+\n| [texto subrayado]{.underline} | [texto subrayado]{.underline}|\n+-----------------------------------+------------------------------+\n| texto destacado | texto destacado |\n+-----------------------------------+------------------------------+\n| [En versalita]{.smallcaps} | [En versalita]{.smallcaps} |\n+-----------------------------------+------------------------------+\n| el emoji :joy: | el emoji :joy: |\n+-----------------------------------+------------------------------+\n| > :warning: **Cuidado!!** no | > :warning: **Cuidado!!** no |\n+-----------------------------------+------------------------------+\n+-----------------------------------+------------------------------+\n\n
\n\n(**) Los emojis mejor desde el editor visual o copiándolos, por ejemplo, desde [aquí](https://gist.github.com/rxaviers/7360908)\n\n\n\n
\n\n## (III) Texto: Notas al píe {background-color=\"#DCDCDC\"}\n\n\nSe usa la marca `^`, y hay 2 sintaxis:\n\n
\n\n. . . \n\n 1.Con sintaxis inline:\n\n\n ``` markdown\n Sintáxis (inline) para insertar una nota al píe^[Se llama inline \n porque el contenido de la nota al píe se entremezcla con el texto principal]. Suele ser\n la sintáxis que yo uso. \n ```\n\n
\n\n 2. **No-**inline\n\n\n ``` markdown\n Aquí voy a poner otra nota al píe [^1] , y otra más.[^b]\n \n [^1]: Esta otra sintaxis me gusta menos. Pero igual es más clara\n\n [^b]: No sufras por la numerácion. lo hará Pandoc!!\n ```\n\n
\n\n. . . \n\n- Documentación oficial [aquí](https://quarto.org/docs/authoring/footnotes-and-citations.html#footnotes)\n\n\n## (III) Texto: Títulos\n\n. . . \n\n
\n\n+---------------------+-----------------------------------+\n| Markdown: | Se verá esto: |\n+=====================+===================================+\n| # Header 1 | # Header 1 |\n+---------------------+-----------------------------------+\n| ## Header 2 | ## Header 2 |\n+---------------------+-----------------------------------+\n| ### Header 3 | ### Header 3 {.heading-output} |\n+---------------------+-----------------------------------+\n| #### Header 4 | #### Header 4 {.heading-output} |\n+---------------------+-----------------------------------+\n| ##### Header 5 | ##### Header 5 {.heading-output} |\n+---------------------+-----------------------------------+\n| ###### Header 6 | ###### Header 6 {.heading-output} |\n+---------------------+-----------------------------------+\n\n\n
\n\n## (III) Texto: Creando **listas**\n\n. . . \n\n- En las listas es **crucial la indentación** (normalmente **2** espacios)\n\n. . . \n\n
\n\n![](./imagenes/ss_03_img_07_listas.png){fig-align=\"center\" width=\"65%\"}\n\n
\n\n\n- Mas posibilidades [aquí](https://quarto.org/docs/authoring/markdown-basics.html#lists) y [aquí](https://quarto.org/docs/visual-editor/content.html#editing-lists)\n\n\n
\n\n## (III) Texto: Párrafos\n\n. . . \n\n- Para crear un nuevo párrafo has de dejar una (o más) **lineas en blanco**\n\n. . . \n\n\n- Para crear más espacio entre párrafos; es decir, [añadir una linea en blanco extra]{.underline}, podemos usar uno o varios: `
` o `

`\n\n\n
\n\n. . . \n\n#### Dentro de un párrafo\n\n- Si dentro de un párrafo necesitas que **una frase empiece en otra linea** entonces, **has de dejar 2 (o más) espacios al final**; en inglés esto se conoce como un \"hard line break\" \n\n\n::: {.fragment}\n:::{.callout-warning icon=\"false\" }\n#### Extensión: más formas de crear \"hard line breaks\" \n\n- El \"hard line break\" [también se puede hacer]{.underline} con `
`\n \n\n- El \"hard line break\" también se puede hacer con `\"\\\"` seguido de nueva linea. \n \n- En una tabla, `\\` es la única forma de crear un salto de línea, ya que se ignoran los espacios finales en las celdas.\n:::\n:::\n\n## (III) Texto: Lineas, espacios, ...\n\n\n. . . \n\n- Si en una linea de texto hay **2 espacios o más**, estos se reducen a un espacio.\n\n. . . \n\n\n:::{.callout-warning icon=\"false\" }\n#### Extensión: ¿cómo dejar más espacio entre palabras?\n\n- Por lo tanto, [si quieres separar palabras con más de un espacio]{.underline}, tendrás que usar lo que en html se conoce como \"entities\": ` `(1 espacio) ` `(2 espacios) y ` `(4 espacios). \n\n - Otra forma sería con la etiqueta `
`.\n:::\n\n. . . \n\n
\n\n\n:::{.callout-warning icon=\"false\" }\n#### Extensión: un detalle que a veces es útil\n\n- Los espacios al principio de las lineas que empiezan con `|` se mantienen (🤓)\n:::\n\n# (IV) Más elementos {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- Además de YAML, chunks y texto, **Markdown tiene más elementos para escribir**\n\n. . . \n\n- Por ejemplo: links, imágenes, vídeos, ecuaciones, tablas, bibliografía, etc ....\n\n\n## (IV) Más elementos: hyper-**links**\n\n
\n\n\n+-----------------------------------------------------+------------------------------------+\n| Si escribes esto: | Al procesarse se verá esto: |\n+=====================================================+====================================+\n| | |\n+-----------------------------------------------------+------------------------------------+\n| [Web de Quarto](https://quarto.org) |[Web de Quarto](https://quarto.org) |\n+-----------------------------------------------------+------------------------------------+\n+-----------------------------------------------------+------------------------------------+\n\n
\n\n. . . \n\n\n::: {.callout-warning collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Extensión: Cómo hacer que los links se abran en nueva página\n\n\nSi quieres que la página enlazada **se abra en otra pestaña** del navegador puedes:\n\n 1. Especificarlo en el YAML con `link-external-newwindow: true`\n\n \n 2. Añadir `{target=\"_blank\"}`, con lo que nuestros enlaces quedarían como:\n \n ```markdown\n [Web de Quarto](https://quarto.org){target=\"_blank\"}\n ```\n 3. La versión 1.3 de Quarto permitirá esto en los enlaces en el fichero `_quarto.yml`. Puedes leerlo [aquí](https://github.com/quarto-dev/quarto-cli/discussions/2283>)\n\n:::\n\n## (IV) Más elementos: **Imágenes**\n\n- Documentación oficial [aquí](https://quarto.org/docs/authoring/figures.html)\n\n\n```markdown\n![](imagenes/imagen_ababol.jpg){ fig-align=\"left\" width=\"12%\"}\n```\n\n![](imagenes/imagen_ababol.jpg){ fig-align=\"left\" width=\"12%\"}\n\n\n```markdown\n![](./imagenes/imagen_ababol.jpg){ fig-align=\"right\" width=\"20%\"}\n```\n\n![](./imagenes/imagen_ababol.jpg){ fig-align=\"right\" width=\"20%\"}\n\n\n- Puedes ver como hacer composiciones de imágenes en el blog, concretamente [aquí](https://perezp44.github.io/intro.to.quarto/blog/24_imagenes.html){target=\"_blank\"}, además de cuestiones como el tamaño y aspecto de las imágenes.\n\n\n\n---\n\n::: {.callout-important icon=\"false\"}\n#### Tarea 3.8: Markdown, incorporar una imagen\n\n- Incorpora [esta imagen](https://commons.wikimedia.org/wiki/File:Nacho_Vegas_-_Rock_%26_Clown_-_A_Estrada.jpg) al archivo `prueba_01.qmd` \n\n\n
\n\n::: {.fragment}\n- Guarda [esta otra imagen](https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Husky_sib%C3%A9rienne.JPG/640px-Husky_sib%C3%A9rienne.JPG) dentro de `my_qproject`, concretamente dentro de la carpeta `imagenes`\n\n\n- Incorpora esa imagen (guardada en tu ordenador) al archivo `prueba_01.qmd` \n:::\n\n
\n\n:::\n\n\n\n\n\n\n## (IV) Más elementos: Imágenes **generadas con código** {background-color=\"#DCDCDC\"}\n\n- Documentación para fijar el tamaño [aquí](https://quarto.org/docs/computations/execution-options.html#figure-options)\n\n\n\n::: {.cell output-location='column-fragment'}\n\n````{.cell-code code-line-numbers=\"2|3|4-5|6|7\"}\n```{{r}}\n#| label: fig-penguins-01\n#| fig-cap: Gráfico con datos de pingüinos\n#| fig-width: 7\n#| fig-asp: 0.618\n#| output-location: column-fragment\n#| code-line-numbers: \"2|3|4-5|6|7\"\nlibrary(tidyverse)\nlibrary(palmerpenguins)\npp <- ggplot(penguins,aes(\n x = bill_length_mm, y = bill_depth_mm,\n color = species, shape = species)) + \n geom_point() +\n theme_minimal() +\n labs(x = \"Bill length (mm)\", y = \"Bill depth (mm)\")\n\npp\n```\n````\n\n::: {.cell-output-display}\n![Gráfico con datos de pingüinos](slides_07b_intro-a-Quarto_files/figure-revealjs/fig-penguins-01-1.png){#fig-penguins-01 width=672}\n:::\n:::\n\n\n\n\n
\n\n## (IV) Más elementos: Tablas con Markdown {background-color=\"#DCDCDC\"}\n\n- Documentación oficial para tablas [aquí](https://quarto.org/docs/authoring/tables.html)\n\n
\n\n. . . \n\n:::: {.columns}\n::: {.column width=\"45%\"}\n\n##### Sintaxis Markdown para tablas\n\n | Right | Left | Default | Center |\n |------:|:-----|---------|:------:|\n | 12 | 12 | 12 | 12 |\n | 123 | 123 | 123 | 123 |\n | 1 | 1 | 1 | 1 |\n \n : Título de la tabla\n:::\n::: {.column width=\"30%\"}\n\n**Genera lo siguiente:**\n\n| Default | Left | Right | Center |\n|---------|:-----|------:|:------:|\n| 12 | 12 | 12 | 12 |\n| 123 | 123 | 123 | 123 |\n| 1 | 1 | 1 | 1 |\n\n: Título de la tabla\n:::\n::::\n\n. . . \n\n\n- Como ves no es fácil-fácil generar tablas con Mardown pero, **puedes usar un generador de tablas**, por ejemplo [este](https://www.tablesgenerator.com/markdown_tables) o [este](https://tableconvert.com/markdown-generator). También se puede usar el [editor visual de Rstudio](https://quarto.org/docs/visual-editor/content.html#editing-tables)\n\n\n## (IV) Más elementos: Tablas con R\n\n- R tiene muchos paquetes para hacer tablas. Por ejemplo: `knitr::kable(df)`, o `gt::gt(df)`, o `DT::datatable(df)` y más. Si te interesa el tema de las tablas puedes visitar [esto](https://perezp44.github.io/intro-ds-21-22-web/tutoriales/tt_08_tablas-Rmarkdown.html) o [esto](https://rfortherestofus.com/2019/11/how-to-make-beautiful-tables-in-r/)\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- rio::import(\"./datos/matriculados.xlsx\")\ngt::gt(df)\n```\n\n::: {.cell-output-display}\n\n```{=html}\n
\n\n\n \n \n \n \n \n \n \n \n \n\n\n \n\n\n \n\n\n \n\n\n \n \n \n
NombreNotaComentario
Eva Maria10very good!!
Pilar8awesome!!
Victor6keep going
Enric7great
\n
\n```\n\n:::\n:::\n\n\n\n\n## (III) Más elementos: Ecuaciones\n\n- Markdown admite ecuaciones **escritas en Latex**:\n\n - si van entre un **`$`** serán ecuaciones inline \n - **`$$`** para ecuaciones independientes. \n\n. . . \n\n\n+-------------------------------------+-----------------------------+\n| Markdown Syntax | Output |\n+=====================================+=============================+\n| ecuación inline: $E = mc^{2}$ | ecuación inline: $E=mc^{2}$ |\n+-------------------------------------+-----------------------------+\n| ecuación independiente: | ecuación independiente: \\ |\n| | $$E = mc^{2}$$ |\n| $$E = mc^{2}$$ | |\n+-------------------------------------+-----------------------------+\n\n. . .\n\n- Tienes editores online de ecuaciones en Latex [aquí](https://www.latex4technics.com/) y [aquí](http://www.sciweavers.org/free-online-latex-equation-editor). Puedes ver algunos ejemplos de ecuaciones escritas en Latex [aquí](https://dereksonderegger.github.io/570L/16-rmarkdown-tricks.html) \n\n- Además, podemos reusar el código Latex de ecuaciones en la web (si se ha usado MathJax). Por ejemplo [aquí](https://perezp44.github.io/VAR-models-web/03-Slides.html)\n\n\n\n# RStudio **Visual editor** {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- ¿Me acordaré de todas la marcas que hemos visto?\n\n. . . \n\n
\n\n🤔, ya te digo yo que **No**\n\n---\n\n## Editor Visual en RStudio\n\n- Desde 2020, concretamente desde la [versión v.1.4](https://posit.co/blog/rstudio-v1-4-preview-visual-markdown-editing/), **RStudio dispone de un editor visual**\n\n- El editor visual **facilita la inserción** de los **elementos** que hemos ido viendo durante el curso. Documentación oficial [aquí](https://quarto.org/docs/visual-editor/) y [aquí](https://docs.posit.co/ide/user/ide/guide/documents/visual-editor.html)\n\n\n. . . \n\n::: {columns}\n::: {.column width=\"68%\"}\n- Hasta ahora hemos trabajado en nuestros QMD en formato \"Source\", pero **podemos cambiar el modo de edición a \"Visual\"**, solo hay que seleccionar la pestaña adecuada:\n:::\n::: {.column width=\"28%\"}\n![](imagenes/ss_03_img_08_visual.png)\n:::\n:::\n\n## Editor Visual: **Modo de edición**\n\n\n::: panel-tabset\n#### Edición en modo Visual:\n![](imagenes/ss_03_img_09b.png)\n\n#### En modo Source:\n![](imagenes/ss_03_img_09a.png)\n:::\n\n\n## Editor Visual: **Barra de herramientas**\n\n\nLa barra de herramientas del editor visual facilita el acceso a la mayoría de elementos que podemos insertar en nuestros documentos QMD:\n\n![](imagenes/ss_03_img_10.png)\n\n::: {layout-ncol=3}\n\n![](./imagenes/ss_03_img_11a.png)\n\n![](./imagenes/ss_03_img_11b.png)\n\n![](./imagenes/ss_03_img_11c.png)\n:::\n\n\n- Esto facilita la entrada a los documentos QMD\n\n- En algunos casos como imágenes y ciertas tablas, solo hay que arrastrar (o copiar y pegar) el contenido y aparecerá en nuestro documento fuente con la sintaxis adecuada.\n\n- Algunas referencias: [Exploring RStudio’s Visual Markdown Editor](https://posit.co/blog/exploring-rstudio-visual-markdown-editor/), [RStudio: el Nuevo Editor Visual](http://destio.us.es/calvo/Qtutoriales/SobreRRStudio/RStudioEditorVisual.html)\n\n# Aún quedan más elementos!! {.unnumbered background-color=\"#ebf5fb\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- Pandoc fenced divs, Pandoc bracketed spans\n\n- Layout, CSS, ....\n\n- ... pero **lo dejamos para más adelante**\n\n\n\n# Intro a Slides con Quarto {background-color=\"#b8c2aa\"}\n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n. . .\n\n\n1. Quarto puede hacer slides de varios tipos (ppt, slidy, beamer)\n\n2. Nos centraremos en el formato **Revealjs**\n\n\n\n\n# Presentaciones con Quarto (generico) {.unnumbered background-color=\"#ebf5fb\"}\n\n\n\n{{< var lineanaranja >}}\n\n\n\n\n- Las slides se escriben en **QMD**, así que ya sabemos\n\n. . . \n\n\n- Hay algunas especificidades que vamos a ver\n\n- Veremos primero aspectos comunes a todos los formatos de slides\n\n\n- [Documentación oficial](https://quarto.org/docs/presentations/)\n\n\n\n--- \n\n## Creación de unas nuevas transparencias: {.smaller}\n\n. . . \n\n1. Has de seguir la siguiente ruta de menús: \n `File > New File > Quarto Presentation`. \n2. 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. \n\n. . . \n\nEn imágenes:\n\n::: {layout-ncol=2}\n![](./imagenes/ss_04_img_01a.png){height=280}\n\n![](./imagenes/ss_04_img_01b.png_z){height=280}\n:::\n\n
\n\n\n--- \n\n## Creación de una nueva slide:\n\n\n- Los títulos de **primer nivel** crean una nueva slide (y tb una nueva sección)\n\n- Los títulos de **segundo** nivel crean una nueva slide. \n\n. . . \n\n- También se puede crear una nueva slide usando **3** o mas **guiones cortos**: `---`\n\n
\n\n. . . \n\n::: {.callout-warning collapse=\"true\" appearance=\"default\" icon=\"false\"}\n#### Extensión: modificar la generación de nuevas slides\n\nHay que usar `slide-level:` en el YAML. Por ejemplo:\n \n \n\n:::: {columns}\n::: {.column width=\"48%\"}\n\n``` yaml\n---\ntitle: \"Mis slides\"\nformat: \n revealjs: \n slide-level: 3\n---\n```\nCon este yaml, los títulos de tercer nivel (con `###`) también crearían una nueva slide\n:::\n::: {.column width=\"48%\"}\n```yaml\n---\ntitle: \"Mis slides\"\nformat: revealjs \n---\n```\n:::\n::::\n:::\n\n\n
\n\n\n---\n\n## Pausas en la presentación\n\n- Por defecto, los elementos de una slide se muestran todos de golpe\n\n. . . \n\n
\n\n> :warning: Para crear pausas en la presentación has de usar las siguientes marcas: . . . \n\n (es decir, tres puntos separados por espacios)\n \n
\n\n. . .\n\n- Por ejemplo:\n\n```default\n## Una nueva slide\n\nContenido nº 1\n\n. . . \n\nContenido nº 2\n\n```\n\n (para ver el Contenido nº 2 habrá que dar al avance página)\n\n\n---\n\n## Listas incrementales\n\n\n- Por defecto las listas se muestran de golpe\n\n. . . \n\n- Si quieres que se muestren elemento a elemento, puedes controlarlo desde el YAML:\n\n\n```yaml\ntitle: \"My Presentation\"\nformat:\n revealjs:\n incremental: true \n```\n\n. . . \n\n- Se puede ir **intercalando** listas incrementales, y no-incrementales, con los siguientes **fenced div's**:\n\n:::: {.columns}\n::: {.column width=\"45%\" .fragment}\n\nLista **incremental** :\n\n
\n\n```markdown\n::: {.incremental}\n- First we take Manhatan,\n- then we take Berlin\n:::\n```\n:::\n::: {.column width=\"45%\" .fragment}\n\nLista **no-incremental** :\n\n
\n\n``` markdown\n::: {.nonincremental}\n- First we take Manhatan,\n- then we take Berlin\n:::\n```\n:::\n::::\n\n---\n\n## Columas multiples {.smaller}\n\n:::: {.columns}\n::: {.column width=\"35%\"}\n- Como puedes ver, se puede generar contenido en **varias columnas**. Para ello hay que usar un **fenced div** con clase `columns`. \n:::\n::: {.column width=\"60%\"}\n> 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](https://quarto.org/docs/presentations/#multiple-columns) de Quarto\n:::\n::::\n\n. . . \n\n- Por ejemplo:\n\n\n```markdown\n:::: {.columns}\n\n::: {.column width=\"40%\"}\nMi contenido en la primera columna\n:::\n\n::: {.column width=\"60%\"}\nContenido en la segunda columna\n:::\n\n::::\n\n```\n\n\n
\n\n\n\n# Revealjs slides {.unnumbered background-color=\"#ebf5fb\"} \n\n\n{{< var lineanaranja >}}\n\n\n\n
\n\n- [reveal.js](https://revealjs.com/) es un open source HTML presentation framework.\n\n- A mi me gustan: en mi opinión tienen unas cuantas ventajas\n\n- Documentación oficial [aquí](https://quarto.org/docs/presentations/revealjs/)\n\n- Listado (extenso) de opciones [aquí](https://quarto.org/docs/reference/formats/presentations/revealjs.html)\n\n\n\n\n---\n\n## Revealjs: primera slide \n\n- La primera slide **se crea automáticamente** [si pones un título en el YAML]{.underline} \n\n - En ese caso, la 1ª slide contendrá los metadatos: title, subtitle, author, institute, date \n \n. . . \n\n- La apariencia de la primera slide dependerá del tema elegido. **Listado de themes** [aquí](https://quarto.org/docs/presentations/revealjs/themes.html#using-themes).\n\n\n---\n\n## Revealjs: Content overflow\n\nSi el contenido que queremos poner no se ajusta a la slide, tenemos varias posibilidades:\n\n
\n\n. . . \n\n1. Usar la `.smaller` class al crear la slide: \n \n```markdown\n\n## Título de la slide {.smaller}\n\n```\n \n
\n \n. . . \n \n2. Modificar el YAML para hacer las slides \"scrollables\":\n \n \n```yaml\n---\ntitle: \"My Presentation\"\nformat:\n revealjs:\n scrollable: true\n--- \n```\n\n---\n\n## Revealjs: Slide background\n\nEn mi opinión las slides mejoran bastante estéticamente si en alguna de ellas cambiamos el fondo. La documentación está [aquí](https://quarto.org/docs/presentations/revealjs/#slide-backgrounds)\n\n\n. . . \n\n- Puedes **incorporar un fondo especifico a una slide**. Se pueden usar los siguientes elementos: **color**, **imagen**, **vídeo** e **iframe**. Por ejemplo:\n\n```markdown\n## Título de la slide {background-color=\"aquamarine\"}\n```\n\n. . . \n\n- Opciones más complejas:\n\n\n```markdown\n## Slide Title {background-video=\"video.mp4\" background-video-loop=\"true\" background-video-muted=\"true\"}\n\n## Slide Title {background-color=\"black\" background-image=\"https://placekitten.com/100/100\" background-size=\"100px\" background-repeat=\"repeat\"}\n\n## Slide Title {background-iframe=\"https://www.uv.es\"}\n```\n\n\n## Slide Backgrounds: ejemplo 1 (color) {background-color=\"aquamarine\"}\n\nPara poner un color de fondo:\n\n```markdown\n\n## Slide Backgrounds: ejemplo 1 (color) {background-color=\"aquamarine\"}\n\n```\n\n\n## Slide Backgrounds: ejemplo 2 (imagen) {background-image=\"imagenes/perro_blanco.jpg\" background-size=\"cover\" background-opacity=\"0.7\"} \n\nPara poner una imagen de fondo:\n\n```markdown\n\n## Slide Backgrounds: ejemplo 2 (imagen) {background-image=\"imagenes/perro_blanco.jpg\" background-size=\"cover\"}\n\n```\n\n\n## {background-image=\"https://images.unsplash.com/photo-1495640388908-05fa85288e61?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=774&q=80\" background-size=\"contain\" background-position=\"left\"}\n\n::: columns\n::: {.column width=\"40%\"}\n:::\n\n::: {.column width=\"60%\"}\n### Se pueden hacer cosas muy chulas como:\n\n::: incremental\n::: r-fit-text\n\n- [Slides Emil Hvitfeldt](https://emilhvitfeldt.github.io/useR2022-textrecipes)\n\n- Parallax background. Documentación [aquí](https://quarto.org/docs/presentations/revealjs/advanced.html#parallax-background)\n\n- [Quarto iFrame Examples](https://emilhvitfeldt.github.io/quarto-iframe-examples/). El [repo](https://github.com/EmilHvitfeldt/quarto-iframe-examples)\n\n:::\n:::\n:::\n:::\n\n::: footer\nInspiración, vamos, copiado de \n:::\n\n## Revealjs: Tabsets \n\n- Puedes crearlas con:\n\n```markdown\n::: {.panel-tabset}\n## Primer Tab\n\nContenido del primer Tab\n\n## Segundo Tab\n\nContenido del segundo Tab\n:::\n```\n. . . \n\n
\n\n- El resultado es:\n\n::: {.panel-tabset}\n## Primer Tab\n\nContenido del primer Tab\n\n## Segundo Tab\n\nContenido del segundo Tab\n:::\n\n\n---\n \n## Revealjs: Transiciones\n\n- Documentación oficial [aquí](https://quarto.org/docs/presentations/revealjs/advanced.html#slide-transitions)\n\n+-------------+------------------------------------------------------------------------+\n| Transition | Description |\n+=============+========================================================================+\n| `none` | No transition (switch instantly) |\n+-------------+------------------------------------------------------------------------+\n| `fade` | Cross fade |\n+-------------+------------------------------------------------------------------------+\n| `slide` | Slide horizontally |\n+-------------+------------------------------------------------------------------------+\n| `convex` | Slide at a convex angle |\n+-------------+------------------------------------------------------------------------+\n| `concave` | Slide at a concave angle |\n+-------------+------------------------------------------------------------------------+\n| `zoom` | Scale the incoming slide so it grows in from the center of the screen. |\n+-------------+------------------------------------------------------------------------+\n \n\n. . .\n\n``` yaml\n---\ntitle: \"Presentation\"\nformat:\n revealjs:\n transition: slide #- transiciones de las slide: {none, fade, slide, convex, concave, or zoom}\n transition-speed: fast #- {default, fast, slow}\n---\n``` \n\n\n\n\n## Revealjs: tunear con **themes**\n\n- Ya sabemos que podemos cambiar la apariencia de las slides usando los **themes** disponibles en Quarto. **Listado de themes** [aquí](https://quarto.org/docs/presentations/revealjs/themes.html#using-themes).\n\n. . . \n\n- Para ello tenemos que incluir en el YAML el theme que queremos:\n\n```markdown\n---\ntitle: \"Presentation\"\nformat:\n revealjs: \n theme: dark\n---\n```\n\n
\n\n. . . \n\n- Además disponemos de muchos otros themes en **extensiones** en [la web de Quarto](https://quarto.org/docs/extensions/listing-revealjs.html) y en [Awesome Quarto](https://github.com/mcanouil/awesome-quarto#presentations)\n\n\n- Por ejemplo: los themes [4 estaciones](https://github.com/EmilHvitfeldt/quarto-revealjs-seasons), [Inversa](https://github.com/EmilHvitfeldt/quarto-revealjs-inverse), [Insper](https://github.com/padsInsper/quarto-insper-theme), ...\n\n\n---\n\n## **Ejemplos** de presentaciones {.smaller}\n\n
\n\n. . . \n\n- [Some good practices for research with R](https://www.good-practices.etiennebacher.com/#/title-slide)de Etienne Bacher, el repo [aquí](https://github.com/etiennebacher/good-practices)\n\n\n- [Debugging](https://rstats-wtf.github.io/wtf-debugging-slides/#/title-slide) de Shannon Pileggi, el repo [aquí](https://github.com/rstats-wtf/wtf-debugging-slides)\n\n- [The Genesis of Experimentation](https://emitanaka.org/slides/Ihaka2022/#/title-slide) de Emi Tanaka, el repo [aquí](https://github.com/emitanaka/talks/tree/master/Ihaka2022)\n\n- [ggdensity: Improved density visualization in R](https://jamesotto852.github.io/JSM-2022/#/) de James Otto y David Kahle, el repo [aquí](https://github.com/jamesotto852/JSM-2022)\n\n- [Extending ggplot2 with custom Geoms and Stats](https://jamesotto852.github.io/extending-ggplot2/#/) de James Otto, el repo [aquí](https://github.com/jamesotto852/extending-ggplot2)\n\n- [Quarto/RMarkdown - What’s Different?](https://laderast.github.io/qmd_rmd/#/title-slide), de TED Laderas. [Vídeo](https://www.youtube.com/watch?v=xC6I5OVOnKI)\n\n- [An Antarctic Tour of the Tidyverse](https://slides.silviacanelon.com/tour-of-the-tidyverse-v2/#/title-slide) de Silvia Canelon, el repo [aquí]()\n\n- [Hello Quarto](https://mine.quarto.pub/hello-quarto/#/hello-quarto-title) de Mine Çetinkaya-Rundel y Julia Stewart Lowndes, el repo [aquí](https://github.com/mine-cetinkaya-rundel/hello-quarto), [más cosas](https://mine-cetinkaya-rundel.github.io/quarto-tip-a-day/posts/31-hello-quarto/)\n\n- [Reproducible authoring with Quarto](https://mine-cetinkaya-rundel.github.io/2022-repro-toronto/#/title-slide) de Mine Çetinkaya-Rundel, el repo [aquí](https://github.com/mine-cetinkaya-rundel/2022-repro-toronto)\n\n- [What can I do with Quarto?](https://nrennie.rbind.io/talks/2022-october-oxford-r-user-group/slides.html#/title-slide) de Nicola Rennie, su web [aquí](https://nrennie.rbind.io/)\n\n- [Reproducible Publications w/ Python and Quarto](https://thomasmock.quarto.pub/python/#/TitleSlide) de Thomas Mock\n\n- [Improvements in text preprocessing using textrecipes](https://emilhvitfeldt.github.io/useR2022-textrecipes/#/section) de Emil Hvitfeldt\n\n- [The Happiest Notebooks on Earth](https://apreshill.github.io/happiest-notebooks-on-earth/#/title-slide) de Allison Hill\n\n- [Quarto Presentations](https://quarto.org/docs/presentations/revealjs/demo/#/title-slide) by Quarto team, el repo [aquí](https://github.com/quarto-dev/quarto-web/blob/main/docs/presentations/revealjs/demo/index.qmd). Documentación oficial [aquí](https://quarto.org/docs/presentations/revealjs/)\n\n- [Intro to Quarto](https://ivelasq.quarto.pub/intro-to-quarto/#/section) de Isabella Velásquez, el repo [aquí](https://github.com/ivelasq/2022-10-27_intro-to-quarto)\n\n\n- [Un buen post sobre Revealjs slides](https://meghan.rbind.io/blog/quarto-slides/) de Meghan Hall\n\n- [Data Science Portfolio with Quarto](https://deepshamenghani.quarto.pub/portfolio-with-quarto-workshop/#/title-slide) de Deepsha Menghani, el repo [aquí](https://github.com/deepshamenghani/Portfolio_DeepshaM). Vídeo [aquí](https://www.youtube.com/watch?v=xtSFXtDf4cM)\n\n- [05 - Presentations Making Slides with Code](https://rstudio-conf-2022.github.io/get-started-quarto/materials/05-presentations.html#/presentations) y [02 - Authoring Quarto](https://jthomasmock.github.io/quarto-2hr-webinar/materials/02-authoring.html#/authoring-quarto) de Thomas Mock. Slides que pertenecen al siguiente taller [Get started with Quarto](https://rstudio-conf-2022.github.io/get-started-quarto/)\n\n\n\n\n# Otros formatos {.unnumbered background-color=\"#ebf5fb\"} \n\n\n{{< var lineanaranja >}}\n\n\n\n- Beamer\n\n- Power Point\n\n- Slidy\n\n\n\n# Beamer slides {.unnumbered background-color=\"#ebf5fb\"} \n\n\n{{< var lineanaranja >}}\n\n\n\n---\n\n## Beamer slides\n\n- Beamer es un formato de slides, basadas en Latex, **muy popular en el mundo académico**\n\n. . .\n\n- Quarto puede hacer Beamer slides. Sólo hay que usar los menús o este yaml:\n\n\n```yaml\n---\ntitle: \"My Presentation\"\nformat: beamer\n```\n\n. . . \n\n- La apariencia visual de las slides vendrá determinada por el `theme` y el `colortheme`. los valores que usa por defeco Quarto no son muy chulos, así que hay que cambiarlos. [Aquí](https://hartwork.org/beamer-theme-matrix/) y [aquí](https://deic.uab.cat/~iblanes/beamer_gallery/) tienes ayuda para elegir el theme y colortheme. Por ejemplo:\n\n\n```yaml\n---\ntitle: \"Presentation\"\nformat: \n beamer: \n aspectratio: 32\n navigation: horizontal\n theme: metropolis\n colortheme: lily\n---\n```\n\n---\n\n\n## Beamer slides (documentación)\n\n. . . \n\n\n- [User Guide](https://ctan.fisiquimicamente.com/macros/latex/contrib/beamer/doc/beameruserguide.pdf) oficial de Beamer\n\n\n- Documentación oficial Beamer de Quarto [aquí](https://quarto.org/docs/presentations/beamer.html#overview)\n\n- Opciones de YAMl de Beamer en Quarto [aquí](https://quarto.org/docs/presentations/beamer.html#beamer-options)\n\n\n- [Beamer en RMD](https://bookdown.org/yihui/rmarkdown/beamer-presentation.html#beamer-presentation)\n\n- [Beamer en StackOverflow](https://stackoverflow.com/questions/tagged/beamer). Por ejemplo:\n\n - [Numeración de las slides como en Revealjs](https://stackoverflow.com/questions/74300235/frame-number-in-quarto-beamer-presentation)\n \n - [Justificar texto](https://es.stackoverflow.com/questions/587772/es-posible-modificar-la-alineaci%C3%B3n-de-un-p%C3%A1rrafo-en-una-presentaci%C3%B3n-beamer-pdf)\n\n\n\n\n\n", "supporting": [ "slides_07b_intro-a-Quarto_files" ], "filters": [ "rmarkdown/pagebreak.lua" ], "includes": { "include-after-body": [ "\n\n\n" ] }, "engineDependencies": {}, "preserve": {}, "postProcess": true } }E Fy![X)#[u@=Afig-penguins-01A-1.pngPNG  IHDR@>T< pHYse IDATxy|UItH&DAqFET  2! <,Ǝ,:È (# ^AB'd$u~R~sNUH}0FX `x,<@X `n|tet[tյBθCTWW4=TVV !RRR8QYYY^TBpƁp2~8DEE~8@Lv9QVVx o𬬬L`x,<@X `x,<@X `x,<@X `x,nfWUXJ83ȉL^H*<1u2< `x,rq<$lt6C!ԍ -X `x,<@X `x,mt죦&mqKH- eq@ ?N;t;!yg<55r%i@R{L8Y#_,x[6 ɩWѭA _uuٳg4h# NG2jrٳBq~ctCt@̙3Bl=ԯ_?-- |>_yy"333===IGa-qLnJMMMMM5-vSKF}k0ˌvӧԯ)fr\.;Ap3()))n'NqƁl5+U Bx,%еcGɊehH1t2r 0>lMr\hX^BƓa9~?'' @qqv表ddd$]eeeYY"+++33C,o5u<)dQ!|#8Gw 9Dw< [aU'3xcUaI,b<@*XBuYh HYTڬ;0&iXhͨ:Q7P9@ԁwp!COx ;9@#dIx 0Xӧό,7U؞+@'>奦D!Z0m#N^B8+)--999F7In;77@EEE'## *++ʄYYYF70fXix@!4<<@` < #vc{щ6ۃV9 xbͺ[n6>2 3̅D <`y얛 `xrXXLAl Q;`c`x,, ݌n>I!w2<@+,bIQUX M3 пM3 xwm[@Kaa6)$ 7#NH"s:8SPH<bwR=@%<@Ќ4;5Xe@' ' ]MfJ>3bu 5dr1Z̈́UQ#H7 FЉzyyyFIz}>¨3*'/c)--999Q͙!@qqv表ddd$]eeeYY"+++33-IJULm1* `x,[KQyeգu;_n L3q =MP 3Xf:zQFzk6\hѶmۼ^o۶m/n-55U!ԼU0 ؏kC@F=/BmmiӦN:v_=x;3YQQѤI~'!DNNΞ={ٳk׮~:;;[j H6t3 Ɛ:'`c̙3/rmmm~/_B,_o nK/O_|op9sjjoFGQ^KF76f 6|:< 7|SV^vK/T?|wgرҜ;~Çoڴ鮻jҤICy/`˰Ec86;`c߿k {}B/Bѹs;9:m۶B{K*,ȼ!tz©[@0s|XOqpS4nܸe˖a׫WO!=/8pSNauiWcQ^dEԬfȺq`o555~趘Zb?͢R^Mϲg e  a~ b'?y]ݜF)k"__kkkw]Rϸv\I9TQڵkʕB[nEzٳB=\fojW8sL\94?"1R[[zƛuϮ95:LlPQQQQQat+$<''GS?j=\uu]wu%HKeffm_~}]2T^XIl4iIZАefloedd 6o߾/eggD~(+͟rW0|4%/##C4B>Os^3CUuuu HKK3!C>Bw4/7ٿ5G I/jZ(SR^zaÖwλn;YQ%%J@( xkmٲEqWw}M6 ݠaÆ%%%eeeao^˓ٹR1 |>_ @囩9Dx^'5DUZZ'Rg@ 3dd\jz[hUVV tPYY)țdç'N=z˖-_njޅBSN~i!DFd潀u,%9ٸk@J6Z WkM5@,///犋{=bĈXKMow]!Լ3#ˡEO9ٸkn\i5k\Ǎ,&oIx0y߸q#G:w\P Wu+Xz۫ӥ^w}֣G$:9<ه"w H{F Ѝo?!1Huر}O9sT:jڴi\sM֭[f(/HXnHo iN[)=RΝ+ѣcƌ9sL<=>t%n{キzkE |>כ"vN\Ď3"v999F7Dx@qqvKkF^M_EEEE유RZL:++EH杁?yLzӼy3f\wuͽ_|E% \{@1k^oLk/gx@s; 3N 5j^^hHjkA1$3<Ti{w{slXW ?`6X^$vtmp$vF%2K/$=9{>_C{V-DM+ZސtC `wԺ`x; `X8--;Dg\g6C *XI À >}&(@ZbZl8Kd'DAQ?9*,EȌ#N`dx"jubx\< <p*4f0h @(<ВiciBx@rL3*-+o @V`<*;'~@ N Ͱs)sN_GE`$cdx:hg2ȄLP Tnd<H.Fh; ax@?U2k9)B(IVIp@\@6:|^7///55UCG[dנd|BCθ&t.$Iii1!3c;8QușxuYN,1 ^am̉g~~bM_Л>}fYAsj;2y5!33u c׼ι#Tx=xZ"Sۊ@qqv*#ۺԁ 1rYfќUX6tKlIx&<4N> J>3ֳ 6.nxsCXJGeJg5;@mt^o^^^jjVL>OW "Qy%(--999F7In;77W=xҸyy< ,++BdeeefftpdxKY%>VUX`t'ӵq B!I x ;3%ƛIrth}"<0׀|*7*o )η0b:JoCsi;0fࡱȰQUXJiƊҧLR0յw MQ Gf@Q=CK&/X:z25z@_MX;ԁk[>Qӻu&;uyC'L@[GrTgëB!tgxNNF75K> #s1fAxhː՚kӑ\Rص'QSfu9NY\U2|0C`Q E-#gO0kɾtOyd0_<BиLŵg0!<e3 P#(t3n!ܫm&LUJnZ`Y>ݐi/U$GazwmFI9 zbr;@u QKLRZȝz 7CWca{z>/ JwЪ0?%|dUvO׼vBx< x@sRdf *~du'2# mq.2Hs$xKפTkO^(m疻$0Ct<-`Xf@8 Ndf'Z嵑۹& Sp3 ;C7Ǟ!)I7п\2>5 tt Ie>OR!zBQFN3%%% ߟrnKt=bS'GJ|K/}K*Y>CT~"%EoTIo 7VxC/եqӖjkk~[B\.vK"k4Zϗ'>ךSHj|B~K)@|@ k^)$7 RQQ!HIIθ'^EEEzH\N &HȈ}<pzV%+\]x^7'qG)--9996zc3Ž( !nwnnvru>7<OFF AUVV !233n`:杇'x, nxAnxH,Ӷ @sx) _GX:MX}~ y"iBFԹ|bhXFRoA#QUX&0"Heq .B*OMU#5pBy-?Aڞ>Ȉ ՚aGd) :I: _]N**<<Ċ>V%)@=ӇX,#jiEI!e`{x pxs `oG!e/s Dw< aR IDATg@8ON< xD A@=xITa,BP:GВT[祵 2MX&gʨ̯ ߫l{F1[NXUݳ"fEW?V-I=+?\C&\èU)#UUK$X9XG$/'P?\5q4xocbm'TNx0AI oJx F7@8M[IUaAdlʇm۶'|Ox?pM[^aJ Z<%J|‡SxwIK׺ e#2r=jv&A9砌 /}M0u֚?dȐ-[RP6[^.Ȝ UmeDVƘaÆǎB4h8U5kvѣGZ u0򶆹Tj'p$^>r*au lcz`z@3g!n6-ȑ"S]KI =A+VfBh"lIxpLK!ުU+!DEE>} ў]oZe>QCj yQr3gL4kmٲeVV_|뭷nٲ%lٳg\K.D;\xnI&={|c;{?߭[Fegg1bľ}bo}۶mٴi=z̚5K1t.r*R(Xbزe?~G)//߻wW?Q2a„ZTTiӦ￿gϞ^7lo7͘1cmvԩovΜ9:t:ujΧM֩Sy}:++`ҥ|ԩS[h!x׮]L8QѹsI&-\Gm޼ɓ'{ya!Ν|?999@`رӦM wykkk5k6f̘+V̟?_~B}۷FGq1CA~UW]5jԨ7|gϞwB#GTyD[>DRXjc'NB^wҋ ;to1-ғÆ 3gB} cǎիWWW\qIN>v{{nIzoG}M8;8<Cq~~aƎ;u}-YdС2= tB}B̛7O"sΝ;woL4 椐iZqJ[4 &X7|#HKKիWmڴ3fÇ۴i^{MJs=wҥ:t0a;wb,-iݺګWyM#&} oV'aB$֍&I [elN&׬Y3!?C=I&zף>Z^۵k7hРe˖}g@r_^ZyGIϞ=۵k?۰a/Bk:tH=xXٳg !ի7iҤҢ45‘UUX#_Vx:Q r>[g` %UBU  %xᇻt2eʔ-[TUUɿK.Q_֭B9ZZE-[E]$ؽ{WiwQ7۷o߾}"=={zw٠Awn:ނ78pyB9rrɴԩSBiyFxb:HP5_^^.MK"=KLbO2ڜeEazKWJ;P޽ٳrOjƍ#FСæM"+///B?~\I~MMVOOOO#Qs݇_SS#]@O֨=TF~sKOO8p[ou?͓&Go8lCEݏ4. [n{Bޣ w| v*XdFXqJ(,Sj ??\Ѯ]|phaڱcGԽ}WB4i !<n_[[[[[J?z)StE[GLPݜ9s<ŋj&F>hÒ {gF{eިR+#Mw`cQZZsrrsTb,#H۝X 5C.yEEE'## *++E233nNr]BtZ&M9rʏ>HѧOR={'!DfffEEE׮]o֭[رcɒ%GBp ֭ ֭W]uU Wwѭ[VZsƍ;;;KKK5 E#  >IL:a*x͙[ɜ/xꩧ׿FMd]v㏃?ׂ>;"-Νv'|rJ>TJJȑ#g ueO3nf 9Dm3}D&9d9l0oo%sb96\p,++0jgMuZB~Al@|+vzIYYС`YXp Y~i^:ULfVgl[ [׭[7j(H-%|KNRrg/wu[ ^2|!Cl2%2-ّvf(3V1aBvZlٻwo!=cFԮB߬YǏ=_֪Mp26r'vSv(OVxǁ.fz*;_W_}VmDMY{Kl5k{`xC Aw syjowoժB{`y4cIm8pbŊZ40)=~ o,Mm;vl֭͛7k,w`3QWgqmi> i]A~UW]5jԨ7|gϞwB#GTyD@ϣ !*{A By;vLsΝ;woL{10<ހq'2QPpIۜ 9 oԩS5i TR~FÒ™eTĎ+3(wlr|bi$rs&\ΝwQ^vm-Z^p@4ʱ2^b%LU_=1F} 丱˼]foJjVF., F &&XFuu9AA9砌 Om.++{g'NUmPڙŽfpe|b;ə*+%"&@ ab< fFw< O*7X~4j1nW?K)v= X_SSrO֨=o4W#"&&{2p*7hРk׮B%Kh4CrN: l=U^1gdzx/ ЍO85`,%= e<' ؛2rSO=sύ7n\s9#ITU[̄OZX~o6Jq`\̀]^z^95i;7ԓ3(2rj<`k =wOXK*lS3 +p'U{Ų = O2rqm_ZZp@’ZZM2Mң[5}Lf@w1Cz\i.Xv_'SC䩽@H>y^qpUVɐ >Yj* %"jmP5u5y o IvVR=mEWj["0wV?z? ]^^u%XQ~͍w @SO|w޽{ꫯT͞=m۶o]vR&̓XU 5i/ 6_W+[xqyyy{vO=zt{ UM0>PW׹M2~c믣FzoիW׮]۷o&ٳgo߾u?Pg>;;{ʔ)#GLI!|'k[^{I$ܼĊJKKlNɖ/GOwQF΁(#|,O ey ց߲eˌ3VZUSS#۱c&M4j(//>|x޽f͚51bÛ6mY'e]FNM!qMK> NV6Fw sy x/믯]v׮]ξkA%|D@ kՁGx3<iAw sy`oժդIvyĉw}';{ywo|'O矟:ujڵwu@6`Bt\.kߵ|rCus\{L /r}ٸvbunMҸqA 4HL֭xgy8kb ׮]~aΝz{ӦM:EKmA>,ZH1bĈ^z !,YѯݻyPȩ*,P&;Q["5Zm"䇸??<55;2dbҥ~?r%KxM6m׮СCwu'N=zt׮]=O۶mN3f̈|>ޝX@t?٠N$usһ}GX#-f Sې/}m֬-ܒvȑ͛7n뮻Znݙ3gJJJ.\x5lڴ)loe]6s;v4k ,ܹe˔7I@lLD70+|$bm(:t"77o߾".e˖{WϜ9s۷7lpܹUTT 2ѣ^w'N~G%d'GN I>}fޡ! }   2x`!{W~ӧO1bDFF/SRW}饗9rwO6-33S6o&i#C4~KQYqM7eff>}>^_ߟ3|o߾_~_^#{B|gJNO:O̙3sf͚~w{^7\pA._|Qkh"zK.Bs=={oɒ%7tbB.(t, /o7oނ B7+++B:tHI4ىY)oذ27rF>iKF˗-[gϞ_?~;a„.]nZf҅ /^FD >}$E }($?߸qƍ}V:t=5jtԩʴĚN,Aȑ͢~H#cƍ?~駪XH!?9r!ߪUNhqBȑyʻ/{&Ksm]Va=WZ%Xp_o}ŊK,:th6m{ Za//?OǎC_/))ٵkW^^ޥ^Zg4ىi֭[۵kײe=z\[xw~С_5==A.K}Ç?C 6:u*77Pc}Q`\P`u ƜG?9z겲ƍ;C Blܸĉ-ZСCIIIXѸcǎIS /瞻k NOm?x^+O >';;[~{SN<~x [3uӊ-;/'d]'z < 7ܐ][[|r5a!Ę1c͛'۫njӰa÷~BYf+חJI['N(:4???!^u/ '?r>7>oV8#Yh t'-#-7eG@\N8a!wuniѢEK,5jԠA>ӹs>yyyGMII:ujaaa]fH IDAT ,_yٳg_p'O<}tjj;s+i&;1?/Br-+WԢ=oݻ+9IR߶m۶mnw >|/0`>}'n襤D~oȏC\30=:IgawmVi ЁXSS7s={V@?gϞ-//O4hP^$ޖ-[VSSӲe˫:6C YhѶm8жm9s\s5K,پ}ٳg{9~֭[x!of;vطo_-3tAy4ىɹ\vN^fffeeUb꽿w?5kV˖-y֬Yx :wvϞ=lٲ> %%oL0*&D%y|[b3uTGk/=[}f01T X`*;yG  s < /xGalڵKѶmX][o|{7 TQQjժg}6;;;33ɓ@ ;;IKKKE￿cǎk׮ݿm׮݅^8x`qXkC7n,[-[蕓Vr3&Ї! o9 ;;ԮB?cƌ3fԹѣGg̘xbȓ+aSa4R;/-kWNӱcǖ-[/ja | '7yDI:[ *!7)ݏa4d o9EV3Z]{3 < O BBz7$Bŷbǎ_}؋M4yKmmmIIy0B ]$& F` \|MMMQQQ؋D{8L8Jy|2|#aa-Zxg>H}F}>0$3,)wkl &vÇ>\gx ^Pgük ǎ;p@yy^B($M>7$<j„ }YEEEŴ+rҤI=z@@LY 0A\h[j^m+J%'߉gxtƇ *wzls 7X~*7|>כv3xId 5L2>JCڛ|Bx\&xCoSRߟI0@ P\\,pݹ Gk:(**x<F7IWYYYVV&49 ~k׿%HMM4hPnڴiS^WK,Bs= ,ЦՀB61FM\& Ž0޲y @@w)sha!x >oKs?ҥK nƾ}9wٷoߕW^)XpE4h2 ruqBgGpB!D? . r6mڬ^sB*&隈S;!Đ!C7okf͚yT&*J]~[JH ;d :$A˖-9}ax`cDw`ggg_p {p jK +Z Ӷ\‡6zb }~ܸqBzĈՑ<#۶m}ꩧTSUX#&=, D͹P8gF0  S]T0TցBL0aĉ@ ??GҥK֭].O?cǎ_~СC~ޛJIOӳv+yʌ5F_31ݎ $|dg W:Q9S;%\Rݻjժe˖ݻwG+**п}u٣p54I{iӦM4iҵk#FDxb5j( .gռ@wYt{֟{ݻwWTTh =2=zac DEPkC7Z={o۷E~駚/rΜ9۷饗jXT~{GnT-b'5k.=DeMu\aOoڴL2E]T^^w3f,['h۶mݧM>IͶ~ȑd M0'~2~?&NiӦ֭[_CҋW^y%Kڷo?a„#Gr)W\qWjEEEFFF\;KIIIbziޤBKMMM ;GvҤ 57&._}HRqqt`zUXXx>e˖/j*## /|O>3B1cƶm~֯_?--}O>dIIInO<9f̘.,;;y=zXrepAIKJJ\.Wvv7p\g>s=ܓ=}tMo233;~Y&}q\Ǐ'5j֪Un{㪔y޼y[lٽ{S~ Ǐ۶mՁ )x%P%1$|XE:Ixb9t&ڵksѣGW\jժ)S$z63SNСÔ)S>쳢"/LҮ]gyF~,Tv;j!qX%ujY]I^9DrOVn /'!/{wD&=(7[ %WÃC@BVPFPAP]\Y.D@XX9  靶&m;$n:{>|zi7}On| BBBN:u~ ۳g/bp+VHLLv?Pb A-Z7i$!?t҈W^=~xnnŋsεۖ-[:w}ӧ S>#_|n֬Y˖-+ZV?gΜE~8? oIn6PJl;;t*-?wq-w!Z&'edG7TTׯ7mأG|gǏ껲UJJi~gǎ{BLۿeF?~Y;w*Ǎ9sfNNҥKgΜiލ\m?qҺޢEԩS_~iZ>{21!? O 9恇sHc&ްaCG7LMMm߾ƍFOСC̗$%%o|xjjjiiu1B&MԪUԉc'W?mUU&44t̘1BÇx8B~XQFB3g(o͟?ڵ -ƴyJ=cwݻwNNΚ5kFܩS;wVsu.\X~m>SN/SSScbbK֫Wzr}~jWxSN)[N:wpj~~zp/'~ߖAϖ7fm寽ZZZ+޽]]iӦ_~9%%w2ޞ ]}I&O:o~z^^_|QӇWZ/Bԭ[ٳ>44Tq-Ŕ'6*;,l e{noΓ2hР5jddd|Ǖ(++SEݻ+333/\ 4h… O<O!V\,Y"شio}&$$(+}Qߺ˗^h4ijWIlKOOBfbCqf+{s㮤Ն0iܸѣ'O߬ ̙3';;;>>4ܺu+%%E%%%!!!>m~bdK.Y^reAAw}Wq=h4nRA !6l`>uݻw'BRUTv4BW:=qnvl<]wm С˗u6w܃ƌ#F̜9S=vM6---7n2P̙3BtݼpAAAQQlRb Ӓ]vWy_@$77/^B͞=[1~֬YZU\}0/.Y$++kРA'N8qF񫯾1bDYYYFQ q[/\3˸)22rǎ޽{ԩSNj4"""|{;YlY~֬Y~nFgϞ/RFVݸqcǎ۶mjo3f8p)SVZըQ3gJ_>}3<>TU-~24/E܇5oqHM#gSN|*S&"C"4;ph4_=`!߾f͚.]X駟 vq!裏r8z^ũj_vn;}z B{ĈBQF :Tj͚5]tYnݩSj׮?/]]vw6߹%OxX?7bU5=Q8 s[nB<Ǚٳg~իX\\9qġCV\ /_̟9_{5GgwpDw XvvI&gΜ9c Æ [zb۶mBx֪UKR`JNW^HHHNN2L92,1cƄOk֬Laa͛͗SNYyݻ>J6lX^^~ UJOe<<;9<H࣑MN:U˟3gΘ/{Ee={HNիb…-Z$5`1XGUO=TDD;ɘ07};ۈơ"{7/8cY ɔ)S6mڔѹsq=SZJOO>}}v&'O^|5kZ̙3***-[dɒ{ΉjEFF !f̘aÆUV%%%k:nܸqhҤ?lbg1X5jᡇRiDc΢(v3l۶BK:4..δIllڵky%KLII~7j/e8길7nt199y۶mIIIK.}饗׿[gϞ[ڵk” ,Bp@\\֭[w&%%kɓ'Ǎ9k֬ϴɃ>xQFk.+++!!ᩧǫT*!~rgv,;ULwY %<<n!)g͚ehɒ%'Oܼy#zZ۴iٓQPP0|GǻErʪssߴXgznp;ӿeee COjb.vzTQQ8ausw\龁J96r!D߾}NJ?n߾]qwݻ7>>~Ν;vT61 f͚1cW^?OȕN`cm;]/xwMlFQVu0Hi9;(?=ziիGw^!omJBӧoݺ>p @pqlcǎ !n.>|xϞ=JRWqq+ @0s,9sFѽ{wUsI&kW^u !DzWV:</ g ^Xx3#hY 㱇=eE`w*=MOHpqșx',Z:eUiv=WE <ŦrWtȫFj;9_VVVjLYk|-Of{>gZǏ?~ֆP#": Zz͛7{0 =B#81;=^sӰ3=LFB$TsG </^\^=U7n\~}[-[aÆ\RRnݺtN״iJ?￿zjBBBRRҠAmo{e!DB|eɥK8>=====]ԬY3+++++k߾}Ç0`m ֣GGG !Faaa=? HR.rwjժUJJJUۖ !""",GFF !lg/n+wQ^^^XXjCBB|]x\aa;$FcTT+;qW}gG&m87uVDDDhh+JZxxxXXBBp ?uBƪހUX,qVZFNVޢh4 L;$BBB ۹CϿn+;qt['kj5w'{U믿޺u999BDW%&& !|DDħ~|XJKKBh;wB/\t=zx8L.*.\kkNQRRرC>䓦[n5 -[4KߦM-Z}\|W3{gĆnj177WhWsh@x$@@x$ vg{yӠk^ZYM+E <  6Z  0@Jua[obh]+2 h@x$@z@SmUnGUiyW:y?h@x$@@x$ v4X +\5 a <  <  F izcx-Hx@dih7 1119s$jTh@x$@@x$@@B-$n?G9 ?q>G < E`v   0 ==x`$q3Z-. n?G]`+9Z  ,v%$$(x@ 8p-[bbbW8q"###::zڴi 4>}ZNKK~+ zJoܸqJ Ȩt֭jz)))*JR=wuWii}b|JHO-Z(66^*jݮnݺ-[4ޫ(pv2 ?իW|ѣyN:)?*E ƍǏ>33SѱcGe-rUh˽5݀/ڵ-[ Twmjjߝ˗/ !L/ԙ(K.]Jp>66?^4hРdS1݀k>={N:V>v|JH˫Vjذ#*SXX(6::ZQTTp5M͚57|(v2tB'OnܸTYe3nܸ^z)K"UEE2oܤIGL,a<22RaP|tt RSS5Maa ˏ>UV)))o7 '廹v֭[?IIIyyy_mۖ,YҬYF @x>ӧO?͛7QLyx_\\l\yxDӧό3/^ܵkWF#9rd ç~ HHI&gnժUDDDÆ ǎۣG?X)2337mԼyvx!DAAreI\\jiIII;v~_~Bg*?d.jB9sF/8P)˗ éS?[:t?񏔔X!D^^E7n!jժpu !FJ ȨN:LԩSGqu RDDD}+P5j!áCIII^;[[FU999BD .n@FP_.hР_pZH)55555b}Ν۲eYfv/_JKKMct=zx駟޺u^z:u2_&hѢ#n@F;oޯ_&ڵKѬY3G@hڴiӢE7n,^BQZZ:wܲݻGEEJz .Tڄ%%%ׯ߱cV}'|5mڴe˖gϞ7o2\YY'|߆lSYOI)-ڵ3oB\reɷn݊LLL<{^oРyCk׮ݼyBFDD(jW^yżYo7 )ST^zɼi/8`M=c _ŋ{W޽k\ٳW\۷﫯!$$C)))yyyݺu2eŋ|լYW^7o޼uV :u4y6mژ X <  <  <  <  <  < @BBBB.]~ sssbV2-PΟ?ª8TiZJ5g7sٲe*ou>hСqqqپܟ~i͚5m۶>}_믿z@/_:uۻwoO93f(,,0a+@pYdI5L?fggٳg޽fj׮ݠA|XC|ٳg'$$\~ݣ0a­[~mIIIcƌ?_?þkaaa?^1~xY*l~?O>]tu]lyח-[ꫯ>C* (Ѕ`i̘1}B\rŋ*nݺu֍]ܢEÆ uEѨQ{}]P;SpQieeeEEEFq@VV͛hd~~~IIGte?=<Nѱ֣{ZaayuVV-Vۮ]qƝcǎSNyF@1TU_~B[n(\Ҵ\Y{^XFYR~mB7oz}Yl2o޼gm۶5u 6cǎ… ͏;k֬_^RիW[R2g僅iӦ;wn^dOGѳgO!Ă #J$_|񅲼QF6m4gΜ6m!ÕUJWoB$$$X_9nJJu˖-ۿmL׹Yf^Ѩ !?nV9ZB<[lٷoo#Rׯ/5jL0AٛVw~3zȞ."@1e˖4tӧKY{}Y$|/ !4_|aܹs-ZBDDD?޴ԤܳgONgɣ>T %l2++T2??O>fgW^t\CTO?B 뵦̞=|YL]x^xAYO?}? !V-++x׸qFyz뭴4!]wݵyJ'/_\/vҥK+VPVj G|8saӦMGB 64^t󢅄,YĢ_2̛"33=߿_ѦMGW7_2x`C_z%UC Q>XqBcǎUUg.x@%~f͚m߾Wضm^BL8z۬Y3!?`;lժ&M( JZƍx͚5ݻ[nm0116\rEQvmez~71=}ݻE7 `0<"@~"33sҥ/_0`~듺>}ZѰaJB()]iE7׼ys#)M-[^%ղ6dgg !m[nU0=ڏV Tx_!!!ƍ۱cZSLIM}%UK!D^^ņճU=j 7vt ʔu =,p~jժ%xPN:B_'4[-`Oa6 k4{vb΢G"""ʋ)--TxP9ev!ą $!DnݪՉ--++ҵ/^tQzN3 7ovw| *UegV5[EEEEEjvRSf\^{qv 7[@ J { !_N: !^W_Yɉh4ӧOwnBoXuܹ;v8[WvmBK.yN3V<(<h={Ç=nӟ#Fؽ{*^?bĈ|J5|p?lذ!ɓ߷/**z****SqB~'!DRRi<9μ7 WQp…;w*,::IT*բE뮼}>ݺukܸӧ/_~ !ĴiӚ6mccc.]O9rk׮#G;N:nݺCueBe4͛77oܼy\.]h_~Gnܳ礧 !ƍgcmzV^Ąjҭ[;w:ҥKk׮]viUHHȋ/8{lWSOUTT3oiK/ԬY3%GFFwQa4}Q!… _~eW*`At}֭?\w޾A.QvݻO4ȑ#mez1ym֬YSvqذa^xgGEEuyݺuK,~"<<<,,T3gN&M6lz,TU @3f̊+ڴi&Mdgg>}ZΟ͘1c̙'N\`@P˶m۶m***m&3McǎBuօKFm۶=rȑ#G֯_ojݺuh ~Ǝf^o4hGg̘:mqqqӧwޭVԩc4>/1zZvÆ ܹn~֭[_}U͚5}]1@aVB@\@S9 Fy![RX)#[d@= BAmenu.js Fy![RX)#[d@ dCAplugin.yml Fy![RX)#[d@lSDAquarto-menu.js Fy![RX)#[d@8 E Amenu.css Fy![RX)#[d@]FAquarto-menu.css!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).RevealMenu=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t,n){return e(n={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&n.path)}},n.exports),n.exports}var n=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!o.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:o},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},d="".split,p=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?d.call(e,""):Object(e)}:Object,h=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return p(h(e))},v=function(e){return"object"==typeof e?null!==e:"function"==typeof e},g=function(e,t){if(!v(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!v(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},S=r.document,E=v(S)&&v(S.createElement),x=!a&&!i((function(){return 7!=Object.defineProperty((e="div",E?S.createElement(e):{}),"a",{get:function(){return 7}}).a;var e})),w=Object.getOwnPropertyDescriptor,L={f:a?w:function(e,t){if(e=m(e),t=g(t,!0),x)try{return w(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},T=function(e){if(!v(e))throw TypeError(String(e)+" is not an object");return e},C=Object.defineProperty,O={f:a?C:function(e,t,n){if(T(e),t=g(t,!0),T(n),x)try{return C(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},A=a?function(e,t,n){return O.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},k=function(e,t){try{A(r,e,t)}catch(n){r[e]=t}return t},I=r["__core-js_shared__"]||k("__core-js_shared__",{}),P=Function.toString;"function"!=typeof I.inspectSource&&(I.inspectSource=function(e){return P.call(e)});var M,R,j,N,_=I.inspectSource,F=r.WeakMap,W="function"==typeof F&&/native code/.test(_(F)),H=t((function(e){(e.exports=function(e,t){return I[e]||(I[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),U=0,$=Math.random(),D=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++U+$).toString(36)},q=H("keys"),B={},G=r.WeakMap;if(W){var V=new G,K=V.get,z=V.has,X=V.set;M=function(e,t){return X.call(V,e,t),t},R=function(e){return K.call(V,e)||{}},j=function(e){return z.call(V,e)}}else{var Y=q[N="state"]||(q[N]=D(N));B[Y]=!0,M=function(e,t){return A(e,Y,t),t},R=function(e){return b(e,Y)?e[Y]:{}},j=function(e){return b(e,Y)}}var J={set:M,get:R,has:j,enforce:function(e){return j(e)?R(e):M(e,{})},getterFor:function(e){return function(t){var n;if(!v(t)||(n=R(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Z=t((function(e){var t=J.get,n=J.enforce,i=String(String).split("String");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof a&&("string"!=typeof t||b(a,"name")||A(a,"name",t),n(a).source=i.join("string"==typeof t?t:"")),e!==r?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=a:A(e,t,a)):l?e[t]=a:k(t,a)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||_(this)}))})),Q=r,ee=function(e){return"function"==typeof e?e:void 0},te=function(e,t){return arguments.length<2?ee(Q[e])||ee(r[e]):Q[e]&&Q[e][t]||r[e]&&r[e][t]},ne=Math.ceil,re=Math.floor,ie=function(e){return isNaN(e=+e)?0:(e>0?re:ne)(e)},ae=Math.min,oe=function(e){return e>0?ae(ie(e),9007199254740991):0},se=Math.max,le=Math.min,ce=function(e,t){var n=ie(e);return n<0?se(n+t,0):le(n,t)},ue=function(e){return function(t,n,r){var i,a=m(t),o=oe(a.length),s=ce(r,o);if(e&&n!=n){for(;o>s;)if((i=a[s++])!=i)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},fe={includes:ue(!0),indexOf:ue(!1)},de=fe.indexOf,pe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),he={f:Object.getOwnPropertyNames||function(e){return function(e,t){var n,r=m(e),i=0,a=[];for(n in r)!b(B,n)&&b(r,n)&&a.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(a,n)||a.push(n));return a}(e,pe)}},me={f:Object.getOwnPropertySymbols},ve=te("Reflect","ownKeys")||function(e){var t=he.f(T(e)),n=me.f;return n?t.concat(n(e)):t},ge=function(e,t){for(var n=ve(t),r=O.f,i=L.f,a=0;ay;y++)if((o||y in m)&&(d=v(f=m[y],y,h),e))if(t)S[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:We.call(S,f)}else if(i)return!1;return a?-1:r||i?i:S}},Ue={forEach:He(0),map:He(1),filter:He(2),some:He(3),every:He(4),find:He(5),findIndex:He(6)},$e=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},De=Object.defineProperty,qe={},Be=function(e){throw e},Ge=function(e,t){if(b(qe,e))return qe[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,o=b(t,0)?t[0]:Be,s=b(t,1)?t[1]:void 0;return qe[e]=!!n&&!i((function(){if(r&&!a)return!0;var e={length:-1};r?De(e,1,{enumerable:!0,get:Be}):e[1]=1,n.call(e,o,s)}))},Ve=Ue.every,Ke=$e("every"),ze=Ge("every");Ce({target:"Array",proto:!0,forced:!Ke||!ze},{every:function(e){return Ve(this,e,arguments.length>1?arguments[1]:void 0)}});var Xe,Ye,Je=te("navigator","userAgent")||"",Ze=r.process,Qe=Ze&&Ze.versions,et=Qe&&Qe.v8;et?Ye=(Xe=et.split("."))[0]+Xe[1]:Je&&(!(Xe=Je.match(/Edge\/(\d+)/))||Xe[1]>=74)&&(Xe=Je.match(/Chrome\/(\d+)/))&&(Ye=Xe[1]);var tt=Ye&&+Ye,nt=Ne("species"),rt=function(e){return tt>=51||!i((function(){var t=[];return(t.constructor={})[nt]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},it=Ue.filter,at=rt("filter"),ot=Ge("filter");Ce({target:"Array",proto:!0,forced:!at||!ot},{filter:function(e){return it(this,e,arguments.length>1?arguments[1]:void 0)}});var st=Ue.forEach,lt=$e("forEach"),ct=Ge("forEach"),ut=lt&&ct?[].forEach:function(e){return st(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=ut},{forEach:ut});var ft=fe.indexOf,dt=[].indexOf,pt=!!dt&&1/[1].indexOf(1,-0)<0,ht=$e("indexOf"),mt=Ge("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:pt||!ht||!mt},{indexOf:function(e){return pt?dt.apply(this,arguments)||0:ft(this,e,arguments.length>1?arguments[1]:void 0)}}),Ce({target:"Array",stat:!0},{isArray:ke});var vt=[].join,gt=p!=Object,yt=$e("join",",");Ce({target:"Array",proto:!0,forced:gt||!yt},{join:function(e){return vt.call(m(this),void 0===e?",":e)}});var bt=Math.min,St=[].lastIndexOf,Et=!!St&&1/[1].lastIndexOf(1,-0)<0,xt=$e("lastIndexOf"),wt=Ge("indexOf",{ACCESSORS:!0,1:0}),Lt=Et||!xt||!wt?function(e){if(Et)return St.apply(this,arguments)||0;var t=m(this),n=oe(t.length),r=n-1;for(arguments.length>1&&(r=bt(r,ie(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:St;Ce({target:"Array",proto:!0,forced:Lt!==[].lastIndexOf},{lastIndexOf:Lt});var Tt=Ue.map,Ct=rt("map"),Ot=Ge("map");Ce({target:"Array",proto:!0,forced:!Ct||!Ot},{map:function(e){return Tt(this,e,arguments.length>1?arguments[1]:void 0)}});var At=function(e,t,n){var r=g(t);r in e?O.f(e,r,c(0,n)):e[r]=n},kt=rt("slice"),It=Ge("slice",{ACCESSORS:!0,0:0,1:2}),Pt=Ne("species"),Mt=[].slice,Rt=Math.max;Ce({target:"Array",proto:!0,forced:!kt||!It},{slice:function(e,t){var n,r,i,a=m(this),o=oe(a.length),s=ce(e,o),l=ce(void 0===t?o:t,o);if(ke(a)&&("function"!=typeof(n=a.constructor)||n!==Array&&!ke(n.prototype)?v(n)&&null===(n=n[Pt])&&(n=void 0):n=void 0,n===Array||void 0===n))return Mt.call(a,s,l);for(r=new(void 0===n?Array:n)(Rt(l-s,0)),i=0;s>>0||(Qt.test(n)?16:10))}:Zt;Ce({global:!0,forced:parseInt!=en},{parseInt:en});var tn=function(){var e=T(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function nn(e,t){return RegExp(e,t)}var rn,an,on={UNSUPPORTED_Y:i((function(){var e=nn("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:i((function(){var e=nn("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},sn=RegExp.prototype.exec,ln=String.prototype.replace,cn=sn,un=(rn=/a/,an=/b*/g,sn.call(rn,"a"),sn.call(an,"a"),0!==rn.lastIndex||0!==an.lastIndex),fn=on.UNSUPPORTED_Y||on.BROKEN_CARET,dn=void 0!==/()??/.exec("")[1];(un||dn||fn)&&(cn=function(e){var t,n,r,i,a=this,o=fn&&a.sticky,s=tn.call(a),l=a.source,c=0,u=e;return o&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),dn&&(n=new RegExp("^"+l+"$(?!\\s)",s)),un&&(t=a.lastIndex),r=sn.call(o?n:a,u),o?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:un&&r&&(a.lastIndex=a.global?r.index+r[0].length:t),dn&&r&&r.length>1&&ln.call(r[0],n,(function(){for(i=1;i1?arguments[1]:void 0,r=oe(t.length),i=void 0===n?r:xn(oe(n),r),a=String(e);return En?En.call(t,a,i):t.slice(i-a.length,i)===a}});var Ln=Ne("species"),Tn=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),Cn="$0"==="a".replace(/./,"$0"),On=Ne("replace"),An=!!/./[On]&&""===/./[On]("a","$0"),kn=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),In=function(e,t,n,r){var a=Ne(e),o=!i((function(){var t={};return t[a]=function(){return 7},7!=""[e](t)})),s=o&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Ln]=function(){return n},n.flags="",n[a]=/./[a]),n.exec=function(){return t=!0,null},n[a](""),!t}));if(!o||!s||"replace"===e&&(!Tn||!Cn||An)||"split"===e&&!kn){var l=/./[a],c=n(a,""[e],(function(e,t,n,r,i){return t.exec===pn?o&&!i?{done:!0,value:l.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Cn,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:An}),u=c[0],f=c[1];Z(String.prototype,e,u),Z(RegExp.prototype,a,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&A(RegExp.prototype[a],"sham",!0)},Pn=function(e){return function(t,n){var r,i,a=String(h(t)),o=ie(n),s=a.length;return o<0||o>=s?e?"":void 0:(r=a.charCodeAt(o))<55296||r>56319||o+1===s||(i=a.charCodeAt(o+1))<56320||i>57343?e?a.charAt(o):r:e?a.slice(o,o+2):i-56320+(r-55296<<10)+65536}},Mn={codeAt:Pn(!1),charAt:Pn(!0)}.charAt,Rn=function(e,t,n){return t+(n?Mn(e,t).length:1)},jn=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return pn.call(e,t)},Nn=Math.max,_n=Math.min,Fn=Math.floor,Wn=/\$([$&'`]|\d\d?|<[^>]*>)/g,Hn=/\$([$&'`]|\d\d?)/g;In("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,a=r.REPLACE_KEEPS_$0,o=i?"$":"$0";return[function(n,r){var i=h(this),a=null==n?void 0:n[e];return void 0!==a?a.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&a||"string"==typeof r&&-1===r.indexOf(o)){var l=n(t,e,this,r);if(l.done)return l.value}var c=T(e),u=String(this),f="function"==typeof r;f||(r=String(r));var d=c.global;if(d){var p=c.unicode;c.lastIndex=0}for(var h=[];;){var m=jn(c,u);if(null===m)break;if(h.push(m),!d)break;""===String(m[0])&&(c.lastIndex=Rn(u,oe(c.lastIndex),p))}for(var v,g="",y=0,b=0;b=y&&(g+=u.slice(y,E)+O,y=E+S.length)}return g+u.slice(y)}];function s(e,n,r,i,a,o){var s=r+e.length,l=i.length,c=Hn;return void 0!==a&&(a=Ae(a),c=Wn),t.call(o,c,(function(t,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":c=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return t;if(u>l){var f=Fn(u/10);return 0===f?t:f<=l?void 0===i[f-1]?o.charAt(1):i[f-1]+o.charAt(1):t}c=i[u-1]}return void 0===c?"":c}))}}));var Un=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};In("search",1,(function(e,t,n){return[function(t){var n=h(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=T(e),a=String(this),o=i.lastIndex;Un(o,0)||(i.lastIndex=0);var s=jn(i,a);return Un(i.lastIndex,o)||(i.lastIndex=o),null===s?-1:s.index}]}));var $n=Ne("species"),Dn=[].push,qn=Math.min,Bn=!i((function(){return!RegExp(4294967295,"y")}));In("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(h(this)),i=void 0===n?4294967295:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!vn(e))return t.call(r,e,i);for(var a,o,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,f=new RegExp(e.source,c+"g");(a=pn.call(f,r))&&!((o=f.lastIndex)>u&&(l.push(r.slice(u,a.index)),a.length>1&&a.index=i));)f.lastIndex===a.index&&f.lastIndex++;return u===r.length?!s&&f.test("")||l.push(""):l.push(r.slice(u)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=h(this),a=null==t?void 0:t[e];return void 0!==a?a.call(t,i,n):r.call(String(i),t,n)},function(e,i){var a=n(r,e,this,i,r!==t);if(a.done)return a.value;var o=T(e),s=String(this),l=function(e,t){var n,r=T(e).constructor;return void 0===r||null==(n=T(r)[$n])?t:Oe(n)}(o,RegExp),c=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(Bn?"y":"g"),f=new l(Bn?o:"^(?:"+o.source+")",u),d=void 0===i?4294967295:i>>>0;if(0===d)return[];if(0===s.length)return null===jn(f,s)?[s]:[];for(var p=0,h=0,m=[];h1?arguments[1]:void 0,t.length)),r=String(e);return Vn?Vn.call(t,r,n):t.slice(n,n+r.length)===r}});var Xn,Yn=Kt.trim;Ce({target:"String",proto:!0,forced:(Xn="trim",i((function(){return!!Dt[Xn]()||"​…᠎"!="​…᠎"[Xn]()||Dt[Xn].name!==Xn})))},{trim:function(){return Yn(this)}});for(var Jn in{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Zn=r[Jn],Qn=Zn&&Zn.prototype;if(Qn&&Qn.forEach!==ut)try{A(Qn,"forEach",ut)}catch(e){Qn.forEach=ut}}var er=[].slice,tr=function(e){return function(t,n){var r=arguments.length>2,i=r?er.call(arguments,2):void 0;return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,i)}:t,n)}};Ce({global:!0,bind:!0,forced:/MSIE .\./.test(Je)},{setTimeout:tr(r.setTimeout),setInterval:tr(r.setInterval)});return String.prototype.startsWith||(String.prototype.startsWith=function(e,t){return this.substr(t||0,e.length)===e}),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){return(void 0===t||t>this.length)&&(t=this.length),this.substring(t-e.length,t)===e}),function(){var e,t,n,r,i=(e=/(msie) ([\w.]+)/.exec(window.navigator.userAgent.toLowerCase()))&&"msie"===e[1]?parseFloat(e[2]):null,a=!1;function o(e){(r=e.menu||{}).path=r.path||function(){var e;if(document.querySelector('script[src$="menu.js"]')){var t=document.querySelector('script[src$="menu.js"]');t&&(e=t.src.slice(0,-7))}else e=("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).slice(0,("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).lastIndexOf("/")+1);return e}()||"plugin/menu/",r.path.endsWith("/")||(r.path+="/"),void 0===r.side&&(r.side="left"),void 0===r.numbers&&(r.numbers=!1),"string"!=typeof r.titleSelector&&(r.titleSelector="h1, h2, h3, h4, h5"),void 0===r.hideMissingTitles&&(r.hideMissingTitles=!1),void 0===r.useTextContentForMissingTitles&&(r.useTextContentForMissingTitles=!1),void 0===r.markers&&(r.markers=!0),"string"!=typeof r.themesPath&&(r.themesPath="dist/theme/"),r.themesPath.endsWith("/")||(r.themesPath+="/"),O("link#theme")||(r.themes=!1),!0===r.themes?r.themes=[{name:"Black",theme:r.themesPath+"black.css"},{name:"White",theme:r.themesPath+"white.css"},{name:"League",theme:r.themesPath+"league.css"},{name:"Sky",theme:r.themesPath+"sky.css"},{name:"Beige",theme:r.themesPath+"beige.css"},{name:"Simple",theme:r.themesPath+"simple.css"},{name:"Serif",theme:r.themesPath+"serif.css"},{name:"Blood",theme:r.themesPath+"blood.css"},{name:"Night",theme:r.themesPath+"night.css"},{name:"Moon",theme:r.themesPath+"moon.css"},{name:"Solarized",theme:r.themesPath+"solarized.css"}]:Array.isArray(r.themes)||(r.themes=!1),void 0===r.transitions&&(r.transitions=!1),!0===r.transitions?r.transitions=["None","Fade","Slide","Convex","Concave","Zoom"]:!1===r.transitions||Array.isArray(r.transitions)&&r.transitions.every((function(e){return"string"==typeof e}))||(console.error("reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')"),r.transitions=!1),i&&i<=9&&(r.transitions=!1),void 0===r.openButton&&(r.openButton=!0),void 0===r.openSlideNumber&&(r.openSlideNumber=!1),void 0===r.keyboard&&(r.keyboard=!0),void 0===r.sticky&&(r.sticky=!1),void 0===r.autoOpen&&(r.autoOpen=!0),void 0===r.delayInit&&(r.delayInit=!1),void 0===r.openOnInit&&(r.openOnInit=!1)}var s=!0;function l(){s=!1}function c(){O("nav.slide-menu").addEventListener("mousemove",(function e(t){O("nav.slide-menu").removeEventListener("mousemove",e),s=!0}))}function u(e){var t=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-e.scrollLeft,n+=e.offsetTop-e.scrollTop,e=e.offsetParent;return{top:n,left:t}}(e).top-e.offsetParent.offsetTop;if(t<0)return-t;var n=e.offsetParent.offsetHeight-(e.offsetTop-e.offsetParent.scrollTop+e.offsetHeight);return n<0?n:0}function f(e){var t=u(e);t&&(l(),e.scrollIntoView(t>0),c())}function d(e){l(),e.offsetParent.scrollTop=e.offsetTop,c()}function p(e){l(),e.offsetParent.scrollTop=e.offsetTop-e.offsetParent.offsetHeight+e.offsetHeight,c()}function h(e){e.classList.add("selected"),f(e),r.sticky&&r.autoOpen&&E(e)}function m(e){if(b())switch(e.stopImmediatePropagation(),e.keyCode){case 72:case 37:!function(){var e=parseInt(O(".active-toolbar-button").getAttribute("data-button"))-1;e<0&&(e=T-1);S(null,O('.toolbar-panel-button[data-button="'+e+'"]').getAttribute("data-panel"))}();break;case 76:case 39:l=(parseInt(O(".active-toolbar-button").getAttribute("data-button"))+1)%T,S(null,O('.toolbar-panel-button[data-button="'+l+'"]').getAttribute("data-panel"));break;case 75:case 38:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))-1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 74:case 40:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))+1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 33:case 85:var t=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)>0})),n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})),r=t.length>0&&Math.abs(u(t[t.length-1]))0&&(p(r),r=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[0]==r?t[t.length-1]:n[0]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(r),d(r));break;case 34:case 68:n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)}));var i=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)<0})),a=i.length>0&&Math.abs(u(i[0]))0&&(d(a),a=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[n.length-1]==a?i[0]:n[n.length-1]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(a),p(a));break;case 36:A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items li:first-of-type"))&&(o.classList.add("selected"),f(o));break;case 35:var o;A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items:last-of-type li:last-of-type"))&&(o.classList.add("selected"),f(o));break;case 32:case 13:var s;(s=O(".active-menu-panel .slide-menu-items li.selected"))&&E(s,!0);break;case 27:g(null,!0)}var l}function v(e){(e&&e.preventDefault(),b())||(O("body").classList.add("slide-menu-active"),O(".reveal").classList.add("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.add("active"),O(".slide-menu-overlay").classList.add("active"),r.themes&&(A('div[data-panel="Themes"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-theme="'+O("link#theme").getAttribute("href")+'"]').forEach((function(e){e.classList.add("active")}))),r.transitions&&(A('div[data-panel="Transitions"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-transition="'+n.transition+'"]').forEach((function(e){e.classList.add("active")}))),A(".slide-menu-panel li.active").forEach((function(e){e.classList.add("selected"),f(e)})))}function g(e,t){e&&e.preventDefault(),r.sticky&&!t||(O("body").classList.remove("slide-menu-active"),O(".reveal").classList.remove("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.remove("active"),O(".slide-menu-overlay").classList.remove("active"),A(".slide-menu-panel li.selected").forEach((function(e){e.classList.remove("selected")})))}function y(e){b()?g(e,!0):v(e)}function b(){return O("body").classList.contains("slide-menu-active")}function S(e,t){v(e);var n=t;"string"!=typeof t&&(n=e.currentTarget.getAttribute("data-panel")),O(".slide-menu-toolbar > li.active-toolbar-button").classList.remove("active-toolbar-button"),O('li[data-panel="'+n+'"]').classList.add("active-toolbar-button"),O(".slide-menu-panel.active-menu-panel").classList.remove("active-menu-panel"),O('div[data-panel="'+n+'"]').classList.add("active-menu-panel")}function E(e,n){var i=parseInt(e.getAttribute("data-slide-h")),a=parseInt(e.getAttribute("data-slide-v")),o=e.getAttribute("data-theme"),s=e.getAttribute("data-highlight-theme"),l=e.getAttribute("data-transition");isNaN(i)||isNaN(a)||t.slide(i,a),o&&I("theme",o),s&&I("highlight-theme",s),l&&t.configure({transition:l});var c=O("a",e);c&&(n||!r.sticky||r.autoOpen&&c.href.startsWith("#")||c.href.startsWith(window.location.origin+window.location.pathname+"#"))&&c.click(),g()}function x(e){"A"!==e.target.nodeName&&e.preventDefault(),E(e.currentTarget)}function w(){var e=t.getState();A("li.slide-menu-item, li.slide-menu-item-vertical").forEach((function(t){t.classList.remove("past"),t.classList.remove("active"),t.classList.remove("future");var n=parseInt(t.getAttribute("data-slide-h")),r=parseInt(t.getAttribute("data-slide-v"));n",s.appendChild(k("br"),O("i",s)),s.appendChild(k("span",{class:"slide-menu-toolbar-label"},e),O("i",s)),s.onclick=i,d.appendChild(s),s},i=function(e,i,a,o,s){function l(e,t){if(""===e)return null;var n=t?O(e,i):O(e);return n?n.textContent:null}var c=i.getAttribute("data-menu-title")||l(".menu-title",i)||l(r.titleSelector,i);if(!c&&r.useTextContentForMissingTitles&&(c=i.textContent.trim())&&(c=c.split("\n").map((function(e){return e.trim()})).join(" ").trim().replace(/^(.{16}[^\s]*).*/,"$1").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")+"..."),!c){if(r.hideMissingTitles)return"";e+=" no-title",c="Slide "+(a+1)}var u=k("li",{class:e,"data-item":a,"data-slide-h":o,"data-slide-v":void 0===s?0:s});if(r.markers&&(u.appendChild(k("i",{class:"fas fa-check-circle fa-fw past"})),u.appendChild(k("i",{class:"fas fa-arrow-alt-circle-right fa-fw active"})),u.appendChild(k("i",{class:"far fa-circle fa-fw future"}))),r.numbers){var f=[],d="h.v";switch("string"==typeof r.numbers?d=r.numbers:"string"==typeof n.slideNumber&&(d=n.slideNumber),d){case"c":f.push(a+1);break;case"c/t":f.push(a+1,"/",t.getTotalSlides());break;case"h/v":f.push(o+1),"number"!=typeof s||isNaN(s)||f.push("/",s+1);break;default:f.push(o+1),"number"!=typeof s||isNaN(s)||f.push(".",s+1)}u.appendChild(k("span",{class:"slide-menu-item-number"},f.join("")+". "))}return u.appendChild(k("span",{class:"slide-menu-item-title"},c)),u},o=function(e){s&&(A(".active-menu-panel .slide-menu-items li.selected").forEach((function(e){e.classList.remove("selected")})),e.currentTarget.classList.add("selected"))},l=O(".reveal").parentElement,c=k("div",{class:"slide-menu-wrapper"});l.appendChild(c);var u=k("nav",{class:"slide-menu slide-menu--"+r.side});"string"==typeof r.width&&(-1!=["normal","wide","third","half","full"].indexOf(r.width)?u.classList.add("slide-menu--"+r.width):(u.classList.add("slide-menu--custom"),u.style.width=r.width)),c.appendChild(u),L();var f=k("div",{class:"slide-menu-overlay"});c.appendChild(f),f.onclick=function(){g(null,!0)};var d=k("ol",{class:"slide-menu-toolbar"});O(".slide-menu").appendChild(d),e("Slides","Slides","fa-images","fas",S,!0),r.custom&&r.custom.forEach((function(t,n,r){e(t.title,"Custom"+n,t.icon,null,S)})),r.themes&&e("Themes","Themes","fa-adjust","fas",S),r.transitions&&e("Transitions","Transitions","fa-sticky-note","fas",S);var p=k("li",{id:"close",class:"toolbar-panel-button"});if(p.appendChild(k("i",{class:"fas fa-times"})),p.appendChild(k("br")),p.appendChild(k("span",{class:"slide-menu-toolbar-label"},"Close")),p.onclick=function(){g(null,!0)},d.appendChild(p),function e(){if(document.querySelector("section[data-markdown]:not([data-markdown-parsed])"))setTimeout(e,100);else{var t=k("div",{"data-panel":"Slides",class:"slide-menu-panel active-menu-panel"});t.appendChild(k("ul",{class:"slide-menu-items"})),u.appendChild(t);var n=O('.slide-menu-panel[data-panel="Slides"] > .slide-menu-items'),r=0;A(".slides > section").forEach((function(e,t){var a=A("section",e);if(a.length>0)a.forEach((function(e,a){var o=i(0===a?"slide-menu-item":"slide-menu-item-vertical",e,r,t,a);o&&n.appendChild(o),r++}));else{var o=i("slide-menu-item",e,r,t);o&&n.appendChild(o),r++}})),A(".slide-menu-item, .slide-menu-item-vertical").forEach((function(e){e.onclick=x})),w()}}(),t.addEventListener("slidechanged",w),r.custom){var h=function(){this.status>=200&&this.status<300?(this.panel.innerHTML=this.responseText,C(this.panel)):I(this)},E=function(){I(this)},C=function(e){A("ul.slide-menu-items li.slide-menu-item",e).forEach((function(e,t){e.setAttribute("data-item",t+1),e.onclick=x,e.addEventListener("mouseenter",o)}))},I=function(e){var t="

ERROR: The attempt to fetch "+e.responseURL+" failed with HTTP status "+e.status+" ("+e.statusText+").

Remember that you need to serve the presentation HTML from a HTTP server.

";e.panel.innerHTML=t};r.custom.forEach((function(e,t,n){var r=k("div",{"data-panel":"Custom"+t,class:"slide-menu-panel slide-menu-custom-panel"});e.content?(r.innerHTML=e.content,C(r)):e.src&&function(e,t){var n=new XMLHttpRequest;n.panel=e,n.arguments=Array.prototype.slice.call(arguments,2),n.onload=h,n.onerror=E,n.open("get",t,!0),n.send(null)}(r,e.src),u.appendChild(r)}))}if(r.themes){var P=k("div",{class:"slide-menu-panel","data-panel":"Themes"});u.appendChild(P);var M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.themes.forEach((function(e,t){var n={class:"slide-menu-item","data-item":""+(t+1)};e.theme&&(n["data-theme"]=e.theme),e.highlightTheme&&(n["data-highlight-theme"]=e.highlightTheme);var r=k("li",n,e.name);M.appendChild(r),r.onclick=x}))}if(r.transitions){P=k("div",{class:"slide-menu-panel","data-panel":"Transitions"});u.appendChild(P);M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.transitions.forEach((function(e,t){var n=k("li",{class:"slide-menu-item","data-transition":e.toLowerCase(),"data-item":""+(t+1)},e);M.appendChild(n),n.onclick=x}))}if(r.openButton){var R=k("div",{class:"slide-menu-button"}),j=k("a",{href:"#"});j.appendChild(k("i",{class:"fas fa-bars"})),R.appendChild(j),O(".reveal").appendChild(R),R.onclick=v}if(r.openSlideNumber)O("div.slide-number").onclick=v;A(".slide-menu-panel .slide-menu-items li").forEach((function(e){e.addEventListener("mouseenter",o)}))}if(r.keyboard){if(document.addEventListener("keydown",m,!1),window.addEventListener("message",(function(e){var t;try{t=JSON.parse(e.data)}catch(e){}t&&"triggerKey"===t.method&&m({keyCode:t.args[0],stopImmediatePropagation:function(){}})})),n.keyboardCondition&&"function"==typeof n.keyboardCondition){var N=n.keyboardCondition;n.keyboardCondition=function(e){return N(e)&&(!b()||77==e.keyCode)}}else n.keyboardCondition=function(e){return!b()||77==e.keyCode};t.addKeyBinding({keyCode:77,key:"M",description:"Toggle menu"},y)}r.openOnInit&&v(),a=!0}function O(e,t){return t||(t=document),t.querySelector(e)}function A(e,t){return t||(t=document),Array.prototype.slice.call(t.querySelectorAll(e))}function k(e,t,n){var r=document.createElement(e);return t&&Object.getOwnPropertyNames(t).forEach((function(e){r.setAttribute(e,t[e])})),n&&(r.innerHTML=n),r}function I(e,t){var n=O("link#"+e),r=n.parentElement,i=n.nextElementSibling;n.remove();var a=n.cloneNode();a.setAttribute("href",t),a.onload=function(){L()},r.insertBefore(a,i)}function P(e,t,n){n.call()}function M(){var e,a,o,s=!i||i>=9;t.isSpeakerNotes()&&window.location.search.endsWith("controls=false")&&(s=!1),s&&(r.delayInit||C(),e="menu-ready",(o=document.createEvent("HTMLEvents",1,2)).initEvent(e,!0,!0),function(e,t){for(var n in t)e[n]=t[n]}(o,a),document.querySelector(".reveal").dispatchEvent(o),n.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:t.getState()}),"*"))}return{id:"menu",init:function(e){o(n=(t=e).getConfig()),P(r.path+"menu.css","stylesheet",(function(){void 0===r.loadIcons||r.loadIcons?P(r.path+"font-awesome/css/all.css","stylesheet",M):M()}))},toggle:y,openMenu:v,closeMenu:g,openPanel:S,isOpen:b,initialiseMenu:C,isMenuInitialised:function(){return a}}}})); name: RevealMenu script: [menu.js, quarto-menu.js] stylesheet: [menu.css, quarto-menu.css] config: menu: side: "left" useTextContentForMissingTitles: true markers: false loadIcons: false window.revealMenuToolHandler = function (handler) { return function (event) { event.preventDefault(); handler(); Reveal.getPlugin("menu").closeMenu(); }; }; window.RevealMenuToolHandlers = { fullscreen: revealMenuToolHandler(function () { const element = document.documentElement; const requestMethod = element.requestFullscreen || element.webkitRequestFullscreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullscreen; if (requestMethod) { requestMethod.apply(element); } }), speakerMode: revealMenuToolHandler(function () { Reveal.getPlugin("notes").open(); }), keyboardHelp: revealMenuToolHandler(function () { Reveal.toggleHelp(true); }), overview: revealMenuToolHandler(function () { Reveal.toggleOverview(true); }), toggleChalkboard: revealMenuToolHandler(function () { RevealChalkboard.toggleChalkboard(); }), toggleNotesCanvas: revealMenuToolHandler(function () { RevealChalkboard.toggleNotesCanvas(); }), downloadDrawings: revealMenuToolHandler(function () { RevealChalkboard.download(); }), togglePdfExport: revealMenuToolHandler(function () { PdfExport.togglePdfExport(); }), }; .slide-menu-wrapper { font-family: 'Source Sans Pro', Helvetica, sans-serif; } .slide-menu-wrapper .slide-menu { background-color: #333; z-index: 200; position: fixed; top: 0; width: 300px; height: 100%; /*overflow-y: scroll;*/ transition: transform 0.3s; font-size: 16px; font-weight: normal; } .slide-menu-wrapper .slide-menu.slide-menu--wide { width: 500px; } .slide-menu-wrapper .slide-menu.slide-menu--third { width: 33%; } .slide-menu-wrapper .slide-menu.slide-menu--half { width: 50%; } .slide-menu-wrapper .slide-menu.slide-menu--full { width: 95%; } /* * Slides menu */ .slide-menu-wrapper .slide-menu-items { margin: 0; padding: 0; width: 100%; border-bottom: solid 1px #555; } .slide-menu-wrapper .slide-menu-item, .slide-menu-wrapper .slide-menu-item-vertical { display: block; text-align: left; padding: 10px 18px; color: #aaa; cursor: pointer; } .slide-menu-wrapper .slide-menu-item-vertical { padding-left: 30px; } .slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical, .slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical, .slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical, .slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical, .slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical { padding-left: 50px; } .slide-menu-wrapper .slide-menu-item { border-top: solid 1px #555; } .slide-menu-wrapper .active-menu-panel li.selected { background-color: #222; color: white; } .slide-menu-wrapper .active-menu-panel li.active { color: #eee; } .slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title, .slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title { font-style: italic; } .slide-menu-wrapper .slide-menu-item-number { color: #999; padding-right: 6px; } .slide-menu-wrapper .slide-menu-item i.far, .slide-menu-wrapper .slide-menu-item i.fas, .slide-menu-wrapper .slide-menu-item-vertical i.far, .slide-menu-wrapper .slide-menu-item-vertical i.fas, .slide-menu-wrapper .slide-menu-item svg.svg-inline--fa, .slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa { padding-right: 12px; display: none; } .slide-menu-wrapper .slide-menu-item.past i.fas.past, .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, .slide-menu-wrapper .slide-menu-item.active i.fas.active, .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, .slide-menu-wrapper .slide-menu-item.future i.far.future, .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active, .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { display: inline-block; } .slide-menu-wrapper .slide-menu-item.past i.fas.past, .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, .slide-menu-wrapper .slide-menu-item.future i.far.future, .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { opacity: 0.4; } .slide-menu-wrapper .slide-menu-item.active i.fas.active, .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active { opacity: 0.8; } .slide-menu-wrapper .slide-menu--left { left: 0; -webkit-transform: translateX(-100%); -ms-transform: translateX(-100%); transform: translateX(-100%); } .slide-menu-wrapper .slide-menu--left.active { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } .slide-menu-wrapper .slide-menu--right { right: 0; -webkit-transform: translateX(100%); -ms-transform: translateX(100%); transform: translateX(100%); } .slide-menu-wrapper .slide-menu--right.active { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } .slide-menu-wrapper { transition: transform 0.3s; } /* * Toolbar */ .slide-menu-wrapper .slide-menu-toolbar { height: 60px; width: 100%; font-size: 12px; display: table; table-layout: fixed; /* ensures equal width */ margin: 0; padding: 0; border-bottom: solid 2px #666; } .slide-menu-wrapper .slide-menu-toolbar > li { display: table-cell; line-height: 150%; text-align: center; vertical-align: middle; cursor: pointer; color: #aaa; border-radius: 3px; } .slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i, .slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button svg.svg-inline--fa { font-size: 1.7em; } .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { color: white; text-shadow: 0 1px black; text-decoration: underline; } .slide-menu-toolbar > li.toolbar-panel-button:hover { color: white; } .slide-menu-toolbar > li.toolbar-panel-button:hover span.slide-menu-toolbar-label, .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button span.slide-menu-toolbar-label { visibility: visible; } /* * Panels */ .slide-menu-wrapper .slide-menu-panel { position: absolute; width: 100%; visibility: hidden; height: calc(100% - 60px); overflow-x: hidden; overflow-y: auto; color: #aaa; } .slide-menu-wrapper .slide-menu-panel.active-menu-panel { visibility: visible; } .slide-menu-wrapper .slide-menu-panel h1, .slide-menu-wrapper .slide-menu-panel h2, .slide-menu-wrapper .slide-menu-panel h3, .slide-menu-wrapper .slide-menu-panel h4, .slide-menu-wrapper .slide-menu-panel h5, .slide-menu-wrapper .slide-menu-panel h6 { margin: 20px 0 10px 0; color: #fff; line-height: 1.2; letter-spacing: normal; text-shadow: none; } .slide-menu-wrapper .slide-menu-panel h1 { font-size: 1.6em; } .slide-menu-wrapper .slide-menu-panel h2 { font-size: 1.4em; } .slide-menu-wrapper .slide-menu-panel h3 { font-size: 1.3em; } .slide-menu-wrapper .slide-menu-panel h4 { font-size: 1.1em; } .slide-menu-wrapper .slide-menu-panel h5 { font-size: 1em; } .slide-menu-wrapper .slide-menu-panel h6 { font-size: 0.9em; } .slide-menu-wrapper .slide-menu-panel p { margin: 10px 0 5px 0; } .slide-menu-wrapper .slide-menu-panel a { color: #ccc; text-decoration: underline; } .slide-menu-wrapper .slide-menu-panel a:hover { color: white; } .slide-menu-wrapper .slide-menu-item a { text-decoration: none; } .slide-menu-wrapper .slide-menu-custom-panel { width: calc(100% - 20px); padding-left: 10px; padding-right: 10px; } .slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items { width: calc(100% + 20px); margin-left: -10px; margin-right: 10px; } /* * Theme and Transitions buttons */ .slide-menu-wrapper div[data-panel='Themes'] li, .slide-menu-wrapper div[data-panel='Transitions'] li { display: block; text-align: left; cursor: pointer; color: #848484; } /* * Menu controls */ .reveal .slide-menu-button { position: fixed; left: 30px; bottom: 30px; z-index: 30; font-size: 24px; } /* * Menu overlay */ .slide-menu-wrapper .slide-menu-overlay { position: fixed; z-index: 199; top: 0; left: 0; overflow: hidden; width: 0; height: 0; background-color: #000; opacity: 0; transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s; } .slide-menu-wrapper .slide-menu-overlay.active { width: 100%; height: 100%; opacity: 0.7; transition: opacity 0.3s; } /* * Hide menu for pdf printing */ body.print-pdf .slide-menu-wrapper .slide-menu, body.print-pdf .reveal .slide-menu-button, body.print-pdf .slide-menu-wrapper .slide-menu-overlay { display: none; } .slide-menu-wrapper .slide-tool-item { display: block; text-align: left; padding: 10px 18px; color: #aaa; cursor: pointer; border-top: solid 1px #555; } .slide-menu-wrapper .slide-tool-item a { text-decoration: none; } .slide-menu-wrapper .slide-tool-item kbd { font-family: monospace; margin-right: 10px; padding: 3px 8px; color: inherit; border: 1px solid; border-radius: 5px; border-color: #555; } .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { text-decoration: none; } .reveal .slide-menu-button { left: 8px; bottom: 8px; } .reveal .slide-menu-button .fas::before, .reveal .slide-chalkboard-buttons .fas::before, .slide-menu-wrapper .slide-menu-toolbar .fas::before { display: inline-block; height: 2.2rem; width: 2.2rem; content: ""; vertical-align: -0.125em; background-repeat: no-repeat; background-size: 2.2rem 2.2rem; } .reveal .slide-chalkboard-buttons .fas::before { height: 1.45rem; width: 1.45rem; background-size: 1.45rem 1.45rem; vertical-align: 0.1em; } .slide-menu-wrapper .slide-menu-toolbar .fas::before { height: 1.8rem; width: 1.8rem; background-size: 1.8rem 1.8rem; } .slide-menu-wrapper .slide-menu-toolbar .fa-images::before { background-image: url('data:image/svg+xml,'); } .slide-menu-wrapper .slide-menu-toolbar .fa-gear::before { background-image: url('data:image/svg+xml,'); } .slide-menu-wrapper .slide-menu-toolbar .fa-times::before { background-image: url('data:image/svg+xml,'); } K Fy![RX)#[d@ ~dHdAmarkdown.js Fy![RX)#[d@!H+dI+dAmarkdown.esm.js^D Fy![RX)#[d@ 5J5Aplugin.js!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealMarkdown=t()}(this,(function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n=0||(u[n]=e[n]);return u}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(u[n]=e[n])}return u}function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null==n)return;var r,u,i=[],o=!0,a=!1;try{for(n=n.call(e);!(o=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);o=!0);}catch(e){a=!0,u=e}finally{try{o||null==n.return||n.return()}finally{if(a)throw u}}return i}(e,t)||a(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},f=function(e){return e&&e.Math==Math&&e},p=f("object"==typeof globalThis&&globalThis)||f("object"==typeof window&&window)||f("object"==typeof self&&self)||f("object"==typeof c&&c)||function(){return this}()||Function("return this")(),h={},D=function(e){try{return!!e()}catch(e){return!0}},g=!D((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),d={},v={}.propertyIsEnumerable,y=Object.getOwnPropertyDescriptor,A=y&&!v.call({1:2},1);d.f=A?function(e){var t=y(this,e);return!!t&&t.enumerable}:v;var m=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},k={}.toString,E=function(e){return k.call(e).slice(8,-1)},x=E,F="".split,b=D((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==x(e)?F.call(e,""):Object(e)}:Object,C=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},w=b,B=C,S=function(e){return w(B(e))},_=function(e){return"object"==typeof e?null!==e:"function"==typeof e},T=_,O=function(e,t){if(!T(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!T(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!T(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!T(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},R=C,I=function(e){return Object(R(e))},j=I,z={}.hasOwnProperty,$=function(e,t){return z.call(j(e),t)},P=_,L=p.document,M=P(L)&&P(L.createElement),N=function(e){return M?L.createElement(e):{}},U=N,q=!g&&!D((function(){return 7!=Object.defineProperty(U("div"),"a",{get:function(){return 7}}).a})),Z=g,G=d,H=m,Q=S,V=O,Y=$,K=q,X=Object.getOwnPropertyDescriptor;h.f=Z?X:function(e,t){if(e=Q(e),t=V(t,!0),K)try{return X(e,t)}catch(e){}if(Y(e,t))return H(!G.f.call(e,t),e[t])};var W={},J=_,ee=function(e){if(!J(e))throw TypeError(String(e)+" is not an object");return e},te=g,ne=q,re=ee,ue=O,ie=Object.defineProperty;W.f=te?ie:function(e,t,n){if(re(e),t=ue(t,!0),re(n),ne)try{return ie(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e};var oe=W,ae=m,se=g?function(e,t,n){return oe.f(e,t,ae(1,n))}:function(e,t,n){return e[t]=n,e},le={exports:{}},ce=p,fe=se,pe=function(e,t){try{fe(ce,e,t)}catch(n){ce[e]=t}return t},he=pe,De="__core-js_shared__",ge=p[De]||he(De,{}),de=ge,ve=Function.toString;"function"!=typeof de.inspectSource&&(de.inspectSource=function(e){return ve.call(e)});var ye=de.inspectSource,Ae=ye,me=p.WeakMap,ke="function"==typeof me&&/native code/.test(Ae(me)),Ee={exports:{}},xe=ge;(Ee.exports=function(e,t){return xe[e]||(xe[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.12.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});var Fe,be,Ce,we=0,Be=Math.random(),Se=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++we+Be).toString(36)},_e=Ee.exports,Te=Se,Oe=_e("keys"),Re=function(e){return Oe[e]||(Oe[e]=Te(e))},Ie={},je=ke,ze=_,$e=se,Pe=$,Le=ge,Me=Re,Ne=Ie,Ue="Object already initialized",qe=p.WeakMap;if(je||Le.state){var Ze=Le.state||(Le.state=new qe),Ge=Ze.get,He=Ze.has,Qe=Ze.set;Fe=function(e,t){if(He.call(Ze,e))throw new TypeError(Ue);return t.facade=e,Qe.call(Ze,e,t),t},be=function(e){return Ge.call(Ze,e)||{}},Ce=function(e){return He.call(Ze,e)}}else{var Ve=Me("state");Ne[Ve]=!0,Fe=function(e,t){if(Pe(e,Ve))throw new TypeError(Ue);return t.facade=e,$e(e,Ve,t),t},be=function(e){return Pe(e,Ve)?e[Ve]:{}},Ce=function(e){return Pe(e,Ve)}}var Ye={set:Fe,get:be,has:Ce,enforce:function(e){return Ce(e)?be(e):Fe(e,{})},getterFor:function(e){return function(t){var n;if(!ze(t)||(n=be(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Ke=p,Xe=se,We=$,Je=pe,et=ye,tt=Ye.get,nt=Ye.enforce,rt=String(String).split("String");(le.exports=function(e,t,n,r){var u,i=!!r&&!!r.unsafe,o=!!r&&!!r.enumerable,a=!!r&&!!r.noTargetGet;"function"==typeof n&&("string"!=typeof t||We(n,"name")||Xe(n,"name",t),(u=nt(n)).source||(u.source=rt.join("string"==typeof t?t:""))),e!==Ke?(i?!a&&e[t]&&(o=!0):delete e[t],o?e[t]=n:Xe(e,t,n)):o?e[t]=n:Je(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&tt(this).source||et(this)}));var ut=p,it=p,ot=function(e){return"function"==typeof e?e:void 0},at=function(e,t){return arguments.length<2?ot(ut[e])||ot(it[e]):ut[e]&&ut[e][t]||it[e]&&it[e][t]},st={},lt=Math.ceil,ct=Math.floor,ft=function(e){return isNaN(e=+e)?0:(e>0?ct:lt)(e)},pt=ft,ht=Math.min,Dt=function(e){return e>0?ht(pt(e),9007199254740991):0},gt=ft,dt=Math.max,vt=Math.min,yt=function(e,t){var n=gt(e);return n<0?dt(n+t,0):vt(n,t)},At=S,mt=Dt,kt=yt,Et=function(e){return function(t,n,r){var u,i=At(t),o=mt(i.length),a=kt(r,o);if(e&&n!=n){for(;o>a;)if((u=i[a++])!=u)return!0}else for(;o>a;a++)if((e||a in i)&&i[a]===n)return e||a||0;return!e&&-1}},xt={includes:Et(!0),indexOf:Et(!1)},Ft=$,bt=S,Ct=xt.indexOf,wt=Ie,Bt=function(e,t){var n,r=bt(e),u=0,i=[];for(n in r)!Ft(wt,n)&&Ft(r,n)&&i.push(n);for(;t.length>u;)Ft(r,n=t[u++])&&(~Ct(i,n)||i.push(n));return i},St=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],_t=Bt,Tt=St.concat("length","prototype");st.f=Object.getOwnPropertyNames||function(e){return _t(e,Tt)};var Ot={};Ot.f=Object.getOwnPropertySymbols;var Rt=st,It=Ot,jt=ee,zt=at("Reflect","ownKeys")||function(e){var t=Rt.f(jt(e)),n=It.f;return n?t.concat(n(e)):t},$t=$,Pt=zt,Lt=h,Mt=W,Nt=D,Ut=/#|\.prototype\./,qt=function(e,t){var n=Gt[Zt(e)];return n==Qt||n!=Ht&&("function"==typeof t?Nt(t):!!t)},Zt=qt.normalize=function(e){return String(e).replace(Ut,".").toLowerCase()},Gt=qt.data={},Ht=qt.NATIVE="N",Qt=qt.POLYFILL="P",Vt=qt,Yt=p,Kt=h.f,Xt=se,Wt=le.exports,Jt=pe,en=function(e,t){for(var n=Pt(t),r=Mt.f,u=Lt.f,i=0;i0&&(!i.multiline||i.multiline&&"\n"!==e[i.lastIndex-1])&&(s="(?: "+s+")",c=" "+c,l++),n=new RegExp("^(?:"+s+")",a)),vn&&(n=new RegExp("^"+s+"$(?!\\s)",a)),gn&&(t=i.lastIndex),r=pn.call(o?n:i,c),o?r?(r.input=r.input.slice(l),r[0]=r[0].slice(l),r.index=i.lastIndex,i.lastIndex+=r[0].length):i.lastIndex=0:gn&&r&&(i.lastIndex=i.global?r.index+r[0].length:t),vn&&r&&r.length>1&&hn.call(r[0],n,(function(){for(u=1;u=74)&&(An=En.match(/Chrome\/(\d+)/))&&(mn=An[1]);var Cn=mn&&+mn,wn=Cn,Bn=D,Sn=!!Object.getOwnPropertySymbols&&!Bn((function(){return!String(Symbol())||!Symbol.sham&&wn&&wn<41})),_n=Sn&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Tn=p,On=Ee.exports,Rn=$,In=Se,jn=Sn,zn=_n,$n=On("wks"),Pn=Tn.Symbol,Ln=zn?Pn:Pn&&Pn.withoutSetter||In,Mn=function(e){return Rn($n,e)&&(jn||"string"==typeof $n[e])||(jn&&Rn(Pn,e)?$n[e]=Pn[e]:$n[e]=Ln("Symbol."+e)),$n[e]},Nn=le.exports,Un=yn,qn=D,Zn=Mn,Gn=se,Hn=Zn("species"),Qn=RegExp.prototype,Vn=!qn((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$
")})),Yn="$0"==="a".replace(/./,"$0"),Kn=Zn("replace"),Xn=!!/./[Kn]&&""===/./[Kn]("a","$0"),Wn=!qn((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Jn=function(e,t,n,r){var u=Zn(e),i=!qn((function(){var t={};return t[u]=function(){return 7},7!=""[e](t)})),o=i&&!qn((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Hn]=function(){return n},n.flags="",n[u]=/./[u]),n.exec=function(){return t=!0,null},n[u](""),!t}));if(!i||!o||"replace"===e&&(!Vn||!Yn||Xn)||"split"===e&&!Wn){var a=/./[u],s=n(u,""[e],(function(e,t,n,r,u){var o=t.exec;return o===Un||o===Qn.exec?i&&!u?{done:!0,value:a.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Yn,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Xn}),l=s[0],c=s[1];Nn(String.prototype,e,l),Nn(Qn,u,2==t?function(e,t){return c.call(e,this,t)}:function(e){return c.call(e,this)})}r&&Gn(Qn[u],"sham",!0)},er=ft,tr=C,nr=function(e){return function(t,n){var r,u,i=String(tr(t)),o=er(n),a=i.length;return o<0||o>=a?e?"":void 0:(r=i.charCodeAt(o))<55296||r>56319||o+1===a||(u=i.charCodeAt(o+1))<56320||u>57343?e?i.charAt(o):r:e?i.slice(o,o+2):u-56320+(r-55296<<10)+65536}},rr={codeAt:nr(!1),charAt:nr(!0)},ur=rr.charAt,ir=function(e,t,n){return t+(n?ur(e,t).length:1)},or=I,ar=Math.floor,sr="".replace,lr=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,cr=/\$([$&'`]|\d{1,2})/g,fr=E,pr=yn,hr=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==fr(e))throw TypeError("RegExp#exec called on incompatible receiver");return pr.call(e,t)},Dr=Jn,gr=ee,dr=Dt,vr=ft,yr=C,Ar=ir,mr=function(e,t,n,r,u,i){var o=n+e.length,a=r.length,s=cr;return void 0!==u&&(u=or(u),s=lr),sr.call(i,s,(function(i,s){var l;switch(s.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(o);case"<":l=u[s.slice(1,-1)];break;default:var c=+s;if(0===c)return i;if(c>a){var f=ar(c/10);return 0===f?i:f<=a?void 0===r[f-1]?s.charAt(1):r[f-1]+s.charAt(1):i}l=r[c-1]}return void 0===l?"":l}))},kr=hr,Er=Math.max,xr=Math.min;Dr("replace",2,(function(e,t,n,r){var u=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,i=r.REPLACE_KEEPS_$0,o=u?"$":"$0";return[function(n,r){var u=yr(this),i=null==n?void 0:n[e];return void 0!==i?i.call(n,u,r):t.call(String(u),n,r)},function(e,r){if(!u&&i||"string"==typeof r&&-1===r.indexOf(o)){var a=n(t,e,this,r);if(a.done)return a.value}var s=gr(e),l=String(this),c="function"==typeof r;c||(r=String(r));var f=s.global;if(f){var p=s.unicode;s.lastIndex=0}for(var h=[];;){var D=kr(s,l);if(null===D)break;if(h.push(D),!f)break;""===String(D[0])&&(s.lastIndex=Ar(l,dr(s.lastIndex),p))}for(var g,d="",v=0,y=0;y=v&&(d+=l.slice(v,m)+b,v=m+A.length)}return d+l.slice(v)}]}));var Fr=_,br=ee,Cr=function(e){if(!Fr(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},wr=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return br(n),Cr(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),Br=_,Sr=wr,_r=_,Tr=E,Or=Mn("match"),Rr=function(e){var t;return _r(e)&&(void 0!==(t=e[Or])?!!t:"RegExp"==Tr(e))},Ir=at,jr=W,zr=g,$r=Mn("species"),Pr=function(e){var t=Ir(e),n=jr.f;zr&&t&&!t[$r]&&n(t,$r,{configurable:!0,get:function(){return this}})},Lr=g,Mr=p,Nr=Vt,Ur=function(e,t,n){var r,u;return Sr&&"function"==typeof(r=t.constructor)&&r!==n&&Br(u=r.prototype)&&u!==n.prototype&&Sr(e,u),e},qr=W.f,Zr=st.f,Gr=Rr,Hr=un,Qr=on,Vr=le.exports,Yr=D,Kr=Ye.enforce,Xr=Pr,Wr=Mn("match"),Jr=Mr.RegExp,eu=Jr.prototype,tu=/a/g,nu=/a/g,ru=new Jr(tu)!==tu,uu=Qr.UNSUPPORTED_Y;if(Lr&&Nr("RegExp",!ru||uu||Yr((function(){return nu[Wr]=!1,Jr(tu)!=tu||Jr(nu)==nu||"/a/i"!=Jr(tu,"i")})))){for(var iu=function(e,t){var n,r=this instanceof iu,u=Gr(e),i=void 0===t;if(!r&&u&&e.constructor===iu&&i)return e;ru?u&&!i&&(e=e.source):e instanceof iu&&(i&&(t=Hr.call(e)),e=e.source),uu&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var o=Ur(ru?new Jr(e,t):Jr(e,t),r?this:eu,iu);uu&&n&&(Kr(o).sticky=!0);return o},ou=function(e){e in iu||qr(iu,e,{configurable:!0,get:function(){return Jr[e]},set:function(t){Jr[e]=t}})},au=Zr(Jr),su=0;au.length>su;)ou(au[su++]);eu.constructor=iu,iu.prototype=eu,Vr(Mr,"RegExp",iu)}Xr("RegExp");var lu=le.exports,cu=ee,fu=D,pu=un,hu="toString",Du=RegExp.prototype,gu=Du.toString,du=fu((function(){return"/a/b"!=gu.call({source:"a",flags:"b"})})),vu=gu.name!=hu;(du||vu)&&lu(RegExp.prototype,hu,(function(){var e=cu(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in Du)?pu.call(e):n)}),{unsafe:!0});var yu=ee,Au=Dt,mu=C,ku=ir,Eu=hr;Jn("match",1,(function(e,t,n){return[function(t){var n=mu(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var u=yu(e),i=String(this);if(!u.global)return Eu(u,i);var o=u.unicode;u.lastIndex=0;for(var a,s=[],l=0;null!==(a=Eu(u,i));){var c=String(a[0]);s[l]=c,""===c&&(u.lastIndex=ku(i,Au(u.lastIndex),o)),l++}return 0===l?null:s}]}));var xu=g,Fu=W.f,bu=Function.prototype,Cu=bu.toString,wu=/^\s*function ([^ (]*)/,Bu="name";xu&&!(Bu in bu)&&Fu(bu,Bu,{configurable:!0,get:function(){try{return Cu.call(this).match(wu)[1]}catch(e){return""}}});var Su=D,_u=function(e,t){var n=[][e];return!!n&&Su((function(){n.call(null,t||function(){throw 1},1)}))},Tu=nn,Ou=S,Ru=[].join,Iu=b!=Object,ju=_u("join",",");Tu({target:"Array",proto:!0,forced:Iu||!ju},{join:function(e){return Ru.call(Ou(this),void 0===e?",":e)}});var zu=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},$u=ee,Pu=zu,Lu=Mn("species"),Mu=function(e,t){var n,r=$u(e).constructor;return void 0===r||null==(n=$u(r)[Lu])?t:Pu(n)},Nu=Jn,Uu=Rr,qu=ee,Zu=C,Gu=Mu,Hu=ir,Qu=Dt,Vu=hr,Yu=yn,Ku=on.UNSUPPORTED_Y,Xu=[].push,Wu=Math.min,Ju=4294967295;Nu("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(Zu(this)),u=void 0===n?Ju:n>>>0;if(0===u)return[];if(void 0===e)return[r];if(!Uu(e))return t.call(r,e,u);for(var i,o,a,s=[],l=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),c=0,f=new RegExp(e.source,l+"g");(i=Yu.call(f,r))&&!((o=f.lastIndex)>c&&(s.push(r.slice(c,i.index)),i.length>1&&i.index=u));)f.lastIndex===i.index&&f.lastIndex++;return c===r.length?!a&&f.test("")||s.push(""):s.push(r.slice(c)),s.length>u?s.slice(0,u):s}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var u=Zu(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,u,n):r.call(String(u),t,n)},function(e,u){var i=n(r,e,this,u,r!==t);if(i.done)return i.value;var o=qu(e),a=String(this),s=Gu(o,RegExp),l=o.unicode,c=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(Ku?"g":"y"),f=new s(Ku?"^(?:"+o.source+")":o,c),p=void 0===u?Ju:u>>>0;if(0===p)return[];if(0===a.length)return null===Vu(f,a)?[a]:[];for(var h=0,D=0,g=[];Dy;y++)if((a||y in g)&&(h=d(p=g[y],y,D),e))if(t)m[y]=h;else if(h)switch(e){case 3:return!0;case 5:return p;case 6:return y;case 2:bi.call(m,p)}else switch(e){case 4:return!1;case 7:bi.call(m,p)}return i?-1:r||u?u:m}},wi={forEach:Ci(0),map:Ci(1),filter:Ci(2),some:Ci(3),every:Ci(4),find:Ci(5),findIndex:Ci(6),filterOut:Ci(7)},Bi=wi.forEach,Si=p,_i=fi,Ti=_u("forEach")?[].forEach:function(e){return Bi(this,e,arguments.length>1?arguments[1]:void 0)},Oi=se;for(var Ri in _i){var Ii=Si[Ri],ji=Ii&&Ii.prototype;if(ji&&ji.forEach!==Ti)try{Oi(ji,"forEach",Ti)}catch(e){ji.forEach=Ti}}var zi={};zi[Mn("toStringTag")]="z";var $i="[object z]"===String(zi),Pi=$i,Li=E,Mi=Mn("toStringTag"),Ni="Arguments"==Li(function(){return arguments}()),Ui=Pi?Li:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Mi))?n:Ni?Li(t):"Object"==(r=Li(t))&&"function"==typeof t.callee?"Arguments":r},qi=Ui,Zi=$i?{}.toString:function(){return"[object "+qi(this)+"]"},Gi=$i,Hi=le.exports,Qi=Zi;Gi||Hi(Object.prototype,"toString",Qi,{unsafe:!0});var Vi=p.Promise,Yi=le.exports,Ki=W.f,Xi=$,Wi=Mn("toStringTag"),Ji=function(e,t,n){e&&!Xi(e=n?e:e.prototype,Wi)&&Ki(e,Wi,{configurable:!0,value:t})},eo={},to=eo,no=Mn("iterator"),ro=Array.prototype,uo=Ui,io=eo,oo=Mn("iterator"),ao=ee,so=ee,lo=function(e){return void 0!==e&&(to.Array===e||ro[no]===e)},co=Dt,fo=hi,po=function(e){if(null!=e)return e[oo]||e["@@iterator"]||io[uo(e)]},ho=function(e){var t=e.return;if(void 0!==t)return ao(t.call(e)).value},Do=function(e,t){this.stopped=e,this.result=t},go=Mn("iterator"),vo=!1;try{var yo=0,Ao={next:function(){return{done:!!yo++}},return:function(){vo=!0}};Ao[go]=function(){return this},Array.from(Ao,(function(){throw 2}))}catch(e){}var mo,ko,Eo,xo=at("document","documentElement"),Fo=/(?:iphone|ipod|ipad).*applewebkit/i.test(kn),bo="process"==E(p.process),Co=p,wo=D,Bo=hi,So=xo,_o=N,To=Fo,Oo=bo,Ro=Co.location,Io=Co.setImmediate,jo=Co.clearImmediate,zo=Co.process,$o=Co.MessageChannel,Po=Co.Dispatch,Lo=0,Mo={},No="onreadystatechange",Uo=function(e){if(Mo.hasOwnProperty(e)){var t=Mo[e];delete Mo[e],t()}},qo=function(e){return function(){Uo(e)}},Zo=function(e){Uo(e.data)},Go=function(e){Co.postMessage(e+"",Ro.protocol+"//"+Ro.host)};Io&&jo||(Io=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Mo[++Lo]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},mo(Lo),Lo},jo=function(e){delete Mo[e]},Oo?mo=function(e){zo.nextTick(qo(e))}:Po&&Po.now?mo=function(e){Po.now(qo(e))}:$o&&!To?(Eo=(ko=new $o).port2,ko.port1.onmessage=Zo,mo=Bo(Eo.postMessage,Eo,1)):Co.addEventListener&&"function"==typeof postMessage&&!Co.importScripts&&Ro&&"file:"!==Ro.protocol&&!wo(Go)?(mo=Go,Co.addEventListener("message",Zo,!1)):mo=No in _o("script")?function(e){So.appendChild(_o("script")).onreadystatechange=function(){So.removeChild(this),Uo(e)}}:function(e){setTimeout(qo(e),0)});var Ho,Qo,Vo,Yo,Ko,Xo,Wo,Jo,ea={set:Io,clear:jo},ta=/web0s(?!.*chrome)/i.test(kn),na=p,ra=h.f,ua=ea.set,ia=Fo,oa=ta,aa=bo,sa=na.MutationObserver||na.WebKitMutationObserver,la=na.document,ca=na.process,fa=na.Promise,pa=ra(na,"queueMicrotask"),ha=pa&&pa.value;ha||(Ho=function(){var e,t;for(aa&&(e=ca.domain)&&e.exit();Qo;){t=Qo.fn,Qo=Qo.next;try{t()}catch(e){throw Qo?Yo():Vo=void 0,e}}Vo=void 0,e&&e.enter()},ia||aa||oa||!sa||!la?fa&&fa.resolve?((Wo=fa.resolve(void 0)).constructor=fa,Jo=Wo.then,Yo=function(){Jo.call(Wo,Ho)}):Yo=aa?function(){ca.nextTick(Ho)}:function(){ua.call(na,Ho)}:(Ko=!0,Xo=la.createTextNode(""),new sa(Ho).observe(Xo,{characterData:!0}),Yo=function(){Xo.data=Ko=!Ko}));var Da=ha||function(e){var t={fn:e,next:void 0};Vo&&(Vo.next=t),Qo||(Qo=t,Yo()),Vo=t},ga={},da=zu,va=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=da(t),this.reject=da(n)};ga.f=function(e){return new va(e)};var ya,Aa,ma,ka,Ea=ee,xa=_,Fa=ga,ba=p,Ca="object"==typeof window,wa=nn,Ba=p,Sa=at,_a=Vi,Ta=le.exports,Oa=function(e,t,n){for(var r in t)Yi(e,r,t[r],n);return e},Ra=wr,Ia=Ji,ja=Pr,za=_,$a=zu,Pa=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},La=ye,Ma=function(e,t,n){var r,u,i,o,a,s,l,c=n&&n.that,f=!(!n||!n.AS_ENTRIES),p=!(!n||!n.IS_ITERATOR),h=!(!n||!n.INTERRUPTED),D=fo(t,c,1+f+h),g=function(e){return r&&ho(r),new Do(!0,e)},d=function(e){return f?(so(e),h?D(e[0],e[1],g):D(e[0],e[1])):h?D(e,g):D(e)};if(p)r=e;else{if("function"!=typeof(u=po(e)))throw TypeError("Target is not iterable");if(lo(u)){for(i=0,o=co(e.length);o>i;i++)if((a=d(e[i]))&&a instanceof Do)return a;return new Do(!1)}r=u.call(e)}for(s=r.next;!(l=s.call(r)).done;){try{a=d(l.value)}catch(e){throw ho(r),e}if("object"==typeof a&&a&&a instanceof Do)return a}return new Do(!1)},Na=function(e,t){if(!t&&!vo)return!1;var n=!1;try{var r={};r[go]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},Ua=Mu,qa=ea.set,Za=Da,Ga=function(e,t){if(Ea(e),xa(t)&&t.constructor===e)return t;var n=Fa.f(e);return(0,n.resolve)(t),n.promise},Ha=function(e,t){var n=ba.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},Qa=ga,Va=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},Ya=Ye,Ka=Vt,Xa=Ca,Wa=bo,Ja=Cn,es=Mn("species"),ts="Promise",ns=Ya.get,rs=Ya.set,us=Ya.getterFor(ts),is=_a&&_a.prototype,os=_a,as=is,ss=Ba.TypeError,ls=Ba.document,cs=Ba.process,fs=Qa.f,ps=fs,hs=!!(ls&&ls.createEvent&&Ba.dispatchEvent),Ds="function"==typeof PromiseRejectionEvent,gs="unhandledrejection",ds=!1,vs=Ka(ts,(function(){var e=La(os)!==String(os);if(!e&&66===Ja)return!0;if(Ja>=51&&/native code/.test(os))return!1;var t=new os((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[es]=n,!(ds=t.then((function(){}))instanceof n)||!e&&Xa&&!Ds})),ys=vs||!Na((function(e){os.all(e).catch((function(){}))})),As=function(e){var t;return!(!za(e)||"function"!=typeof(t=e.then))&&t},ms=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;Za((function(){for(var r=e.value,u=1==e.state,i=0;n.length>i;){var o,a,s,l=n[i++],c=u?l.ok:l.fail,f=l.resolve,p=l.reject,h=l.domain;try{c?(u||(2===e.rejection&&Fs(e),e.rejection=1),!0===c?o=r:(h&&h.enter(),o=c(r),h&&(h.exit(),s=!0)),o===l.promise?p(ss("Promise-chain cycle")):(a=As(o))?a.call(o,f,p):f(o)):p(r)}catch(e){h&&!s&&h.exit(),p(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Es(e)}))}},ks=function(e,t,n){var r,u;hs?((r=ls.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),Ba.dispatchEvent(r)):r={promise:t,reason:n},!Ds&&(u=Ba["on"+e])?u(r):e===gs&&Ha("Unhandled promise rejection",n)},Es=function(e){qa.call(Ba,(function(){var t,n=e.facade,r=e.value;if(xs(e)&&(t=Va((function(){Wa?cs.emit("unhandledRejection",r,n):ks(gs,n,r)})),e.rejection=Wa||xs(e)?2:1,t.error))throw t.value}))},xs=function(e){return 1!==e.rejection&&!e.parent},Fs=function(e){qa.call(Ba,(function(){var t=e.facade;Wa?cs.emit("rejectionHandled",t):ks("rejectionhandled",t,e.value)}))},bs=function(e,t,n){return function(r){e(t,r,n)}},Cs=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ms(e,!0))},ws=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw ss("Promise can't be resolved itself");var r=As(t);r?Za((function(){var n={done:!1};try{r.call(t,bs(ws,n,e),bs(Cs,n,e))}catch(t){Cs(n,t,e)}})):(e.value=t,e.state=1,ms(e,!1))}catch(t){Cs({done:!1},t,e)}}};if(vs&&(as=(os=function(e){Pa(this,os,ts),$a(e),ya.call(this);var t=ns(this);try{e(bs(ws,t),bs(Cs,t))}catch(e){Cs(t,e)}}).prototype,(ya=function(e){rs(this,{type:ts,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Oa(as,{then:function(e,t){var n=us(this),r=fs(Ua(this,os));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=Wa?cs.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ms(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),Aa=function(){var e=new ya,t=ns(e);this.promise=e,this.resolve=bs(ws,t),this.reject=bs(Cs,t)},Qa.f=fs=function(e){return e===os||e===ma?new Aa(e):ps(e)},"function"==typeof _a&&is!==Object.prototype)){ka=is.then,ds||(Ta(is,"then",(function(e,t){var n=this;return new os((function(e,t){ka.call(n,e,t)})).then(e,t)}),{unsafe:!0}),Ta(is,"catch",as.catch,{unsafe:!0}));try{delete is.constructor}catch(e){}Ra&&Ra(is,as)}wa({global:!0,wrap:!0,forced:vs},{Promise:os}),Ia(os,ts,!1),ja(ts),ma=Sa(ts),wa({target:ts,stat:!0,forced:vs},{reject:function(e){var t=fs(this);return t.reject.call(void 0,e),t.promise}}),wa({target:ts,stat:!0,forced:vs},{resolve:function(e){return Ga(this,e)}}),wa({target:ts,stat:!0,forced:ys},{all:function(e){var t=this,n=fs(t),r=n.resolve,u=n.reject,i=Va((function(){var n=$a(t.resolve),i=[],o=0,a=1;Ma(e,(function(e){var s=o++,l=!1;i.push(void 0),a++,n.call(t,e).then((function(e){l||(l=!0,i[s]=e,--a||r(i))}),u)})),--a||r(i)}));return i.error&&u(i.value),n.promise},race:function(e){var t=this,n=fs(t),r=n.reject,u=Va((function(){var u=$a(t.resolve);Ma(e,(function(e){u.call(t,e).then(n.resolve,r)}))}));return u.error&&r(u.value),n.promise}});var Bs=O,Ss=W,_s=m,Ts=function(e,t,n){var r=Bs(t);r in e?Ss.f(e,r,_s(0,n)):e[r]=n},Os=D,Rs=Cn,Is=Mn("species"),js=function(e){return Rs>=51||!Os((function(){var t=[];return(t.constructor={})[Is]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},zs=nn,$s=_,Ps=gi,Ls=yt,Ms=Dt,Ns=S,Us=Ts,qs=Mn,Zs=js("slice"),Gs=qs("species"),Hs=[].slice,Qs=Math.max;zs({target:"Array",proto:!0,forced:!Zs},{slice:function(e,t){var n,r,u,i=Ns(this),o=Ms(i.length),a=Ls(e,o),s=Ls(void 0===t?o:t,o);if(Ps(i)&&("function"!=typeof(n=i.constructor)||n!==Array&&!Ps(n.prototype)?$s(n)&&null===(n=n[Gs])&&(n=void 0):n=void 0,n===Array||void 0===n))return Hs.call(i,a,s);for(r=new(void 0===n?Array:n)(Qs(s-a,0)),u=0;ai;)Ws.f(e,n=r[i++],t[n]);return e},nl=ee,rl=tl,ul=St,il=Ie,ol=xo,al=N,sl=Re("IE_PROTO"),ll=function(){},cl=function(e){return"' ); var leadingWs = text.match( /^\n?(\s*)/ )[1].length, leadingTabs = text.match( /^\n?(\t*)/ )[1].length; if( leadingTabs > 0 ) { text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); } else if( leadingWs > 1 ) { text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' ); } return text; } /** * Given a markdown slide section element, this will * return all arguments that aren't related to markdown * parsing. Used to forward any other user-defined arguments * to the output markdown slide. */ function getForwardedAttributes( section ) { var attributes = section.attributes; var result = []; for( var i = 0, len = attributes.length; i < len; i++ ) { var name = attributes[i].name, value = attributes[i].value; // disregard attributes that are used for markdown loading/parsing if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; if( value ) { result.push( name + '="' + value + '"' ); } else { result.push( name ); } } return result.join( ' ' ); } /** * Inspects the given options and fills out default * values for what's not defined. */ function getSlidifyOptions( options ) { options = options || {}; options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR; options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR; options.attributes = options.attributes || ''; return options; } /** * Helper function for constructing a markdown slide. */ function createMarkdownSlide( content, options ) { options = getSlidifyOptions( options ); var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) ); if( notesMatch.length === 2 ) { content = notesMatch[0] + ''; } // prevent script end tags in the content from interfering // with parsing content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER ); return ''; } /** * Parses a data string into multiple slides based * on the passed in separator arguments. */ function slidify( markdown, options ) { options = getSlidifyOptions( options ); var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ), horizontalSeparatorRegex = new RegExp( options.separator ); var matches, lastIndex = 0, isHorizontal, wasHorizontal = true, content, sectionStack = []; // iterate until all blocks between separators are stacked up while( matches = separatorRegex.exec( markdown ) ) { var notes = null; // determine direction (horizontal by default) isHorizontal = horizontalSeparatorRegex.test( matches[0] ); if( !isHorizontal && wasHorizontal ) { // create vertical stack sectionStack.push( [] ); } // pluck slide content from markdown input content = markdown.substring( lastIndex, matches.index ); if( isHorizontal && wasHorizontal ) { // add to horizontal stack sectionStack.push( content ); } else { // add to vertical stack sectionStack[sectionStack.length-1].push( content ); } lastIndex = separatorRegex.lastIndex; wasHorizontal = isHorizontal; } // add the remaining slide ( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) ); var markdownSections = ''; // flatten the hierarchical stack, and insert
tags for( var i = 0, len = sectionStack.length; i < len; i++ ) { // vertical if( sectionStack[i] instanceof Array ) { markdownSections += '
'; sectionStack[i].forEach( function( child ) { markdownSections += '
' + createMarkdownSlide( child, options ) + '
'; } ); markdownSections += '
'; } else { markdownSections += '
' + createMarkdownSlide( sectionStack[i], options ) + '
'; } } return markdownSections; } /** * Parses any current data-markdown slides, splits * multi-slide markdown into separate sections and * handles loading of external markdown. */ function processSlides( scope ) { return new Promise( function( resolve ) { var externalPromises = []; [].slice.call( scope.querySelectorAll( 'section[data-markdown]:not([data-markdown-parsed])') ).forEach( function( section, i ) { if( section.getAttribute( 'data-markdown' ).length ) { externalPromises.push( loadExternalMarkdown( section ).then( // Finished loading external file function( xhr, url ) { section.outerHTML = slidify( xhr.responseText, { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-separator-vertical' ), notesSeparator: section.getAttribute( 'data-separator-notes' ), attributes: getForwardedAttributes( section ) }); }, // Failed to load markdown function( xhr, url ) { section.outerHTML = '
' + 'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' + 'Check your browser\'s JavaScript console for more details.' + '

Remember that you need to serve the presentation HTML from a HTTP server.

' + '
'; } ) ); } else { section.outerHTML = slidify( getMarkdownFromSlide( section ), { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-separator-vertical' ), notesSeparator: section.getAttribute( 'data-separator-notes' ), attributes: getForwardedAttributes( section ) }); } }); Promise.all( externalPromises ).then( resolve ); } ); } function loadExternalMarkdown( section ) { return new Promise( function( resolve, reject ) { var xhr = new XMLHttpRequest(), url = section.getAttribute( 'data-markdown' ); var datacharset = section.getAttribute( 'data-charset' ); // see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes if( datacharset != null && datacharset != '' ) { xhr.overrideMimeType( 'text/html; charset=' + datacharset ); } xhr.onreadystatechange = function( section, xhr ) { if( xhr.readyState === 4 ) { // file protocol yields status code 0 (useful for local debug, mobile applications etc.) if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) { resolve( xhr, url ); } else { reject( xhr, url ); } } }.bind( this, section, xhr ); xhr.open( 'GET', url, true ); try { xhr.send(); } catch ( e ) { console.warn( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e ); resolve( xhr, url ); } } ); } /** * Check if a node value has the attributes pattern. * If yes, extract it and add that value as one or several attributes * to the target element. * * You need Cache Killer on Chrome to see the effect on any FOM transformation * directly on refresh (F5) * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277 */ function addAttributeInElement( node, elementTarget, separator ) { var mardownClassesInElementsRegex = new RegExp( separator, 'mg' ); var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"]+?)\"|(data-[^\"= ]+?)(?=[\" ])", 'mg' ); var nodeValue = node.nodeValue; var matches, matchesClass; if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) { var classes = matches[1]; nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex ); node.nodeValue = nodeValue; while( matchesClass = mardownClassRegex.exec( classes ) ) { if( matchesClass[2] ) { elementTarget.setAttribute( matchesClass[1], matchesClass[2] ); } else { elementTarget.setAttribute( matchesClass[3], "" ); } } return true; } return false; } /** * Add attributes to the parent element of a text node, * or the element of an attribute node. */ function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) { if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) { var previousParentElement = element; for( var i = 0; i < element.childNodes.length; i++ ) { var childElement = element.childNodes[i]; if ( i > 0 ) { var j = i - 1; while ( j >= 0 ) { var aPreviousChildElement = element.childNodes[j]; if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) { previousParentElement = aPreviousChildElement; break; } j = j - 1; } } var parentSection = section; if( childElement.nodeName == "section" ) { parentSection = childElement ; previousParentElement = childElement ; } if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) { addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes ); } } } if ( element.nodeType == Node.COMMENT_NODE ) { if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) { addAttributeInElement( element, section, separatorSectionAttributes ); } } } /** * Converts any current data-markdown slides in the * DOM to HTML. */ function convertSlides() { var sections = deck.getRevealElement().querySelectorAll( '[data-markdown]:not([data-markdown-parsed])'); [].slice.call( sections ).forEach( function( section ) { section.setAttribute( 'data-markdown-parsed', true ) var notes = section.querySelector( 'aside.notes' ); var markdown = getMarkdownFromSlide( section ); section.innerHTML = marked( markdown ); addAttributes( section, section, null, section.getAttribute( 'data-element-attributes' ) || section.parentNode.getAttribute( 'data-element-attributes' ) || DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR, section.getAttribute( 'data-attributes' ) || section.parentNode.getAttribute( 'data-attributes' ) || DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR); // If there were notes, we need to re-add them after // having overwritten the section's HTML if( notes ) { section.appendChild( notes ); } } ); return Promise.resolve(); } function escapeForHTML( input ) { return input.replace( /([&<>'"])/g, char => HTML_ESCAPE_MAP[char] ); } return { id: 'markdown', /** * Starts processing and converting Markdown within the * current reveal.js deck. */ init: function( reveal ) { deck = reveal; let { renderer, animateLists, ...markedOptions } = deck.getConfig().markdown || {}; if( !renderer ) { renderer = new marked.Renderer(); renderer.code = ( code, language ) => { // Off by default let lineNumbers = ''; // Users can opt in to show line numbers and highlight // specific lines. // ```javascript [] show line numbers // ```javascript [1,4-8] highlights lines 1 and 4-8 if( CODE_LINE_NUMBER_REGEX.test( language ) ) { lineNumbers = language.match( CODE_LINE_NUMBER_REGEX )[1].trim(); lineNumbers = `data-line-numbers="${lineNumbers}"`; language = language.replace( CODE_LINE_NUMBER_REGEX, '' ).trim(); } // Escape before this gets injected into the DOM to // avoid having the HTML parser alter our code before // highlight.js is able to read it code = escapeForHTML( code ); return `
${code}
`; }; } if( animateLists === true ) { renderer.listitem = text => `
  • ${text}
  • `; } marked.setOptions( { renderer, ...markedOptions } ); return processSlides( deck.getRevealElement() ).then( convertSlides ); }, // TODO: Do these belong in the API? processSlides: processSlides, convertSlides: convertSlides, slidify: slidify, marked: marked } }; export default Plugin;  N Fy![RX)#[d@ $XLXAhighlight.js Fy![RX)#[d@ TAzenburn.cssDZ Fy![RX)#[d@ UAmonokai.css_ Fy![RX)#[d@T:XV:XAhighlight.esm.jAs Fy![RX)#[d@ ?^?Aplugin.js!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealHighlight=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,a=new Array(t);n=74)&&(W=le.match(/Chrome\/(\d+)/))&&($=W[1]);var ue=$&&+$,me=ue,pe=E,ge=!!Object.getOwnPropertySymbols&&!pe((function(){return!String(Symbol())||!Symbol.sham&&me&&me<41})),Ee=ge&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Se=p,be=g.exports,fe=J,Te=ne,Ce=ge,Ne=Ee,Re=be("wks"),ve=Se.Symbol,Oe=Ne?ve:ve&&ve.withoutSetter||Te,he=function(e){return fe(Re,e)&&(Ce||"string"==typeof Re[e])||(Ce&&fe(ve,e)?Re[e]=ve[e]:Re[e]=Oe("Symbol."+e)),Re[e]},ye={};ye[he("toStringTag")]="z";var Ie="[object z]"===String(ye),Ae={exports:{}},De=q,Me=Function.toString;"function"!=typeof De.inspectSource&&(De.inspectSource=function(e){return Me.call(e)});var Le,we,xe,Pe=De.inspectSource,ke=Pe,Ue=p.WeakMap,Fe="function"==typeof Ue&&/native code/.test(ke(Ue)),Be=g.exports,Ge=ne,Ye=Be("keys"),He=function(e){return Ye[e]||(Ye[e]=Ge(e))},Ve={},qe=Fe,ze=f,We=F,$e=J,Qe=q,Ke=He,je=Ve,Xe="Object already initialized",Ze=p.WeakMap;if(qe||Qe.state){var Je=Qe.state||(Qe.state=new Ze),et=Je.get,tt=Je.has,nt=Je.set;Le=function(e,t){if(tt.call(Je,e))throw new TypeError(Xe);return t.facade=e,nt.call(Je,e,t),t},we=function(e){return et.call(Je,e)||{}},xe=function(e){return tt.call(Je,e)}}else{var at=Ke("state");je[at]=!0,Le=function(e,t){if($e(e,at))throw new TypeError(Xe);return t.facade=e,We(e,at,t),t},we=function(e){return $e(e,at)?e[at]:{}},xe=function(e){return $e(e,at)}}var rt={set:Le,get:we,has:xe,enforce:function(e){return xe(e)?we(e):Le(e,{})},getterFor:function(e){return function(t){var n;if(!ze(t)||(n=we(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},it=p,ot=F,st=J,lt=Y,ct=Pe,_t=rt.get,dt=rt.enforce,ut=String(String).split("String");(Ae.exports=function(e,t,n,a){var r,i=!!a&&!!a.unsafe,o=!!a&&!!a.enumerable,s=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||st(n,"name")||ot(n,"name",t),(r=dt(n)).source||(r.source=ut.join("string"==typeof t?t:""))),e!==it?(i?!s&&e[t]&&(o=!0):delete e[t],o?e[t]=n:ot(e,t,n)):o?e[t]=n:lt(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&_t(this).source||ct(this)}));var mt={}.toString,pt=function(e){return mt.call(e).slice(8,-1)},gt=Ie,Et=pt,St=he("toStringTag"),bt="Arguments"==Et(function(){return arguments}()),ft=gt?Et:function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),St))?n:bt?Et(t):"Object"==(a=Et(t))&&"function"==typeof t.callee?"Arguments":a},Tt=ft,Ct=Ie?{}.toString:function(){return"[object "+Tt(this)+"]"},Nt=Ie,Rt=Ae.exports,vt=Ct;Nt||Rt(Object.prototype,"toString",vt,{unsafe:!0});var Ot=y,ht=function(){var e=Ot(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t},yt=Ae.exports,It=y,At=E,Dt=ht,Mt="toString",Lt=RegExp.prototype,wt=Lt.toString,xt=At((function(){return"/a/b"!=wt.call({source:"a",flags:"b"})})),Pt=wt.name!=Mt;(xt||Pt)&&yt(RegExp.prototype,Mt,(function(){var e=It(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in Lt)?Dt.call(e):n)}),{unsafe:!0});var kt={},Ut={},Ft={}.propertyIsEnumerable,Bt=Object.getOwnPropertyDescriptor,Gt=Bt&&!Ft.call({1:2},1);Ut.f=Gt?function(e){var t=Bt(this,e);return!!t&&t.enumerable}:Ft;var Yt=pt,Ht="".split,Vt=E((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==Yt(e)?Ht.call(e,""):Object(e)}:Object,qt=Vt,zt=Q,Wt=function(e){return qt(zt(e))},$t=S,Qt=Ut,Kt=P,jt=Wt,Xt=A,Zt=J,Jt=O,en=Object.getOwnPropertyDescriptor;kt.f=$t?en:function(e,t){if(e=jt(e),t=Xt(t,!0),Jt)try{return en(e,t)}catch(e){}if(Zt(e,t))return Kt(!Qt.f.call(e,t),e[t])};var tn={},nn=Math.ceil,an=Math.floor,rn=function(e){return isNaN(e=+e)?0:(e>0?an:nn)(e)},on=rn,sn=Math.min,ln=function(e){return e>0?sn(on(e),9007199254740991):0},cn=rn,_n=Math.max,dn=Math.min,un=function(e,t){var n=cn(e);return n<0?_n(n+t,0):dn(n,t)},mn=Wt,pn=ln,gn=un,En=function(e){return function(t,n,a){var r,i=mn(t),o=pn(i.length),s=gn(a,o);if(e&&n!=n){for(;o>s;)if((r=i[s++])!=r)return!0}else for(;o>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return!e&&-1}},Sn={includes:En(!0),indexOf:En(!1)},bn=J,fn=Wt,Tn=Sn.indexOf,Cn=Ve,Nn=function(e,t){var n,a=fn(e),r=0,i=[];for(n in a)!bn(Cn,n)&&bn(a,n)&&i.push(n);for(;t.length>r;)bn(a,n=t[r++])&&(~Tn(i,n)||i.push(n));return i},Rn=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],vn=Nn,On=Rn.concat("length","prototype");tn.f=Object.getOwnPropertyNames||function(e){return vn(e,On)};var hn={};hn.f=Object.getOwnPropertySymbols;var yn=tn,In=hn,An=y,Dn=se("Reflect","ownKeys")||function(e){var t=yn.f(An(e)),n=In.f;return n?t.concat(n(e)):t},Mn=J,Ln=Dn,wn=kt,xn=b,Pn=function(e,t){for(var n=Ln(t),a=xn.f,r=wn.f,i=0;i=51||!ra((function(){var t=[];return(t.constructor={})[oa]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},la=Xn,ca=f,_a=Jn,da=un,ua=ln,ma=Wt,pa=aa,ga=he,Ea=sa("slice"),Sa=ga("species"),ba=[].slice,fa=Math.max;la({target:"Array",proto:!0,forced:!Ea},{slice:function(e,t){var n,a,r,i=ma(this),o=ua(i.length),s=da(e,o),l=da(void 0===t?o:t,o);if(_a(i)&&("function"!=typeof(n=i.constructor)||n!==Array&&!_a(n.prototype)?ca(n)&&null===(n=n[Sa])&&(n=void 0):n=void 0,n===Array||void 0===n))return ba.call(i,s,l);for(a=new(void 0===n?Array:n)(fa(l-s,0)),r=0;si;)Ma.f(e,n=a[i++],t[n]);return e},Pa=se("document","documentElement"),ka=y,Ua=xa,Fa=Rn,Ba=Ve,Ga=Pa,Ya=R,Ha=He("IE_PROTO"),Va=function(){},qa=function(e){return"