Comment puis-je Sweave un projet multi-fichier?
-
27-09-2019 - |
Question
Je suis en train d'écrire ma thèse en LaTeX et parce que les choses ont un peu long à mon goût, je devais le diviser en plusieurs fichiers. Appelons les thesis.tex
, intro.tex
, mat_n_met.tex
, rslts.tex
et discsn.tex
. Je lié intro.tex
, mat_n_met.tex
, rslts.tex
et discsn.tex
par thesis.tex
avec \include{intro}
(et ainsi de suite ...).
J'ai aussi créé un fichier séparé appelé r_crunching.Rnw
(que je cours à travers Sweave) qui contient un morceau qui exécute le script R avec l'analyse des données et des morceaux qui donnent des produits de pdf des graphiques que j'intégrer via \includegraphics
(par exemple, dans, rslts.tex
). Toujours suivant?
Si je lance un Rnw (à savoir I de rslts.tex
remplacé le nom de rslts.Rnw
) sans « un lien » pour le morceau avec le script R, vous obtiendrez une erreur de Sweave()
dire la référence en \Sexpr{}
n'existe pas. Est-il possible, sans fusionner tous les fichiers en un seul .Rnw, à l'appel \Sexpr{}
à rslts.Rnw
de dire?
D'autres méthodes pour appliquer ce principe sont les bienvenus.
La solution
Oublier une seconde que vous faites affaire avec Sweave et il suffit de penser du problème de latex - pour lesquels des solutions de \include
et offre de \includeonly
. Essayez cela avec quelques fichiers de test simples.
Une fois que vous avez ce compris, replier Sweave dans le mélange et juste travail Sweave est après « simplement » une étape de pré-traitement, quoique très intelligent.
Autres conseils
Je recommande d'utiliser rstudio ( http://www.rstudio.com/ide/ ). Sweave est bien intégré dans cet IDE et il prend en charge les documents de plusieurs fichiers. Même synctex et TeX erreur de navigation du journal fonctionnent toujours lorsque l'on travaille avec des documents multi-fichiers.
A partir du fichier maître, vous pouvez inclure des fichiers enfants en utilisant
\SweaveInput{Child.Rnw}
Vous pouvez lier un fichier enfant dans le fichier maître en incluant la directive
% !Rnw root = Master.Rnw
dans le fichier enfant. De cette façon, lorsque vous travaillez sur un fichier enfant et le formater, rstudio savoir pour le fichier typeset maître.
Les détails sont expliqués dans la documentation rstudio http://www.rstudio.com / ide / docs / création / multiple_rnw_files
Pour élargir la réponse de Dirk et MJM, je suggère d'utiliser de \include
et Makefile.
Supposons que vous ayez un fichier maître: master.tex
. Dans ce fichier, vous devez inclure des fichiers .tex
et .Rnw
, i.e..
\include chapter1
\include chapter2
\include chapter3
....
Maintenant, le Makefile suivant fournit des fonctions pour créer les .tex
, les fichiers .R
et .pdf
:
.SUFFIXES: .tex .pdf .Rnw .R
MAIN = master
##List your your .Rnw includes
RNWINCLUDES = chapter1 chapter2 chapter3
TEX = $(RNWINCLUDES:=.tex)
RFILES = $(RNWINCLUDES:=.R)
RNWFILES = $(INCLUDES:=.Rnw)
all: $(MAIN).pdf
$(MAIN).pdf: $(TEX) $(MAIN).tex
R: $(RFILES)
.Rnw.R:
R CMD Stangle $<
.Rnw.tex:
R CMD Sweave $<
.tex.pdf:
pdflatex $<
bibtex $*
pdflatex $<
pdflatex $<
Pour l'essentiel, la .SUFFIXES
fournir un ensemble de règles pour convertir d'un format de fichier à un autre. Par exemple, pour convertir de .Rnw
à .R
, nous utilisons la commande
`R CMD Stangle $<`
une réponse assez évidente est d'utiliser un makefile, en utilisant éventuellement cachesweave paquet, pour traiter les fichiers concernés dans l'ordre.
Ma solution à des projets multi-fichiers en Sweave (sous rstudio) est le suivant:
1) Création d'un fichier maître, dire master.Rnw
, dans lequel vous avez les appels vers les sous-fichiers intro.Rnw
, matmet.Rnw
, etc:
\documentclass[11pt]{book}
% \usepackage{blah, blah} as you wish
\graphicspath{ {./figs/}
\begin{document}
\SweaveOpts{concordance=TRUE}
\include{intro} % a call to 'intro.Rnw'
\include{matmet} % a call to 'matmet.Rnw'
\include{results} % a call to 'results.Rnw'
\include{discuss} % a call to 'discuss.Rnw'
\end{document}
2) Créer des sous-fichiers. Je donne ici que la première, intro.Rnw
. S'il vous plaît noter que dans les sous-fichiers vous ne pas utiliser préambulaire commandes telles que \documentclass
ou \begin{document}
\chapter{Introduction}\label{ch:intro}
\section{This is section 01}
In section 01 we are concerned about whether \texttt{Sexpr} could possibly work. The chunk below creates a variable \em{a} which will be referred to by this command later on.
<<>>=
a <- 1+2
@
Ok, if it is working, we shall see number 3 right here: \Sexpr{a}.
3) Après avoir enregistré des modifications dans 'intro.Rnw', allez simplement à 'master.Rnw' et le compiler en utilisant les touches Ctrl + Maj + K et ... voilá: