【问题标题】:Access a build system from another build system in Sublime Text 2在 Sublime Text 2 中从另一个构建系统访问一个构建系统
【发布时间】:2013-01-04 06:10:21
【问题描述】:

我正在尝试在 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 访问一个构建系统)?

【问题讨论】:

  • 至少反向搜索部分可能很困难,而这正是 RStudio 付出了相当大的努力使其工作的地方;对于knitr 部分,也许这可行:"cmd": ["Rscript", "-e", "knitr::knit('${file_name}')"] 其余的工作是您的问题:如何调用 LaTeXTools?我不使用 Sublime Text,所以我不知道...
  • 是的,我正试图摆脱 RStudio(尽管我很喜欢它),因为 Sublime Text 是一个出色的编辑器。我也有 knitr 的语言定义和构建系统,但它也有同样的问题——如何使用 LaTeXTools 更强大的构建系统构建已编译的 TeX 文件(由 Sweave 或 knitr 制作)?
  • 我也想love 知道解决方案:)
  • 这是我所有的 ST 文件:github.com/andrewheiss/KnitrSublime

标签: r sublimetext2 knitr


【解决方案1】:

这是 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

祝你好运!

【讨论】:

  • 天哪!太棒了!谢谢!
  • 你介意我清理一下(即结合我的 knitr 语言定义等)并将其作为拉取请求提交到 LaTeX 工具存储库吗?
  • 一点也不,我还有一个补充是为了突出和识别语法。
  • 是的,我也是。我还没有开始向 LaTeX Tools 发送拉取请求,因为它看起来确实是一个小众需求,但我将它包含在我的包中 github.com/andrewheiss/KnitrSublime
【解决方案2】:

感谢 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 并直接从 ST2 运行它并支持 Skim 非常好。

您有什么理由不想将您概述的更改直接添加到您的包源中? (也许我的只是我的版本太旧了。)

【讨论】:

  • 我无法将更改直接放入 ST 包,因为它们都处理 LaTeXTools 包,我无法控制。在actual ST package 中,我解释了手动修补的过程(现在适用于 ST 2 和 3)。此外,您可以使用一个名为 latexing 的新包,它内置了对 knitr 和 Skim 的支持。
  • 哦,ST应该自动将文件编译成.pyc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2013-07-12
  • 2013-01-03
  • 2015-11-27
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多