5

Sublime Text2で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スクリプトを使用して大部分の手間のかかる作業(およびスキムマジック)を実行するためです。しかし、私はそれを使ってSweaveから生成されたTeXファイルを構築できるようにしたいと思っています。

理想的には、ビルドシステムをなんとかしてネストしたいと思います。.RnwファイルをTeXに変換し、すぐに既存のLaTeXToolsビルドシステムを実行します。擬似コードの場合:

{
    [CONVERT RNW TO ${file_name}.tex && RUN THE LATEXTOOLS BUILD SYSTEM ON ${file_name}.tex]
}

別のビルドシステムの内部からビルドシステムにアクセスすることは可能ですか(または、bashからビルドシステムにアクセスすることもできますか)?

4

2 に答える 2

4

これは、Rnwファイルを処理するためのLatexToolsプラグインの2つのファイルへのパッチであり、RnwファイルをLaTeXファイルのように動作させるためのLatexプラグインへの1つのパッチです。

まず、LaTeX.tmLanguageファイルに固有のLaTeXプラグインへのパッチ:

<?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

幸運を!

于 2013-02-22T05:13:00.640 に答える
1

必要な変更の詳細な説明をありがとうHerberto!

私は先に進んで、言及されたファイルを変更しました。すべてが魅力のように機能します!1つは、それが必要かどうかはわかりませんが、編集後に両方の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から直接実行できるのは非常に便利です。

概説した変更をパッケージソースに直接追加したくない理由はありますか?(多分私のバージョンが古すぎるだけです。)

于 2013-08-24T15:03:51.500 に答える