1

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

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

任何帮助深表感谢!


编辑:我已经对此进行了更深入的研究,并使用上述参考中的代码我已经开始编写一个执行此操作的函数。但是,它有一个重大缺陷。我先给你代码:

(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),然后执行所述函数或在编译完成但出现错误时打印一些错误消息。

4

2 回答 2

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))))

EDIT
AUC TeX 没有使用编译模式来生成 TeX,所以上述方法不起作用。由于它对其他编译缓冲区仍然有用,因此我将其留在答案中。另一种实现方式TeX-MultiTeX是绑定TeX-process-asynchronousnil,这应该确保 AUC TeX 等待命令完成。

于 2013-05-23T17:50:41.017 回答
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))))
于 2013-05-23T19:10:26.843 回答