2011年6月29日水曜日

YaTeXとRefTeXの共存

追記:2020/01/12:yatex-modeからreftex-modeが正常に動かないと思っていたのは誤解でした.local variableのTeX-masterの初期化を行っていなかったのが原因のようです.
(setq-default TeX-master nil)をinit.elに加えておくと動作するようになりました.

追記:2019/04/11:emacs 26以上を使用していると,yatex-modeからreftex-modeを利用する際に,分割したファイルの横断検索ができなくなっているようです.emacs標準のlatex-modeからは検索できているので,yatex側に原因がありそうです.

RefTeXは相互参照の入力補完を行うelispです。長い原稿を書く際には必需で、これなしではやってられません。YaTeX側にはprefixキーを自由に選択できる余地があるのですが、RefTeXはAucTeXと合わせて使うことを前提としているためか、prefixキーがCtrl-cに固定されています。YaTeXの幾つかのコマンドと重複して使いづらいので、現在はYaTeXのコマンドをメインにして、RefTeXのキーを変更して使っています。

対処療法的なところがあるのであまりオススメはしませんが、Web上でこのような情報をあまり見かけないので.emacs.elを晒しておきます。本当はRefTeXにも自由に変更出来るprefixキーを定義するなどの変更を行うべきなのでしょうが、elispが読み書き出来無いのでこの程度で勘弁してください。


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; RefTex 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; YaTeX-modeでReftex-modeを使う.
;; YaTeX-modeでの色使いを変更する
(add-hook 'yatex-mode-hook
'(lambda()
(progn
;               (reftex-mode)       ; reftex-modeを使う
(turn-on-reftex)
(setq TeX-parse-self t)
;               (setq-default Tex-master nil)
(setq enable-local-variables t)
(YaTeX-font-lock-recenter)
)))


;;数式のラベル作成時にも自分でラベルを入力できるようにする
(setq reftex-insert-label-flags '("s" "sfte"))


;;; YaTeXとの競合の解消 (競合部分はYaTeXを優先する)
;; YaTeXでのコマンドの定義は"yatex.el"の"Define key table"部分を参照せよ

(add-hook 'yatex-mode-hook
#'(lambda ()
(reftex-mode 1)
(define-key reftex-mode-map
(concat YaTeX-prefix ">") 'YaTeX-comment-region)
;指定領域のコメントアウト "C-c >"
(define-key reftex-mode-map
(concat YaTeX-prefix "<") 'YaTeX-uncomment-region)
;コメントアウト解除 "C-c <"
(define-key reftex-mode-map  (concat YaTeX-prefix ")") 'YaTeX-insert-parens-region)
;領域を括弧で括る "C-c )"
))


;; 上でYaTeXに譲り渡したRefTeXのコマンドを定義し直す  
;;;;; labelの参照のコマンドを"C-c )"から"C-h )"に変更(暫定的)
(add-hook 'reftex-mode-hook
 '(lambda ()
               (define-key reftex-mode-map "\C-h)" 'reftex-reference)
               (define-key reftex-mode-map "\C-h=" 'reftex-toc)
               (define-key reftex-mode-map "\C-h(" 'reftex-label)
               (define-key reftex-mode-map "\C-h[" 'reftex-citation)
               (define-key reftex-mode-map "\C-h<" 'reftex-index)
               (define-key reftex-mode-map "\C-h>" 'reftex-display-index)
               (define-key reftex-mode-map "\C-h/" 'reftex-index-selection-or-word)
               (define-key reftex-mode-map "\C-h\\" 'reftex-index-phrase-selection-or-word)
               (define-key reftex-mode-map "\C-h|" 'reftex-index-visit-phrases-buffer)
               (define-key reftex-mode-map "\C-h&" 'reftex-view-crossref)
))

;;;

;;; C-h&でhyperlink, hypertarget間の相互ジャンプを可能にする

(setq reftex-view-crossref-extra
'(("\hyperlink" "\hypertarget{\\(%s\\)}" 1)
("\hypertarget" "\hyperlink{\\(%s\\)}" 1)))


;;; 新たなlabel環境の定義

;; \eqrefを使う
(setq reftex-label-alist 
'(
(nil ?e nil "\\eqref{%s}" nil nil)
("theo"  ?h "theo:"  "\\ref{%s}" t ("定理"))
("axiom"  ?a "axiom:"  "\\ref{%s}" t ("公理"))
("prop"  ?p "prop:"  "\\ref{%s}" nil ("命題"))
("lem"   ?l "lem:"   "\\ref{%s}" nil ("補題"))
("defi"  ?d "defi:"   "\\ref{%s}" nil ("定義"))
("coro"  ?c "coro:"   "\\ref{%s}" nil ("系"))
))