任何人都可以帮我完成第一个 start-process
和第二个 start-process
之间的步骤。显示pdf文件的 second start-process
应运行only if
首先 start-process
完成而不会出现错误。可能会发现某种类型的成功退出代码,但在这方面我需要一些帮助。
我愿意接受有关如何最好地确定第一个 start-process
是否完成而没有错误的建议。一种方法是查看output
缓冲区以确定最后一行是否等于“Process process
finished”。使* .pdf文件可能需要几个秒,即使它没有错误,如果它太早开始,第二 start-process
也会失败。 Sit-for不是最佳选择,因为如果第一个 start-process
未正确完成,第二个 start-process
应该被中止。生成output
缓冲区也需要几秒钟,因此检查缓冲区中的最后一行还需要等到 first start-process
完成。但是,发现一个成功的退出代码(如果存在这样的东西)将比搜索输出缓冲区中的字符串等更好。 。 。
仅供参考:.latexmkrc $pdflatex
代码行将* .pdf的副本放回工作目录,而.latexmkrc $out_dir
代码行将所有辅助文件放入/tmp
文件夹。这是必需的,因为Tex-Live for OSX不支持$aux_dir
。结果是一个干净的工作目录,只包含* .tex和* .pdf文件。
(defun latexmk ()
".latexmkrc should contain the following entries -- without the backslashes:
$pdflatex .= ' && (cp \"%D\" \"%R.pdf\")';
$force_mode = 1;
$pdf_mode = 1;
$out_dir = '/tmp';"
(interactive)
(let* (
(process (file-name-nondirectory buffer-file-name))
(output (concat "*" (file-name-nondirectory buffer-file-name) "*") )
(latexmk "/usr/local/texlive/2012/texmf-dist/scripts/latexmk/latexmk.pl")
(arg-1 "-interaction=nonstopmode")
(arg-2 "-file-line-error")
(arg-3 "-synctex=1")
(arg-4 "-r")
(arg-5 "/Users/HOME/.0.data/.0.emacs/.latexmkrc")
(pdf-file (concat "/tmp/" (car (split-string
(file-name-nondirectory buffer-file-name) "\\.")) ".pdf"))
(line (format "%d" (line-number-at-pos)))
(skim "/Applications/Skim.app/Contents/SharedSupport/displayline") )
(if (buffer-modified-p)
(save-buffer))
(start-process process output latexmk arg-1 arg-2 arg-3 arg-4 arg-5 buffer-file-name)
;; (if (last line of output buffer is "Process 'process' finished")
(start-process "displayline" nil skim "-b" line pdf-file buffer-file-name)
(switch-to-buffer output)
;; )
))
编辑:基于Francesco在下面的答案中概述的概念的工作解决方案可在相关主题中找到:https://tex.stackexchange.com/a/156617/26911
答案 0 :(得分:6)
This answer提供了一种链接异步命令的方法,使用sentinels等待每个命令在运行以下命令之前终止。
您需要调整标记以使用process-exit-status
检查过程退出状态。一个最小的工作示例应该是:
(defun run-latexmk ()
"Asynchronously run `latexmk' and attach a sentinel to it"
(let ((process (start-process "latexmk" "*output*"
"/bin/sh" "-c" "echo KO; false")))
(set-process-sentinel process 'latexmk-sentinel)))
(defun latexmk-sentinel (p e)
"Display the pdf if `latexmk' was successful"
(when (= 0 (process-exit-status p))
(start-process "displaypdf" "*output*"
"/bin/echo" "DISPLAY PDF")))
;; Example use
(with-current-buffer (get-buffer-create "*output*") (erase-buffer))
(run-latexmk)