Rstudio rmarkdown:单个PDF中的纵向和横向布局

时间:2014-09-15 13:58:03

标签: r pdf rstudio knitr r-markdown

我想知道如何使用rmarkdown生成在同一文档中同时具有纵向和横向布局的pdf。如果有一个纯rmarkdown选项比使用latex更好。

这是一个小的,可重复的例子。首先,在RStudio中渲染此.Rmd(按编织PDF 按钮)会生成包含横向布局中所有页面的pdf:

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

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

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

然后尝试创建混合纵向和横向布局的文档。 YAML中的基本设置是根据“包含”部分here完成的。 in_header文件'header.tex'仅包含\usepackage{lscape},即knitr横向布局here的建议包。 .tex文件与.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)
```

但是,此代码会导致错误:

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

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:61)

所以,pandoc does not解析了乳胶环境的内容,但您可以在header.tex文件中redefining the commands欺骗它:

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

因此,此处\begin{landscape}重新定义为\blandscape\end{landscape}重新定义为\elandscape。在.Rmd文件中使用这些新定义的命令似乎有效:

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

答案 1 :(得分:30)

基于以前的解决方案,以下解决方案不需要辅助header.tex文件。所有内容都包含在.Rmd文件中。而是在YAML标头的header-includes块中定义LaTeX命令。可以找到更多信息here

另外,我注意到使用lscape LaTeX包会旋转页面的内容,但不会旋转PDF页面本身。这是使用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)
```

答案 2 :(得分:16)

对于最常见的情况。

有三个条件。

  1. 一切都处于纵向模式。
  2. 横向模式中的所有内容。
  3. 纵向和横向模式的混合。
  4. 让我们缩小到每个条件。

    1. 第一个,比如说我们有一个降价文件,下面是代码。这是创建rmd文件时Rstudio中的默认设置。当你编织它。毫无疑问,它会自动假设它是一个肖像模式。

      title: "Landscape and Portrait"
          author: "Jung-Han Wang"
          date: "Thursday, March 19, 2015"
          output: pdf_document
      
    2. 当您想要将PDF文件编织为横向模式时,您唯一需要添加的是classoption:landscape

          title: "Landscape and Portrait"
          author: "Jung-Han Wang"
          date: "Thursday, March 19, 2015"
          output: pdf_document
          classoption: landscape
      
    3. 如果您想要两者混合,则需要在YAML中添加.tex文件。通过引用我上面提到的链接。您可以在此处下载.tex代码。 http://goo.gl/cptOqg或者只是简单地复制代码并将其保存为header.tex然后,为了使生活更轻松,请将此.tex文件与rmd文件一起编织。确保你做了这两件事: 复制tex文件并将其与rmd文件一起移动。 将rmd的开头更改为:

       title: "Landscape and Portrait"
          author: "Jung-Han Wang"
          date: "Thursday, March 19, 2015"
          output:
            pdf_document:
              includes:
                in_header: header.tex
      
    4. 这是我玩这个问题之后的摘要,主要是受益于巴蒂斯特的答案。

      我在博主my blogger中添加了一些快照和示例。

      希望这会有所帮助。 祝你好运。

答案 3 :(得分:2)

正如baptiste所提到的,如果你将R命令包含在LaTeX环境中,pandoc将不会解析它们并将它们放入生成的LaTeX中:这就是导致错误的原因。除了baptiste的简单修复,您可以使用xtable R包,它可以从R输出创建更性感的LaTeX表。要使以下示例生效,您需要在\usepackage{rotating}文件中添加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)
```

第二个表格将打印在sidewaystable环境中,而不是通常的table:因此它将以横向模式打印在单独的页面中。请注意,lscape包或sideways环境中以横向模式放置的表格和图形将始终放在单独的页面中,请参阅此非常重要的文档的第91页:

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

由于我觉得这有点烦人,我设法找到一种方法将肖像和风景表保持在同一页面中(在整个过程中浪费了整个下午):

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

对于横向表,我使用了此处提供的\rotatebox建议:

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

为了实现这一点,我必须仅使用tabular部分生成表格的print(xtable(...部分,然后我必须捕获输出并使用{{1“手动”环绕它}和table命令,将所有内容转换为字符串R输出,以便pandoc不会将它们视为LaTeX环境。对于纯粹的rmarkdown解决方案......祝你好运!