【发布时间】:2013-03-15 21:58:57
【问题描述】:
我正在使用 OSX TexLive (MacTeX),它不支持 -aux-directory 或 aux_dir 的 latexmk 选项。没有将辅助文件发送到其他地方的内置方法,而是将新的 *.pdf 文件保存在 *.tex 文件的工作目录中。因此,我可以清理工作目录,或者将 *.pdf 文件从 -output-directory 复制回工作目录。
我正在寻找一些建议,关于如何最好地创建一个事件侦听器,以触发以下任一 Sublime Text 2 插件的第二 (2) 阶段。第一阶段 (1) 是构建一个乳胶文档并创建一个 *.pdf(这需要时间)。第二阶段 (2) 是清理工作目录(使用带有小 -c 选项的内置 latexmk 脚本);或者,将 *.pdf 从 -output-directory 复制到包含 *.tex 文件的工作目录。两个插件都可以工作,并且第二阶段 (2) 配置了 10 秒 lambda 超时,以便latexmk 构建过程有机会在进入第二阶段 (2) 之前完成。 [latexmk 命令在这里有效(没有绝对路径),因为 $PATH 已使用不同的插件设置。]
有时,由于 *.tex 文档中的错误(例如拼写错误),LaTeX 文档无法正确构建。当构建过程失败时,没有必要清理或复制 *.pdf - 即,*.pdf 甚至可能还没有创建,或者它会包含错误。
问题的核心是正确构建 LaTeX 文档时出现的 event 究竟是什么?而且,构建失败时出现的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)
虽然还不是提议的事件监听器插件的解决方案,但以下两行代码(当添加到 LaTexTools makePDF.py 的 the very end 时,将在成功完成构建 *.pdf 文件后自动清理。一个 lambda timeout 不是必须的。注意:需要将两行代码缩进到与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 行可能是在 python 控制台中运行的 the event,它可能会被 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。
【问题讨论】:
标签: latex sublimetext2 sublimetext pdflatex