我创建了一个函数,编译当前的latex文件:
;close the *async pdflatex* window, when pdflatex finishes
(defun latex-sentinel (process event)
(message event)
(cond ((string-match-p "finished" event)
(progn
(kill-buffer "*async pdflatex*")
(message "pdflatex done")
(delete-other-windows)))))
(defun latex-compile ()
"Runs pdflatex on current file"
(interactive)
(let* ((file-name (shell-quote-argument (buffer-file-name)))
(process (start-process-shell-command
"pdflatex"
"*async pdflatex*"
(concat "pdflatex " file-name))))
(set-process-sentinel process 'latex-sentinel)
(setq new-window (split-window-below 40))
(set-window-buffer new-window "*async pdflatex*")
(other-window 1)))
(add-hook 'LaTeX-mode-hook (lambda ()
(define-key LaTeX-mode-map (kbd "<f2>") 'latex-compile)))
当出现错误时,在编译时,pdflatex冻结,我看到了:
我目前的工作流程:
是否可以跟踪进程已停止并等待用户输入?我目前的哨兵仅在“完成”事件中激活。所以我可以自动完成当前的工作流程。
答案 0 :(得分:3)
[@Thomas:你不需要AUCTeX。内置latex-mode
还为该任务提供C-c C-c
绑定。 ]
一般情况下,检测到进程“等待我”是困难/不可能的(最多可能会监视进程的CPU使用情况,如果有一段时间它是0%,你可以决定它可能在等你,但是即使这样做也很棘手,因为你需要找到适当的操作系统进程来监控,然后使用系统相关的操作来获得CPU使用率。 latex-modes通常通过在pdflatex的命令行上传递\nonstopmode\input
来“解决”这个问题。
答案 1 :(得分:0)
我遇到了同样的困难。以下似乎没问题。
(defun latex-compile()
(interactive)
(save-buffer)
(set 'tex-to-pdf "pdflatex -interaction=nonstopmode")
(set 'file-name (shell-quote-argument (buffer-file-name)))
(set 'comm1 (concat tex-to-pdf " " file-name ))
(set-process-sentinel
(start-process-shell-command "latex-compile"
"*async latex-compile*"
comm1)
'tex-to-pdf-sentinel))
;;;
(defun tex-to-pdf-sentinel (process event)
(cond
( (string-match-p "finished" event)
(message "latex-compile complete"))
( (string-match-p "\\(exited\\|dumped\\)" event)
(message "error in latex-compile"))
))
我意识到使用set
的全局变量是不可取的;这只是一个很小的例子。
您可以在第一次完成时设置第二个sentilel
,例如以便查看器打开以显示.pdf
输出,或者您希望每次都确保bibtex
运行。这可以节省latex mode
中对 C-c C-c 的重复调用。