在使用 PDF 输出选项的 RMarkdown 中,有时代码块的输出会在页面之间拆分(如下面的示例所示。这有时会产生输出,其中只有一小部分输出在一页上,而较大的部分在另一页上.
Microsoft Word 可以选择启用 Widow/Orphan control 选项来防止这种分离。
如果一个部分少于一定数量的行,我可以在 RMarkdown 中启用任何类似的选项来跨页面合并连续的块吗?
我目前的方法涉及交叉引用输出,并在分成两页的代码块之前放置一个
\newline
。显然,这是不必要的复杂并且很容易出错。
默认情况下,代码块输出放在乳胶
verbatim
环境中。但是你可以使用带有 Verbatim
选项的 samepage
环境从乳胶包 fancyvrb
(参见手册,第 17 页) 来保持代码块的整个输出。
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
只是为了生成随机文本,它与这里的问题/解决方案无关。
您可以将逐字环境扭曲成
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)
```