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


84

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

这是一个小的可复制示例。首先,.Rmd在RStudio中渲染此图像(按“编织PDF”按钮)将生成pdf,所有页面均采用横向布局:

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

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

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

然后尝试创建混合纵向和横向布局的文档。中的基本设置YAML是根据此处的“包含”部分完成的。该in_header文件“header.tex”只包含\usepackage{lscape},建议一揽子knitr景观布局在这里。该.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

任何帮助深表感谢。

Answers:


78

因此,pandoc 它不会解析乳胶环境的内容,但是您可以通过重新定义header.tex文件中的命令来使其愚弄:

\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)。“不解析乳胶环境的内容”在“包含”部分中并不十分清楚。但是我认为我的latex无知也应该受到指责。
亨里克

4
它是一个复杂的工具链,具有三个/四个不同的参与者(knitr-rmarkdown / pandoc-latex),而且我发现在记录的内容之外,很难弄清问题出在哪里。最好的方法似乎是独立运行它们:首先进行编织,查看生成的结果.md(在这里很好),然后进行md-> tex转换(这就是问题所在)。该错误消息没有帮助,因为它已经是下一步(乳胶)。
baptiste 2014年

使用此解决方案,在pdf中,而不是由“ #Introduction”创建的结构化标头,而是将#显示为符号
JMarcelino

3
我猜这是愚蠢的乳胶问题:header.tex文件在哪里(或应该存放在哪里),以便读取它?我大量使用RMarkdown,但它相对较新,并且还不了解所有互锁软件包及其协同工作方式。
Mike Williamson

header.tex文件应位于同一目录中
baptiste'Aug

50

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

另外,我注意到使用lscapeLaTeX包旋转页面的内容,而不旋转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)
```

1
在我的系统上,此解决方案不起作用。我在Mac OS_10.13.4上运行R-3.4.4,rmarkdown_1.9,knitr_1.20。想知道可能是什么问题?
Geochem B,

@GeochemB是否正确安装了必需的LaTeX软件包?我最近在TinyTeX上取得了成功,并推荐它。
威震天

安装它们时它们没有引发错误,但是我会仔细检查并报告。感谢您的注意,我没有想到这一点,并且对输出到PDF / Latex还是陌生的。
Geochem B,

@Megatron我经历了Tex Live实用程序,并安装和更新了Oberdiek软件包。这样就可以了,但还没有骰子。即使我复制/粘贴上面的代码,方向也没有改变。
Geochem B,

1
@GeochemB使用此代码,我遇到了同样的问题。我尝试在SumatraPDF v3.1.1和Adobe Acrobat DC和Pro中查看文档。根据文档,Oberdeik包含在MikTex中。根据我的理解,如果我安装了MikTex,则pdflscape应该很好。好奇是否有人解决方案。
帕特里克

22

对于最常见的情况。

有3个条件。

  1. 一切都处于纵向模式。
  2. 一切都处于横向模式。
  3. 纵向和横向模式的混合。

让我们缩小到每个条件。

  1. 第一个,说我们有一个markdown文档,其代码如下。这是创建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
    

这是我处理此问题后的摘要,并且从baptiste的回答中受益匪浅。

我包括在我的博客的一些快照和例子我的博客

希望这可以帮助。祝好运。


2
您的方法有效。为了更容易理解,我认为pandoc的问题在于,当您使用环境而不是宏时,它变得很奇怪。这就是为什么我按照您的建议在标头(pdflandscape程序包)中包含\ newcommand {\ blandscape} {\ begin {landscape}}和\ newcommand {\ elandscape} {\ end {landscape}},并且效果很好。谢谢!
gvegayon

1
我按照上面的步骤进行操作(查看博客对此有所帮助),并且效果很好。谢谢!
Scott Worland 2015年

4

如baptiste所述,如果将R命令包含在LaTeX环境中,则pandoc不会解析它们,而是将它们原样放置在生成的LaTeX中:这是导致错误的原因。除了baptiste的简单好方法之外,您还可以使用xtableR包,它可以从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(...部分生成表的一部分,然后捕获输出,并使用tableandrotatebox命令“手动”将其包围,将所有内容转换为字符串R输出,这样pandoc就不会看到它们作为LaTeX环境。对于纯rmarkdown解决方案...祝您好运!


这是此页面上唯一对我有用的。谢谢,雷纳托!
斯图尔特(Stuart)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.