2014-10-21 11 views
5

Ho un genitore e un figlio Rnw documento. Il dottore del bambino si trova nella sottocartella children, vale a direknitr: come utilizzare i documenti child .Rnw con i percorsi delle figure (relativi)?

+-- parent.Rnw 
+-- children 
    +-- child.Rnw 
    +-- figure 
     +-- test.pdf 

Ora voglio creare il (margine) figura test.pdf dall'interno del doc figlio utilizzando la funzione pdf e posizionarlo nella cartella figure all'interno della cartella children (cioè la cartella locale figure per child.Rnw).

parent.Rnw

\documentclass{article} 
\begin{document} 
I am the parent 
<<child, child='children/child.Rnw'>>= 
@ 
\end{document} 

child.Rnw

<<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} } 

Quando si compila il child.Rnw tutto funziona bene. Il percorso per figure/test.pdf è corretto per il documento figlio ma non durante la compilazione del documento padre. Quindi dovrebbe essere children/figure/test.pdf.

Domanda: Come posso avere un percorso corretto per la compilazione del bambino E il doc genitore?

+0

I percorsi nei documenti figli sono stati per me un incubo e non penso che avrò mai il tempo o il coraggio per correggerli (o forse è semplicemente impossibile correggerli perché bisogna considerare sia LaTeX che R) . Quello che consiglierei è di mettere tutto in una struttura piatta, cioè genitori e figli nella stessa directory, ed evitare le directory annidate. –

+0

@Yihui, c'è un modo che knitr può conoscere durante la comilizzazione se il documento attualmente compilato è un documento figlio o no? Cioè dall'interno del documento figlio, c'è un modo per R di vedere se questo è un documento figlio? Se è così, proverò a generare il percorso utilizzando un chunk knitr a seconda se il doc è un bambino o meno. –

+2

Sì, esiste una funzione interna 'knitr ::: child_mode()'. –

risposta

6

Per me la seguente soluzione è adatta: Nella parte superiore del doc bambino, definire una funzione che regola un percorso relativo a seconda che il documento viene eseguito come un bambino o no:

# 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 
    } 
} 

Ora, forniamo il percorso from-the-parent-to-the-child alla funzione adjust_path.

ap <- adjust_path("children") 

La funzione restituisce una nuova funzione che può essere utilizzata per regolare un percorso relativo in un documento figlio. Ora possiamo scrivere

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

e il percorso sarà corretto se eseguito come documento figlio o autonomo.

Problemi correlati