我正在使用 OSX TexLive (MacTeX),它不支持-aux-directory
or的 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 end
LaTexTools 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。