【问题标题】:wrapping figure with latex environment in knitr/rmarkdown with hooks在带有钩子的 knitr/rmarkdown 中使用乳胶环境包裹图形
【发布时间】:2015-12-01 10:14:03
【问题描述】:

我想使用钩子将使用 knitr 和 rmarkdown 创建的图形包装在“wrapfigure”环境中。但是,当运行下面的最小示例时,图形块只会被编译成降价图片:

\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)
```

【问题讨论】:

  • 尝试将results = "asis" 添加到r 块中。
  • 试过了。结果相同。
  • @user2987808 The answer by @MartinSchmelzer 将是当前的最佳答案。这值得一试。

标签: r latex knitr r-markdown


【解决方案1】:

pandoc 负责将markdown 文档转换为TEX 文档。由于pandoc 没有在\begin{…}\end{…} 之间接触,因此图像的markdown 语法没有被转换为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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多