Latex 在数字/代码块上方和下方添加垂直空间

Latex 在数字/代码块上方和下方添加垂直空间,latex,r-markdown,Latex,R Markdown,我正在从Rmd编织到PDF。我想在图/代码块的上方和下方添加垂直空间,以将此内容与正文分开。通过在序言中添加以下内容,我成功地为Rnw文件完成了这项工作: 我尝试将这一行添加到Rmd文件yaml部分的头includes,但没有成功。我打开了保留临时tex文件的选项,我看到tex中没有knitrout环境 相反,(i)代码块被包装在\begin{Shaded}中,(ii)图在\begin{figure}中,以及(iii)表在\begin{longtable}中 我尝试通过将以下内容添加到头包含中来

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

我尝试将这一行添加到Rmd文件yaml部分的
头includes
,但没有成功。我打开了保留临时tex文件的选项,我看到tex中没有
knitrout
环境

相反,(i)代码块被包装在
\begin{Shaded}
中,(ii)图在
\begin{figure}
中,以及(iii)表在
\begin{longtable}

我尝试通过将以下内容添加到
头包含中来解决代码块的问题(I):

\renewenvironment{Shaded}{\vspace{1em}}{\vspace{1em}}
这增加了空间,但去掉了阴影背景。我不知道如何解决这个问题,也不知道如何处理图(ii)和表(iii)


我认为您需要修改挂钩:
我举几个例子。一旦了解了它的工作原理,就可以添加自己的修改

在源代码之前添加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 要修改的挂钩

```{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)
  }
})
```
在图形前后添加vspace 您可以创建一个新的环境来嵌入一个图形。这需要添加一个技巧来让PANDOC忽略<代码> \开始< /代码>和<代码> \\代码>,否则PANDOC不把环境中的代码当作标记语法。 创建要在YAML中调用的外部tex文件 这段文字在里面

\newenvironment{plotspace}[1]{#1}
% -- command for pandoc trick with \begin and \end -- %
\newcommand{\nopandoc}[1]{#1} 
在YAML中调用tex文件 要包含在代码中的钩子函数 在更新环境中检索阴影 当您尝试更新
着色
环境时,您可以在附加的header.tex文件中执行以下操作

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

“谢谢你,”大卫利地说。我遇到过一些建议,建议这样的问题更适合SO,因为有人知道
rmarkdown
和LaTeX会有帮助。也许你是对的,这很公平。我的乳胶技能太生疏了。不过,这里的问题很好。谢谢,@StatnMap。这看起来很棒。我在调用YAML的.tex文件中加入了pandoc技巧,但我得到了一个错误<代码>!未定义的控制序列。l、 145\newcommand{\nopandoc
。是否应该很明显我缺少一个latex软件包?我认为您不需要其他软件包。我将Rmd文件和头文件tex文件放在下载位置(压缩)在我的网站上:。解压缩它。然后你可以通过点击Rstudio中的
knit
按钮来运行它,或者你可以在R:
rmarkdown::render(“Fig\Vspace\u rmarkdown.Rmd”,output\u format=“pdf\u document”)中使用这个命令来运行它
我将包含的.tex文件替换为您的文件,并解决了错误,谢谢。一切正常,但我正在努力修改节之间的间距。在中,我将参数移动到设置块中,并将其设置为非常小…但pdf输出仍然显示较大的间距。这是因为在
\renewenvironment{shade}
set在头文件tex中,还有
vspace
set。您应该在更新环境和钩子修改之间进行选择。或者定义所需的组合。以使PDF看起来像我想要的那样。非常好。我能看到的唯一剩余问题是
vspaceplot
阻止图形标签工作。对于instance,文本中对图1的引用打印为“图???”。pandoc“技巧”是否可能干扰图编号?
```{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)
```
\newenvironment{plotspace}[1]{#1}
% -- command for pandoc trick with \begin and \end -- %
\newcommand{\nopandoc}[1]{#1} 
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)
```
\renewenvironment{Shaded}
{
  \vspace{2cm}%
  \begin{snugshade}%
}{%
  \end{snugshade}%
  \vspace{5cm}%
}