I'm using开发者_开发知识库 AUCTeX and I would like to bind a key, e.g. C-0
, that does the following:
- Saves the active file without prompting me.
- Runs
latexmk
on the active file without prompting me. - Shows me errors if
latexmk
encounters any by .
My problem is not how to bind a key (for which Tyler posted a link in a comment below) but how to come up with a function that accomplishes item 1–3.
I call Latexmk by
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk %s" TeX-run-TeX nil t
:help "Run Latexmk on file")
TeX-command-list)))
This is my .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';
I'm using Emacs 23.3 and AUCTeX 11.86.
Something like this?
(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)))
Edit:
TeX-save-document
saves your master file and any sub-files (if you just have one file, it's your master file), and when TeX-save-query
is nil, it doesn't ask you for confirmation. Then TeX-run-TeX
runs latexmk using the mechanism usually used for running TeX
, which includes error message parsing, but because it usually starts an asynchronous process, we set TeX-process-asynchronous
to nil to wait for it to end. The odd-looking plist-get
form is the documented way to check for errors from TeX-run-TeX
(see comments in tex-buf.el
), and if there are errors, we jump to the first one; if there are no errors, we show a message in the minibuffer just for fun.
Finally, the local-set-key
is one way to bind a key to the function.
Does this do what you want?
(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))
I don't use latexmk, but to make that work all you need to do is switch the string "LaTeX" for the name string you use for latexmk in TeX-command-list
(which is probably just "latexmk" or "Latexmk").
I'm glad you asked, as this will be useful for me now!
Assuming you've already used the answer in How to call latexmk in emacs, and jump to next-error to add latexmk
to the command list for AUCTeX, you can use the following function:
(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
And use any of the key-binding techniques to bind it to C-0
; here's one that's local to the TeX mode:
(define-key TeX-mode-map (kbd "C-0") 'run-latexmk)
The run-latexmk
function is based on digging through TeX-command-master
, and simplifying it to your needs. Note that the call to (next-error)
may not always happen, because LaTeX may get confused by your error and pause waiting for input
精彩评论