RMarkdown 防止代码输出跨页

Ale*_*fie 3 latex r rstudio knitr r-markdown

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

显示页面之间块输出分割的示例输出

Microsoft Word 可以选择启用寡妇/孤儿控制选项,以防止这种分离。

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

我当前的方法涉及交叉引用输出并\newline在代码块之前放置在两个页面之间分割的代码块。显然,这是不必要的复杂并且很容易出错。

sha*_*fee 6

默认情况下,代码块输出放置在 Latexverbatim环境中。但是您可以使用 Latex 包中的Verbatim环境和选项(请参阅手册,第 17 页)来将代码块的整个输出放在一起。samepagefancyvrb

因此,您可以修改knitroutput钩子以使用Verbatim[[samepage=true]而不是verbatim基于chunk-option启用的钩子nobreak

因此,如果您想要特定块的无分页行为,请将块选项设置nobreakTRUE特定块,或者如果您想要所有块输出的无分页行为,请使用nobreak=TRUEin 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)
```
Run Code Online (Sandbox Code Playgroud)

无分页符的代码输出


注意:我有乳胶包lipsum只是为了生成随机文本,它与这里的问题/解决方案无关。