Rstudio rmarkdown: both portrait and landscape layout in a single PDF

RPdfRstudioKnitrR Markdown

R Problem Overview


I wonder how to use rmarkdown to generate a pdf which has both portrait and landscape layout in the same document. If there is a pure rmarkdown option that would be even better than using latex.

Here's a small, reproducible example. First, rendering this .Rmd in RStudio (press Knit PDF button) results in a pdf with all pages in landscape layout:

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

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

Then an attempt to create a document which mixes portrait and landscape layout. The basic setup in the YAML is done according to the 'Includes' section here. The in_header file 'header.tex' only contains \usepackage{lscape}, a package suggested for knitr landscape layout here. The .tex file is in the same directory as the .Rmd file.

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

However, this code results in an 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

Any help is much appreciated.

R Solutions


Solution 1 - R

So, pandoc does not parse the content of latex environments, but you can fool it by redefining the commands in your header.tex file:

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

Thus, here \begin{landscape} is redefined to \blandscape, and \end{landscape} to \elandscape. Using those newly defined command in the .Rmd file seems to work:

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

Solution 2 - R

Building upon previous solutions, the following solution does not require an auxiliary header.tex file. All contents are contained in the .Rmd file. The LaTeX commands are instead defined in a header-includes block in the YAML header. More info can be found here.

Also, I noticed that using the lscape LaTeX package rotates the contents of a page, but not the PDF page itself. This is resolved using the pdflscape package.

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

Solution 3 - R

For the most common cases.

There are 3 conditions.

  1. Everything in portrait mode.
  2. Everything in landscape mode.
  3. Mixture of portrait and landscape modes.

Let’s narrow down to each conditions.

  1. The first one, say we have a markdown document start with the code below. And this is the default setting in Rstudio when you create an rmd file. When you knit it. It will automatically assume it’s a portrait mode without doubt.

     title: "Landscape and Portrait"
         author: "Jung-Han Wang"
         date: "Thursday, March 19, 2015"
         output: pdf_document
    
  2. When you want to knit the PDF file to landscape mode, the only thing you need to add is classoption: landscape

         title: "Landscape and Portrait"
         author: "Jung-Han Wang"
         date: "Thursday, March 19, 2015"
         output: pdf_document
         classoption: landscape
    
  3. If you want mixture of both, you will need to add .tex file in YAML. By referencing the link I mentioned above. You can download the .tex code here. http://goo.gl/cptOqg Or just simply copy the code and save it as header.tex Then, to make life easier, put this .tex file along with the rmd file to be knitted. Make sure you did these two things: Copy the tex file and move it along with the rmd file. Change the beginning of rmd to be:

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

This is the summary after I played with this issue and mostly benefited from baptiste's answer.

I included some snapshots and examples in my blogger my blogger.

Hope this helps. Good luck.

Solution 4 - R

As baptiste mentioned, if you enclose R commands within a LaTeX environment, pandoc will not parse them and will place them as they are into the generated LaTeX: this is what causes the error. Beyond baptiste's nice and simple fix, you could use the xtable R package, which offers the possibility of creating sexier-looking LaTeX tables from R output. For the following example to work, you need to add \usepackage{rotating} in the header.tex file:

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

The second table will be printed within the sidewaystable environment, rather than the usual table: therefore it will be printed in landscape mode, in a separate page. Note that tables and figures which are placed in landscape mode by the lscape package or in the sideways environment will always be placed in a separate page, see page 91 of this very important document:

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

Since I find this a bit annoying, I managed to find a way to keep both portrait and landscape tables within the same page (wasting my whole afternoon in the process):

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

For the landscape table, I used the \rotatebox suggestion provided here:

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

For this to work, I have to only generate the tabular part of the table with the print(xtable(... part, then I have to capture the output and "manually" surround it with the table and rotatebox commands, converting everything into a string R output so that pandoc does not see them as LaTeX environments. For a pure rmarkdown solution... good luck!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3712688View Question on Stackoverflow
Solution 1 - RbaptisteView Answer on Stackoverflow
Solution 2 - RMegatronView Answer on Stackoverflow
Solution 3 - RJung-Han WangView Answer on Stackoverflow
Solution 4 - Rrenato vitoloView Answer on Stackoverflow