如何使用Sweave处理多文件项目?

8
我正在使用LaTeX写毕业论文,由于内容有点长,我把它分成了几个文件。我们称之为 thesis.tex, intro.tex, mat_n_met.tex, rslts.texdiscsn.tex。我通过在 thesis.tex 中使用 \include{intro}(等等)将 intro.tex, mat_n_met.tex, rslts.texdiscsn.tex 进行了链接。
我还创建了一个名为 r_crunching.Rnw 的单独文件(我通过 Sweave 运行它),其中包含运行 R 脚本和生成 PDF 图形输出的代码块,我通过 \includegraphics (例如在 rslts.tex 中)嵌入图形输出。还跟上吗?
如果我运行一个 Rnw 文件(例如我将 rslts.tex 重命名为 rslts.Rnw)而没有 "链接" 到包含 R 脚本的代码块,则会出现 Sweave() 错误,指示 \Sexpr{} 中的引用不存在。是否有一种方法可以在例如 rslts.Rnw 中调用 \Sexpr{},而无需将所有文件合并为单个 .Rnw 文件?
欢迎使用其他方法来完成此操作。

虽然有些离题,但如果有帮助的话:http://staff.acecrc.org.au/~mdsumner/TCallaghan/ 这个模板展示了如何使用include/includeonly基础设施,并且至少包含了一个机构的所有部分。我直接使用了它,并仅用我的Rnw等效文件替换了chap1.tex等,并在pre-latex过程中添加了Sweave。 - mdsumner
我编辑了标题以表明我理解了你的问题。如果我理解有误,请随时再次编辑。 (尽管如此,我仍然没有真正理解问题以及接受的答案是如何帮助解决的。) - Paŭlo Ebermann
问题在于至少有两个文件是Sweave文件,并且其中一个文件的结果无法被另一个文件看到。我认为原来的标题更简单明了,虽然比较口语化。Roman仍然在这里活跃,也许他会加入讨论,但同时我会把它恢复到最初的状态。Paŭlo,我希望这样做不算失礼,但是你为什么要编辑一个你不理解的问题呢? - Aaron left Stack Overflow
@Aaron,不会有任何冒犯。我认为“帮我”这样的标题通常都不太好,而且我现在正在查看一些带有这些关键词的标签下的所有问题,试图给它们一个更好的标题。(我的标签是[标签:latex],而不是[标签:r]或[标签:sweave])。你说得对,在这种情况下我应该简单地发表评论。 - Paŭlo Ebermann
Paŭlo,谢谢您没有生气,并对我的问题提供了出色的答案。感谢您为改进该网站所做的工作。 - Aaron left Stack Overflow
5个回答

5

我建议使用RStudio (http://www.rstudio.com/ide/)。Sweave 已经很好地集成到了这个 IDE 中,支持多文件文档。即使处理多文件文档时,Synctex 和 TeX 错误日志导航仍然可以正常工作。

您可以使用主文件来包含子文件。

\SweaveInput{Child.Rnw}

您可以通过包含指令将子文件链接回主文件。

% !Rnw root = Master.Rnw

在子文件中加入以下代码。这样,在编辑子文件并进行排版时,RStudio就知道要对主文件进行排版。

详细内容可以参考RStudio文档:http://www.rstudio.com/ide/docs/authoring/multiple_rnw_files


4

忘记你正在处理Sweave,只考虑LaTeX问题--其中\include\includeonly提供了解决方案。 尝试用一些简单的测试文件做到这一点。

一旦你弄清楚了这一点,再将Sweave加入到混合中,它就像Sweave一样工作,只是它是一个“仅仅”预处理步骤,尽管是非常聪明的预处理步骤。


2

为了补充Dirk和mjm的回答,我建议使用\include和Makefiles。

假设你有一个主文件:master.tex。在该文件中,你包含了一些.tex.Rnw文件,即:

\include chapter1
\include chapter2
\include chapter3
....

现在,以下Makefile提供了创建.tex、.R和.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 $<

基本上,.SUFFIXES 提供了一组规则,用于将一个文件格式转换为另一个文件格式。例如,要将 .Rnw 转换为 .R,我们使用以下命令:
`R CMD Stangle $<`

1
一个相当明显的答案是使用一个 makefile,可能使用 package cachesweave,以正确的顺序处理相关文件。

0

我在Sweave(在Rstudio下)中处理多文件项目的解决方案如下:

1)创建一个主文件,比如master.Rnw,其中包含对子文件intro.Rnwmatmet.Rnw等的调用:

\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) 创建子文件。这里只提供第一个文件intro.Rnw。请注意,在子文件中,您不要使用类似于\documentclass\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) 在保存了“intro.Rnw”中的修改后,只需转到“master.Rnw”,使用Ctrl+Shift+K进行编译,然后... voilá:

通过上述命令创建的文件的屏幕截图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接