1

n数値を要求し、その後デフォルトのコンパイル コマンドn-timesを実行する関数が必要です。つまり、C-c C-c(つまりTeX-command-master)実行するコマンドを尋ねられたくない場合とは異なり、AUCTeX設定に基づいてデフォルトのコンパイルコマンドを選択する必要があります。当然、エラーが発生した場合、実行は停止するはずです。

私はTeX-texifyについて知っていますが、AUCTeX パーサーが適切であると考えるものとは無関係に 5 回 emacs実行したい場合があるため、これは私のニーズを満たしません。pdflatex

どんな助けでも大歓迎です!


編集:これをもう少し調べて、上記の参照のコードを使用して、これを行う関数の作成を開始しました。ただし、1 つの大きな欠陥があります。最初にコードを教えてください:

(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 ドキュメントのコンパイルには時間がかかりますが、私の関数はコンパイル コマンドの 2 回目 (およびそれ以降) の実行を即座に呼び出します。(TeX-command TeX-MultiTeX-Command 'TeX-master-file)おそらく、誰かが を実行する前にコンパイルが正常に終了したかどうかを確認し、その関数を実行するか、コンパイルがエラーで終了した場合はエラーメッセージを出力するソリューションを見つけるのに役立ちます。

4

2 に答える 2

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 に答える
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 を生成するためにコンパイル モードを使用していないため、上記は機能しません。他のコンパイル バッファにはまだ役立つので、回答に残しておきます。実装するもう 1 つの方法は、AUC TeX がコマンドの終了を確実に待機するようにTeX-MultiTeXバインドTeX-process-asynchronousすることです。nil

于 2013-05-23T17:50:41.017 に答える