编译多个Rnw文件

时间:2019-06-12 13:57:26

标签: r emacs latex knitr ess

如果您使用Emacs,则可以回答此部分。如果没有,请跳到下面的最后一部分。

如果我们将Rnw文件分成多个文件,是否可以在Emacs中使用knitr和LaTeX通过在上按M-n e来创建整个文档子文件

我想也许可以通过使用Emacs file variables指定子文件的父文件来完成上述过程。

当前,我必须使用M-n e将缓冲区从子缓冲区更改为父缓冲区(或者我需要使用Makefile ---这是我正在做的事情)来编译整个文档,但是我想按{ {1}}在具有指定父级的任何子级文件上,并编译整个文档。

我正在answer中规定的Emacs中使用ESS,多模和poly-R。


以上场景是受工作流程启发的,该工作流程是在Emacs和AUCTeX中使用LaTeX创建文档。在该设置中,通过在主M-n e文件或文件中C-c C-a中的任何其他tex文件上按下相同的键盘快捷键(tex)来创建文档。主文件。这样就无需在点击include之前将缓冲区更改为主文件。


如果您使用Emacs,则可以回答部分

作为一个相关但不理想的选项,knitr通过将主文件指定为其父文件来仅允许编译子文件。这是通过向子级添加诸如C-c C-a之类的行来完成的(请参见standalone mode)。但是问题在于,这不会 创建整个文档,而只会创建子文件中包含的部分。

作为最小的示例,这是名为\Sexpr{set_parent('main-document.Rnw')}的主(父)文件:

main.Rnw

包括以下名为\documentclass{article} \begin{document} This is the main file. <<>>= 2^10 @ Now we include a child file. <<chld, child = "chld.Rnw">>= @ Back to the main. \end{document} 的子文件:

chld.Rnw

在这里,使用以下<<chld-set-parent, echo = FALSE, cache = FALSE>>= set_parent("main.Rnw") @ % instead of the above we could say \Sexpr{set_parent("main.Rnw")} This is the contents of the child document. <<>>= 3^6 @ End of child. 脚本编织main.Rnw

bash

在编织R -q -e "library(knitr); knit2pdf('main.Rnw')" 时创建整个文档:

chld.Rnw

创建一个仅包含子文件内容的文档。这对某些人可能有用,但是我认为能够在R -q -e "library(knitr); knit2pdf('chld.Rnw')" 上调用knit命令会更有用,因为我们已将父文件明确指定为chld.Rnw,所以整个文档都已创建。 / p>

1 个答案:

答案 0 :(得分:0)

弄清了我在问题中解释的想法之后,我终于使用Makefile来编译我的项目,该项目由几个.tex文件和另外几个.Rnw文件组成带有相关的.R文件,可将代码与文本分开,以实现清晰的组织。

使用Makefile,我可以从项目中的任何 child 文件中编译整个文档。

这里是template,是一个用R代码编织的大文档,我用它作为我的论文模板。 README文件说明了项目的结构以及如何编译。

要在Linux命令行上编译整个文档,只需键入:

make

要在Emacs中进行编译,请键入M-x compile,然后在微型缓冲区如下所示时EnterCompile command: make -k。下次,您可以键入M-x recompile,甚至更容易,在*compilation*缓冲区已处于活动状态时,只需键入g,整个文档将使用代码重新编译。