ST2插件 - 请创建一个事件监听器

时间:2013-03-26 07:17:26

标签: latex sublimetext2 sublimetext pdflatex

我使用的是OSX TexLive(MacTeX),它不支持-aux-directoryaux_dir的latexmk选项。没有内置方法可以将辅助文件发送到其他位置,但是将新的* .pdf文件保存在* .tex文件的工作目录中。因此,我可以清理工作目录,或将* .pdf文件从-output-directory复制回工作目录。

我正在寻找一些建议,关于如何最好地创建一个事件监听器,它将触发下面任一Sublime Text 2插件的第二阶段(2)。第一阶段(1)是构建一个乳胶文档并创建一个* .pdf(这需要时间)。第二阶段(2)要么清理工作目录(使用内置的latexmk脚本和小-c选项);或者,将* .pdf从-output-directory复制到包含* .tex文件的工作目录。两个插件都工作,第二阶段(2)配置了10秒的λ超时,这样latexmk构建过程就有机会完成,然后再进入第二阶段(2)。 [latexmk命令在这里工作(没有绝对路径),因为$PATH已使用不同的插件设置。]

由于* .tex文档中的错误(例如拼写错误),LaTeX文档有时无法正确构建。当构建过程失败时,没有必要清理或复制* .pdf - 即,甚至可能没有创建* .pdf,或者它将包含错误。

问题的核心是LaTeX文档正确构建时出现的event究竟是什么;并且,当构建失败时,event究竟是什么?

目标是让一个插件的第二阶段(2)在完成成功的LaTeX构建后自动激活。如果构建过程失败,则不要进入第二阶段(2) - 并显示错误消息 - Ooops! The build process failed -- please check the *.tex document for errors.

非常感谢任何帮助。

import sublime, sublime_plugin
import os, os.path, shutil

class LatexmkWorkingDirectory(sublime_plugin.TextCommand):
   def run(self, edit):
      self.view.window().run_command('exec', {'cmd': ["latexmk", "-r", "/Users/HOME/Library/Application Support/Sublime Text 2/Packages/User/0.latexmkrc/.latexmkrc", self.view.file_name() ]})
      sublime.set_timeout(lambda: self.view.window().run_command('exec', {'cmd': ["latexmk", "-c", "-r", "/Users/HOME/Library/Application Support/Sublime Text 2/Packages/User/0.latexmkrc/.latexmkrc", self.view.file_name() ]}), 10000)

class LatexmkOutputDirectory(sublime_plugin.TextCommand):
   def run(self, edit):
      path, file = os.path.split(self.view.file_name())
      prefix, suffix = os.path.splitext(file)
      self.view.window().run_command('exec', {'cmd': ["latexmk", "-r", "/Users/HOME/Library/Application Support/Sublime Text 2/Packages/User/0.latexmkrc/.latexmkrc", "-output-directory=/tmp", self.view.file_name() ]})
      sublime.set_timeout(lambda: shutil.copyfile('/tmp/' + prefix + '.pdf', path + '/' + prefix + '.pdf'), 10000)

虽然还不是建议的事件监听器插件的解决方案,但是在成功完成构建* .pdf文件时,以下两行代码(当添加到LaTexTools makePDF.py的the very end时将自动清除。不需要lambda超时。注意:必须将两行代码缩进到与self.window.active_view().run_command("jump_to_pdf", {"from_keybinding": True})相同的级别。

from subprocess import call
call(["latexmk", "-c", "-r", "/Users/HOME/Library/Application Support/Sublime Text 2/Packages/User/0.latexmkrc/.latexmkrc", self.file_name])

在OSX上安装MacTeX会在此处安装latexmk脚本(版本4.31):/usr/local/texlive/2012/texmf-dist/scripts/latexmk/latexmk.pl。至于那个perl脚本,可以在第5511行附近添加一个清理命令,就在行print "$My_name: All targets (@dests) are up-to-date\n";之后。 [注意:目前版本的latexmk是4.35。 -aux-directory限制在TexLive(不是latexmk)内 - 即,latexmk依靠TexLive来完成所有的魔法。]

已知问题:将latexmk.pl脚本硬连接到清理将阻止LaTexTools插件发挥其魔力,因为它依赖于* .log文件。如果那个* .log文件很快就被清除了,那么魔法就会被打破。因此,如果使用LaTexTools,我们可以硬连接makePDF.py的最后两行。或者,我们可以硬连接latexmk.pl而不使用LaTexTools。

注意:看来latexmk.pl(v.4.31)的第5510行可能是 the event 在python控制台中运行,可能会被Sublime监听插件,以便可以自动实现清理而无需修改latexmk.pl脚本。需要进一步研究以查看插件是否可以将控制台输出作为后续命令行的触发事件进行监听。如果依赖于LaTeXTools插件,那么可能需要依赖* .log文件和/或the event的插件输出(而不是第5510行)。

        print "$My_name: All targets (@dests) are up-to-date\n";
        print "$My_name: Cleanup (@dests) -- hardwired @ lines 5511 to 5513\n";
        system("latexmk", "-r", "/Users/HOME/Library/Application Support/Sublime Text 2/Packages/User/0.latexmkrc/.latexmkrc", "-c", @dests);
        print "$My_name: Cleanup (@dests) -- complete!\n";

对于版本4.35,这些行是5676到5678。

1 个答案:

答案 0 :(得分:0)

而不是事件监听器,更好的方法是使用subprocess.check_call和call来完成这个项目。 bash相当于&&

Python equivalent to Bash: `latexmk file.tex && latexmk -c file.tex`

特别感谢John Collins博士。 (latexmk的作者)。

https://github.com/lawlist/LaTexTools-Unofficial-Modification

https://github.com/lawlist/ST2-plugin-latexmk-save-build-clean