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)