Rstudio rmarkdown: diseño vertical y horizontal en un solo PDF

84

Me pregunto como usar rmarkdown para generar un pdf que tiene un diseño vertical y horizontal en el mismo documento. Si hay una rmarkdownopción pura , sería incluso mejor que usar látex.

Aquí hay un pequeño ejemplo reproducible. Primero, renderizar esto .Rmden RStudio (presione el botón Knit PDF ) da como resultado un pdf con todas las páginas en formato horizontal:

---
title: "All pages landscape"
output: pdf_document
classoption: landscape
---

```{r}
summary(cars)
```

\newpage
```{r}
summary(cars)
```

Luego, un intento de crear un documento que combine el diseño vertical y horizontal. La configuración básica en YAMLse realiza de acuerdo con la sección 'Incluye' aquí . El in_headerarchivo 'header.tex' solo contiene \usepackage{lscape}un paquete sugerido para el knitrdiseño horizontal aquí . El .texarchivo está en el mismo directorio que el.Rmd archivo.

---
title: "Mixing portrait and landscape"
output:
    pdf_document:
        includes:
            in_header: header.tex
---

Portrait:
```{r}
summary(cars)
```

\newpage
\begin{landscape}
Landscape:
```{r}
summary(cars)
```
\end{landscape}

\newpage
More portrait:
```{r}
summary(cars)
```

Sin embargo, este código da como resultado un error:

# ! You can't use `macro parameter character #' in horizontal mode.
# l.116 #

# pandoc.exe: Error producing PDF from TeX source
# Error: pandoc document conversion failed with error 43

Cualquier ayuda es muy apreciada.

user3712688
fuente

Respuestas:

78

Por lo tanto, pandoc no analiza el contenido de los entornos de látex, pero puede engañarlo redefiniendo los comandos en su header.texarchivo:

\usepackage{lscape}
\newcommand{\blandscape}{\begin{landscape}}
\newcommand{\elandscape}{\end{landscape}}

Por lo tanto, aquí \begin{landscape}se redefine a \blandscape, y \end{landscape}a \elandscape. El uso de esos comandos recién definidos en el .Rmdarchivo parece funcionar:

---
title: "Mixing portrait and landscape"
output:
    pdf_document:
        includes:
            in_header: header.tex 
---

Portrait
```{r}
summary(cars)
```

\newpage
\blandscape
Landscape
```{r}
summary(cars)
```
\elandscape

\newpage
More portrait
```{r}
summary(cars)
```
baptiste
fuente
Gracias por su investigación y respuesta (+1). El "no analiza el contenido de los entornos de látex" no está del todo claro en la sección Incluye . Pero asumo que mi latexignorancia también tiene la culpa.
Henrik
4
es una cadena de herramientas compleja, con tres o cuatro jugadores diferentes (knitr-rmarkdown / pandoc-latex) y encuentro que fuera de lo documentado, es bastante difícil averiguar dónde se rompen las cosas. La mejor manera parece ejecutarlos de forma independiente: primero tejer, mirar el resultado .md(bien, aquí), luego la conversión md-> tex (ahí es donde salió mal). El mensaje de error no fue útil porque ya es el siguiente paso (látex).
baptiste
Con esta solución, en el pdf, en lugar del encabezado estructurado creado por "#Introducción", el # aparece como un símbolo
JMarcelino
3
Supongo que una pregunta tonta de látex: ¿dónde (o debería) vivir el archivo header.tex para que se lea? Utilizo mucho RMarkdown, pero soy relativamente nuevo y aún no he entendido todos los paquetes entrelazados y cómo funcionan juntos.
Mike Williamson
el archivo header.tex debe estar en el mismo directorio
baptiste
50

Sobre la base de soluciones anteriores, la siguiente solución no requiere un header.texarchivo auxiliar . Todos los contenidos están incluidos en el .Rmdarchivo. En cambio, los comandos LaTeX se definen en un header-includesbloque en el encabezado YAML. Puede encontrar más información aquí .

Además, noté que el uso del lscapepaquete LaTeX rota el contenido de una página, pero no la página PDF en sí. Esto se resuelve usando el pdflscapepaquete.

---
title: "Mixing portrait and landscape WITHOUT a header.tex file"
header-includes:
- \usepackage{pdflscape}
- \newcommand{\blandscape}{\begin{landscape}}
- \newcommand{\elandscape}{\end{landscape}}
output: pdf_document
---

Portrait
```{r}
summary(cars)
```

\newpage
\blandscape
Landscape
```{r}
summary(cars)
```
\elandscape

\newpage
More portrait
```{r}
summary(cars)
```
Megatron
fuente
1
En mi sistema, esta solución no funciona. Estoy ejecutando R-3.4.4, rmarkdown_1.9, knitr_1.20 en Mac OS_10.13.4. ¿Se pregunta cuál puede ser el problema?
Geochem B
@GeochemB ¿Están instalados correctamente los paquetes LaTeX necesarios? Recientemente tuve éxito con TinyTeX y lo recomiendo.
Megatron
No arrojaron un error cuando los instalé, pero lo verificaré y lo reportaré. Gracias por avisarme, no había pensado en eso y soy nuevo en la salida a PDF / Latex.
Geochem B
@Megatron Pasé por la utilidad Tex Live y tengo el paquete Oberdiek instalado y actualizado. Así que los requisitos están ahí, pero todavía no hay dados. Incluso cuando copio / pego el código anterior, no hay cambios en la orientación.
Geochem B
1
@GeochemB Tengo el mismo problema al usar este código. Intenté ver el documento en SumatraPDF v3.1.1 y Adobe Acrobat DC y Pro. De la documentación Oberdeik está incluido en MikTex. Según tengo entendido, si tengo MikTex instalado, el pdflscape debería ser bueno. Curioso si alguien tiene una solución.
Patrick
22

