将 Latex-Sweave 子文件编译为主 Latex-Sweave 文件

将 Latex-Sweave 子文件编译为主 Latex-Sweave 文件

我正在撰写论文,已经准备好了两章。我希望将这两章合并到一个 Sweave 文件中。

假设我有一个名为的文件夹chapter1,其中包含chapter1.Rnwchapter1.texchapter1.pdf。我通常会回到这个chapter1.Rnw,更改一些内容,编译,然后查看chapter1.pdf

我想创建一个名为 的新文件夹,thesis其中包含,thesis.Rnw并且该文件夹将编译并包含在其中。chapter1thesis.Rnwchapter1.Rnwchapter1.pdfthesis.pdf

现在我相信我可以让它发挥作用,但方式并不令我满意。

假设我们在一个 Rstudio 项目中,其中getwd().thesis/thesis.Rnw

\documentclass{article}

\begin{document}

<<>>=
print("Main document begins")
print(getwd()) # prints "thesis/"
@

\Sexpr{knit_child('chapter1/chapter1.Rnw')}

<<>>=
print("Main document ends")
print(getwd()) # prints "thesis/"
@
\end{document}

现在chapter1.Rnw假设

% Beginning of paper

<<>>=
print("Child document begins")
print("Child document ends")
@

% End of paper

编译thesis.Rnw返回了预期的结果pdf,但是由于它不包含任何文档,因此它chapter1.Rnw本身无法编译。documentclass{}begin{} end{}

我尝试过包括

\documentclass{article}

\begin{document}

% Beginning of paper

<<>>=
print("Child document begins")
print("Child document ends")
@

% End of paper

\end{document}

但是chapter1.Rnw编译 FROMthesis.Rnw会引发一堆错误,例如:

! LaTeX Error: Can be used only in preamble.
! LaTeX Error: Command \hlnum already defined.
! LaTeX Error: Command \hlstr already defined.
! LaTeX Error: Command \hlcom already defined.
....
! LaTeX Error: Command \hlkwd already defined.
! LaTeX Error: Command \kframe already defined.
! LaTeX Error: Command \knitrout already defined.
! LaTeX Error: Can be used only in preamble.

请注意,chapter1.Rnw使用上述方法运行确实有效,但现在thesis.Rnw它不起作用了。

我曾考虑过在编译之前解析chapter1.Rnwthesis.Rnw删除乳胶前导码,但我认为这可能会在编译时产生一些错误,thesis.Rnw因为它无法找到所有的包。

是否有一个(更简单的)解决方案,既能让两个.Rnw文件独立,又能让它们协同工作?

答案1

一个解决方案,可能不是最好的解决方案,是保留chapter1.Rnw无序言(您的第一个解决方案),将部分乳胶序言移动到一个单独的文件中,以便您可以获取它并有 2 个 masterr.Rnw 文件来调用第一章,一个在,thesis.Rnw一次在额外的“only-chapter1”中。

例如,创建一个 tex 文件package_to_include.tex

\usepackage{longtable}
\usepackage{...}

在你的thesis.Rnw

 \documentclass{article}
 \input{package_to_include.tex}

 \begin{document}

<<input_chapter1, child='chapter1/chapter1.Rnw'>>=
@

 \end{document}

在您的目录中添加一个新的compile_chapter_1.Rnw例如chapter

 \documentclass{article}
 \input{../package_to_include.tex}

 \begin{document}

<<input_chapter1, child='chapter1.Rnw'>>=
@

 \end{document}

总而言之,如果你将各个部分模块化,那么你可以在需要时调用所需的部分,而无需重复。我通常还将所需的所有 R 库放在一个单独的文件中,这样我就可以随时调用它。

答案2

感谢@nebi 和@Fran。我通过阅读解决了这个问题论坛主题和knitr 文档

其实答案很简单。knitr包已经考虑过了。如果我添加

<<>>=
set_parent("../thesis.Rnw")
@

chapter1.Rnw。该函数将使用 中的前导码thesis.Rnw作为 中的前导码chapter1.Rnw,使两个文档独立。我现在可以运行thesis.Rnw并获得预期结果,并chapter1.Rnw单独运行并仅获得chapter1.Rnw输出。

感谢你们俩。

相关内容