Rstudio rmarkdown: layout verticale e orizzontale in un unico PDF

Mi chiedo come utilizzare rmarkdown per generare un pdf con layout rmarkdown e orizzontale nello stesso documento. Se esiste un’opzione di rmarkdown pura, sarebbe ancora meglio dell’uso del latex.

Ecco un piccolo esempio riproducibile. Innanzitutto, il rendering di questo .Rmd in RStudio (premi il pulsante Knit PDF ) genera un pdf con tutte le pagine in layout orizzontale:

 --- title: "All pages landscape" output: pdf_document classoption: landscape --- ```{r} summary(cars) ``` \newpage ```{r} summary(cars) ``` 

Quindi un tentativo di creare un documento che mischia ritratto e layout del paesaggio. La configurazione di base in YAML viene eseguita in base alla sezione “Include” qui . Il file in_header ‘header.tex’ contiene solo \usepackage{lscape} , un pacchetto suggerito per il layout del panorama di knitr qui . Il file .tex trova nella stessa directory del file .Rmd .

 --- 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) ``` 

Tuttavia, questo codice genera un errore:

 # ! 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 

Ogni aiuto è molto apprezzato.

Quindi, pandoc non analizza il contenuto degli ambienti in latex, ma puoi ingannarlo ridefinendo i comandi nel tuo file header.tex :

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

Quindi, qui \begin{landscape} viene ridefinito in \blandscape e \end{landscape} in \elandscape . L’utilizzo di questi comandi appena definiti nel file .Rmd sembra funzionare:

 --- 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) ``` 

Basandosi su soluzioni precedenti, la seguente soluzione non richiede un file header.tex ausiliario. Tutti i contenuti sono contenuti nel file .Rmd . I comandi LaTeX sono invece definiti in un blocco di intestazione nell’intestazione YAML. Maggiori informazioni possono essere trovate qui .

Inoltre, ho notato che l’uso del pacchetto lscape LaTeX ruota il contenuto di una pagina, ma non la pagina PDF stessa. Questo è risolto usando il pacchetto pdflscape .

 --- 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) ``` 

Per i casi più comuni.

Ci sono 3 condizioni.

  1. Tutto in modalità verticale.
  2. Tutto in modalità orizzontale.
  3. Miscela di modalità verticale e orizzontale.

Restringiamo ad ogni condizione.

  1. Il primo, diciamo che abbiamo un documento di markdown che inizia con il codice qui sotto. E questa è l’impostazione predefinita in Rstudio quando si crea un file rmd. Quando lo lavori a maglia Assumerà automaticamente che sia una modalità verticale senza dubbio.

     title: "Landscape and Portrait" author: "Jung-Han Wang" date: "Thursday, March 19, 2015" output: pdf_document 
  2. Quando vuoi lavorare il file PDF in modalità orizzontale, l’unica cosa che devi aggiungere è classoption: landscape

      title: "Landscape and Portrait" author: "Jung-Han Wang" date: "Thursday, March 19, 2015" output: pdf_document classoption: landscape 
  3. Se si desidera una combinazione di entrambi, sarà necessario aggiungere il file .tex in YAML. Facendo riferimento al collegamento che ho menzionato sopra. Puoi scaricare il codice .tex qui. http://goo.gl/cptOqg O semplicemente copia il codice e salvalo come header.tex Quindi, per semplificarti la vita, metti questo file .tex insieme al file rmd da lavorare. Assicurati di aver fatto queste due cose: copia il file tex e spostalo insieme al file rmd. Cambia l’inizio di rmd per essere:

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

Questo è il riassunto dopo che ho giocato con questo problema e ho beneficiato principalmente della risposta di battista.

Ho incluso alcune istantanee ed esempi nel mio blogger, il mio blogger .

Spero che questo ti aiuti. In bocca al lupo.

Come menzionato da baptiste, se si racchiudono i comandi R all’interno di un ambiente LaTeX, pandoc non li analizzerà e li posizionerà così come sono nel LaTeX generato: questo è ciò che causa l’errore. Oltre alla semplice e semplice correzione di baptiste, è ansible utilizzare il pacchetto xtable R, che offre la possibilità di creare tavoli LaTeX dall’aspetto più sexy dall’output R. Perché il seguente esempio funzioni, devi aggiungere \usepackage{rotating} header.tex \usepackage{rotating} nel file header.tex :

 --- 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 seconda tabella verrà stampata all’interno dell’ambiente sidewaystable , piuttosto che nella solita table : pertanto verrà stampata in modalità orizzontale, in una pagina separata. Nota che le tabelle e le figure posizionate in modalità orizzontale dal pacchetto lscape o dall’ambiente sideways saranno sempre posizionate in una pagina separata, vedi pagina 91 di questo importantissimo documento:

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

Dal momento che trovo un po ‘fastidioso, sono riuscito a trovare un modo per mantenere le tabelle sia verticali che orizzontali all’interno della stessa pagina (sprecando tutto il mio pomeriggio nel processo):

 --- 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}")) ``` 

Per la tabella orizzontale, ho utilizzato il suggerimento \rotatebox fornito qui:

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

Perché funzioni, devo solo generare la parte tabular della tabella con la print(xtable(... parte, quindi devo catturare l’output e “manualmente” circondarlo con i comandi table e rotatebox , convertendo tutto in una stringa R in uscita in modo che pandoc non li veda come ambienti LaTeX.Per una soluzione rmarkdown pura … buona fortuna!