我试图在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访问构建系统)?
答案 0 :(得分:4)
这是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
祝你好运!
答案 1 :(得分:1)
感谢Herberto所需更改的详细说明!
我刚才继续改变了上面提到的文件。一切都像魅力一样! 但有一点是,不确定是否需要,但我在编辑后将两个python文件重新编译为.pyc。
python -m py_compile makePDF.py
完成这项工作。如果有人在
行遇到“无效的语法错误”print threading.active_count()
重新编译时,只需将其替换为:
print(threading.active_count())
此外,由于LaTeXTools的日志解析器仅显示日志文件中的错误,我们可能也有兴趣查看knitr输出。您可以通过替换:
将其存储在单独的日志文件中os.system("Rscript -e \"library(knitr); knit('"+ self.file_name +"')\"")
使用:
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并通过Skim支持直接从ST2运行它是非常好的。
您是否有任何理由不想将您概述的更改直接添加到包源中? (也许我只是我的版本太旧了。)