Как мне связать latexmk с одним ключом в Emacs и показать ошибки, если они есть? - PullRequest
16 голосов
/ 28 сентября 2011

Я использую AUCTeX и хотел бы связать ключ, например, C-0, что делает следующее:

  1. Сохраняет активный файл без запроса.
  2. Запускает latexmk на активном файле без запроса.
  3. Показывает мне ошибки, если latexmk встречает кого-либо.

Моя проблема в том, что не , как связать ключ (для которого Тайлер разместил ссылку в комментарии ниже) , но , как придумать функцию, которая выполняет пункты 1–3 .


Я звоню Latexmk по

(add-hook 'LaTeX-mode-hook (lambda ()
  (push 
    '("Latexmk" "latexmk %s" TeX-run-TeX nil t
      :help "Run Latexmk on file")
    TeX-command-list)))

Это мой .latexmkrc

$pdf_mode = 1;
$recorder = 1;
$latex = 'latex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';
$pdflatex = 'pdflatex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';

Я использую Emacs 23.3 и AUCTeX 11.86.

Ответы [ 3 ]

14 голосов
/ 18 октября 2011

Как то так?

(require 'tex-buf)

(defun run-latexmk ()
  (interactive)
  (let ((TeX-save-query nil)
        (TeX-process-asynchronous nil)
        (master-file (TeX-master-file)))
    (TeX-save-document "")
    (TeX-run-TeX "latexmk" "latexmk" master-file)
    (if (plist-get TeX-error-report-switches (intern master-file))
        (TeX-next-error t)
      (minibuffer-message "latexmk done"))))

(add-hook 'LaTeX-mode-hook
          (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))

Редактировать : TeX-save-document сохраняет ваш главный файл и любые вложенные файлы (если у вас есть только один файл, это ваш главный файл), а когда TeX-save-query равен нулю, он не запрашивает подтверждения. Затем TeX-run-TeX запускает latexmk, используя механизм, обычно используемый для запуска TeX, который включает в себя анализ сообщений об ошибках, но, поскольку он обычно запускает асинхронный процесс, мы устанавливаем TeX-process-asynchronous в ноль, чтобы дождаться его завершения. Странно выглядящая форма plist-get - это документированный способ проверки ошибок из TeX-run-TeX (см. Комментарии в tex-buf.el), и, если есть ошибки, мы переходим к первой; если ошибок нет, мы показываем сообщение в минибуфере просто для удовольствия.

Наконец, local-set-key - это один из способов привязки клавиши к функции.

3 голосов
/ 18 октября 2011

Делает ли это то, что вы хотите?

(defun my-tex ()
"Saves the current buffer and runs LaTeX, all with no prompts or further interaction."
  (interactive)
  (save-buffer)
  (TeX-command "LaTeX" 'TeX-master-file -1))

Я не использую latexmk, но для этой работы все, что вам нужно сделать, это переключить строку "LaTeX" для строки имени, которую вы используете для latexmk в TeX-command-list (что, вероятно, просто "latexmk" или "Latexmk" «).

Я рад, что вы спросили, так как это будет полезно для меня сейчас!

2 голосов
/ 18 октября 2011

Если вы уже использовали ответ в Как вызвать latexmk в emacs и перейти к следующей ошибке , чтобы добавить latexmk в список команд для AUCTeX, вы можете использовать следующую функцию:

(defun run-latexmk ()
  (interactive)
  (save-buffer)
  (TeX-command "Latexmk" 'TeX-master-file 0)
  (if (plist-get TeX-error-report-switches (intern (TeX-master-file)))
      (next-error))) ;; 0 -> suppress confirmation

И использовать любой из методов привязки клавиш, чтобы связать его с C-0; вот тот, который является локальным для режима TeX:

(define-key TeX-mode-map (kbd "C-0") 'run-latexmk)

Функция run-latexmk основана на копании в TeX-command-master и упрощении его для ваших нужд. Обратите внимание, что вызов (next-error) не всегда может произойти, потому что LaTeX может запутаться из-за вашей ошибки и приостановить ожидание ввода

...