RMarkdown 防止代码输出跨页中断

问题描述 投票:0回答:2

在使用 PDF 输出选项的 RMarkdown 中,有时代码块的输出会在页面之间拆分(如下面的示例所示。这有时会产生输出,其中只有一小部分输出在一页上,而较大的部分在另一页上.

Microsoft Word 可以选择启用 Widow/Orphan control 选项来防止这种分离。

如果一个部分少于一定数量的行,我可以在 RMarkdown 中启用任何类似的选项来跨页面合并连续的块吗?

我目前的方法涉及交叉引用输出,并在分成两页的代码块之前放置一个

\newline
。显然,这是不必要的复杂并且很容易出错。

r latex r-markdown rstudio knitr
2个回答
3
投票

默认情况下,代码块输出放在乳胶

verbatim
环境中。但是你可以使用带有
Verbatim
选项的
samepage
环境从乳胶包
fancyvrb
(参见手册,第 17 页)
来保持代码块的整个输出。

因此,您可以修改 knitr

output
钩子 以使用
Verbatim[[samepage=true]
而不是
verbatim
,这将基于块选项
nobreak
启用。

因此,如果您想要特定块的无分页行为,请将块选项

nobreak
设置为特定块的
TRUE
,或者如果您想要所有块输出的无分页行为,请使用
nobreak=TRUE
knitr::opts_chunk$set
.

---
title: "No Page Break for Outputs"
output: pdf_document
header-includes:
  - \usepackage{lipsum}
  - \usepackage{fancyvrb}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, nobreak=TRUE)
```


```{r, echo=FALSE}
library(knitr)

default_output_hook <- knit_hooks$get('output')

knit_hooks$set(
  output = function(x, options) {
    if(is.null(options$nobreak)) {
      default_output_hook(x, options)
    } else {
      paste0("\\begin{Verbatim}[samepage=true]\n", x, "\n\\end{Verbatim}"
        )
    }
  }
)
```

\lipsum[1-5]

## R code

```{r}
t.test(mpg ~ am, data=mtcars)
```


注意:我有乳胶包

lipsum
只是为了生成随机文本,它与这里的问题/解决方案无关。


1
投票

您可以将逐字环境扭曲成

minipage
,它不能跨页中断:

---
title: "No Page Break for Outputs"
output: pdf_document
header-includes:
  - \usepackage{lipsum}
  - \AddToHook{env/verbatim/begin}{\begin{minipage}{\linewidth}}
  - \AddToHook{env/verbatim/end}{\end{minipage}}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

\lipsum[1-5]

## R code

```{r}
t.test(mpg ~ am, data=mtcars)
```

这也可以用于仅使一个代码块牢不可破,同时保持其他代码块的默认行为:

---
title: "No Page Break for Outputs"
output: pdf_document
header-includes:
  - \usepackage{lipsum}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

\lipsum[1-5]

## R code

\AddToHookNext{env/verbatim/begin}{\begin{minipage}{\linewidth}}
\AddToHookNext{env/verbatim/end}{\end{minipage}}
```{r}
t.test(mpg ~ am, data=mtcars)
```
© www.soinside.com 2019 - 2024. All rights reserved.