diseños de dos columnas en presentaciones RStudio / slidify / pandoc


Estoy tratando de llegar a un buen sistema para generar diapositivas y folletos de acompañamiento. El sistema ideal tendría las siguientes propiedades:

  • hermoso en ambos diseños de presentación (PDF/HTML) y folleto (PDF) (los folletos deben tener espacio para tomar notas)
  • trozos R incrustados, figuras, otras imágenes JPG / PNG, etc.
  • fácil de componer
  • compilar usando herramientas de línea de comandos
  • apoyo bibliográfico
  • pandoc separador de diapositivas se prefiere el formato (generar automáticamente una nueva diapositiva después de las cabeceras de un nivel especificado)
  • Puedo vivir con un poco de procesamiento adicional (por ejemplo, a través de sed), pero preferiría no escribir una infraestructura enorme
  • diseños de dos columnas: hay un ASÍ que publica sobre cómo obtener diapositivas de varias columnas de pandoc, pero está orientado a LaTeX en lugar de a HTML.
  • capacidad para ajustar el tamaño de las imágenes incrustadas (que no sean figuras generadas por R) y la columna anchos sobre la marcha

Esto es lo que he descubierto hasta ahora sobre las diversas opciones:

  • Slidify :
    • no hace pandoc formato separador de diapositivas, aunque hay una solución
    • la sugerencia para crear folletos es imprimir en PDF; me gustaría dejar espacio para notas, etc. (Probablemente podría encontrar una manera de hacerlo usando algo como PDFtk o psnup...)
  • RStudio presentaciones (.Rpres archivos):
    • hace muchas cosas muy bien, incluyendo columnas múltiples con anchos especificados
    • no admite el formato de separador de diapositivas pandoc
    • No puedo entender lo que está pasando bajo el capó. Existe la documentación de RStudio que describe el proceso de traducción para HTML normal, pero no parece cubrir el formato de presentación R (que no es exactamente el mismo). (Anteriormente he invertido un poco de esfuerzo en averiguar cómo obtener RStudio-como salida a través de pandoc ...), lo que significa que no puedo generar diapositivas, etc. desde la línea de comandos.
  • La versión de desarrollo de RStudio (a partir de marzo de 2014) viene incluida con Pandoc y la versión 2 de rmarkdown. Aborda muchos de los problemas anteriores con el formato .Rpres.
  • pandoc: puede ser el único traductor de markdown que tiene características como notas al pie, soporte bibliográfico, etc.. También puedo usar pandoc para generar LaTeX usando la clase tufte-handout, que cumple con mis criterios de belleza.
    • Desafortunadamente, parece no tener soporte de formato de dos columnas incorporado. El ejemplo HTML5 de Yihui Xie no muestra ningún ejemplo de dos columnas, y afirma (en la diapositiva 5) que hacer clic en el botón "Tejer HTML" en RStudio equivale a pandoc -s -S -i -t dzslides --mathjax knitr-slides.md -o knitr-slides.html, pero no parece serlo ...
  • LaTeX/beamer: Simplemente podría componer en Rnw (knitr-dialect Sweave) en lugar de R markdown para empezar. Esto me daría lo último flexibilidad ...
    • a pesar de muchos años de uso de látex, encuentro que la composición de látex es más dolorosa que la composición de markdown.

Después de todo eso, mi pregunta específica es: ¿cuál es la mejor manera (más fácil) de generar un diseño de dos columnas para la salida HTML?

Cualquier otro consejo también será apreciado.

Author: Community, 2013-12-31

5 answers

Esta es una vieja Q, pero recientemente me plagó una pregunta similar, esto es lo que encontré:

Usando el formato RPres, se pueden especificar dos columnas así ( detalles). Tenga en cuenta que RPres solo se puede convertir a HTML haciendo clic en un botón en RStudio, no parece haber ningún método de línea de comandos, lo que es un poco molesto. A pesar de eso, diría que actualmente es el método más simple y flexible para obtener columnas de diapositivas con markdown:

=== 

Two Column Layout  
===

This slide has two columns

***

```{r, echo=FALSE}
plot(cars)
```

introduzca la descripción de la imagen aquí

Se proporciona cierta flexibilidad ajustando las proporciones de las columnas:

===

Two Column Layout  
===
left: 30%
This slide has two columns

***

```{r, echo=FALSE}
plot(cars)
```

introduzca la descripción de la imagen aquí

Con rmarkdown podemos obtener dos columnas, pero sin control sobre dónde está la ruptura, lo cual es un pequeño problema:

---
output: ioslides_presentation
---


## Two Column Layout  {.columns-2}

This slide has two columns


```{r, echo=FALSE}
plot(cars)
```

introduzca la descripción de la imagen aquí

También podemos mezclar markdown y LaTeX en un archivo Rmd usando el formato beamer_presentation en RStudio para obtener dos columnas como esta, pero no podemos ejecutar ningún código en ninguna columna, lo cual es una limitación:

