AUCTeX Sync -- Update all elisp to v11.92
[packages] / xemacs-packages / auctex / tex-jp.el
index 08328da..510f8cb 100644 (file)
@@ -1,10 +1,12 @@
 ;;; tex-jp.el --- Support for Japanese TeX.  -*- coding: iso-2022-jp-unix; -*-
 
-;; Copyright (C) 2002-2007, 2012  Free Software Foundation, Inc.
-;; Copyright (C) 1999, 2001 Hidenobu Nabetani <nabe@debian.or.jp>
+;; Copyright (C) 1999, 2001-2008, 2012-2013, 2016-2017
+;;   Free Software Foundation, Inc.
 
-;; Author:     KOBAYASHI Shinji <koba@flab.fujitsu.co.jp>
+;; Author:     KOBAYASHI Shinji <koba@flab.fujitsu.co.jp>,
+;;             Hidenobu Nabetani <nabe@debian.or.jp>
 ;; Maintainer: Masayuki Ataka <masayuki.ataka@gmail.com>
+;;             Ikumi Keita <ikumikeita@jcom.home.ne.jp>
 ;; Keywords: tex
 
 ;; This file is part of AUCTeX.
@@ -33,6 +35,7 @@
 ;;; Code:
 
 (require 'latex)
+(require 'tex-buf)
 (eval-when-compile
   (autoload 'TeX-plain-tex-mode "plain-tex" nil t))
 
                 (const :tag "jTeX" jtex)
                 (const :tag "upTeX" uptex)))
 
+(defcustom japanese-TeX-use-kanji-opt-flag (not (eq system-type 'windows-nt))
+  "Add kanji option to Japanese pTeX family if non-nil.
+If `TeX-japanese-process-input-coding-system' or
+`TeX-japanese-process-output-coding-system' are non-nil, the process coding
+systems are determined by their values regardless of the kanji option."
+  :group 'AUCTeX-jp
+  :type 'boolean)
+
 (setq TeX-engine-alist-builtin
       (append TeX-engine-alist-builtin
              '((ptex "pTeX" "ptex %(kanjiopt)" "platex %(kanjiopt)" "eptex")
@@ -104,20 +115,41 @@ For detail, see `TeX-command-list', to which this list is appended."
                                     (const :tag "AmSTeX" ams-tex-mode)))
                        (repeat :tag "Menu elements" :inline t sexp))))
 
+;; customize option \e$B$N=i4|CM$d\e(B saved value \e$B$=$N$b$N$r2~JQ$7$J$$$h$&$K\e(B
+;; \e$B$9$k$?$a!"\e(Bsetcar \e$B$N;HMQ$OHr$1$k!#\e(B
+(setq TeX-command-list
+      ;; `TeX-command-list' \e$B$HF1$89=B$$N?7$7$$\e(B list \e$B$r:n$k!#\e(B
+      ;; \e$B3FMWAG$N\e(B list \e$B$r\e(B l \e$B$H$7$F!"\e(Bl \e$B$=$N$b$N$r;H$C$?$j!"\e(Bl \e$B$r\e(B
+      ;; \e$B<c43=$@5$7$?\e(B list \e$B$r:n$C$?$j$7$F\e(B `mapcar' \e$B$G=8$a$k!#\e(B
+      (mapcar
+       (lambda (l)
+        (cond
+         ;; l \e$B$NBh\e(B1\e$BMWAG$,\e(B "BibTeX" \e$B$d\e(B "Index" \e$B$@$C$?$i!"\e(Bl \e$B$NBh\e(B2\e$BMWAG\e(B
+         ;; \e$B$@$1$rF~$lBX$($?JL$N\e(B list \e$B$r:n$k!#\e(B
+         ((equal (car l) "BibTeX")
+          (append (list (car l) "%(bibtex) %s") (cddr l)))
+         ((equal (car l) "Index")
+          (append (list (car l) "%(makeindex) %s") (cddr l)))
+         ;; \e$B$=$l0J30$N>l9g$O\e(B l \e$B$=$N$b$N$r;H$&!#\e(B
+         (t
+          l)))
+       TeX-command-list))
+
 ;; \e$B=gD4$K9T$1$PITMW$K$J$k!#\e(B
 (setq TeX-command-list
       (append japanese-TeX-command-list
              '(("-" "" ignore nil t)) ;; separator for command menu
              TeX-command-list))
 
-;; \e$B;CDj=hCV!#\e(Btex.el \e$B$K<h$j9~$s$G$b$i$($k$H$h$$!#\e(B
-(setcar (cdr (assoc "BibTeX" TeX-command-list)) "%(bibtex) %s")
-(setcar (cdr (assoc "Index" TeX-command-list)) "%(makeindex) %s")
+;; Define before first use.
+(defvar japanese-TeX-mode nil
+  "Non-nil means the current buffer handles Japanese TeX/LaTeX.")
+(make-variable-buffer-local 'japanese-TeX-mode)
+(put 'japanese-TeX-mode 'permanent-local t)
 
-;; \e$B;CDj=hCV!#\e(Btex.el \e$B$K<h$j9~$s$G$b$i$($k$H$h$$!#\e(B
-(setq TeX-expand-list
+(setq TeX-expand-list-builtin
       (append
-       TeX-expand-list
+       TeX-expand-list-builtin
        '(
         ;; -kanji \e$B%*%W%7%g%s$NJ8;zNs$r:n$k!#\e(B
         ("%(kanjiopt)" (lambda ()
@@ -142,10 +174,21 @@ For detail, see `TeX-command-list', to which this list is appended."
                         ((eq TeX-engine 'jtex) "jbibtex")
                         ((eq TeX-engine 'uptex) "upbibtex")
                         (t "bibtex"))))
-        ;; mendex \e$B$H\e(B makeindex \e$B$NE,@Z$JJ}$rA*Br$9$k!#\e(B
+        ;; mendex, upmendex, makeindex \e$B$N$&$AE,@Z$J$b$N$rA*Br$9$k!#\e(B
         ("%(makeindex)" (lambda ()
-                          (if (memq TeX-engine '(ptex uptex))
-                              "mendex %(mendexkopt)" "makeindex")))
+                          (cond
+                          ;; upmendex \e$B$O\e(B XeLaTeX \e$B$d\e(B LuaLaTeX \e$B$G$b\e(B
+                          ;; \e$B;H$($k!#\e(Bsee
+                          ;; http://www.t-lab.opal.ne.jp/tex/README_upmendex.md
+                          ;; FIXME: XeLaTeX \e$B$d\e(B LuaLaTeX \e$B$@$1$r;H$&\e(B
+                          ;; \e$BMxMQ<T$N>l9g$O!"\e(Btex-jp \e$B$O\e(B load \e$B$5$l$J\e(B
+                          ;; \e$B$$$N$G$3$N@_Dj$O0UL#$,$J$$!#\e(B
+                           ((and (memq TeX-engine '(uptex xetex luatex))
+                                 (executable-find "upmendex"))
+                            "upmendex %(dic)")
+                           ((memq TeX-engine '(ptex uptex))
+                            "mendex %(mendexkopt) %(dic)")
+                           (t "makeindex"))))
         ;; mendex \e$BMQF|K\8l%3!<%I%*%W%7%g%s!#\e(B
         ("%(mendexkopt)" (lambda ()
                            (if (and (featurep 'mule)
@@ -155,6 +198,21 @@ For detail, see `TeX-command-list', to which this list is appended."
                                  (if str (format " -%c " (upcase (aref str 0)))
                                    ""))
                              "")))
+       ;; (up)mendex \e$BMQ<-=q;XDj%*%W%7%g%s!#\e(B
+       ("%(dic)" (lambda ()
+                   ;; master \e$B$HF1L>$G3HD%;R$,\e(B .dic \e$B$N%U%!%$%k$,$"$l$P\e(B
+                   ;; \e$B$=$l$r<-=qL>$H$7$F\e(B -d \e$B%*%W%7%g%s$KM?$($k!#\e(B
+                   ;; C-c C-r \e$BEy$N>l9g\e(B _region_.dic \e$B$K$9$Y$-$G$O\e(B
+                   ;; \e$B$J$$$N$G!"\e(B`TeX-master-file' \e$B$rM[$K8F$V!#\e(B
+                   (let ((dicname (TeX-master-file "dic" t)))
+                     (if (file-exists-p
+                          (expand-file-name dicname (TeX-master-directory)))
+                         (let ((result (format "-d %s" dicname)))
+                           ;; Advance past the file name in order to
+                           ;; prevent expanding any substring of it.
+                           (setq pos (+ pos (length result)))
+                           result)
+                       ""))))
         ;; pxdvi \e$B$H\e(B %(o?)xdvi \e$B$NE,@Z$JJ}$rA*Br$9$k!#\e(B
         ("%(xdvi)" (lambda ()
                      ;; pxdvi \e$B$O\e(B ptex, jtex \e$B6&MQ$J$N$G!"\e(B
@@ -164,89 +222,57 @@ For detail, see `TeX-command-list', to which this list is appended."
 
 ;;; Viewing (new implementation)
 
-(unless (get 'TeX-view-predicate-list 'saved-value)
-  (setq TeX-view-predicate-list
+(setq TeX-view-predicate-list-builtin
+      (append
        '((paper-a4
-          (TeX-match-style
-           "\\`\\(a4j\\|a4paper\\|a4dutch\\|a4wide\\|sem-a4\\)\\'"))
+         (let ((regex "\\`\\(?:a4j\\|a4paper\\|a4dutch\\|a4wide\\|sem-a4\\)\\'"))
+           (or (TeX-match-style regex)
+               (and (fboundp 'LaTeX-match-class-option)
+                    (LaTeX-match-class-option regex)))))
          (paper-a5
-          (TeX-match-style
-           "\\`\\(a5j\\|a5paper\\|a5comb\\)\\'"))
+         (let ((regex "\\`\\(?:a5j\\|a5paper\\|a5comb\\)\\'"))
+           (or (TeX-match-style regex)
+               (and (fboundp 'LaTeX-match-class-option)
+                    (LaTeX-match-class-option regex)))))
          ;; jarticle \e$B$J$I$@$H\e(B b4paper, b5paper \e$B$O\e(B JIS B \e$B7ONs!#\e(B
          ;; j-article \e$B$J$I$NJ}$K$O\e(B a4j, b5j \e$B$H$$$C$?%*%W%7%g%s$O$J$$!#\e(B
          (paper-b5    ; ISO B5
-          (and (TeX-match-style "\\`b5paper\\'")
-               (not (memq TeX-engine '(ptex uptex)))))
+          (and (fboundp 'LaTeX-match-class-option)
+              (LaTeX-match-class-option "\\`b5paper\\'")
+               (not (TeX-match-style "\\`u?[jt]s?\\(?:article\\|report\\|book\\)\\'"))))
          (paper-b5jis ; JIS B5
-          (or (TeX-match-style "\\`b5j\\'")
-              (and (TeX-match-style "\\`b5paper\\'")
-                   (memq TeX-engine '(ptex uptex)))))
+         (and (fboundp 'LaTeX-match-class-option)
+              (or (LaTeX-match-class-option "\\`b5j\\'")
+                  (and (LaTeX-match-class-option "\\`b5paper\\'")
+                       (TeX-match-style "\\`u?[jt]s?\\(?:article\\|report\\|book\\)\\'")))))
          ;; article \e$B$J$I$K$O\e(B b4paper \e$B$H$$$&%*%W%7%g%s$O$J$$!#\e(B
          ;; b4paper \e$B$H$$$&%*%W%7%g%s$,$"$C$?$i\e(B JIS B4 \e$B$H8+$J$9!#\e(B
          (paper-b4jis
-          (TeX-match-style "\\`\\(b4j\\|b4paper\\)\\'")))))
-;; jsarticle \e$B$@$HB>$K$b$b$C$HH=7?$N%*%W%7%g%s$,$"$k$,!"\e(B
-;; \e$BA4ItLLE]8+$F$k$H%-%j$,$J$$$N$G!"$3$l$/$i$$$G$$$$$@$m$&!#\e(B
-;; jsarticle.el \e$B$d\e(B jsbook.el \e$B$GDI2CJ,$N=hM}$r;E9~$a$P$$$$$N$+$bCN$l$J$$!#\e(B
-
-;; \e$B;CDj=hCV!#\e(Btex.el \e$B$K<h$j9~$s$G$b$i$($k$H$h$$!#\e(B
-(unless (get 'TeX-view-program-list 'saved-value)
-  (setq TeX-view-program-list
-       (cond
-        ;; http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?AUCTeX
-        ;; \e$B$r;29M$K$7$F$_$?!#\e(B
-        ((eq system-type 'windows-nt)
-         '(("Dviout" ("dviout -1 "
-                      ((paper-a4 paper-portrait) " -y=A4 ")
-                      ((paper-a4 paper-landscape) " -y=A4L ")
-                      ((paper-a5 paper-portrait) " -y=A5 ")
-                      ((paper-a5 paper-landscape) " -y=A5L ")
-                      ((paper-b5 paper-portrait) " -y=E5 ")
-                      ((paper-b5 paper-landscape) " -y=E5L ")
-                      ((paper-b4jis paper-portrait) " -y=B4 ")
-                      ((paper-b4jis paper-landscape) " -y=B4L ")
-                      ((paper-b5jis paper-portrait) " -y=B5 ")
-                      ((paper-b5jis paper-landscape) " -y=B5L ")
-                      (paper-legal " -y=Legal ")
-                      (paper-letter " -y=Letter ")
-                      (paper-executive " -y=Exective ")
-                      "%o" (mode-io-correlate " \"# %n '%b'\"")))
-           ("TeXworks" "TeXworks %o")
-           ("SumatraPDF" "SumatraPDF -reuse-instance %o"
-            (mode-io-correlate " -forward-search \"%b\" %n"))
-           ("MuPDF" "mupdf %o")))
-        ;; \e$B$3$l$G$$$$$N$+$I$&$+$OIT0B!#\e(B
-        ((eq system-type 'darwin)
-         '(("Preview" "open -a Preview.app %o")
-           ("TeXShop" "open -a TeXShop.app %o")
-           ("TeXworks" "open -a TeXworks.app %o")
-           ("Skim" "open -a Skim.app %o")
-           ("displayline" "displayline %n %o %b")
-           ("PictPrinter" "open -a PictPrinter.app %d")
-           ("Mxdvi" "open -a Mxdvi.app %d")
-           ("open" "open %o")))
-        (t
-         (setcar (cadr (assoc "xdvi" TeX-view-program-list-builtin))
-                 "%(xdvi) -unique")
-         '(("TeXworks" "texworks %o")
-           ("zathura" "zathura %o")
-           ("MuPDF" "mupdf %o"))))))
+         (and (fboundp 'LaTeX-match-class-option)
+              (LaTeX-match-class-option "\\`\\(?:b4j\\|b4paper\\)\\'"))))
+       ;; jsclasses \e$B$@$HB>$K$b$b$C$HH=7?$N%*%W%7%g%s$,$"$k$,!"A4ItLLE]\e(B
+       ;; \e$B8+$F$k$H%-%j$,$J$$$N$G!"$3$l$/$i$$$G$$$$$@$m$&!#\e(B
+       ;; jsarticle.el \e$B$d\e(B jsbook.el \e$B$GDI2CJ,$N=hM}$r;E9~$a$P$$$$$N$+$bCN$l$J$$!#\e(B
+       TeX-view-predicate-list-builtin))
+
+(unless (memq system-type '(windows-nt darwin))
+  (let ((l (assoc "xdvi" TeX-view-program-list-builtin)))
+    (when l
+      (setcar (cadr l) "%(xdvi) -unique")
+      (setcdr (cdr l) '("%(xdvi)"))))
+  (setq TeX-view-program-list-builtin
+       (append TeX-view-program-list-builtin
+               '(("MuPDF" "mupdf %o" "mupdf")))))
 
 ;; \e$B$3$l$O\e(B tex.el \e$B$K<h$jF~$l$F$b$i$&$N$OFq$7$$$+!)\e(B
 ;; tex-jp.el \e$B$,FI$_9~$^$l$k$@$1$G!"\e(Bdvi viewer \e$B$N%G%U%)%k%H$,\e(B dviout \e$B$K\e(B
 ;; \e$B$J$C$F$7$^$&$N$ODq93$,Bg$-$$$+$b!#\e(B
 (unless (get 'TeX-view-program-selection 'saved-value)
-  (setq TeX-view-program-selection
-       (append
-        (cond
-         ((eq system-type 'windows-nt)
-          '((output-dvi "Dviout")
-            (output-pdf "TeXworks")))
-         ((eq system-type 'darwin)
-          '((output-pdf "Preview")))
-         (t
-          nil))
-        TeX-view-program-selection)))
+  (if (eq system-type 'windows-nt)
+      (setq TeX-view-program-selection
+           (append
+            '((output-dvi "dviout"))
+            TeX-view-program-selection))))
 
 (mapc (lambda (dir) (add-to-list 'TeX-macro-global dir t))
       (or (TeX-tree-expand
@@ -260,47 +286,24 @@ For detail, see `TeX-command-list', to which this list is appended."
           "jlatex" '("/jtex/" "/jbibtex/bst/"))
          '("/usr/share/texmf/jtex/" "/usr/share/texmf/jbibtex/bst/")))
 
-;; \e$B=gD4$K9T$1$PITMW$K$J$k!#\e(B
-(setq LaTeX-command-style
-      (append '(("\\`u[jt]\\(article\\|report\\|book\\)\\'\\|\\`uplatex\\'"
-                "%(PDF)uplatex %(kanjiopt)%S%(PDFout)")
-               ("\\`[jt]s?\\(article\\|report\\|book\\)\\'"
-                "%(PDF)platex %(kanjiopt)%S%(PDFout)")
-               ("\\`j-\\(article\\|report\\|book\\)\\'"
-                "%(PDF)jlatex %(kanjiopt)%S%(PDFout)"))
-             LaTeX-command-style))
-
 (defcustom japanese-TeX-error-messages t
   "*If non-nil, explain TeX error messages in Japanese."
   :group 'AUCTeX-jp
   :type 'boolean)
 
-(when (featurep 'mule)
-
-;; FIX-ME (2007-02-09) The default coding system in recent Unix (like Fedora and
-;; Ubuntu) is utf-8.  But Japanese TeX system does not support utf-8 yet
-;; (platex-utf is under development, may be alpha phase).  So,
-;; process-coding-system for Japanese TeX is not defined from
-;; default-coding-system.  When platex-utf is out, we should look this setting,
-;; again.
-
-(defcustom TeX-japanese-process-input-coding-system
-  (cond ((memq system-type '(windows-nt ms-dos cygwin)) 'shift_jis-dos)
-       ((memq system-type '(mac darwin)) 'shift_jis-mac)
-       (t 'euc-jp-unix))
-  "TeX-process' coding system with standard input."
+(defcustom TeX-japanese-process-input-coding-system nil
+  "If non-nil, used for encoding input to Japanese TeX process.
+When nil, AUCTeX tries to choose suitable coding system.
+See also a user custom option `TeX-japanese-process-output-coding-system'."
   :group 'AUCTeX-jp
-  :type 'coding-system)
+  :type '(choice (const :tag "Default" nil) coding-system))
 
-(defcustom TeX-japanese-process-output-coding-system
-  (cond ((memq system-type '(windows-nt ms-dos cygwin)) 'shift_jis-dos)
-       ((memq system-type '(mac darwin)) 'shift_jis-mac)
-       (t 'euc-jp-unix))
-  "TeX-process' coding system with standard output."
+(defcustom TeX-japanese-process-output-coding-system nil
+  "If non-nil, used for decoding output from Japanese TeX process.
+When nil, AUCTeX tries to choose suitable coding system.
+See also a user custom option `TeX-japanese-process-input-coding-system'."
   :group 'AUCTeX-jp
-  :type 'coding-system)
-
-)
+  :type '(choice (const :tag "Default" nil) coding-system))
 
 ;; \e$B=gD4$K9T$1$PITMW$K$J$k!#\e(B
 (defcustom japanese-TeX-command-default "pTeX"
@@ -333,34 +336,133 @@ For detail, see `TeX-command-list', to which this list is appended."
     ("treport")
     ("tbook")
     ("jsarticle")
-    ("jsbook"))
-  "*List of Japanese document styles."
+    ("jsbook")
+    ;; for upLaTeX
+    ("ujarticle") ("ujreport") ("ujbook")
+    ("utarticle") ("utreport") ("utbook"))
+  "*List of Japanese document classes."
   :group 'AUCTeX-jp
   :type '(repeat (group (string :format "%v"))))
 
 (setq LaTeX-style-list
       (append japanese-LaTeX-style-list LaTeX-style-list))
 
-;;; Coding system
-(eval-and-compile
+;; text\e$B!A7O$NL@D+BN!&%4%7%C%/BN;XDj%3%^%s%I$O\e(B jLaTeX \e$B$K$O$J$$$h$&$G!"\e(B
+;; (u)pLaTeX \e$B$G$7$+;H$($J$$$,!"LdBj$K$J$k$3$H$O$J$$$@$m$&!#\e(B
+(setq LaTeX-font-list
+      (append '((?m "\\textmc{" "}" "\\mathmc{" "}")
+                (?g "\\textgt{" "}" "\\mathgt{" "}"))
+             LaTeX-font-list))
 
-(when (featurep 'mule)
+;;; Coding system
 
 (defun japanese-TeX-set-process-coding-system (process)
   "Set proper coding system for japanese TeX PROCESS."
-  (if (with-current-buffer TeX-command-buffer japanese-TeX-mode)
-      (set-process-coding-system process
-                                TeX-japanese-process-output-coding-system
-                                TeX-japanese-process-input-coding-system)))
-(setq TeX-after-start-process-function
-      'japanese-TeX-set-process-coding-system)
-
-(defcustom japanese-TeX-use-kanji-opt-flag t
-  "Add kanji option to Japanese pTeX family if non-nil."
-  :group 'AUCTeX-jp
-  :type 'boolean)
+  (with-current-buffer TeX-command-buffer
+    (when japanese-TeX-mode
+      ;; TeX-engine \e$B$,\e(B ptex, jtex, uptex \e$B$N$$$:$l$+$G$"$k>l9g$N$_9M$(\e(B
+      ;; \e$B$k!#\e(Bluatex-ja \e$B$J$I$N>l9g$O$=$b$=$b$?$@$N\e(B latex-mode \e$B$G$h$/!"\e(B
+      ;; \e$B$o$6$o$6\e(B japanese-latex-mode \e$B$K$9$kI,MW$,$J$$!#\e(B
+
+      ;; FIXME: \e$B0J2<$N=hM}$O\e(B tex engine \e$B$rBP>]$H$9$k>l9g$7$+9M$($F$$$J$$!#\e(B
+      ;; bibtex \e$B$d\e(B mendex \e$BEy$NJd=u%D!<%k$N>l9g$O@5$7$/$J$$=hM}$+$b$7$l$J$$!#\e(B
+      (let*
+         ;; -kanji \e$B%*%W%7%g%s$"$j$N;~$NJ8;z%3!<%I!#\e(B
+         ((kanji (and japanese-TeX-use-kanji-opt-flag
+                      (let ((str (japanese-TeX-get-encoding-string)))
+                        (cond
+                         ((equal str "euc") 'euc-jp)
+                         ((equal str "jis") 'iso-2022-jp)
+                         ((equal str "sjis") 'shift_jis)
+                         ((equal str "utf8") 'utf-8)))))
+
+          ;; process \e$B$+$i$N=PNO$NJ8;z%3!<%I!#\e(B
+          (dec (cond
+                ;; windows \e$B$H\e(B mac \e$B$N>l9g!#\e(B
+                ((memq system-type '(windows-nt darwin))
+                 (cond
+                  ;; ptex \e$B$J$i\e(B mac \e$B$O\e(B utf-8\e$B!#\e(B
+                  ;; windows \e$B$G\e(B -kanji \e$B%*%W%7%g%s$"$j$N;~$O$=$NJ8;z%3!<%I!"\e(B
+                  ;; \e$B$J$7$N;~$O\e(B sjis\e$B!#\e(B
+                  ((eq TeX-engine 'ptex)
+                   (cond ((eq system-type 'darwin)
+                          'utf-8)
+                         ((and japanese-TeX-use-kanji-opt-flag kanji)
+                          kanji)
+                         (t 'shift_jis)))
+                  ;; jtex \e$B$J$i\e(B sjis \e$B$K8GDj$9$k!#\e(B
+                  ((eq TeX-engine 'jtex)
+                   'shift_jis)
+                  ;; uptex \e$B$J$i\e(B utf-8 \e$B$K8GDj$9$k!#\e(B
+                  (t
+                   'utf-8)))
+                ;; unix \e$B$N>l9g!#\e(B
+                (t
+                 ;; jtex \e$B$J$i\e(B euc \e$B$K8GDj$9$k!#\e(B
+                 (cond
+                  ((eq TeX-engine 'jtex)
+                   'euc-jp)
+                  ;; \e$B$=$l0J30$O!"\e(Buptex \e$B$G$b\e(B locale \e$B$K=>$&!#\e(B
+                  ;; \e$B$?$@$7!"\e(Blocale \e$B$,F|K\8l$r%5%]!<%H$7$J$$>l9g$O\e(B
+                  ;; euc \e$B$K8GDj$9$k!#\e(B
+                  (t
+                   (let ((lcs
+                          (cond
+                           ((boundp 'locale-coding-system)
+                            locale-coding-system)
+                           ;; XEmacs doesn't have `locale-coding-system'.
+                           ;; Instead xemacs 21.5 has
+                           ;; `get-coding-system-from-locale' and
+                           ;; `current-locale'.  They aren't available on
+                           ;; xemacs 21.4.
+                           ((and
+                             (featurep 'xemacs)
+                             (fboundp 'get-coding-system-from-locale))
+                            (get-coding-system-from-locale
+                             (if (fboundp 'current-locale)
+                                 (current-locale)
+                               ;; I don't know XEmacs well, so incorporate
+                               ;; the suggestion of
+                               ;; http://lists.gnu.org/archive/html/auctex-devel/2017-02/msg00079.html
+                               ;; as well.
+                               (or (getenv "LC_ALL")
+                                   (getenv "LC_CTYPE")
+                                   (getenv "LANG")
+                                   "")))))))
+                     (if (and lcs (japanese-TeX-coding-ejsu lcs))
+                         lcs 'euc-jp)))))))
+
+          ;; process \e$B$KM?$($kF~NO$NJ8;z%3!<%I!#\e(B
+          (enc (cond
+                ;; ptex \e$B$G\e(B -kanji \e$B%*%W%7%g%s$"$j$J$i!"$=$NJ8;z%3!<%I!#\e(B
+                ;; \e$B$J$7$J$i\e(B utf-8 \e$B$+\e(B sjis\e$B!#\e(B
+                ((eq TeX-engine 'ptex)
+                 (if (and japanese-TeX-use-kanji-opt-flag kanji)
+                     kanji
+                   (if (eq system-type 'windows-nt)
+                       'shift_jis 'utf-8)))
+                ;; jtex \e$B$J$i\e(B euc \e$B$+\e(B sjis \e$B$K8GDj$9$k!#\e(B
+                ((eq TeX-engine 'jtex)
+                 (if (memq system-type '(windows-nt darwin))
+                     'shift_jis 'euc-jp))
+                ;; uptex \e$B$J$i\e(B utf-8 \e$B$K8GDj$9$k!#\e(B
+                (t
+                 'utf-8))))
+
+       ;; \e$B2~9T%3!<%I$r;XDj!#\e(B
+       (setq dec (coding-system-change-eol-conversion
+                  dec
+                  (if (eq system-type 'windows-nt) 'dos 'unix))
+             enc (coding-system-change-eol-conversion
+                  enc
+                  (if (eq system-type 'windows-nt) 'dos 'unix)))
+
+       ;; Customize \e$BCM$,$"$l$P$=$l$rM%@h!#\e(B
+       (set-process-coding-system
+        process
+        (or TeX-japanese-process-output-coding-system dec)
+        (or TeX-japanese-process-input-coding-system enc))))))
 
-;;;###autoload
 (defun japanese-TeX-coding-ejsu (coding-system)
   "Convert japanese CODING-SYSTEM to mnemonic string.
 euc-jp:    \"euc\"
@@ -369,19 +471,28 @@ shift_jis: \"sjis\"
 utf-8:     \"utf8\"
 Return nil otherwise."
   (let ((base (coding-system-base coding-system)))
+    (if (featurep 'xemacs)
+       (setq base (coding-system-name base)))
     (cdr (assq base
               '((japanese-iso-8bit . "euc")
+                (euc-jp . "euc") ; for xemacs
                 (iso-2022-jp . "jis")
                 (japanese-shift-jis . "sjis")
+                (shift_jis . "sjis") ; for xemacs
                 (utf-8 . "utf8")
+                (mule-utf-8 . "utf8") ; for emacs 21, 22
+                ;; utf-8-auto \e$B$d\e(B utf-8-emacs \e$B$rF~$l$kI,MW$O$"$k$N$+!)\e(B
 
-                ;; xemacs \e$B$@$H0J2<$NL>A0$O0c$&$+$b!D!#\e(B
+                ;; xemacs 21.5 with mule \e$B$K$O!"\e(Bjisx0213 \e$B$N\e(B charset \e$B$O\e(B
+                ;; \e$B$"$k$,$=$lMQ$N\e(B coding system \e$B$O$J$$!#\e(B
                 (euc-jis-2004 . "euc")
                 (iso-2022-jp-2004 . "jis")
                 (japanese-shift-jis-2004 . "sjis")
 
                 (japanese-cp932 . "sjis")
-                (eucjp-ms . "euc"))))))
+                (eucjp-ms . "euc")
+                (windows-932 . "sjis") ; for xemacs 21.5 with mule
+               )))))
 
 (defun japanese-TeX-get-encoding-string ()
   "Return coding option string for Japanese pTeX family.
@@ -404,15 +515,8 @@ For inappropriate encoding, nil instead."
       (japanese-TeX-coding-ejsu
        (default-value 'buffer-file-coding-system))))
 
-))
-
 ;;; Japanese TeX modes
 
-(defvar japanese-TeX-mode nil
-  "Non-nil means the current buffer handles Japanese TeX/LaTeX.")
-(make-variable-buffer-local 'japanese-TeX-mode)
-(put 'japanese-TeX-mode 'permanent-local t)
-
 ;;;###autoload
 (defun japanese-plain-tex-mode ()
   "Major mode in AUCTeX for editing Japanese plain TeX files.
@@ -424,10 +528,16 @@ Set `japanese-TeX-mode' to t, and enter `TeX-plain-tex-mode'."
 (defun japanese-plain-tex-mode-initialization ()
   "Japanese plain-TeX specific initializations."
   (when japanese-TeX-mode
-;    (setq TeX-command-default japanese-TeX-command-default)
-    (TeX-engine-set japanese-TeX-engine-default)))
+    (TeX-engine-set japanese-TeX-engine-default)
+
+    ;; For the intent of the following lines, see the comments below
+    ;; in `japanese-latex-mode-initialization'.
+    (when enable-local-variables
+      (setq major-mode 'japanese-plain-tex-mode)
+      (add-hook 'hack-local-variables-hook #'japanese-TeX-reset-mode-name
+               nil t))))
 
-(add-hook 'plain-TeX-mode-hook 'japanese-plain-tex-mode-initialization)
+(add-hook 'plain-TeX-mode-hook #'japanese-plain-tex-mode-initialization)
 
 ;;;###autoload
 (defun japanese-latex-mode ()
@@ -440,39 +550,91 @@ Set `japanese-TeX-mode' to t, and enter `TeX-latex-mode'."
 (defun japanese-latex-mode-initialization ()
   "Japanese LaTeX specific initializations."
   (when japanese-TeX-mode
-;    (setq TeX-command-default japanese-LaTeX-command-default)
+    ;; `TeX-match-style' \e$B$r;H$&$N$O\e(B `TeX-update-style' \e$B$N8e$KCY$i$;$k!#\e(B
+    ;; \e$B$3$NCJ3,$G;H$&$H!"$=$NCf$G8F$V\e(B `TeX-style-list' \e$B$NCf$G\e(B
+    ;; `TeX-update-style' \e$B$,8F$P$l$F$7$^$$!"\e(Blocal variable \e$BEy$N=`Hw$,\e(B
+    ;; \e$B@0$C$F$J$$CJ3,$G\e(B style hook \e$B$,<B9T$5$l$FITE,$J7k2L$K$J$k$3$H$,\e(B
+    ;; \e$B$"$k!#$^$?!"\e(B`TeX-update-style' \e$B$O8e$+$i\e(B `find-file-hook' \e$BCf$G$b\e(B
+    ;; \e$B$&0lEY8F$P$l$k$N$G!"\e(B`TeX-parse-self' \e$B$,\e(B t \e$B$@$H\e(B parse \e$B=hM}$bL5BL\e(B
+    ;; \e$B$K\e(B 2 \e$B2s9T$o$l$F$7$^$&!#\e(B
+    (add-hook 'TeX-update-style-hook
+             #'japanese-LaTeX-guess-engine nil t)
+    (setq LaTeX-default-style japanese-LaTeX-default-style)
+
+    (when (and (fboundp 'font-latex-add-keywords)
+              (eq TeX-install-font-lock 'font-latex-setup))
+      ;; jLaTeX \e$B$K$O$J$$%3%^%s%I$@$,!"$=$l$O$b$&5$$K$7$J$/$F$$$$$@$m$&!#\e(B
+      (font-latex-add-keywords '(("textgt" "{") ("mathgt" "{"))
+                              'bold-command)
+      (font-latex-add-keywords '("gtfamily")
+                              'bold-declaration))
+
+    ;; The value of `major-mode' should be `latex-mode', not
+    ;; `japanese-latex-mode', because the name `latex-mode' is hard
+    ;; coded in several places of AUCTeX like "(eq major-mode
+    ;; 'latex-mode)", "(memq major-mode '(doctex-mode latex-mode)" and
+    ;; so on.  By such piece of codes, `japanese-latex-mode' should
+    ;; simply be regarded as `latex-mode'.  So we'd like to leave
+    ;; `major-mode' as `latex-mode' here, but doing so confuses
+    ;; `hack-local-variables' in two ways.
+    ;; (1) It is tricked into considering that the major mode is not
+    ;;     yet initialized and calls `japanese-latex-mode' again.
+    ;; (2) It does not read the directory local variables prepared for
+    ;;     `japanese-latex-mode'.
+    ;; Thus we temporarily set `major-mode' to `japanese-latex-mode'
+    ;; here and plan to reset it to `latex-mode' after
+    ;; `hack-local-variables' is done.
+    (when enable-local-variables
+      (setq major-mode 'japanese-latex-mode)
+      (add-hook 'hack-local-variables-hook #'japanese-TeX-reset-mode-name
+               nil t))))
+
+(add-hook 'LaTeX-mode-hook #'japanese-latex-mode-initialization)
+
+;; This function is useful only within `hack-local-variables-hook'.
+(defun japanese-TeX-reset-mode-name ()
+  (cond ((eq major-mode 'japanese-latex-mode)
+        (setq major-mode 'latex-mode))
+       ((eq major-mode 'japanese-plain-tex-mode)
+        (setq major-mode 'plain-tex-mode)))
+  (remove-hook 'hack-local-variables-hook #'japanese-TeX-reset-mode-name t))
+
+;; Make `hack-dir-local-variables' to regard `latex-mode' as parent
+;; of `japanese-latex-mode', and `plain-tex-mode' as parent of
+;; `japanese-plain-tex-mode'.
+(put 'japanese-plain-tex-mode 'derived-mode-parent 'plain-tex-mode)
+(put 'japanese-latex-mode 'derived-mode-parent 'latex-mode)
+
+(defun japanese-LaTeX-guess-engine ()
+  "Guess Japanese TeX engine and set it to `TeX-engine'.
+Document class and its option is considered in the guess.  Do not
+overwrite the value already set locally."
+  ;; `TeX-engine' may be set by the file local variable or by the menu
+  ;; Command->TeXing Options manually.  Don't override the user
+  ;; preference set in such ways.
+  (unless (local-variable-p 'TeX-engine (current-buffer))
     (TeX-engine-set
-     ;; class file \e$BL>$KMj$k$N$O@5$7$$$N$+!)\e(B
-     ;; jLaTeX \e$B$K$b\e(B jarticle \e$B$O0l1~$"$k$7!"\e(BpLaTeX \e$B$G$b<+J,$G\e(B j-article \e$B$r\e(B
-     ;; \e$B%$%s%9%H!<%k$7$F;H$C$F$$$1$J$$K!$O$J$$!#\e(B
      (cond
-      ((TeX-match-style "\\`u[jt]\\(article\\|report\\|book\\)\\'\\|\\`uplatex\\'")
+      ((TeX-match-style "\\`u[jt]\\(?:article\\|report\\|book\\)\\'")
        'uptex)
-      ((TeX-match-style "\\`[jt]s?\\(article\\|report\\|book\\)\\'")
-       'ptex)
-      ((TeX-match-style "\\`j-\\(article\\|report\\|book\\)\\'")
+      ((TeX-match-style "\\`[jt]s?\\(?:article\\|report\\|book\\)\\'")
+       (if (LaTeX-match-class-option "\\`uplatex\\'")
+          'uptex 'ptex))
+      ((TeX-match-style "\\`j-\\(?:article\\|report\\|book\\)\\'")
        'jtex)
-      (t japanese-TeX-engine-default)))
-    (setq LaTeX-default-style japanese-LaTeX-default-style)
-;    (setq TeX-command-BibTeX
-;        (if (and (eq TeX-engine 'ptex) (executable-find "pbibtex"))
-;            "pBibTeX" "jBibTeX"))
-))
-
-(add-hook 'LaTeX-mode-hook 'japanese-latex-mode-initialization)
-
+      (t japanese-TeX-engine-default)))))
 
 ;;; Support for various self-insert-command
 
 (fset 'japanese-TeX-self-insert-command
       (cond ((fboundp 'can-n-egg-self-insert-command)
-            'can-n-egg-self-insert-command)
+            #'can-n-egg-self-insert-command)
            ((fboundp 'egg-self-insert-command)
-            'egg-self-insert-command)
+            #'egg-self-insert-command)
            ((fboundp 'canna-self-insert-command)
-            'canna-self-insert-command)
+            #'canna-self-insert-command)
            (t
-            'self-insert-command)))
+            #'self-insert-command)))
 
 (defun TeX-insert-punctuation ()
   "Insert point or comma, cleaning up preceding space."
@@ -480,13 +642,18 @@ Set `japanese-TeX-mode' to t, and enter `TeX-latex-mode'."
   (expand-abbrev)
   (if (TeX-looking-at-backward "\\\\/\\(}+\\)" 50)
       (replace-match "\\1" t))
-  (call-interactively 'japanese-TeX-self-insert-command))
+  (call-interactively #'japanese-TeX-self-insert-command))
 
 ;;; Error Messages
 
 (if japanese-TeX-error-messages
 (setq TeX-error-description-list
-  '(("Bad \\\\line or \\\\vector argument.*" .
+  '(("\\(?:Package Preview Error\\|Preview\\):.*" .
+"`preview'\e$B$X\e(B`auctex'\e$B%*%W%7%g%s$rD>@\M?$($k$N$OHr$1$F$/$@$5$$!%\e(B
+\e$B%W%l%S%e!<$N<B9T;~0J30$G$3$N%(%i!<$,=P$?>l9g!$M>$j$K$3$_$$$C$?$3$H$r\e(B
+\e$B$7$9$.$+!$$G$J$1$l$P\e(BAUCTeX\e$B$,$R$I$$<:GT$r$7$F$$$^$9!%\e(B")
+
+    ("Bad \\\\line or \\\\vector argument.*" .
 "\e$B@~$N79$-$r;XDj$9$k!$\e(B\\line\e$B$^$?$O\e(B\\vector\e$B$N:G=i$N0z?t$,IT@5$G$9!%\e(B")
 
     ("Bad math environment delimiter.*" .