emacs/code/elpa/auctex-latexmk-20170618.1636/auctex-latexmk.el

182 lines
6.9 KiB
EmacsLisp

;;; auctex-latexmk.el --- Add LatexMk support to AUCTeX
;; Copyright (C) 2013-2016 by Tomoya Tanjo
;; Author: Tomoya Tanjo <ttanjo@gmail.com>
;; URL: https://github.com/tom-tan/auctex-latexmk/
;; Package-Version: 20170618.1636
;; Package-Commit: 4d353522650d7685acbf1d38f7dbc504f734bd84
;; Package-Requires: ((auctex "11.87"))
;; Keywords: tex
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This library adds LatexMk support to AUCTeX.
;;
;; Requirements:
;; * AUCTeX
;; * LatexMk
;; * TeXLive (2011 or later if you write TeX source in Japanese)
;;
;; To use this package, add the following line to your .emacs file:
;; (require 'auctex-latexmk)
;; (auctex-latexmk-setup)
;; And add the following line to your .latexmkrc file:
;; # .latexmkrc starts
;; $pdf_mode = 1;
;; # .latexmkrc ends
;; After that, by using M-x TeX-command-master (or C-c C-c), you can use
;; LatexMk command to compile TeX source.
;;
;; For Japanese users:
;;
;; LatexMk command automatically stores the encoding of a source file
;; and passes it to latexmk via an environment variable named "LATEXENC".
;; Here is the example of .latexmkrc to use "LATEXENC":
;; # .latexmkrc starts
;; $kanji = "-kanji=$ENV{\"LATEXENC\"}" if defined $ENV{"LATEXENC"};
;; $latex = "platex $kanji";
;; $bibtex = "pbibtex $kanji";
;; $dvipdf = 'dvipdfmx -o %D %S';
;; $pdf_mode = 3;
;; # .latexmkrc ends
;;; Code:
(require 'tex-buf)
(require 'latex)
(defgroup auctex-latexmk nil
"Add LatexMk support to AUCTeX."
:group 'AUCTeX
:prefix "auctex-latexmk")
(defcustom auctex-latexmk-encoding-alist
'((japanese-iso-8bit . "euc")
(japanese-iso-8bit-unix . "euc")
(euc-jp . "euc")
(euc-jp-unix . "euc")
(utf-8 . "utf8")
(utf-8-unix . "utf8")
(japanese-shift-jis . "sjis")
(japanese-shift-jis-dos . "sjis"))
"Encoding mapping for platex."
:group 'auctex-latexmk)
(defcustom auctex-latexmk-inherit-TeX-PDF-mode nil
"If non-nil add -pdf flag to latexmk when `TeX-PDF-mode' is active."
:group 'auctex-latexmk)
(defun TeX-run-latexmk (name command file)
(let ((TeX-sentinel-default-function 'Latexmk-sentinel)
(pair (assq buffer-file-coding-system auctex-latexmk-encoding-alist)))
(unless (null pair)
(setenv "LATEXENC" (cdr pair)))
(TeX-run-TeX name command file)
(setenv "LATEXENC" nil)))
;;;###autoload
(defun auctex-latexmk-setup ()
"Add LatexMk command to TeX-command-list."
(add-to-list 'TeX-expand-list
'("%(-PDF)"
(lambda ()
(cond
((and (eq TeX-engine 'default)
TeX-PDF-mode
auctex-latexmk-inherit-TeX-PDF-mode)
"-pdf ")
((and (eq TeX-engine 'xetex)
TeX-PDF-mode
auctex-latexmk-inherit-TeX-PDF-mode)
"-pdf -pdflatex=xelatex ")
((eq TeX-engine 'xetex) "-xelatex ")
((eq TeX-engine 'luatex) "-lualatex ")
(t "")))))
(setq-default TeX-command-list
(cons
'("LatexMk" "latexmk %(-PDF)%S%(mode) %(file-line-error) %(extraopts) %t" TeX-run-latexmk nil
(plain-tex-mode latex-mode doctex-mode) :help "Run LatexMk")
TeX-command-list)
LaTeX-clean-intermediate-suffixes
(append LaTeX-clean-intermediate-suffixes
'("\\.fdb_latexmk" "\\.aux.bak" "\\.fls"))))
(defun Latexmk-sentinel (process name)
(save-excursion
(goto-char (point-max))
(cond
((re-search-backward (format "^%s finished at" mode-name) nil t)
(if (re-search-backward "^Run number [0-9]+ of rule '\\(pdf\\|lua\\|xe\\)?latex'" nil t)
(progn
(forward-line 5)
(let ((beg (point)))
(when (string= (current-word) "Latexmk")
;; Special treatment for MiKTeX
(forward-line))
(re-search-forward "^Latexmk:" nil t)
(beginning-of-line)
(save-restriction
(narrow-to-region beg (point))
(goto-char (point-min))
(TeX-LaTeX-sentinel process name))))
(message (format "%s: nothing to do" name))))
((re-search-backward (format "^%s exited abnormally with code" mode-name) nil t)
(re-search-backward "^Collected error summary (may duplicate other messages):" nil t)
(re-search-forward "^ \\([^:]+\\):" nil t)
(let ((com (TeX-match-buffer 1)))
(cond
((string-match "^\\(pdf\\|lua\\|xe\\)?latex" com)
(goto-char (point-min))
(TeX-LaTeX-sentinel process name)
(when (string= TeX-command-next TeX-command-BibTeX)
(setq TeX-command-default nil)))
((string-match "^bibtex " com)
(forward-line -1)
(re-search-backward com nil t)
(forward-line 5)
(let ((beg (point)))
(re-search-forward "^Rule" nil t)
(beginning-of-line)
(save-restriction
(narrow-to-region beg (point))
(TeX-BibTeX-sentinel process name))))))))))
(defadvice TeX-recenter-output-buffer (around recenter-for-latexmk activate)
(setq ad-return-value
(let ((buffer (TeX-active-buffer)))
(if buffer
(if (with-current-buffer buffer
(goto-char (point-max))
(re-search-backward "^latexmk" nil t))
(let ((old-buffer (current-buffer)))
(TeX-pop-to-buffer buffer t t)
(bury-buffer buffer)
(goto-char (point-max))
(re-search-backward "^Run number [0-9]+ of rule 'bibtex .+'"
nil t)
(re-search-forward "^Rule" nil t)
(forward-line -1)
(recenter (if line
(prefix-numeric-value line)
(/ (window-height) 2)))
(TeX-pop-to-buffer old-buffer nil t))
ad-do-it)
(message "No process for this document.")))))
(provide 'auctex-latexmk)
;;; auctex-latexmk.el ends here