---
output: beamer_presentation
---

Two Column Layout 
-------

\begin{columns}
\begin{column}{0.48\textwidth}
This slide has two columns
\end{column}
\begin{column}{0.48\textwidth}
If I put any code in here I get an error, see
https://support.rstudio.com/hc/communities/public/questions/202717656-Can-we-have-columns-in-rmarkdown-beamer-presentations-
\end{column}
\end{columns}

introduzca la descripción de la imagen aquí

Parece que un documento LaTeX Rnw regular es la mejor manera de obtener columnas si desea usar LaTex, no este híbrido markdown (cf. dos columnas beamer / sweave slide con grid graphic )

En todo lo anterior se puede colocar una imagen en una columna.

El sitio web de slidify tiene instrucciones para hacer dos columnas aquí: http://slidify.org/customize.html pero no está claro qué tiene que ir a la carpeta assets/layouts para que funcione

 24
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:41

Ahora tengo lo que creo que es una solución razonable que debería aplicarse al menos a las soluciones basadas en ioslides, y tal vez (?) a otros formatos basados en HTML5. Comenzando aquí , agregué

<style>
div#before-column p.forceBreak {
    break-before: column;
}
div#after-column p.forceBreak {
    break-after: column;
}
</style>

Al principio de mi documento; luego poner <p class="forceBreak"></p> dentro de una diapositiva con {.columns-2} rompe la columna en ese punto, por ejemplo,

## Latin hypercube sampling {.columns-2}

- sample evenly, randomly across (potentially many) uncertain parameters

<p class="forceBreak"></p>

![](LHScrop.png)
[User:Saittam, Wikipedia](https://commons.wikimedia.org/wiki/File:LHSsampling.png#/media/File:LHSsampling.png)

Puede haber una manera aún mejor, pero esto no es demasiado doloroso.

@ChrisMerkord señala en los comentarios que

.forceBreak { -webkit-column-break-after: always; break-after: column; }

Funcionó en su lugar (No he probado ...)

 11
Author: Ben Bolker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 16:57:20

Tengo una idea de AQUÍ, las soluciones básicas fue:


### Function *inner_join*
. . .

`<div style="float: left; width: 50%;">`
``` {r, echo = FALSE, results = 'markup', eval = TRUE}
kable(cbind(A,B))                                    
```
`</div>`
`<div style="float: right; width: 50%;">`
```{r, echo = TRUE, results = 'markup', eval = TRUE}
inner_join(A,B, by="C")
```
`</div>`

 5
Author: Rafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 07:26:21

Existe una solución para el error beamer.

En resumen: El error está relacionado con el motor de conversión pandoc, que trata todo entre \begin{...} y \end{...} como TeX. Se puede evitar dando una nueva definición para begin{column} y end{column} en la cabecera yaml.

Crea miestilo.tex y escribir allí:

\def\begincols{\begin{columns}}
\def\begincol{\begin{column}}
\def\endcol{\end{column}}
\def\endcols{\end{columns}}

En el archivo Rmd utilice estas nuevas definiciones

---
output:
  beamer_presentation:
    includes:
      in_header: mystyle.tex
---


Two Column Layout 
-------

\begincols
  \begincol{.48\textwidth}

This slide has two columns.

  \endcol
\begincol{.48\textwidth}

```{r}
#No error here i can run any r code
plot(cars)
```

  \endcol
\endcols

Y obtienes: introduzca la descripción de la imagen aquí

 5
Author: Mikael Jumppanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 08:35:59

Hasta ahora no he sido capaz de hacer algo mejor que hackear mi propio poco de marcado en la parte superior del formato rmd: Llamo a mi archivo fuente rmd0 y ejecutar un script que incluye este sed tidbit para traducirlo a rmd antes de llamar knit:

sed -e 's/BEGIN2COLS\(.*\)/<table><tr><td style="vertical-align:top; width=50%" \1>/' \
    -e 's/SWITCH2COLS/<\/td><td style="vertical-align:top">/' \
    -e 's/END2COLS/<\/td><\/tr><\/table>/' ...

Hay algunas razones por las que no me gusta esto. (1) Es feo y de propósito especial, y no tengo una manera particularmente buena de permitir argumentos opcionales (por ejemplo, anchos relativos de columnas, alineación, etc.).). (2) tiene que ser ajustado para cada salida formato (por ejemplo, si quisiera la salida LaTeX/beamer tendría que sustituir \begin{columns}\begin{column}{5cm} ... \end{column}\begin{column}{5cm} ... \end{column}\end{columns} en su lugar (resulta que quiero ignorar el formato de dos columnas cuando hago folletos de formato LaTeX, por lo que es un poco más fácil, pero sigue siendo feo).

Slidify todavía puede ser la respuesta.

 3
Author: Ben Bolker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-13 23:14:25