1

1 番目 start-process2 番目 の間 の ステップ で 誰か 手を 貸して くださいstart-process. pdf ファイルを表示する2番目は、 エラーなしで最初の終了を実行する必要があります。おそらく何らかのタイプの成功した終了コードが見つかる可能性がありますが、その点で助けが必要です。start-processonly if start-process

最初の start-processファイルがエラーなしで終了したかどうかを判断する最善の方法に関する提案を受け付けています。1 つの方法は、バッファーを調べて、最後の行が "Process finished"outputに等しいかどうかを判断することです。process*.pdf ファイルの作成には、エラーがなくても数かかる場合があり、開始が早すぎると失敗します start-processSit-for は最適なオプションではありませ start-processん。バッファの生成にも数秒かかるため、バッファ内の最後の行を確認するには、最初の行まで待つ必要があります。 start-processoutput start-process終わります。ただし、(そのようなものが存在する場合) 成功した終了コードを見つけることは、出力バッファーで文字列 equals を検索するよりも優れています。. . .

参考: コードの .latexmkrc$pdflatex行は *.pdf のコピーを作業ディレクトリに戻し$out_dir、コードの .latexmkrc 行はすべての補助ファイルを/tmpフォルダーに入れます。OSX 用の Tex-Live は をサポートしていないため、これが必要です$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)
  ;;  )
    ))

編集:フランチェスコが以下の回答で概説した概念に基づく実用的なソリューションは、関連スレッドで利用できます: https://tex.stackexchange.com/a/156617/26911

4

1 に答える 1

6

この回答は、非同期コマンドをチェーンする方法を提供し、センチネルを使用して各コマンドが終了するのを待ってから、以下を実行します。

を使用してプロセスの終了ステータスを確認するには、センチネルを調整する必要があります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)
于 2013-09-09T21:17:56.563 に答える