Как связать latexmk с одним ключом в Emacs и показать ошибки, если они есть

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

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

Моя проблема не в том, как связать клавишу (для которой Тайлер разместил ссылку в комментарии ниже) , а как придумать функцию, которая выполняет пункты 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.


person N.N.    schedule 28.09.2011    source источник
comment
То, что вы просите, очень близко к функциям, которые уже доступны в пакете AucTex по умолчанию. Вы можете начать с этого вопроса: stackoverflow.com/questions/2199678/, которая отсортирует для вас latexmk, а затем при необходимости поработайте над ее настройкой, чтобы получить желаемое поведение.   -  person Tyler    schedule 29.09.2011
comment
@Tyler Спасибо. Как привязать такую ​​команду к клавише?   -  person N.N.    schedule 29.09.2011
comment
Если вы последуете первому ответу, C-c C-c должен скомпилировать ваш файл tex с помощью latexmk (возможно, вам придется изменить файлы конфигурации, чтобы по умолчанию отображалось всплывающее окно latexmk, но AucTex обычно знает, что делать). Фактически выполняется команда TeX-command-master, которую можно привязать обычным способом: masteringemacs.org/articles/2011/02/08/   -  person Tyler    schedule 29.09.2011
comment
@Tyler C-c C-c все еще предлагает мне, даже если это значение по умолчанию.   -  person N.N.    schedule 18.10.2011
comment
Ответ на этот вопрос можно найти по адресу stackoverflow.com/questions/7885853/   -  person N.N.    schedule 25.10.2011


Ответы (3)


Что-то вроде этого?

(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 в nil, чтобы дождаться его завершения. Странно выглядящая форма plist-get - это документированный способ проверки ошибок в TeX-run-TeX (см. Комментарии в tex-buf.el), и если есть ошибки, мы переходим к первой; если ошибок нет, мы просто для развлечения показываем сообщение в минибуфере.

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

person Jouni K. Seppänen    schedule 18.10.2011
comment
Это довольно близко к тому, что я настраивал. Но, по крайней мере, в моей системе (окно Windows) LaTeX запускается асинхронно, поэтому (plist-get ...) не всегда возвращает true. Мне удалось обойти это, посоветовав TeX-TeX-sentinel-check, но это кажется невероятно хакерским ... - person Ben Lerner; 18.10.2011
comment
О, я вижу, вы установили для TeX-process-asynchronous значение nil, так что этого просто не произойдет ... Что ж, это должно сработать :-) - person Ben Lerner; 18.10.2011
comment
В большинстве случаев ваш код, кажется, делает то, что я хочу. Однако, когда я редактирую большой файл и выполняю C-0, появляется ошибка, и она всплывает, как и ожидалось, но верхний буфер заменяется буфером с именем TeX Live 2011. - person N.N.; 19.10.2011
comment
Я думаю, что проблема вызвана комбинацией экранирования оболочки pdflatex и \include. Вот тестовый пример, который вызывает проблему \immediate\write18{sh ./vc}\input{vc}\documentclass{article}\begin{document}text\end{document} (удалены разрывы строк, чтобы поместиться в комментарий). - person N.N.; 19.10.2011
comment
Кроме того, теперь минибуфер немного увеличивается по высоте при запуске run-latexmk, а затем возвращается к нормальной высоте после завершения. Можно ли сделать так, чтобы высота минибуфера не менялась? - person N.N.; 20.10.2011
comment
Мне помогли решить проблему в stackoverflow.com/questions/7885853/. Не могли бы вы объяснить, для чего нужен (require 'tex-buf)? Ни в одном другом решении нет этой строки. - person N.N.; 10.11.2011
comment
Хороший фрагмент, как я могу заставить команду run-latexmk, которая привязана к C-0, принимать префикс, такой как C-u, чтобы запрашивать командную строку, чтобы я мог изменить часть приглашения, такую ​​как параметр latexmk или имя главного файла? - person CodyChan; 14.09.2016

Это делает то, что вы хотите?

(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»).

Рад, что вы спросили, так как теперь мне это пригодится!

person Tyler    schedule 18.10.2011
comment
Я удовлетворяет пунктам 1 и 2 моего списка. Я бы хотел, чтобы окно показывало ошибки, если они есть. Я использую -interaction=nonstopmode с pdflatex, поэтому мне хотелось бы видеть только ту ошибку, на которой он останавливается. - person N.N.; 18.10.2011
comment
Извините, я не знаю, как работает latexmk, поэтому не знаю, куда идти. Вы вдохновили меня исследовать, как заставить Auctex заменить latexmk - должно быть возможно заставить Auctex вычислить, сколько раз запускать pdflatex и bibtex, не нажимая C-c C-c. Однако это займет немного больше времени. - person Tyler; 18.10.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 может запутаться из-за вашей ошибки и приостановить ожидание ввода.

person Ben Lerner    schedule 18.10.2011
comment
Я получаю значение символа, поскольку переменная недействительна: TeX-mode-map при попытке привязки клавиш, даже если я заключил ее в eval-after-load 'tex. - person N.N.; 18.10.2011
comment
Я также получаю TeX-command-expand: Аргумент неправильного типа: stringp, nil, когда я пытаюсь запустить-latexmk. - person N.N.; 18.10.2011
comment
@ N.N. Я признаю, что на самом деле я запускал его не из привязки клавиш, а просто M-x run-latexmk, и это сработало для меня ... Однако, пробуя это сейчас, я не вижу ошибок, которые вы делаете. Вы можете исправить ошибку значения символа ..., заключив define-key в (add-hook 'LaTeX-mode-hook (lambda () (define-key...)), что гарантирует, что вы находитесь в режиме LaTeX. Я могу воспроизвести ошибку TeX-command-expand, но только если я вызову ее напрямую, чего не делает приведенный выше код ... Устраняет ли использование ловушки режима обе проблемы или только одну проблему для вас? - person Ben Lerner; 18.10.2011
comment
Перехватчик режима исправляет привязку клавиш, но run-latexmk по-прежнему возвращает аргумент неправильного типа: stringp, nil. Я обновил свой вопрос информацией о моей настройке, если это имеет значение. - person N.N.; 18.10.2011