es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Referenciación dinámica de notas al pie en rmarkdown / bookdown.

Estoy combinando varios archivos .Rmd en un solo documento grande usando bookdown. Los archivos individuales contienen notas al pie, que comienzan con ^[1]. Esto obviamente lleva a notas al pie duplicadas en el documento final, ya que bookdown no puede determinar a qué referencia pertenece cada nota al pie.

Como consecuencia, me pregunto si hay alguna forma de generar dinámicamente notas al pie cuando se renderiza el documento, pero no pude encontrar nada relacionado con eso en la documentación de bookdown.

Tengo esta solución de trabajo que utiliza una función personalizada:

---
title: "Untitled"
output:
  html_document:
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

footnote.nr <- 0

footnote.counter <- function(){
  footnote.nr <- footnote.nr + 1
  .GlobalEnv$footnote.nr <- footnote.nr
  return(footnote.nr)
}
```

Lorem ipsum.[^`r footnote.counter()`]

[^`r footnote.nr`]: Prueba

Lorem ipsum.[^`r footnote.counter()`]

[^`r footnote.nr`]: Prueba2

Sin embargo, esto resultaría en tener que adaptar todo el documento, lo cual sería igual de trabajoso que comenzar la numeración de las notas al pie desde cero (aunque probablemente sea menos propenso a errores). ¿Existen otras soluciones? También estaría bien si las notas al pie se muestran para cada capítulo individual, lo que significa que la primera nota al pie de cada capítulo comienza con un 1.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es usar el paquete noteref, que proporciona una forma de renumerar automáticamente las notas al pie en un documento. Para usar noteref en tu documento bookdown, puedes agregarlo al campo preamble en tu archivo bookdown.yml:

    pandoc_args: [
      "--lua-filter=noteref.lua"
    ]
    

    Esto permitirá que noteref se utilice cuando tus archivos .Rmd se rendericen a HTML o PDF.

    Para usar noteref en tus archivos .Rmd individuales, puedes reemplazar la notación ^[1] de las notas al pie con la notación [@label], donde label es un identificador único para cada nota al pie. Por ejemplo:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed et vehicula mauris. Sed feugiat ultricies purus, eget blandit justo fringilla vitae. Vivamus lobortis arcu vitae porttitor imperdiet. Sed maximus, elit vel mattis dignissim, elit est luctus dolor, eu interdum diam libero nec metus. Sed vel sapien ac metus consequat efficitur ac ut turpis. Sed sit amet magna eu metus hendrerit commodo. In sodales, neque vitae sollicitudin blandit, velit velit venenatis dolor, in sollicitudin eros turpis ut mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam non feugiat est, eget laoreet dolor. Ut in elit vel leo ornare fermentum nec ut ipsum. Nunc euismod nulla tortor, ut maximus est dignissim vel. Nullam vel dignissim orci. Praesent dictum ultricies arcu, et malesuada leo vestibulum a. Cras justo ex, imperdiet in sollicitudin quis, porttitor sit amet purus. Pellentesque nec neque nec ex imperdiet consectetur at a nulla. Nullam vel euismod tellus. [@fn1]
    
    [@fn1]: Esta es una nota al pie.
    

    En este ejemplo, la nota al pie está etiquetada como fn1 en lugar de utilizar la notación ^[1]. Cuando tu documento se renderice, noteref reemplazará la notación [@fn1] con el número de nota al pie correspondiente, basándose en el orden de aparición de los identificadores label en tu documento.

    Si deseas reiniciar los números de las notas al pie en cada capítulo de tu documento bookdown, puedes usar la función noteref_seq del paquete noteref en combinación con knitr para definir una nueva secuencia de números de notas al pie para cada capítulo. Por ejemplo:

    ---
    title: "Mi libro"
    output: 
      bookdown::html_document2:
        includes:
          in_header: "header.html"
    ---
    
    ```{r setup, include=FALSE}
    library(noteref)
    library(knitr)
    
    # Define una nueva sección para cada capítulo
    knitr::knit_hooks$set(section = function(before, options, envir) {
      if(before) {
        noteref_seq("chap1", 1)
      }
    })
    
    # Define una sección para cada capítulo
    

    Capítulo 1

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed et vehicula mauris. Sed feugiat ultricies purus, eget blandit justo fringilla vitae. Vivamus lobortis arcu vitae porttitor imperdiet. Sed maximus, elit vel mattis dignissim, elit est luctus dolor, eu interdum diam libero nec metus. Sed vel sapien ac metus consequat efficitur ac ut turpis. Sed sit amet magna eu metus hendrerit commodo. In sodales, neque vitae sollicitudin blandit, velit velit venenatis dolor, in sollicitudin eros turpis ut mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam non feugiat est, eget laoreet dolor. Ut in elit vel leo ornare fermentum nec ut ipsum. Nunc euismod nulla tortor, ut maximus est dignissim vel. Nullam vel dignissim orci. Praesent dictum ultricies arcu, et malesuada leo vestibulum a. Cras justo ex, imperdiet in sollicitudin quis, porttitor sit amet purus. Pellentesque nec neque nec ex imperdiet consectetur at a nulla. Nullam vel euismod tellus. [@fn1]

    [@fn1]: Esta es una nota al pie en el capítulo 1.

    Capítulo 2

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed et vehicula mauris. Sed feugiat ultricies purus, eget blandit justo fringilla vitae. Vivamus lobortis arcu vitae porttitor imperdiet. Sed maximus, elit vel mattis dignissim, elit est luctus dolor, eu interdum diam libero nec metus. Sed vel sapien ac metus consequat efficitur ac ut turpis. Sed sit amet magna eu metus hendrerit commodo. In sodales, neque vitae sollicitudin blandit, velit velit venenatis dolor, in sollicitudin eros turpis ut mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam non feugiat est, eget laoreet dolor. Ut in elit vel leo ornare fermentum nec ut ipsum. Nunc euismod nulla tortor, ut maximus est dignissim vel. Nullam vel dignissim orci. Praesent dictum ultricies arcu, et malesuada leo vestibulum a. Cras justo ex, imperdiet in sollicitudin quis, porttitor sit amet purus. Pellentesque nec neque nec ex imperdiet consectetur at a nulla. Nullam vel euismod tellus. [@fn2]

    [@fn2]: Esta es una nota al pie en el capítulo 2.
    “`

    En este ejemplo, definimos una nueva secuencia de números de notas al pie para cada capítulo usando la función noteref_seq, y usamos knitr para definir una nueva sección para cada capítulo y reiniciar los números de notas al pie al comienzo de cada capítulo. Cuando se renderice tu documento bookdown, deberías ver notas al pie etiquetadas secuencialmente dentro de cada capítulo, comenzando desde 1.

Comments are closed.