AUCTeX:运行编译命令n次

时间:2013-05-19 17:22:42

标签: emacs auctex

我想要一个函数,要求输入一个数字n并执行默认的编译命令n - 之后的次数。也就是说不像C-c C-c(即TeX-command-master)我不想被问到要运行哪个命令,它应该根据AUCTeX设置选择默认的编译命令。当然,如果发生任何错误,执行应该停止。

我知道TeX-texify但是,这并不能满足我的需求,因为有时我只想让emacs独立运行pdflatex五次,而不是AUCTeX解析器认为足够的。

非常感谢任何帮助!


编辑:我已经进一步研究了这个并使用上面引用的代码我已经开始编写一个执行此操作的函数。但是,它有一个主要缺陷。我先给你一些代码:

  
(defcustom TeX-MultiTeX-Command "LaTeX" "Default MultiTeX command" :type 'string :group 'TeX-command)
(defun TeX-MultiTeX (n)
  "Run TeX-command n-times"
  (interactive "nRun TeX/LaTeX how many times: ")
  (while (> n 0)
      (TeX-command TeX-MultiTeX-Command 'TeX-master-file)
    (setq n (- n 1))))

如您所见,我已经实现了一个配置变量来选择正确的编译命令。现在让我提出问题:

LaTeX文档的编译需要一些时间,但是,我的函数立即调用编译命令的第二次(和后续)执行。也许有人可以在执行(TeX-command TeX-MultiTeX-Command 'TeX-master-file)之前找到检查编译是否已成功完成的解决方案的帮助,然后执行所述函数或在编译完成时显示错误信息。

2 个答案:

答案 0 :(得分:2)

您似乎需要一种同步方式来运行TeX-command。我没有跟TeX-command说话,但如果它使用编译API,可以让它等待编译完成,尽管如何做到这一点并不是很明显。以下是使用compilation-finish-functions来达到预期效果的示例:

(require 'cl)  ; for lexical-let

(defun compile-and-wait (compilefun)
  (interactive)
  (lexical-let ((done nil) finish-callback)
    (setq finish-callback
          ;; when the compilation is done, remove the callback from
          ;; compilation-finish-functions and interrupt the wait
          (lambda (buf msg)
            (setq compilation-finish-functions
                  (delq finish-callback compilation-finish-functions))
            (setq done t)))
    (push finish-callback compilation-finish-functions)
    (funcall compilefun)
    (while (not done)
      (sleep-for .1))))

修改
AUC TeX没有使用编译模式来生成TeX,因此上述功能无效。由于它对其他编译缓冲区仍然有用,我将其留在答案中。实现TeX-MultiTeX的另一种方法是将TeX-process-asynchronous绑定到nil,这应该确保AUC TeX等待命令完成。

答案 1 :(得分:2)

借助TeX-texify函数的代码,我已经开发了一个能够实现我想要的功能,下面给出了代码。

我要感谢user4815162342;虽然这个解决方案并非基于他的建议,但我认为他的解决方案可能会用于解决其他问题。另外,我要感谢TN的作者TeX-texify,我无耻地为我的问题采取并调整了他的代码。 ;)

(defcustom TeX-MultiTeX-Command "LaTeX"
  "Default MultiTeX command"
  :type 'string :group 'TeX-command)

(defun TeX-MultiTeX-sentinel (&optional proc sentinel)
  "Non-interactive! Call the standard-sentinel of the current LaTeX-process.
If there is still something left do do start the next latex-command."
  (set-buffer (process-buffer proc))
  (funcall TeX-MultiTeX-sentinel proc sentinel)
  (let ((case-fold-search nil))
    (when (string-match "\\(finished\\|exited\\)" sentinel)
      (set-buffer TeX-command-buffer)
      (unless (plist-get TeX-error-report-switches (intern (TeX-master-file)))
        (TeX-MultiTeX TeX-MultiTeX-num-left)))))

(defun TeX-MultiTeX (n)
  "Run TeX-command n-times"
  (interactive "nRun TeX/LaTeX how many times: ")
  (when (or (called-interactively-p 'any)
        (null (boundp 'TeX-MultiTeX-num-left)))
    (setq TeX-MultiTeX-num-left n))
  (if (>= TeX-MultiTeX-num-left 1)
      (progn
    (TeX-command TeX-MultiTeX-Command 'TeX-master-file)
    (setq TeX-MultiTeX-num-left (- TeX-MultiTeX-num-left 1))
    (setq proc (get-buffer-process (current-buffer)))
    (setq TeX-MultiTeX-sentinel (process-sentinel proc))
    (set-process-sentinel proc 'TeX-MultiTeX-sentinel))))