【问题标题】:add vertical space above and below figures/code chunks在数字/代码块上方和下方添加垂直空间
【发布时间】:2017-04-12 20:37:42
【问题描述】:

我正在从Rmd 编织到 PDF。我想在数字/代码块的上方和下方添加垂直空间,以将此内容与正文分开。通过将以下内容添加到我的序言see this answer 中,我已经成功地为Rnw 文件完成了此操作:

\renewenvironment{knitrout}{\vspace{1em}}{\vspace{1em}}

我尝试将此行添加到我的 Rmd 文件的 yaml 部分中的header-includes,但它不起作用。我打开了保留临时 tex 文件的选项,我看到 tex 中没有 knitrout 环境。

相反,(i) 代码块被包裹在 \begin{Shaded} 中,(ii) 数字被包裹在 \begin{figure} 中,(iii) 表格被包裹在 \begin{longtable} 中。

我尝试通过将以下内容添加到 header-includes 来解决代码块 (i) 的问题:

\renewenvironment{Shaded}{\vspace{1em}}{\vspace{1em}}

这增加了空间,但删除了阴影背景。我不知道如何解决这个问题或解决数字 (ii) 和表格 (iii)。

R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.4

【问题讨论】:

  • 谢谢,@DavidLively。我遇到过一些建议,建议像这样的问题更适合 SO,因为如果有人知道 rmarkdown 和 LaTeX 会有所帮助。不过你可能是对的。
  • 很公平。我的 LaTeX 技能太生疏了。不过,这里的问题很好。

标签: latex r-markdown


【解决方案1】:

我认为你需要修改钩子:https://yihui.name/knitr/hooks/
我给你一些例子。了解它的工作原理后,您可以添加自己的修改。

在源代码前添加vspace

要修改的钩子:

```{r setup_source, include=FALSE}
hook_source_def = knitr::knit_hooks$get('source')
knitr::knit_hooks$set(source = function(x, options) {
  if (!is.null(options$vspaceecho)) {
    begin <- paste0("\\vspace{", options$vspaceecho, "}")
    stringr::str_c(begin, hook_source_def(x, options))
  } else {
    hook_source_def(x, options)
  }
})
```

如何调用这个修改:

```{r vspace, vspaceecho='2cm', echo=TRUE}
summary(cars)
```

在 R 输出后添加 vspace

要修改的钩子

```{r setup_output, include=FALSE}
hook_output_def = knitr::knit_hooks$get('output')
knitr::knit_hooks$set(output = function(x, options) {
  if (!is.null(options$vspaceout)) {
    end <- paste0("\\vspace{", options$vspaceout, "}")
    stringr::str_c(hook_output_def(x, options), end)
  } else {
    hook_output_def(x, options)
  }
})
```

如何调用这个修改:

```{r vspaceafter, vspaceout='1cm'}
summary(cars)
```

在图形前后添加vspace

您可以创建一个新环境来嵌入图形。这需要添加一个技巧,让 pandoc 忽略 \begin\end,否则 pandoc 不会将环境中的代码视为 markdown 语法。

创建要在 YAML 中调用的外部 tex 文件

里面有这段文字

\newenvironment{plotspace}[1]{#1}
% -- command for pandoc trick with \begin and \end -- %
\newcommand{\nopandoc}[1]{#1} 

在 YAML 中调用 tex 文件

output: 
  pdf_document:
    keep_tex: yes
    include:
      in_header: header.tex

要包含在代码中的钩子函数

hook_plot_def = knitr::knit_hooks$get('plot')
knitr::knit_hooks$set(plot = function(x, options) {
  if (!is.null(options$vspaceplot)) {
    begin <- paste0("\\nopandoc{\\begin{plotspace}}\n\\vspace{", options$vspaceplot, "}\n")
    end <- paste0("\n\\vspace{", options$vspaceplot, "}\n\\nopandoc{\\end{plotspace}}")
    stringr::str_c(begin, hook_plot_def(x, options), end)
  } else {
    hook_plot_def(x, options)
  }
})

怎么称呼它

```{r plotvspace, vspaceplot='2em', fig.cap='Figure with vspace'}
plot(cars)
```

在更新环境中检索阴影

当您尝试更新 Shaded 环境时,您可以在附加的 header.tex 文件中执行以下操作。

\renewenvironment{Shaded}
{
  \vspace{2cm}%
  \begin{snugshade}%
}{%
  \end{snugshade}%
  \vspace{5cm}%
}

【讨论】:

  • 谢谢@StatnMap。这看起来很棒。我将 pandoc 技巧放在我在 YAML 中调用的 .tex 文件中,但出现错误。 ! Undefined control sequence. l.145 \newcommand{\nopandoc。我错过了一个乳胶包是不是很明显?
  • 我认为您不需要其他软件包。我将要下载(压缩)的 Rmd 文件和头 tex 文件放在我的网站上:statnmap.com/vspace_rmarkdown。解压它。然后您可以通过单击 Rstudio 中的 knit 按钮来运行它,或者您可以在 R 中使用以下命令运行它:rmarkdown::render("Fig_Vspace_rmarkdown.Rmd", output_format = "pdf_document")
  • 我用你的替换了我包含的 .tex 文件并解决了错误,所以谢谢。一切都在运行,但我正在努力修改部分之间的空间。在this rmd file,我将参数移动到设置块并将它们设置为非常小......但pdf输出仍然显示大空间。
  • 是因为在头tex文件的\renewenvironment{Shaded}集合中,也有vspace集合。您应该在此更新环境和挂钩修改之间进行选择。或定义所需的组合。
  • I made a few tweaks 让 PDF 看起来像我想要的那样。非常好。我能看到的唯一剩下的问题是vspaceplot 阻止图形标签工作。例如,文本中对图 1 的引用打印为“图??”。 pandoc“技巧”是否有可能干扰数字编号?
猜你喜欢
  • 1970-01-01
  • 2014-10-16
  • 2019-06-25
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多