class: center, middle, inverse, title-slide <h1 class = "celeste-ish" style="line-height: 90px; margin-top: -50px;"> Clase 4: <p style="margin-bottom: -170px;"> </p> Distill,<br> Blogdown y<br> Bookdown </h1> <h3 class = "celeste-ish" style = "position: absolute; bottom: 80px;"> Autor: Lucio Cornejo </h3> --- ## Contenido extra para la sesión pasada - **Xaringan** - La opción `highlightStyle` del YAML de un archivo con `output` Xaringan permite algunos valores diferentes al valor `highlight` de un archivo con `output` html\_document, tal como el tipo de resaltado **dracula**. - Otras maneras de crear diapositivas en **R Markdown**: - reveal.js - <https://bookdown.org/yihui/rmarkdown/revealjs.html> - <https://e-gor.github.io/Reveal.js-TOC-Progress/demo/#/> - slidy_presentation - <https://bookdown.org/yihui/rmarkdown/slidy-presentation.html> - <https://pebiba-taller-rmd.netlify.app/index.html#(1)> - Problema respecto a la [tabla de contenidos](https://github.com/yihui/xaringan/issues/217). .scrollable[ - Convertir las diapositivas a **PDF**: - Paquete **pagedown** - Si no les funciona pagedown::chrome_print, ni xaringanBuilder, ni [esto](https://www.garrickadenbuie.com/blog/print-xaringan-chromote/), intenten emplear [**decktape**](https://github.com/astefanutti/decktape), pues así sí me funcionó la conversión a PDF. - Uso de xaringan::decktape: - Instalar `decktape` como figura en el link anterior. - `setwd("ruta_de_folder_que_contiene_tu_xaringan")` - `xaringan::decktape("nombre_archivo_xaringan.html","nombre_para_pdf_xaringan.pdf")` ] <p style="margin-bottom: -30px;"> </p> - **Sitio web básico creado con R Markdown** - Uso de la función `rmarkdown::render_site()`. - Uso del archivo `_output.yml`. - ¿Cómo añadir íconos al sitio web? - [Cómo obtener el script necesario.](https://www.youtube.com/watch?v=BATVa4vGZto&ab_channel=EasyTutorials) - [Algunas opciones de íconos.](https://www.w3schools.com/icons/icons_reference.asp) ??? - Mostrar cómo incluir el script para íconos y el ícono para la página principal del sitio, en la carpeta del sitio web, vía el archivo **_site.yml** --- ## Distill ### Sitios web creados con Distill <https://www.jvcasillas.com/> <https://pkgs.rstudio.com/distill/articles/examples.html> <p style="margin-bottom: -30px;"> </p> ### ¿Por qué usar Distill para crear un sitio web? > _La idea fue crear una plataforma para ayudar a científicos a aprovechar_ > _los beneficios de la comunicación moderna vía HTML, la cual diseñadores_ > _digitales y periodistas han estado usando para crear artículos_ > _interactivos y atractivos ubicados donde están los lectores:_ > **online**<br> > --- https://www.rstudio.com/blog/distill/ <p style="margin-bottom: -50px;"> </p> Es un formato más estable que **Blogdown**, ya que no requiere de **Hugo**, así que se evita problemas de compatibilidad (presentes o futuros) entre **Hugo** y **Blogdown**. ??? Comentar sobre el problema actual de compatibilidad de mi [página](https://lucio-cornejo.github.io/) de Mathematical Music theory. --- ## Manos a la obra - Creación del sitio web<br> ```r distill::create_blog(dir = "nombre_carpeta", title = "nombre_sitio_web") ``` - Acceder al archivo `_site/index.html`, página principal del sitio web creado. - Configuremos el archivo `_posts/welcome/welcome.Rmd`, lo renderizamos y regresamos a la páginal principal del sitio web. - Creación de un nuevo post<br> ```r distill::create_post(title = "titulo_publicacion", draft = FALSE) ``` Podemos emplear `draft=TRUE` para que tal publicación no se muestre en el sitio web, ya que sería un _borrador_. En el **encabezado YAML** de aquella publicación podemos cambiar `draft: FALSE` cuando el documeto este listo para ser publicado. ??? `create_blog(...) vs create_website(...)` - "Blogs Distill" son "sitios web Distill" con extra funcionalidades. - Para un "blog Distill" es posible que las publicaciones se añadan automáticamente con su preview y link en la homepage; sin embargo, eso se tendría que hacer manualmente para "sitios web Distill". - Cuando se reconstruye un "sitio web Distill", las publicaciones se renderizan de nuevo, pero eso no ocurre para los "blog Distill", evitando así posible problemas de compatibilidad tras actualizar paquetes de **R**. --- <p style="margin-bottom: -30px;"> </p> - Definir el **preview** de la publicación. - Una **tabla de contenidos** diferente a la que hemos estado empleando. - `toc: true` - `toc_float: false` - Propiedad `code_folding: true` y creación de links para secciones de código. - Añadir `categories: ["alguna_categoria"]` a la publicación creada y ver el cambio que produce en la página principal del sitio web. - Personalizar el diseño del sitio web - [Alternativa más rápida](https://rstudio.github.io/distill/website.html#theming) (no me funciona) - Crear un archivo **CSS** donde modificamos el estilo del sitio, y lo incluimos adecuadamente vía el `_site.yml` del sitio web. - Esconder la categoría `articles` de la página principal del sitio web. --- class: middle - Añadir sección de comentarios y para compartir la publicación: - Insertar el siguiente código al archivo `_site.yml` y cambiar el valor de `base_url` por el link con el cual se accederá al blog creado con **Distill** tras haberlo subido online: ```yaml base_url: https://mathematical-music-theory-blog.netlify.app/ collections: posts: disqus: shortname: comentarios # nombre cualquiera, pero obligatorio hidden: true share: [twitter, linkedin, facebook, google-plus, pinterest] ``` - Esconder los anuncios (versión Desktop) en la sección de comentarios, modificando apropiadamente el archivo `CSS` señalado en `_site.yml`. - [Más propiedades](https://ymlthis.r-lib.org/reference/yml_distill_opts.html) para incluir en el **encabezado YAML** de nuestros documentos creados con Distill. --- <p style="margin-bottom: -70px;"> </p> ## Publicación del blog creado con Distill <p style="margin-bottom: -80px;"> </p> 1. Ejecutamos `rmarkdown::render_site()` tras haber fijado como directorio aquel donde se encuentra el archivo **index.Rmd**. 1. En **GitHub**, creamos un repositorio con el mismo nombre que el nombre de la carpeta principal de nuestro blog Distill. 1. Ejecutamos en alguna terminal los siguientes comandos, tras cambiar adecuadamente las secciones **ruta-de-la-carpeta-del-blog-Distill**, **nombre-de-usuario** y **nombre-del-repositorio**: <p style="margin-bottom: -85px;"> </p> .scrollable[ ```text cd ruta-de-la-carpeta-del-blog-Distill git add . git commit -m "initial commit" git remote add origin https://github.com/nombre-de-usuario/nombre-del.repositorio.git git branch -M main git push -u origin main ``` ] 1. Cuando publiquemos el sitio web via **Netlify** y **GitHub**, en la sección **Publish directory** escribimos **_site**. --- class: middle ## Referencias para Distill - <https://themockup.blog/posts/2020-08-01-building-a-blog-with-distill/> - <https://rstudio.github.io/distill/blog.html> - <https://rstudio.github.io/distill/metadata.html> - <https://rstudio.github.io/distill/> --- class: middle ## Blogdown ### Ejemplos de blog creados con R Markdown - <https://malco.io/> - <https://desiree.rbind.io/> - <https://hugo-apero-docs.netlify.app/> Lamentablemente, actualmente ya [no funciona](https://github.com/rstudio/blogdown/issues/638) el modelo mostrado, **hugo-academic** (gcushen/hugo-academic), con **Blogdown**. Sin embargo, podrían emplear un modelo [parecido](https://themes.gohugo.io/themes/meghna-hugo/). --- ## Creamos un sitio web con el paquete Blogdown Pasos para crear nuestro sitio web con **R Markdown** y el paquete **Blogdown**:<br> 1. Crear un nuevo repositorio en GitHub. 1. En RStudio, crear un nuevo proyecto vía un link del repositorio creado. 1. Ejecutar el siguiente código: ```r # Instalaciones install.packages("blogdown") blogdown::install_hugo() blogdown::hugo_version() # debe ser más actual que "0.80.0" # Creamos el sitio web library(blogdown) #new_site(theme = "themefisher/meghna-hugo") # otra plantilla new_site(theme = "hugo-apero/hugo-apero", format = "toml", sample = FALSE, empty_dirs = TRUE) ``` --- ## Modificaciones básicas para personalizar el sitio web <p style="margin-bottom: -80px;"> </p> - `config.toml` <p style="margin-bottom: -60px;"> </p> - `title` - `author` - `[params]` - Cambiar `favicon` y `logo` vía `themes/hugo-apero/static/img` . - `theme` - `customtextFontFamily` - `customheadingFontFamily` - `[menu]` <p style="margin-bottom: -70px;"> </p> - Para otras plantillas, se suele emplear el comando `blogdown::build_site()` para que se actualicen los documentos del sitio web (análogo a la función `rmarkdown::render_site()` que ya hemos visto). Sin embargo, para esta plantilla (hugo-apero), basta `push` los cambios al repositorio asociado a este blog (el cual también se ha vinculado con **Netlify**) para que se actualice la versión online del blog creado. ??? Tras publicar el blog en **Netlify**, cambiar el `baseURL` en el archivo `config.toml` por el link del blog online, por ejemplo: <br> `baseURL = "https://hugo-apero-docs.netlify.app/"` --- class: middle - Para incluir cambios personalizados para el diseño visual **(CSS)** del blog, <br> modificar el archivo `themes/hugo-apero/assets/custom.scss`.<br> Para aplicar aquellas alteraciones al blog, en el archivo `config.toml` incluir en la línea 58 (del archivo default) `custom_theme = "custom"` . - También puedes añadir código de **JavaScript** que desees se aplique en cada página del blog, incluyendo tal código en el archivo<br> `themes/hugo-apero/assets/js/main.js` . - Asimismo, es posible añadir contenido a la sección `head` de cada sitio web del blog, modificando adecuadamente el archivo<br> `theme/hugo-apero/layouts/partials/head.html` . - `content/_index.md` (homepage) <p style="margin-bottom: -60px;"> </p> - `description, image_left, title, ...` - `images` (`themes/hugo-apero/static/img`) --- class: middle - `content/blog/_index.md` <p style="margin-bottom: -60px;"> </p> - `sidebar` (la imagen debe llamarse `sidebar-listing` ) - `layout` - list (blogs, projects, talks) - list-sidebar (blogs, projects, talks) - list-grid (solo blogs y projects) - **Cada sección es configurada por su archivo `_index.md`** . - **Los thumbnails deben llamarse `featured` ** **(o contener esa palabra en el nombre (ej: `mario-featured.png`))** **para que Hugo los reconozca como thumbnails**. - Creamos una nueva publicación en la sección **blog** via el **RStudio** addin _New Post_: - Señalamos la extensión [**Rmarkdown**](https://bookdown.org/yihui/blogdown/output-format.html) - Como contenido de aquella publicación, emplearemos el modelo de la siguiente diapositiva. ??? Explicar por qué se usa la extensión **.Rmarkdown** y **.markdown** en vez de **.Rmd** y **html**. --- ```` --- author: Yoshi layout: single date: '2022-02-01' excerpt: | Resumen corto. title: Ejemplo --- ## Ejemplos ```{r} DT::datatable(mtcars) ``` ```{r} plot(pressure) ``` Ecuación $e^{i\pi} +1 = 0$ en línea. $$ \sin^2\theta + \cos^2\theta = 1 $$ ```` --- - Configuramos la sección **About** del blog: <p style="margin-bottom: -70px;"> </p> - Solo realizar los siguientes cambios en `content/about/_index.md` : <p style="margin-bottom: -50px;"> </p> - `description` - `show_header` - `sidebar_left` - Cambiar todas las propiedades en `content/about/header/index.md` . - `content/about/main/index.md` <p style="margin-bottom: -50px;"> </p> - `number_featured` - `intro` - `content/about/sidebar/index.md` <p style="margin-bottom: -50px;"> </p> - `author` - `role` - `avatar_shape` - La imagen en esa ruta debe llamarse **avatar** para que se muestre en el esta parte del blog. - `show_social_links` - `audio_link_label` - El audio en aquel directorio debe llamarse **audio** para que se reconozca y se le apliquen estos cambios. - `link_list` --- class: middle - Podemos incluir botones como los de la publicación **Palmer Penguins** en la sección **Projects**. Para ello, veamos el archivo `content/project/penguins/index.md` . - Es posible crear **series** en las publicaciones del blog, por ejemplo, siguiendo el modelo de la plantilla para **spoonful-series**, copiando la carpeta, pegándola y alterándola adecuadamente; por ejemplo, cambiando el nombre a **xaringan-series** (`series` es necesario en el nombre para ser reconocida como tal) y alterando la propiedad `series` en el archivo `_index.md` de la carpeta _clonada_. <p style="margin-bottom: 20px;"> </p> ## Referencias para Blogdown - <https://hugo-apero-docs.netlify.app/start/> - <https://www.youtube.com/watch?v=RksaNh5Ywbo&ab_channel=R-LadiesTunis> - <https://www.apreshill.com/slides/blogdown-workshop-slides.html#1> --- ## Bookdown ### Motivación - Limitaciones de **Markdown** que soluciona el paquete **Blogdown**: - Numeración automática de figuras y tablas para formato HTML - Referenciar tablas y figuras. - Gran control sobre la apariencia de las figuras.<br> (Actualmente, no es posible controlar el alineamiento de las figuras empleando únicamente **Markdown** ) ### Ventajas - En el caso de libros creados en formato HTML, estos podrían ser mucho más interactivos que el libro tradicional en PDF, ya sea debido al uso de gráficos interactivos o incluso apliaciones más complejas (e interactivas) que requieran de **Shiny** o JavaScript. - Los lectores del libro pueden sugerir correcciones o cambios (a quien creó el libro) vía un simple **pull request** en **GitHub**. - La actualización del libro, ya sea para nuevas ediciones de este, o simples correcciones, se puede realizar rápidamente. Entonces, no es necesario esperar meses o años para obtener versiones nuevas de un texto, como podría ser el caso para libros creados solo en formato PDF. --- <p style="margin-bottom: -70px;"> </p> - [Modelo simple para crear el libro](https://github.com/rstudio/bookdown-demo) - En nuestro caso, crearemos un repositorio en **GitHub** y un nuevo proyecto en **RStudio**, vinculado a ese repositorio (igual que hicimos con **Blogdown**). - Una vez dentro de aquel proyecto en **RStudio**, ejecutamos en la consola:<br> `bookdown::create_gitbook(".")` - Antes de renderizar el libro, realicemos algunas modificaciones básicas: - `_output.yml` - Propiedad `before` del `toc` - Podemos añadir `number_sections: false` encima de `css`<br> para definir si enumeramos las secciones o no. - `index.Rmd` - `tile`, `author` y `description` . - `_bookdown.yml` - `delete_merged_file` - `chapter_name` ??? Explicar que la opción **site: bookdown::bookdown_site** en el encabezado YAML del archivo `index.Rmd` permite que **RStudio** renderice el libro **capítulo por capítulo**, haciendo click en el botón **Knit**, en vez de que se renderize el libro completo tras presionar aquel botón. --- La sección `chapter_name` que acabamos de modificar solo afecta a la versión **HTML** del libro. Para alterar esa misma propiedad, pero para la versión **PDF** del libro, incluir lo siguiente en el encabezado **YAML** del archivo `index.Rmd` :<br> ```yaml header-includes: - \AtBeginDocument{\renewcommand{\chaptername}{nombre_deseado }} ``` - Empleamos el comando `bookdown::render_book()` para renderizar el libro. - Creamos las versiones del libro en los formatos establecidos en `_output.yml` via el comando `bookdown::render_book(output_format = 'all')`. - Análogamente a **Blogdown**, existe la función `bookdown::serve_book()` para visualizar rápidamente cómo los cambios en los archivos del libro alteran su presentación final. --- ## Ejemplo de YAML para `bookdown::gitbook` ```yaml bookdown::gitbook: config: toc: collapse: section # subsection, NULL edit: null # ver ejemplo en https://bookdown.org/yihui/bookdown download: # En la carpeta _book, donde se encuentra index.html, # puedes incluir archivos por descargar cuando se apriete # el botón respectivo en la barra superior. - ["otro_modelo.pdf","PDF"] - ["otro_modelo.epub","EPUB"] search: # Busca en todo el libro, no solo en página actual # No funciona cuando se abre el libro vía su directorio; # requiere un servidor (local o no) engine: fuse # lunr # ¿Por qué usar fuse.js? # https://github.com/rstudio/bookdown/issues/1031 options: # Opciones para fuse.js https://fusejs.io/api/options.html isCaseSensitive: true # Distinguirá mayúsculas que se inserten para buscar fontsettings: theme: night family: serif size: 2 # valor por default sharing: facebook: true github: false twitter: true linkedin: false weibo: false instapaper: false vk: false whatsapp: false all: ['facebook', 'twitter', 'linkedin', 'weibo', 'instapaper'] info: true ``` --- class: middle ## Referenciar entornos de ecuaciones ```md \begin{equation} f\left(k\right) = \binom{n}{k} p^k\left(1-p\right)^{n-k} (\#eq:ecuacion) \end{equation} Notemos que en la ecuación \@ref(eq:ecuacion) se cumple ... ``` ```md \begin{align} g(X_{n}) &= g(\theta)+g'({\tilde{\theta}})(X_{n}-\theta) \notag \\ \sqrt{n}[g(X_{n})-g(\theta)] &= g'\left({\tilde{\theta}}\right) \sqrt{n}[X_{n}-\theta ] (\#eq:alineado) \end{align} La notación ahora es \@ref(eq:alineado) ``` Hay que asegurarse de no enumerar ecuaciones que no poseen _etiqueta_, ya sea alterando los entornos como `equation*` o empleando `\nonumber` o `\notag` apropiadamente. --- ## Entornos definidos vía `Pandoc` y `Bookdown` ### Ejemplo (funciona para formato HTML y PDF, no EPUB) ```md ::: {.theorem #famoso name="Identidad de Euler"} Para cualquier $\theta\in\mathbb{R}$ se cumple $$e^{i\theta}= \cos\theta + i\sin\theta$$ ::: El teorema \@ref(thm:famoso) es el más elegante según ciertos matemáticos. ``` <p style="margin-bottom: 0px;"> </p> .center[ ### Posibilidades <p style="margin-bottom: -30px;"> </p> |Entorno |Nombre impreso |Prefijo de etiqueta | |:-----------|:--------------|:-------------------| |theorem |Theorem |thm | |lemma |Lemma |lem | |corollary |Corollary |cor | |proposition |Proposition |prp | |conjecture |Conjecture |cnj | |definition |Definition |def | |example |Example |exm | |exercise |Exercise |exr | |hypothesis |Hypothesis |hyp | ] ??? Mostrar un ejemplo con el entorno **hypothesis**. --- ## Referencias de texto <p style="margin-bottom: -80px;"> </p> `(ref:ejemplo) ~~Referencias~~ de **una línea** y _sin espacio vacío al final_.` ```` ```{r, fig.cap="(ref:ejemplo)"} plot(pressure) ``` ```` <p style="margin-bottom: -25px;"> </p> ## Referencia a imágenes y mayor control de los gráficos <p style="margin-bottom: -80px;"> </p> ```` ```{r, etiqueta} #| fig.cap: "Gráfica de ejemplo" #| fig.asp: 1 # proporción altura/ancho de la figura #| fig.width: 6 # 6 pulgadas de ancho para la imagen #| fig.align: "center" # centrar la figura plot(pressure) ``` Referencia a la imagen \@ref(fig:etiqueta) . ```` --- class: middle Podemos refenciar la imagen previa vía el nombre del chunk donde fue creada y la sintáxis `\@ref(fig:label)`, pero para que funcione **es necesario que aquel chunk tenga algún valor para _fig.cap_**. <p style="margin-bottom: -30px;"> </p> ## Referencia a tablas <p style="margin-bottom: -80px;"> </p> Podemos emplear la función **kable** del paquete **knitr** para crear tablas y que se les asigne una **etiqueta** en base al nombre del chunk donde se crea la tabla. ```` ```{r tabla} knitr::kable( head(mtcars[, 1:8], 10), booktabs = TRUE, caption = 'Tabla cualquiera' ) ``` Referencia para \@ref(tab:tabla) ```` <p style="margin-bottom: -20px;"> </p> ## _Cross-references_ <p style="margin-bottom: -70px;"> </p> ```md Link para sección [Render book] Link para [una de las secciones pasadas][Render book] ``` --- class: middle ## Personalización del texto de las etiquetas (para HTML) <p style="margin-bottom: -80px;"> </p> Algunas opciones que se pueden incluir en el archivo `_bookdown.yml`: ```yaml language: label: fig: 'Figura ' tab: 'Tabla ' eq: 'Ecuación ' thm: 'Teorema ' lem: 'Lema ' cor: 'Corolario ' prp: 'Proposición ' cnj: 'Conjetura ' def: 'Definición ' exm: 'Ejemplo ' exr: 'Ejercicio ' hyp: 'Hipóthesis ' proof: 'Prueba. ' remark: 'Observación. ' solution: 'Solución. ' ``` --- class: middle ## Resaltado del código mostrado <p style="margin-bottom: -50px;"> </p> ### Incluir en archivo `_output.yml` ```yaml bookdown::gitbook: highlight: espresso # tango, pygments, kate, monochrome, espresso, zenburn, haddock, breezedark, default . ``` <p style="margin-bottom: 0px;"> </p> ### Incluir en archivo `style.css` ```css div.sourceCode *:not(button) { background: inherit !important; } ``` --- class: middle ## Personalización vía HTML y JavaScript <p style="margin-bottom: -80px;"> </p> Así como en los paquetes previos expuestos en esta sesión, es posible anexar código de HTML o de JavaScript a cada página del documento/libro vía el archivo `_output.yml` de la siguiente manera: ```yaml bookdown::gitbook: includes: in_header: ejemplo-01.html # incluir en el interior de <head> before_body: ejemplo-02.html # incluir al inicio del interior de <body> after_body: ejemplo-03.html # incluir al final del interior de <body> ``` --- ## `Bookdown`: _Transferencia de poderes_ <p style="margin-bottom: -85px;"> </p> Si tu publicación consiste de un único documento (sea largo o no) en formato `html_document` , `pdf_document` o `word_document` , puedes implementarle la **enumeración automática de figuras, tablas y ecuaciones**, además del **cross-referencing de figuras, tablas, ecuaciones y secciones** (funcionalidades que **Bookdown** implementó para **R Markdown**) cambiando de la siguiente manera el encabezado YAML de tu documento: ```yaml # Ejemplo de "ANTES" output: html_document: default pdf_document: default word_document: default ``` ```yaml # Ejemplo de "DESPUÉS" output: bookdown::html_document2: default bookdown::pdf_document2: default bookdown::word_document2: default ``` --- <p style="margin-bottom: -60px;"> </p> ## Renderizar un solo capítulo en vez de todo el libro <p style="margin-bottom: -85px;"> </p> `bookdown::preview_chapter('nombre_archivo_capitulo.Rmd')` ## Modificar el orden de los capítulos <p style="margin-bottom: -90px;"> </p> En el archivo `_bookdown.yml`, puedes definir el orden de los capítulos que establece tus documentos **R Markdown**, de las siguientes maneras: ```yaml # Orden para todos los outputs rmd_files: ["index.Rmd", "abstract.Rmd", "intro.Rmd"] ``` ```yaml # Orden para cada tipo de output rmd_files: html: ["index.Rmd", "abstract.Rmd", "intro.Rmd"] latex: ["abstract.Rmd", "intro.Rmd"] # para PDF ``` ## Formato `bookdown::bs4_book` <p style="margin-bottom: -90px;"> </p> Por ahora, basta remover `number_sections` y `highlight` de `_output.yml` , cambiar el formato en tal archivo y renderizar el libro. --- ## Publicamos el libro online de manera gratuita <p style="margin-bottom: -80px;"> </p> Una vez que ya hemos renderizado el libro por completo y está listo para ser publicado, podemos emplear **RStudio Connect** para la publicación. <p style="margin-bottom: -30px;"> </p> ### Pasos 1. Crear una cuenta en [RStudio Connect](https://bookdown.org/connect/). 1. Ejecutar `install.packages('rsconnect')` en la consola de **RStudio**. 1. Ejecutar `bookdown::publish_book()` para publicar el libro.<br> Cuando emplees aquel comando por primera vez, se te pedirá una corta autentificación. 1. En caso desees actualizar el libro, tras haberlo renderizado, ejectua el mismo comando `bookdown::publish_book()` tras haberte asegurado que **RStudio** está empleando como directorio la ruta donde se almacenan los archivos de tu libro. ??? Mostrar también cómo hacerlo vía Netlify y GitHub, para poder tener **version control**. --- class: middle ## Referencias para Bookdown - <https://bookdown.org/yihui/bookdown/> - [Formato bookdown::bs4_book](https://bookdown.org/yihui/bookdown/html.html#bs4-book)