在 Sumatra PDF reader 中打开已编译的 .rnw 的自定义函数?
Custom function to open compiled .rnw in Sumatra PDF reader?
自更新到 Windows 10 后,我无法使用 Rstudio 中的“编译 PDF”按钮编译 .rnw 文件,如果它们有引用(我使用 natbib 包)。所以,我放弃了 Sweave,转而使用 Knitr。虽然不如编译 PDF 按钮方便,但命令
knitr::knit2pdf('my_doc.rnw')
使用 R 代码、Latex 和引文编译 PDF,没有错误。但是,与编译 PDF 按钮不同,它不会在我首选的 PDF 预览器 Sumatra 中自动启动新编译的 PDF。我的问题是 knitr::knit2pdf 的源代码,即
function (input, output = NULL, compiler = NULL, envir = parent.frame(),
quiet = FALSE, ...)
{
out = knit(input, output = output, envir = envir, quiet = quiet)
owd = setwd(dirname(out))
on.exit(setwd(owd))
if (is.null(compiler)) {
compiler = if (grepl("\.rst$", out))
"rst2pdf"
else "pdflatex"
}
if (identical(compiler, "rst2pdf")) {
if (tolower(file_ext(out)) != "rst")
stop("for rst2pdf compiler input must be a .rst file")
rst2pdf(basename(out), ...)
}
else {
tinytex::latexmk(basename(out), engine = compiler, ...)
}
with_ext(out, "pdf")
}
修改为每次启动和更新新编译的 PDF 运行 knitr::knit2pdf?
谢谢。
我不建议尝试“修改”knit2pdf
– 但您可以在编织后轻松地在 SumatraPDF 中打开您的 PDF。只需致电:
system2("C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe", args = "my_doc.pdf", wait = FALSE, invisible = FALSE)
您可能需要将路径调整为SumatraPDF.exe
。 SumatraPDF 会在 PDF 更改时自动更新,因此您无需任何额外的努力即可看到更改。
如果您更喜欢使用 oneliner 来编织和打开 PDF:
knit2sumatra <- function(input) {
# "input" should be the filename WITHOUT extension
knitr::knit2pdf(paste0(input, ".Rnw"))
system2(
"C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe",
args = paste0(input, ".pdf"),
wait = FALSE,
invisible = FALSE
)
}
或者,只需将 system2
调用放在 RNW 文件的一个块(某处)中。 SumatraPDF 将尝试过早打开 PDF – 但一旦编译完成,最终的 PDF 就会可见。
自更新到 Windows 10 后,我无法使用 Rstudio 中的“编译 PDF”按钮编译 .rnw 文件,如果它们有引用(我使用 natbib 包)。所以,我放弃了 Sweave,转而使用 Knitr。虽然不如编译 PDF 按钮方便,但命令
knitr::knit2pdf('my_doc.rnw')
使用 R 代码、Latex 和引文编译 PDF,没有错误。但是,与编译 PDF 按钮不同,它不会在我首选的 PDF 预览器 Sumatra 中自动启动新编译的 PDF。我的问题是 knitr::knit2pdf 的源代码,即
function (input, output = NULL, compiler = NULL, envir = parent.frame(),
quiet = FALSE, ...)
{
out = knit(input, output = output, envir = envir, quiet = quiet)
owd = setwd(dirname(out))
on.exit(setwd(owd))
if (is.null(compiler)) {
compiler = if (grepl("\.rst$", out))
"rst2pdf"
else "pdflatex"
}
if (identical(compiler, "rst2pdf")) {
if (tolower(file_ext(out)) != "rst")
stop("for rst2pdf compiler input must be a .rst file")
rst2pdf(basename(out), ...)
}
else {
tinytex::latexmk(basename(out), engine = compiler, ...)
}
with_ext(out, "pdf")
}
修改为每次启动和更新新编译的 PDF 运行 knitr::knit2pdf?
谢谢。
我不建议尝试“修改”knit2pdf
– 但您可以在编织后轻松地在 SumatraPDF 中打开您的 PDF。只需致电:
system2("C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe", args = "my_doc.pdf", wait = FALSE, invisible = FALSE)
您可能需要将路径调整为SumatraPDF.exe
。 SumatraPDF 会在 PDF 更改时自动更新,因此您无需任何额外的努力即可看到更改。
如果您更喜欢使用 oneliner 来编织和打开 PDF:
knit2sumatra <- function(input) {
# "input" should be the filename WITHOUT extension
knitr::knit2pdf(paste0(input, ".Rnw"))
system2(
"C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe",
args = paste0(input, ".pdf"),
wait = FALSE,
invisible = FALSE
)
}
或者,只需将 system2
调用放在 RNW 文件的一个块(某处)中。 SumatraPDF 将尝试过早打开 PDF – 但一旦编译完成,最终的 PDF 就会可见。