2013-01-04 143 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