1

我正在使用 OSX TexLive (MacTeX),它不支持-aux-directoryor的 latexmk 选项aux_dir。没有将辅助文件发送到其他地方的内置方法,而是将新的 *.pdf 文件保存在 *.tex 文件的工作目录中。因此,我既可以清理工作目录,也可以将 *.pdf 文件从一个-output-directory备份复制到工作目录。

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

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

问题的核心是event正确构建 LaTeX 文档时会发生什么?并且,构建失败时究竟event发生了什么?

目标是在成功完成 LaTeX 构建后自动激活任一插件的第二 (2) 阶段。如果构建过程失败,则不要继续进行第二阶段 (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)

虽然还不是提议的事件侦听器插件的解决方案,但以下两行代码(当添加到the very endLaTexTools makePDF.py 时,将在成功完成构建 *.pdf 文件后自动清理。不需要 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。限制在于TexLive -aux-directory(不是 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。

4

1 回答 1

0

与事件侦听器相比,完成此项目的更好方法是使用 subprocess.check_call 和调用。bash 等价于&&.

Python 等价于 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

于 2013-03-30T20:25:51.180 回答