用knitr / rmarkdown用钩子包裹乳胶环境图

时间:2015-12-01 10:14:04

标签: r latex knitr r-markdown

我想在"包装中包装用knitr和rmarkdown创建的数字"环境使用钩子。但是,在运行下面的最小示例时,图块只会被编译成markdown图片:

\begin{wrapfigure}{R}{0.3\textwidth}
![](test_files/figure-latex/unnamed-chunk-2-1.pdf) 
\end{wrapfigure}

而不是预期的:

\begin{wrapfigure}{R}{0.3\textwidth}
\includegraphics{test_files/figure-latex/unnamed-chunk-2-1.pdf}
\end{wrapfigure}

最小例子:

---
header-includes:
   - \usepackage{wrapfig}
output: 
  pdf_document:
    keep_tex: TRUE
---

```{r}
library(knitr)
knit_hooks$set(wrapf = function(before, options, envir) {
  if(before) {
    "\\begin{wrapfigure}{R}{0.3\\textwidth}"
  } else {
    "\\end{wrapfigure}"
  }
})
```

```{r, wrapf=TRUE}
library(ggplot2)
qplot(cars$speed, cars$dist)
```

1 个答案:

答案 0 :(得分:2)

pandoc负责将降价文档转换为TEX文档。由于pandoc\begin{…}\end{…}之间没有触及,因此图像的降价语法不会转换为TEX语法。

你可以......

  • 隐藏图表(fig.show = 'hide')并使用cat("\includegraphics{figure/unnamed-chunk-2-1.pdf}")的内容。
  • 隐藏上图,并在保存cat的钩子中包含一些魔法。
  • 如果您想要PDF输出,请写RNW而不是RMD。

以下是选项2的示例:

knit_hooks$set(wrapf = function(before, options, envir) {
  if(before) {
    return("\\begin{wrapfigure}{R}{0.3\\textwidth}")
  } else {

    output <- vector(mode = "character", length = options$fig.num + 1)

    for (i in 1:options$fig.num) {
      output[i] <- sprintf("\\includegraphics{%s}", fig_path(number = i))
    }

    output[i+1] <- "\\end{wrapfigure}"
    return(paste(output, collapse = ""))
  }
})

此挂钩可与wrapf = TRUEfig.show = "hide"一起使用。 (此外,您需要将\usepackage{graphics}添加到header-includes。)

但请注意我不会这样做!在更复杂的设置中,太多事情可能会出错。想想缓存,标题,标签,缓存(再次!)......

因此,如果确实需要控制PDF的排版,我建议编写RNW(选项3)。