knitr:如何使用具有(相对)图形路径的child.Rnw文档?

knitr:如何使用具有(相对)图形路径的child.Rnw文档?,r,knitr,R,Knitr,我有一个父母和一个孩子Rnw文档。子文档位于子文件夹children,即 +-- parent.Rnw +-- children +-- child.Rnw +-- figure +-- test.pdf 现在,我想使用pdf函数从子文档内部创建(边距)图test.pdf,并将其放置在children文件夹(即children.Rnw的本地figure文件夹)中 parent.Rnw \documentclass{article} \begin{documen

我有一个父母和一个孩子
Rnw
文档。子文档位于子文件夹
children
,即

+-- parent.Rnw
+-- children
    +-- child.Rnw
    +-- figure
         +-- test.pdf
现在,我想使用
pdf
函数从子文档内部创建(边距)图
test.pdf
,并将其放置在
children
文件夹(即
children.Rnw
的本地
figure
文件夹)中

parent.Rnw

\documentclass{article}
\begin{document}
I am the parent
<<child, child='children/child.Rnw'>>=
@
\end{document}
<<parent, echo=FALSE, cache=FALSE>>=
knitr::set_parent("../parent.Rnw")
@

I am the child doc.

<<>>=
pdf("figure/test.pdf")
plot(1:10)
dev.off()
@

\marginpar{ \includegraphics[width=\marginparwidth]{figure/test.pdf} }
\documentclass{article}
\开始{document}
我是父母
=
@
\结束{document}
child.Rnw

\documentclass{article}
\begin{document}
I am the parent
<<child, child='children/child.Rnw'>>=
@
\end{document}
<<parent, echo=FALSE, cache=FALSE>>=
knitr::set_parent("../parent.Rnw")
@

I am the child doc.

<<>>=
pdf("figure/test.pdf")
plot(1:10)
dev.off()
@

\marginpar{ \includegraphics[width=\marginparwidth]{figure/test.pdf} }
=
knitr::set_parent(“../parent.Rnw”)
@
我是孩子医生。
=
pdf(“figure/test.pdf”)
绘图(1:10)
发展主任()
@
\marginpar{\includegraphics[width=\marginparwidth]{figure/test.pdf}
编译
child.Rnw
时,一切正常。对于子文档,
figure/test.pdf
的路径是正确的,但在编译父文档时不正确。然后它必须是
children/figure/test.pdf


问题:如何为子文档和父文档的编译找到正确的路径?

以下解决方案适合我: 在子文档的顶部,我定义了一个函数,该函数根据文档是否作为子文档运行来调整相对路径:

# rp: a relative path
adjust_path <- function(path_to_child_folder, rp) 
{ 
  is.child <- knitr:::child_mode()
  function(rp) 
  {
    if (is.child)
      rp <- file.path(path_to_child_folder, rp)
    rp
  }  
}
该函数返回一个新函数,可用于调整子文档中的相对路径。现在我们可以写作了

\includegraphics[width=\textwidth]{\Sexpr{ap("figure/test.pdf")}} 

和路径是正确的,如果运行为一个孩子或独立的文件。

子文档中的路径对我来说是一场噩梦,我不认为我将有时间或勇气去修复它们(或者可能是不可能修复它们,因为我们必须同时考虑胶乳和R)。我建议将所有内容放在一个平面结构中,即父目录和子目录在同一个目录中,并避免嵌套目录。@Yihui,knitr在编译过程中有没有办法知道当前编译的文档是否为子文档?也就是说,从子文档内部,R是否有办法查看该文档是否为子文档?如果是这样,我将尝试使用knitr块生成路径,具体取决于文档是否为子文档。是的,有一个内部函数
knitr:::child_mode()