我正在编写一个大型的 Sweave 文档,该文档将被分成许多章节,最终输出是所有内容的大型 pdf 和每个章节的单独 pdf(与大型 pdf 中的页面和标题编号相同)。
我发现了一些很棒的答案关于处理多个文件,但还没有看到如何创建具有适当分页的单独章节 pdf。
有没有办法做到这一点?
答案1
我发现这对于论文的特定章节布局非常有帮助,但是还有许多其他关于 LaTeX 章节的资源:数学论文模板和指南
单个 .tex 文档整理所有单独的章节,这些章节可以单独从 .Rnw 生成为 .tex,样式文件和配置控制章节和分页。
我不认为这与 Sweave 或 R 有关,因为这仅与将单个块从 .Rnw 转换为 .tex 有关
答案2
如果你不介意先创建一个大的 PDF 文件,然后提取章节,pdf页面可能是您正在寻找的工具。
如果您想为每个章节创建单独的文件,我认为唯一的方法是为每个章节创建一个 TEX 文件。如何做到这一点取决于您目前拥有的 Sweave 块的结构。有关此内容的详细信息将提供更多想法。
问候,雷纳
答案3
我最终选择了针织品而不是 Sweave,因为它提供了更多选项,并且更好地控制了创建后放置 tex 文件的位置。
现在,从技术上来说,有一种方法可以让 knitr 通过 master 并编译包含的单个 Rnw 文件,但我无法让它工作。我知道人们使用 makefile,但我更擅长 R 而不是 makefile,所以我想出了这个解决方案。
我编写了一个 R 函数,用于检查 tek 文件是否不存在或是否比 Rnw 文件旧。如果是,则编译 tex。
doKnit <- function(file.name)
{
# create full names of files
rnw <- sprintf("%s.Rnw", file.name)
tex <- sprintf("%s.tex", file.name)
# if the rnw file doesn't exist, just exit and do nothing
if(!file.exists(rnw))
{
return(NULL)
}
## create the tex file if necessary
# if the tex file doesn't exist, or it is older than the rnw file you have to create it
if(!file.exists(tex) || file.info(tex)$mtime < file.info(rnw)$mtime)
{
knit(input=rnw, output=tex)
}else
{
# just return NULL
NULL
}
}
然后我有另一个函数,它只是循环遍历文件名向量,对每个文件名调用上述函数。
knitAll <- function(files)
{
## loop through and knit each chapter file if the tex file is older
for(a in files)
{
doKnit(file.name=a)
}
}
(我知道我可以将其矢量化,但感觉有点过度了)。
然后在我的 master.Rnw 中,我使用文件列表(不包括扩展名)调用该函数来检查编译。
<<knitting,include=FALSE>>=
source("knitting.r")
# vector of chapters to be knitted
chapters <- c("Introduction",
"Chapter01",
"Chapter02"
)
knitAll(files=sprintf("%s/%s", chapters, chapters))
@
这个块必须include=FALSE
确保它不会出现在文档中。
我知道这有点儿不靠谱,但效果确实很好。效果非常好,所以我打算把它加入到我的R 包零碎的东西。
无论如何,RStudio真的让生活变得如此美好。新预览版甚至还对 Rnw 文件进行了拼写检查。
knitr 还包括一种生成 PDF 的方法个人文件,但我还没有掌握。