从两个不同位置编织时在 Rmarkdown 中使用相对路径

Using relative paths in Rmarkdown when knitting from two different locations

我的问题是使用相关链接和“编译”(编织)。

我正在使用 RMarkdown 写一本书。由于文件会比较大,所以需要拆分成子文件和目录。

我有一个主文件,其中仅包含指向章节(第 1 章、第 2 章...)的链接。每章都有一个文件,每章都需要引用一些图(图 1,...)。

我希望能够相互独立地编织 masterfile.Rmd 和 chap1.Rmd 以便为章节获得一个文件,为整本书获得一个文件。

这是我的文件的组织方式 (MVE)。目录以大写显示。

masterfile.Rmd的代码如下:

{r child = '/chapters/chap1.Rmd'}

chap1.Rmd的代码如下:

![](../figures/fig1.pdf)

我从chap1.Rmd开始编织,一切都很好。当我从 masterfile 开始编织时,我收到以下消息:

[警告]无法获取资源'../figures/fig1.pdf':PandocResourceNotFound“../figures/fig1.pdf”

好像找不到fig1.pdf。我猜这是因为主文件中的 include 语句只“复制”chap1.Rmd 的代码并在 ROOT 目录(而不是 CHAPTERS 目录)中“执行”它,所以“ .." 从 masterfile.

编织时驱动到不存在的位置(在 ROOT 之前)

我可以更改设置并在 chap1.Rmd 文件中写入 ![](/figures/fig1.pdf)。从 masterfile 编织时它会工作正常但不再从 chap1.Rmd.

编织时

你知道如何两者兼得吗?

欢迎来到 RMarkdown 社区!

由于 KnitR、Rmd 和 pandoc 的相互作用,这个解决方案并不像您想象的那么容易,但目录重组几乎会更容易。

即使你看了 Rmarkdown 作者的最新书RMarkdown CookbookHERE。他们在 ROOT 目录中有所有章节,只有图像(可能还有数字)的子目录。

资源:

2. Github options knitr question

3. similar question from Rstudio community

您可以利用Lua filter功能在编织主文件时重写图像路径。例如

function Image (img)
  img.src = img.src:gsub('^%.%./', './')
  return img
end

这会将 ../figures/fig1.pdf 之类的路径替换为 ./figures/fig1.pdf

使用代码将其写入文件并调用通过 pandoc_args 添加它(仅在主文件中)。

---
output:
  html_document:
    pandoc_args: ["--lua-filter=filter.lua"]
---