Para los casos más comunes.

Hay 3 condiciones.

  1. Todo en modo retrato.
  2. Todo en modo paisaje.
  3. Mezcla de modos retrato y paisaje.

Reduzcamos a cada condición.

  1. El primero, digamos que tenemos un documento de rebajas, comienza con el siguiente código. Y esta es la configuración predeterminada en Rstudio cuando crea un archivo rmd. Cuando lo tejes. Asumirá automáticamente que es un modo de retrato sin duda.

    title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
    
  2. Cuando desee tejer el archivo PDF en modo horizontal, lo único que necesita agregar es la opción de clasificación: paisaje

        title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output: pdf_document
        classoption: landscape
    
  3. Si desea una combinación de ambos, deberá agregar el archivo .tex en YAML. Haciendo referencia al enlace que mencioné anteriormente. Puede descargar el código .tex aquí. http://goo.gl/cptOqg O simplemente copie el código y guárdelo como header.tex Luego, para hacer la vida más fácil, coloque este archivo .tex junto con el archivo rmd que se va a tejer. Asegúrese de hacer estas dos cosas: Copie el archivo tex y muévalo junto con el archivo rmd. Cambie el comienzo de rmd para que sea:

     title: "Landscape and Portrait"
        author: "Jung-Han Wang"
        date: "Thursday, March 19, 2015"
        output:
          pdf_document:
            includes:
              in_header: header.tex
    

Este es el resumen después de que jugué con este problema y me beneficié principalmente de la respuesta de baptiste.

Incluí algunas instantáneas y ejemplos en mi blogger mi blogger .

Espero que esto ayude. Buena suerte.

Jung-Han Wang
fuente
2
Tu enfoque funciona. Para que sea más fácil de entender, creo que el problema con pandoc es que se vuelve extraño cuando usas entornos en lugar de macros. Por eso incluí, como sugirió, \ newcommand {\ blandscape} {\ begin {landscape}} y \ newcommand {\ elandscape} {\ end {landscape}} en mi encabezado (el paquete pdflandscape), y funcionó perfectamente. ¡Gracias!
gvegayon
1
Seguí estos pasos anteriores (me ayudó mirar el blog) y funcionó muy bien. ¡Gracias!
Scott Worland
4

Como mencionó Baptiste, si incluye comandos R dentro de un entorno LaTeX, pandoc no los analizará y los colocará como están en el LaTeX generado: esto es lo que causa el error. Más allá de la solución simple y agradable de baptiste, puede usar el xtablepaquete R, que ofrece la posibilidad de crear tablas LaTeX de aspecto más atractivo a partir de la salida R. Para que el siguiente ejemplo funcione, debe agregar \usepackage{rotating}el header.texarchivo:

---
title: "Mixing portrait and landscape"
output:
    pdf_document:
        keep_tex: true
        includes:
            in_header: header.tex
---
```{r, echo=FALSE}
library(xtable)
```

Portrait
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Landscape table"), comment=FALSE)
```

Landscape:
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Landscape table"),
      floating.environment="sidewaystable", comment=FALSE)
```

La segunda tabla se imprimirá dentro del sidewaystableentorno, en lugar de lo habitual table: por lo tanto, se imprimirá en modo paisaje, en una página aparte. Tenga en cuenta que las tablas y figuras que se colocan en modo horizontal por el lscapepaquete o en el sidewaysentorno siempre se colocarán en una página separada, consulte la página 91 de este documento muy importante:

http://www.tex.ac.uk/tex-archive/info/epslatex/english/epslatex.pdf

Como encuentro esto un poco molesto, logré encontrar una manera de mantener las tablas verticales y horizontales en la misma página (perdiendo toda la tarde en el proceso):

---
title: "Mixing portrait and landscape"
output:
    pdf_document:
        keep_tex: true
        includes:
            in_header: header.tex
---
```{r, echo=FALSE}
library(xtable)
```

Portrait:
```{r, results='asis', echo=FALSE}
print(xtable(summary(cars), caption="Portrait table."), comment=FALSE)
```

Landscape:
```{r, results='asis', echo=FALSE}
cat(paste0(
    "\\begin{table}[ht]\\centering\\rotatebox{90}{",
    paste0(capture.output(
      print(xtable(summary(cars)), floating=FALSE, comment=FALSE)),
      collapse="\n"),
    "}\\caption{Landscape table.}\\end{table}"))
```

Para la tabla de paisaje, utilicé la \rotateboxsugerencia proporcionada aquí:

http://en.wikibooks.org/wiki/LaTeX/Rotations

Para que esto funcione, solo tengo que generar la tabularparte de la tabla con la print(xtable(...parte, luego tengo que capturar la salida y rodearla "manualmente" con los comandos tabley rotatebox, convirtiendo todo en una salida de cadena R para que pandoc no vea ellos como entornos LaTeX. Para una solución pura de rmarkdown ... ¡buena suerte!

renato vitolo
fuente
Este es el único en esta página que funcionó para mí. ¡Gracias Renato!
Stuart