r - 从 Sublime Text 2 中的另一个构建系统访问构建系统

标签 r sublimetext2 knitr

我正在尝试在 Sublime Text 2 中为 knitr/Sweave 创建一个构建系统。我当前的简单(和工作)构建系统如下:

{
    "cmd": ["bash", "-c", "/usr/bin/R64 CMD Sweave '${file_name}' && pdflatex '${file_base_name}.tex' -interaction=nonstopmode -synctex=1 %S -f -pdf && /Applications/Skim.app/Contents/MacOS/Skim '${file_base_name}.pdf'"], 
    "path": "$PATH:/usr/texbin:/usr/local/bin", 
    "selector": "text.tex.latex.sweave","shell":false,
    "file_regex": "^(...*?):([0-9]+): ([0-9]*)([^\\.]+)"
}

(text.text.latex.sweave 上下文在 Sweave Textmate 包中定义,哪种在 Sublime Text 中有效)

构建系统需要一个 .Rnw文件,将其转换为 TeX,然后运行 ​​pdflatex在上面。这个构建系统可以工作,但它在打开 Skim 的方式上相当有限(它只是打开 PDF——仅此而已)。 LaTeXTools Sublime Text 包更加健壮,可以打开/刷新 Skim,同时突出显示修改过的行并提供 Skim 的神奇反向搜索。

我不想重写 LaTeXTools 构建系统,特别是因为它使用单独的 Python 脚本完成了大部分繁重的工作(和 Skim 魔术)。但是,我真的希望能够使用它来构建从 Sweave 生成​​的 TeX 文件。

理想情况下,我希望以某种方式嵌套一个构建系统——转换一个 .Rnw文件到 TeX,然后立即运行已经存在的 LaTeXTools 构建系统。在伪代码中:
{
    [CONVERT RNW TO ${file_name}.tex && RUN THE LATEXTOOLS BUILD SYSTEM ON ${file_name}.tex]
}

是否可以从另一个构建系统内部访问构建系统(或者,从 bash 访问构建系统)?

最佳答案

这是对 LatexTools 插件中两个文件的补丁,以处理 Rnw 文件,以及对 Latex 插件的一个补丁,以使 Rnw 文件表现得像 LaTeX 文件。

首先是 Latex 插件的补丁,特别是文件 LaTeX.tmLanguage:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>fileTypes</key>
    <array>
        <string>tex</string>
        <string>Rnw</string>
    </array>

观察我如何向数组添加元素以处理 Rnw 扩展。

现在补丁makePDF.py

寻找这样的一条线
if self.tex_ext.upper() != ".TEX":
    sublime.error_message("%s is not a TeX source file: cannot compile." % (os.path.basename(view.file_name()),))
    return

并将其替换为
if (self.tex_ext.upper() != ".TEX") and (self.tex_ext.upper() != ".RNW"):
    sublime.error_message("%s is not a TeX or Rnw source file: cannot compile." % (os.path.basename(view.file_name()),))
    return

然后寻找一条线
os.chdir(tex_dir)
CmdThread(self).start()
print threading.active_count()

并将其替换为
os.chdir(tex_dir)
if self.tex_ext.upper() == ".RNW":
    # Run Rscript -e "library(knitr); knit('" + self.file_name + "')"
    os.system("Rscript -e \"library(knitr); knit('"+ self.file_name +"')\"")
    self.file_name = self.tex_base + ".tex"
    self.tex_ext = ".tex"
CmdThread(self).start()
print threading.active_count()

最后一个补丁是文件 jumpToPDF.py

找一条线
if texExt.upper() != ".TEX":
    sublime.error_message("%s is not a TeX source file: cannot jump." % (os.path.basename(view.fileName()),))
    return

并将其替换为
if (texExt.upper() != ".TEX") and (texExt.upper() != ".RNW"):
    sublime.error_message("%s is not a TeX or Rnw source file: cannot jump." % (os.path.basename(view.fileName()),))
    return

祝你好运!

关于r - 从 Sublime Text 2 中的另一个构建系统访问构建系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152004/

相关文章:

r - 如何在自定义包中使用 tidyselect "where"?

r - R 有 "negative zero"吗?

php - 用于显示 PHP 警告和错误的 Sublime Text 扩展

java - Sublime Text 2 构建系统以在新的终端/命令提示符窗口中编译和运行 Java?

css - 使用 knitr 幻灯片实现长功能的垂直滚动条

r - 用线条覆盖堆叠的 ggplot2 条形图的每个条形图

r - 在函数中使用 dplyr,对函数参数进行分组错误

python - 如何在 Sublime Text 中为常见的 Python 行创建自动完成列表?

r - 如何访问存储在包中的 R markdown

r - Latex R block 输出未修饰