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

And*_*rew 5 r knitr sublimetext2

我正在尝试在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]*)([^\\.]+)"
}
Run Code Online (Sandbox Code Playgroud)

(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]
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

这是对 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>
Run Code Online (Sandbox Code Playgroud)

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

现在是 makePDF.py 的补丁

寻找像这样的aa行

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
Run Code Online (Sandbox Code Playgroud)

并将其替换为

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
Run Code Online (Sandbox Code Playgroud)

然后寻找像这样的行

os.chdir(tex_dir)
CmdThread(self).start()
print threading.active_count()
Run Code Online (Sandbox Code Playgroud)

并将其替换为

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()
Run Code Online (Sandbox Code Playgroud)

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

寻找一条线

if texExt.upper() != ".TEX":
    sublime.error_message("%s is not a TeX source file: cannot jump." % (os.path.basename(view.fileName()),))
    return
Run Code Online (Sandbox Code Playgroud)

并将其替换为

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
Run Code Online (Sandbox Code Playgroud)

祝你好运!