2013-01-04 142 views
5

我试图在崇高的文本创建knitr/Sweave构建系统2.我现在的,简单的(工作)建立系统如下:访问构建系统从另一个构建系统2

{ 
    "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]*)([^\\.]+)" 
} 

构建系统需要一个.Rnw文件,将其转换为TeX的,然后在其上运行pdflatex(该​​上下文在Sweave TextMate的束,这样在崇高文本作品的定义)。这个构建系统的工作原理,但它打开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的访问构建系统)?

+0

至少反向搜索部分可能很难,那就是RStudio已经付出了相当大的努力使其工作;对于'knitr'部分,或许这样做:''cmd“:[”Rscript“,”-e“,”knitr :: knit('$ {file_name}')“]',其余的工作是你的问题:如何调用LaTeXTools?我不使用Sublime Text,所以我不知道... –

+0

是的,我试图摆脱RStudio(尽管我喜欢它),因为Sublime Text是一个优秀的编辑器。我也有针对knitr的语言定义和构建系统,但它也有同样的问题 - 我如何使用LaTeXTools更强大的构建系统构建编译的TeX文件(由Sweave或knitr制作)? – Andrew

+0

我想[爱](https://github.com/yihui/knitr/issues/449)知道一个解决方案以及:) –

回答

4

这是LatexTools插件中两个文件的补丁,用于处理Rnw文件,以及一个补丁到Latex插件,以使Rnw文件的行为与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 

AA线并与

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 

祝你好运!

+0

废话!太棒了!谢谢! – Andrew

+0

你介意我是否清理了一点(即与我的knitr语言定义等结合)并将其作为拉取请求提交给LaTeX Tools存储库? – Andrew

+0

完全没有,为了突出语法和识别语法,我还有另外的补充。 –

1

感谢您对Herberto所需更改的详细描述!

我只是继续前进,并更改提到的文件。一切都像一个魅力! 虽然有一件事,不知道它是否是必需的,但我编辑它们后将两个python文件重新编译为.pyc。

python -m py_compile makePDF.py 

完成这项工作。如果有人在该行同时重新编译

print threading.active_count() 

遇到一个“无效的语法错误”,只是将其替换为:

print(threading.active_count()) 

而且,由于LaTeXTools的日志分析器只从日志文件中显示错误,我们可能有兴趣看到knitr输出。您可以通过替换在一个单独的日志文件,其存储:

​​

有:

knitcmd = "/usr/bin/Rscript -e \"library(knitr); knit('"+ self.file_name +"')\"" 
    process = subprocess.Popen(knitcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
    #Launch the shell command: 
    knit_output, knit_error = process.communicate() 
    #store results in a log 
    knit_log = open(self.tex_base + "_knitrbuild.log", "w") 
    knit_log.write(knit_output) 
    knit_log.write(knit_error) 
    knit_log.close() 

我用一个简单的bash脚本构建文档(Mac专用)前:

#!/bin/bash 
[ $# -eq 0 ] && { echo "Usage: $0 file.Rnw for knitting"; exit 1; } 
rnw="library(knitr);knit("\'"$1.Rnw"\'")" 
echo "Rscript executing:" $rnw 
tex="$1.tex" 
pdf="$1.pdf" 
Rscript -e $rnw && pdflatex $tex && pdflatex $tex && open -a Preview $pdf 

retval=$? 
[ $retval -eq 0 ] && echo "$rnw knitted and $pdf ready" 

但能够自定义LaTeXTools并直接从ST2与Skim支持运行它是非常好的。

有没有什么原因让你不想将你列出的变更直接添加到你的软件包源代码中? (也许我的这只是我的版本太旧了。)

+0

我不能把变化直接进入ST包,因为它们都涉及我无法控制的LaTeXTools包。在[实际ST包](https://github.com/andrewheiss/SublimeKnitr)中,我解释了手动修补的过程(现在对于ST 2和ST 3)。另外,您可以使用一个名为[latexing](http://www.latexing.com/)的新软件包,该软件包内置了对knitr和Skim的支持。 – Andrew

+0

哦,ST应该自动将文件编译为'.pyc'。 – Andrew