Emacs: если latexmk завершает нормально, тогда показывает pdf, иначе выдает ошибки

Может ли кто-нибудь, пожалуйста, дайте мне руку с шагом между первым start-process а второй start-process, Второй start-process который отображает PDF-файл должен работать only if первый start-process заканчивается без ошибок. Вероятно, есть какой-то тип успешного кода выхода, который можно обнаружить, но мне нужна помощь, пожалуйста, в этом отношении.

Я открыт для предложений относительно того, как лучше определить, является ли первый start-process закончил без ошибок. Одним из методов будет посмотреть на output буфер, чтобы определить, равна ли последняя строка "Процесс" process готово ". Создание файла *.pdf может занять несколько секунд, даже если он без ошибок, а второй start-process терпит неудачу, если это начинается слишком рано. Сидеть за не самый лучший вариант, так как второй start-process следует прервать, если первый start-process не завершено правильно. Генерация output Буфер также занимает пару секунд, поэтому проверка последней строки в буфере также должна подождать до первой start-process отделки. Однако, определение успешного кода выхода (если такая вещь существует) было бы лучше, чем поиск в выходном буфере строки, равной.,,,

К вашему сведению:.latexmkrc $pdflatex строка кода помещает копию *.pdf обратно в рабочий каталог и.latexmkrc $out_dir строка кода помещает все вспомогательные файлы в /tmp папка. Это необходимо, потому что Tex-Live для OSX не поддерживает $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

1 ответ

Решение

Этот ответ предоставляет способ связать асинхронные команды, используя часовых, которые ждут завершения каждой команды перед выполнением следующего.

Вам нужно адаптировать дозорного, чтобы проверить состояние завершения процесса, используя 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)
Другие вопросы по тегам