yuuji@395: ;;; yatex19.el -- YaTeX facilities for Emacs 19 or later -*- coding: sjis -*- yuuji@443: ;;; (c)1994-2017 by HIROSE Yuuji.[yuuji@yatex.org] yuuji@497: ;;; Last modified Sun Sep 17 10:22:54 2017 on firestorm yuuji@366: ;;; $Id$ yuuji@46: yuuji@287: ;;; Code: yuuji@64: ;(require 'yatex) yuuji@47: yuuji@73: (and (boundp 'YaTeX-use-hilit19) yuuji@73: YaTeX-use-hilit19 yuuji@73: (require 'hilit19)) yuuji@72: yuuji@72: (defvar YaTeX-use-highlighting (or YaTeX-use-font-lock YaTeX-use-hilit19) yuuji@72: "*Use highlighting buffer or not.") yuuji@72: (defvar YaTeX-background-mode yuuji@80: (or (if (fboundp 'get-frame-background-mode) yuuji@80: (get-frame-background-mode (selected-frame))) yuuji@398: (if (boundp 'frame-background-mode) yuuji@398: frame-background-mode) yuuji@80: (if (fboundp 'frame-parameters) yuuji@80: (cdr (assq 'background-mode (frame-parameters)))) yuuji@80: (if (boundp 'hilit-background-mode) yuuji@80: hilit-background-mode) yuuji@80: (if (face-background 'default) yuuji@80: (if (> (+ 32768 32768 32768) yuuji@80: (apply '+ yuuji@80: (funcall (if (fboundp 'color-rgb-components) yuuji@80: 'color-rgb-components yuuji@80: 'x-color-values) yuuji@80: (face-background 'default)))) yuuji@80: 'dark yuuji@80: 'light)))) yuuji@70: yuuji@64: (defvar YaTeX-mode-menu-map (make-sparse-keymap "YaTeX")) yuuji@64: (defvar YaTeX-mode-menu-map-process (make-sparse-keymap "Process")) yuuji@64: (define-key YaTeX-mode-map [menu-bar yatex] yuuji@64: (cons "YaTeX" YaTeX-mode-menu-map)) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-process yuuji@64: (nreverse yuuji@64: '((buffer "LaTeX" . (lambda () (interactive) (YaTeX-typeset-menu nil ?j))) yuuji@214: (pdf "LaTeX+PDF" . (lambda () (interactive) (YaTeX-typeset-menu nil ?d))) yuuji@64: (kill "Kill LaTeX" . (lambda () (interactive) (YaTeX-typeset-menu nil ?k))) yuuji@64: (bibtex "BibTeX" . (lambda () (interactive) (YaTeX-typeset-menu nil ?b))) yuuji@64: (mindex "makeindex" . (lambda () (interactive) (YaTeX-typeset-menu nil ?i))) yuuji@64: (preview "Preview" . (lambda () (interactive) (YaTeX-typeset-menu nil ?p))) yuuji@64: (lpr "lpr" . (lambda () (interactive) (YaTeX-typeset-menu nil ?l))) yuuji@64: (lpq "lpq" . (lambda () (interactive) (YaTeX-typeset-menu nil ?q)))))) yuuji@64: (defvar YaTeX-mode-menu-map-modes (make-sparse-keymap "Modes")) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-modes yuuji@64: (delq nil yuuji@64: (nreverse yuuji@64: (list yuuji@64: (if YaTeX-auto-math-mode nil yuuji@64: (cons 'math (cons "Toggle math-mode" yuuji@353: (function(lambda () (interactive) yuuji@353: (YaTeX-switch-mode-menu nil ?t)))))) yuuji@64: (cons 'mod (cons "Toggle Modify Mode" yuuji@353: (function(lambda () (interactive) yuuji@353: (YaTeX-switch-mode-menu nil ?m))))))))) yuuji@64: (defvar YaTeX-mode-menu-map-percent (make-sparse-keymap "percent")) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-percent yuuji@64: (nreverse yuuji@64: '((! "Change LaTeX typesetter(%#!)" yuuji@64: . (lambda () (interactive) (YaTeX-%-menu nil nil ?!))) yuuji@64: (begend "Set %#BEGIN-%#END on region" yuuji@64: . (lambda () (interactive) (YaTeX-%-menu nil nil ?b))) yuuji@64: (lpr "Change LPR format" yuuji@64: . (lambda () (interactive) (YaTeX-%-menu nil nil ?l)))))) yuuji@46: yuuji@64: (defvar YaTeX-mode-menu-map-jump (make-sparse-keymap "jump")) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-jump yuuji@64: (nreverse yuuji@64: '((corres "Goto corersponding position" . YaTeX-goto-corresponding-*) yuuji@64: (main "Visit main source" yuuji@64: . (lambda () (interactive) (YaTeX-visit-main))) yuuji@64: (main-other "Visit main source other window" yuuji@64: . YaTeX-visit-main-other-window)))) yuuji@46: yuuji@64: (defvar YaTeX-mode-menu-map-comment (make-sparse-keymap "comment")) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-comment yuuji@64: (nreverse yuuji@64: '((comment "Comment region or environment" . YaTeX-comment-region) yuuji@64: (uncomment "Unomment region or environment" . YaTeX-uncomment-region) yuuji@64: (commentp "Comment paragraph" . YaTeX-comment-paragraph) yuuji@64: (uncommentp "Uncomment paragraph" . YaTeX-uncomment-paragraph)))) yuuji@46: yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map yuuji@64: (nreverse yuuji@64: (list yuuji@64: ;; Change/Kill/Fill ------------------------------------------------------- yuuji@64: (cons (list 'chg "Change") (cons "Change macros" 'YaTeX-change-*)) yuuji@64: (cons (list 'kill "Kill") (cons "Kill macros" 'YaTeX-kill-*)) yuuji@64: (cons (list 'fill "Fill") (cons "Fill \\item" 'YaTeX-fill-item)) yuuji@64: (cons (list 'nl "Newline") (cons "Newline" 'YaTeX-intelligent-newline)) yuuji@64: ;; ======================================================================== yuuji@64: (cons (list 'sep1 "---") (cons "---" nil)) yuuji@64: ;; Comment/Uncomment ------------------------------------------------------ yuuji@64: (cons (list 'comment "comment") (cons "Comment region or environment" yuuji@64: 'YaTeX-comment-region)) yuuji@64: (cons (list 'uncomment "uncomment") (cons "Uncomment region or environment" yuuji@64: 'YaTeX-uncomment-region)) yuuji@64: (cons (list 'commentp "commentp") (cons "Comment paragraph" yuuji@64: 'YaTeX-comment-paragraph)) yuuji@64: (cons (list 'uncommentp "uncommentp") (cons "Uncomment paragraph" yuuji@64: 'YaTeX-uncomment-paragraph)) yuuji@64: ;; ======================================================================== yuuji@64: (cons (list 'sep2 "---") (cons "---" nil)) yuuji@64: ;; Jump cursor ------------------------------------------------------------ yuuji@64: (cons (list 'jump "jump") (cons "Jump Cursor" YaTeX-mode-menu-map-jump)) yuuji@64: ;; Document hierarchy --------------------------------------------------- yuuji@64: (cons (list 'hier "hier") (cons "Display Document hierarchy" yuuji@64: 'YaTeX-display-hierarchy)) yuuji@64: ;; What position ---------------------------------------------------------- yuuji@64: (cons (list 'col "column") (cons "What column in tabular" yuuji@64: 'YaTeX-what-column)) yuuji@64: ;; % menu ----------------------------------------------------------------- yuuji@64: (cons (list 'percent "percent") (cons "Edit %# notation" yuuji@64: YaTeX-mode-menu-map-percent)) yuuji@64: ;; Switch modes ----------------------------------------------------------- yuuji@64: (cons (list 'mode "mode") (cons "Switching YaTeX's modes" yuuji@64: YaTeX-mode-menu-map-modes)) yuuji@64: ;; ======================================================================== yuuji@64: (cons (list 'sep "---") (cons "---" nil)) yuuji@64: ;; Help for LaTeX --------------------------------------------------------- yuuji@64: (cons (list 'ap "apr") (cons "Apropos on LaTeX commands" 'YaTeX-apropos)) yuuji@64: (cons (list 'help "help") (cons "Help on LaTeX commands" 'YaTeX-help)) yuuji@64: ;; Menu for Typeset relating processes ------------------------------------ yuuji@64: (cons (list 'process "Process menu") yuuji@64: (cons "Process" YaTeX-mode-menu-map-process))) yuuji@64: )) yuuji@46: yuuji@64: ;; Make section-type commands menu ------------------------------------------- yuuji@64: (defvar YaTeX-mode-menu-map-sectionr yuuji@64: (make-sparse-keymap "Enclose region with section-type macro")) yuuji@64: (defvar YaTeX-mode-menu-map-section (make-sparse-keymap "Section-type macro")) yuuji@46: (let ((sorted-section yuuji@46: (sort yuuji@46: (delq nil yuuji@46: (mapcar (function (lambda (s) yuuji@46: (if (> (length (car s)) 5) yuuji@46: (car s)))) yuuji@46: (append section-table user-section-table))) yuuji@46: 'string<))) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-section yuuji@64: (mapcar yuuji@64: (function (lambda (secname) yuuji@64: (cons (intern secname) yuuji@64: (cons secname yuuji@64: (list 'lambda () yuuji@64: (list 'interactive) yuuji@64: (list 'YaTeX-make-section yuuji@64: nil nil nil yuuji@64: secname)))))) yuuji@64: sorted-section)) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-sectionr yuuji@64: (mapcar yuuji@64: (function (lambda (secname) yuuji@64: (cons (intern secname) yuuji@64: (cons secname yuuji@64: (list 'lambda () yuuji@64: (list 'interactive) yuuji@64: (list 'YaTeX-make-section yuuji@64: nil yuuji@64: (list 'region-beginning) yuuji@64: (list 'region-end) yuuji@64: secname)))))) yuuji@64: sorted-section))) yuuji@46: yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map yuuji@64: (nreverse yuuji@64: (list yuuji@64: (cons '(sectionr "Section-type (long name)") yuuji@64: (cons "Section type" YaTeX-mode-menu-map-section)) yuuji@64: (cons '(section "Section-type region (long name)") yuuji@64: (cons "Section type region (long name)" yuuji@64: YaTeX-mode-menu-map-sectionr))))) yuuji@64: yuuji@64: ;; Make large-type commands menu --------------------------------------------- yuuji@64: (defvar YaTeX-mode-menu-map-envr (make-sparse-keymap "Environment region")) yuuji@64: (defvar YaTeX-mode-menu-map-env (make-sparse-keymap "Environment")) yuuji@64: yuuji@64: (let ((sorted-env yuuji@64: (sort yuuji@64: (mapcar (function (lambda (s) (car s))) yuuji@64: (append env-table user-env-table)) yuuji@64: 'string<))) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-env yuuji@64: (mapcar yuuji@64: (function (lambda (envname) yuuji@64: (cons (intern envname) yuuji@64: (cons envname yuuji@64: (list 'lambda () yuuji@64: (list 'interactive) yuuji@64: (list 'YaTeX-insert-begin-end yuuji@64: envname nil)))))) yuuji@64: sorted-env)) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map-envr yuuji@64: (mapcar yuuji@64: (function (lambda (envname) yuuji@64: (cons (intern envname) yuuji@64: (cons envname yuuji@64: (list 'lambda () yuuji@64: (list 'interactive) yuuji@64: (list 'YaTeX-insert-begin-end yuuji@64: envname t)))))) yuuji@64: sorted-env))) yuuji@64: (YaTeX-define-menu yuuji@64: 'YaTeX-mode-menu-map yuuji@64: (nreverse yuuji@64: (list yuuji@64: (cons '(envr "Environment") yuuji@64: (cons "Environment" YaTeX-mode-menu-map-env)) yuuji@64: (cons '(env "Environment region") yuuji@64: (cons "Environment region" yuuji@64: YaTeX-mode-menu-map-envr))))) yuuji@64: yuuji@64: (and (featurep 'xemacs) yuuji@64: (add-hook 'yatex-mode-hook yuuji@353: (function yuuji@353: (lambda () yuuji@64: (or (assoc "YaTeX" current-menubar) yuuji@64: (progn yuuji@64: (set-buffer-menubar (copy-sequence current-menubar)) yuuji@353: (add-submenu nil YaTeX-mode-menu-map))))))) yuuji@46: yuuji@53: ;; Other key bindings for window-system yuuji@53: ;(YaTeX-define-key [?\C- ] 'YaTeX-do-completion) yuuji@53: (define-key YaTeX-mode-map [?\M-\C- ] 'YaTeX-mark-environment) yuuji@53: yuuji@46: ;; Highlightening yuuji@53: ;; メニューに比べてこっちは結構本気でやってます。 yuuji@53: ;; だって文書構造がとっても分かり易いんだもん。 yuuji@53: ;; みんなも hilit19.el を使おう! yuuji@72: ;; とかいってるうちに hilit19 って obsolete になってしまった… yuuji@72: ;; …ということで、hilit19 用のパターンを font-lock に変換する関数を yuuji@72: ;; 作成してなんとか font-lock にも対応(2000年12月)。 yuuji@72: ;; しかし、font-lock は仕様が変わりやすい雰囲気でずっと動き続けるか yuuji@72: ;; どうかは不明。むしろ進化の止まったhilit19を使い続ける方が安心と yuuji@72: ;; 言えないこともないが世の流れは読めず……。 yuuji@53: ;; yuuji@53: ;; さて、まずは対応する {} をピカピカ範囲とするような関数を作る。 yuuji@53: ;; これは hilit-LaTeX.el を参考にした。でも、ちゃんと section 型コマンドの yuuji@53: ;; 引数を数えて正しい位置までピカピカさせるよ〜ん! yuuji@53: yuuji@53: (defun YaTeX-19-region-section-type (pattern) yuuji@80: "Return cons of starting and end point of section-type commands of PATTERN." yuuji@53: (if (re-search-forward pattern nil t) yuuji@69: (let ((m0 (match-beginning 0)) (e0 (match-end 0)) cmd (argc 1)) yuuji@64: (setq cmd (substring (YaTeX-match-string 0) 1) yuuji@53: argc (or (car (cdr (YaTeX-lookup-table cmd 'section))) argc)) yuuji@69: (if (= argc 0) (cons m0 (point)) ;引数個数0ならマッチした領域 yuuji@69: (skip-chars-forward " \n\t*") yuuji@69: (while (looking-at "\\[") (forward-list 1)) ;optionならスキップ yuuji@69: (skip-chars-forward " \n\t") yuuji@72: (prog1 yuuji@72: (if (looking-at "{") ;{}が始まるならちゃんとしたsection型 yuuji@72: (cons m0 yuuji@72: (condition-case err yuuji@72: (progn yuuji@72: ;;(skip-chars-backward "^{") (forward-char -2) yuuji@72: (while (> argc 0) yuuji@72: (skip-chars-forward "^{") yuuji@72: (forward-list 1) yuuji@72: (setq argc (1- argc))) yuuji@72: (point)) yuuji@72: (error m0))) yuuji@72: ;{}でないならたぶん \verb 環境などにあるダミー yuuji@72: (cons m0 e0)) yuuji@72: ;;move to re-search end not to make font-lock confused yuuji@72: (goto-char e0)))))) yuuji@53: yuuji@53: (defun YaTeX-19-region-large-type (pattern) yuuji@80: "Return cons of large-type contents. yuuji@53: Assumes PATTERN begins with `{'." yuuji@53: (if (re-search-forward pattern nil t) yuuji@72: (let ((m0 (match-beginning 0)) (e0 (match-end 0))p) yuuji@53: (goto-char m0) yuuji@53: (skip-chars-forward "^ \t\n") yuuji@53: (skip-chars-forward " \t\n") yuuji@72: (prog1 yuuji@72: (cons (setq p (point)) yuuji@72: (condition-case err yuuji@72: (progn (goto-char m0) (forward-list 1) (1- (point))) yuuji@72: (error (1+ p)))) yuuji@72: ;;move to re-search end not to make font-lock confused yuuji@72: (goto-char e0))))) yuuji@53: yuuji@80: (defun YaTeX-19-region-env-type (envptn) yuuji@80: "Return cons of environment contents specified by ENVPTN as regexp." yuuji@80: (if (and (looking-at envptn) ;;re-search-forward envptn nil t) yuuji@80: (save-excursion yuuji@80: (not(search-backward YaTeX-comment-prefix yuuji@80: (point-beginning-of-line) t)))) yuuji@80: (let ((m0 (match-beginning 0)) (e0 (match-end 0)) yuuji@80: (env (YaTeX-match-string 1)) yuuji@80: (nextline (progn (forward-line 1) (point)))) yuuji@80: (goto-char m0) yuuji@80: ;(message "max=%d" (point-max))(sit-for 2) yuuji@80: (condition-case err yuuji@80: (if (YaTeX-goto-corresponding-environment) yuuji@80: (prog1 yuuji@80: (cons nextline (match-beginning 0)) yuuji@80: (goto-char e0))) yuuji@80: (error nil))))) yuuji@80: yuuji@80: (defun YaTeX-19-region-paren-math (ptn) yuuji@80: "Return cons of \(...\) or \[...\] type math environment." yuuji@80: (if (looking-at "\\\\\\([\[(]\\)") yuuji@80: (let*((ptype (cdr (assoc (YaTeX-match-string 1) yuuji@80: '(("(" . ")") ("[" "]"))))) yuuji@80: (b (match-beginning 0)) yuuji@80: (e (match-end 0))) yuuji@80: (condition-case err yuuji@80: (if (re-search-forward yuuji@80: (concat "[^\\]\\\\" (regexp-quote ptype)) yuuji@80: nil t) yuuji@80: (prog1 (cons b (match-beginning 0)) yuuji@80: (goto-char e))) yuuji@80: (error nil))))) yuuji@80: yuuji@80: (defun YaTeX-19-region-math-sub (ptn) yuuji@80: "Return cons of _{...}" yuuji@80: (if (and (looking-at ptn) yuuji@80: (eq YaTeX-font-lock-formula-face yuuji@80: (get-text-property (point) 'face))) yuuji@80: (let ((e (match-end 0)) (p (point))) yuuji@80: (goto-char e) yuuji@80: (prog1 yuuji@80: (condition-case () yuuji@80: (if (looking-at "{") yuuji@80: (cons (1+ (point)) yuuji@80: (progn (forward-list 1) (1- (point)))) yuuji@80: (cons e yuuji@80: (cond yuuji@80: ((looking-at (concat YaTeX-ec-regexp yuuji@80: YaTeX-TeX-token-regexp)) yuuji@80: (match-end 0)) yuuji@80: ;; other case?? yuuji@80: (t (1+ (point))))))) yuuji@80: (goto-char e))))) yuuji@80: yuuji@53: ;; 些細なことだが % の前の文字もピカリとさせてしまうようで… >hilit19 yuuji@53: ;; ↓この関数は下の hilit-set-mode-patterns の "[^\\]\\(%\\).*$" に yuuji@53: ;; 依存している yuuji@53: (defun YaTeX-19-region-comment (pattern) yuuji@53: "Return list of comment start and end point." yuuji@53: (if (re-search-forward pattern nil t) yuuji@56: (cons (match-beginning 2) (match-end 0)))) yuuji@56: yuuji@80: ;; 2006/6/23 match only if it's in specified envrironment. yuuji@80: (defun YaTeX-19-re-search-in-env (ptn_env) yuuji@80: (catch 'done yuuji@80: ;; For font-lock, this function should find it. yuuji@80: (let (md r) yuuji@80: (while (YaTeX-re-search-active-forward yuuji@80: (car ptn_env) YaTeX-comment-prefix nil t) yuuji@80: (setq md (match-data) yuuji@80: r (string-match (cdr ptn_env) yuuji@80: (or (YaTeX-inner-environment 'quick) ""))) yuuji@80: (store-match-data md) yuuji@80: (if r (setq r (cons (match-beginning 0) (match-end 0)))) yuuji@80: (if (or YaTeX-use-hilit19 r) (throw 'done r)) yuuji@80: (goto-char (match-end 0))) yuuji@80: (throw 'done r)))) yuuji@80: yuuji@56: ;;(make-face 'tt) yuuji@56: ;;(set-face-font 'tt "-schumacher-clean-medium-r-normal--*-*-*-*-*-*-*-*") yuuji@56: ;;(hilit-translate 'tt "white") yuuji@53: yuuji@80: ;; font-lockの関数呼びパターンの場合は正規表現が行末までマッチすると yuuji@80: ;; hilit候補対象外にされてしまうので1字手前で正規表現を止める yuuji@53: (defvar YaTeX-hilit-patterns-alist yuuji@53: '( yuuji@80: ;; formulas yuuji@80: (YaTeX-19-region-math-sub "[^\\]^" YaTeX-font-lock-math-sup-face overwrite) yuuji@80: (YaTeX-19-region-math-sub "[^\\]_" YaTeX-font-lock-math-sub-face overwrite) yuuji@80: (YaTeX-19-region-env-type yuuji@80: "\\\\begin{\\(equation\\|eqnarray\\|displaymath\\|\\(x?x?\\|fl\\)align\\|multline\\|gather\\)" formula) yuuji@80: ;(YaTeX-19-region-paren-math "\\\\" formula) yuuji@80: ;;("[^\\]\\\\(" "\\\\)" formula) ; \( \) yuuji@80: ;;("[^\\]\\\\\\[" "\\\\\\]" formula) ; \[ \] yuuji@53: ;; comments yuuji@56: (YaTeX-19-region-comment "\\([^\\]\\|^\\)\\(%\\).*$" comment) yuuji@58: yuuji@64: (YaTeX-19-region-section-type "\\\\footnote\\(mark\\|text\\)?\\>" keyword) yuuji@53: ("\\\\[a-z]+box" 0 keyword) yuuji@64: (YaTeX-19-region-section-type "\\\\\\(v\\|h\\)space\\>" keyword) yuuji@58: yuuji@53: ;; (re-)define new commands/environments/counters yuuji@53: (YaTeX-19-region-section-type yuuji@64: "\\\\\\(re\\)?new\\(environment\\|command\\|theorem\\|length\\|counter\\)\\>" yuuji@60: defun) yuuji@53: (YaTeX-19-region-section-type yuuji@64: "\\\\textbf\\>" bold) yuuji@53: yuuji@53: ;; various declarations/definitions yuuji@53: (YaTeX-19-region-section-type yuuji@64: "\\\\\\(set\\|setto\\|addto\\)\\(length\\|width\\|counter\\)\\>" yuuji@53: define) yuuji@53: (YaTeX-19-region-section-type yuuji@64: "\\\\\\(title\\|author\\|date\\|thanks\\)\\>" define) yuuji@53: yuuji@59: ("\\\\document\\(style\\|class\\)\\(\\[.*\\]\\)?{" "}" decl) yuuji@73: yuuji@73: ("\\\\\\(begin\\|end\\|nofiles\\|includeonly\\|usepackage\\(\\[.*\\]\\)?\\){" "}" decl) yuuji@53: ("\\\\\\(raggedright\\|makeindex\\|makeglossary\\|maketitle\\)\\b" 0 decl) yuuji@53: ("\\\\\\(pagestyle\\|thispagestyle\\|pagenumbering\\){" "}" decl) yuuji@53: ("\\\\\\(normalsize\\|small\\|footnotesize\\|scriptsize\\|tiny\\|large\\|Large\\|LARGE\\|huge\\|Huge\\)\\b" 0 decl) yuuji@53: ("\\\\\\(appendix\\|tableofcontents\\|listoffigures\\|listoftables\\)\\b" yuuji@53: 0 decl) yuuji@53: ("\\\\\\(bf\\|em\\|it\\|rm\\|sf\\|sl\\|ss\\|tt\\)\\b" 0 decl) yuuji@53: yuuji@53: ;; label-like things yuuji@53: ;;this should be customized by YaTeX-item-regexp yuuji@53: ("\\\\\\(sub\\)*item\\b\\(\\[[^]]*\\]\\)?" 0 label) yuuji@53: (YaTeX-19-region-section-type yuuji@80: "\\\\\\(caption\\|bibitem\\)\\(\\[[^]]*\\]\\)?\\>" label) yuuji@53: yuuji@61: ;; things that do some sort of cross-reference yuuji@61: (YaTeX-19-region-section-type yuuji@80: "\\\\\\(\\(no\\|possessive\\)?cite[a-z]*\\|[a-z]*ref\\|label\\|index\\|glossary\\)\\>" yuuji@61: crossref) yuuji@61: yuuji@61: ;; things that bring in external files yuuji@80: ("\\\\\\(include\\|input\\|bibliography\\(style\\)?\\){" "}" include) yuuji@61: yuuji@80: ;; ("\\\\begin{\\(eqn\\|equation\\|x?x?align\\|split\\|multline\\|gather\\)" yuuji@80: ;; "\\\\end{\\(eqn\\|equation\\|x?x?align\\|split\\|multline\\|gather\\).*}" yuuji@80: ;; formula) yuuji@72: ("\\([^\\$]\\|^\\)\\($\\($[^$]*\\$\\|[^$]*\\)\\$\\)" 2 formula); '$...$' or '$$...$$' yuuji@53: yuuji@61: ;; "wysiwyg" emphasis -- these don't work on nested expressions yuuji@56: (YaTeX-19-region-large-type "{\\\\\\(em\\|it\\|sl\\)" italic) yuuji@53: (YaTeX-19-region-large-type "{\\\\bf" bold) yuuji@56: ;;;(YaTeX-19-region-large-type "{\\\\tt" tt) yuuji@56: ;;;("\\\\begin{verbatim" "\\\\end{verbatim" tt) yuuji@53: yuuji@80: ("``" "''" string) yuuji@80: ("\\\\\\(new\\|clear\\(double\\)?\\)page\\>\\|\\\\\\(\\\\\\|cr\\)\\>" yuuji@80: 0 delimiter) yuuji@86: ;; re-search-in-env seems to make it slow down. 2007/2/11 yuuji@86: ;;(YaTeX-19-re-search-in-env yuuji@86: ;; ("&\\|\\\\hline" . "tabular\\|equation\\|eqn\\|array\\|align") delimiter) yuuji@86: ;;(YaTeX-19-re-search-in-env ("\\\\[+-=><'`]" . "tabbing") delimiter) yuuji@86: ("&\\|\\\\hline\\|\\\\[+-=><'`]" 0 delimiter) yuuji@80: ) yuuji@72: "*Hiliting pattern alist for LaTeX text.") yuuji@53: yuuji@53: ;;(defvar YaTeX-hilit-pattern-adjustment-default nil) yuuji@53: ;; ↑いらなくなった。 yuuji@51: (defvar YaTeX-hilit-pattern-adjustment-private nil yuuji@53: "*Adjustment hilit-pattern-alist for default yatex-mode's pattern.") yuuji@46: (defvar YaTeX-hilit-sectioning-face yuuji@57: '(yellow/dodgerblue yellow/slateblue) yuuji@51: "*Hilightening face for sectioning unit. '(FaceForLight FaceForDark)") yuuji@57: (defvar YaTeX-hilit-sectioning-attenuation-rate yuuji@57: '(15 40) yuuji@57: "*Maximum attenuation rate of sectioning face. '(ForeRate BackRate) yuuji@57: Each rate specifies how much portion of RGB value should be attenuated yuuji@57: towards to lowest sectioning unit. Numbers should be written in percentage.") yuuji@52: (defvar YaTeX-sectioning-patterns-alist nil yuuji@52: "Hilightening patterns for sectioning units.") yuuji@47: (defvar YaTeX-hilit-singlecmd-face yuuji@72: '("slateblue2" . "aquamarine") yuuji@51: "*Hilightening face for maketitle type. '(FaceForLight FaceForDark)") yuuji@52: yuuji@52: ;;; セクションコマンドを、構造レベルの高さに応じて色の濃度を変える yuuji@52: ;;; 背景が黒でないと何が嬉しいのか分からないに違いない. yuuji@53: ;;; もしかして白地の時は構造レベルに応じて色を明るくしたほうが良いのか? yuuji@72: ;;; ...どうやらそうでもないらしい。これでいいみたい(2000/12)。 yuuji@60: ;(if (fboundp 'win32-color-values) yuuji@60: ; (fset 'x-color-values 'win32-color-values)) yuuji@60: yuuji@72: (defun YaTeX-19-create-face (sym fgcolor &optional bgcolor) yuuji@72: "Create face named SYM with face of FGCOLOR/BGCOLOR." yuuji@376: (if (consp fgcolor) yuuji@376: (setq fgcolor (if (eq YaTeX-background-mode 'light) yuuji@376: (car fgcolor) yuuji@376: (cdr fgcolor)))) yuuji@376: (if (consp bgcolor) yuuji@376: (setq bgcolor (if (eq YaTeX-background-mode 'light) yuuji@376: (car bgcolor) yuuji@376: (cdr bgcolor)))) yuuji@72: (cond yuuji@72: ((and YaTeX-use-font-lock (fboundp 'defface)) yuuji@72: (custom-declare-face yuuji@72: sym yuuji@72: (list yuuji@72: (list (list yuuji@72: '(class color) yuuji@72: ;(list 'background YaTeX-background-mode) yuuji@72: ) yuuji@72: (delq nil yuuji@72: (append yuuji@72: (list ':foreground fgcolor) yuuji@72: (if bgcolor yuuji@72: (list ':background bgcolor)) yuuji@72: )) yuuji@72: ) yuuji@72: (list t (list ':bold t ':underline t)) yuuji@72: ) yuuji@72: (format "Font lock face for %s" sym) yuuji@72: ':group 'font-lock-faces) yuuji@72: (set sym sym) yuuji@72: sym) yuuji@72: ((and YaTeX-use-hilit19 (and (fboundp 'hilit-translate))) yuuji@72: (let ((face (intern (concat fgcolor "/" bgcolor)))) yuuji@80: (if (facep sym) yuuji@80: (hilit-translate sym face) yuuji@80: (make-face sym) yuuji@80: (or (memq sym hilit-predefined-face-list) yuuji@80: (progn yuuji@80: (set-face-foreground sym fgcolor) yuuji@80: (set-face-background sym bgcolor) yuuji@80: (setq hilit-predefined-face-list yuuji@80: (cons sym hilit-predefined-face-list))))) yuuji@72: face)))) yuuji@72: yuuji@53: (cond yuuji@72: (YaTeX-use-highlighting yuuji@72: (cond yuuji@72: (window-system yuuji@72: (let*((sectface yuuji@72: (car (if (eq YaTeX-background-mode 'dark) yuuji@72: (cdr YaTeX-hilit-sectioning-face) yuuji@72: YaTeX-hilit-sectioning-face))) yuuji@72: (sectcol (symbol-name sectface)) yuuji@72: (fl YaTeX-use-font-lock) yuuji@72: (form (if fl "#%02x%02x%02x" "hex-%02x%02x%02x")) yuuji@72: sect-pat-alist) yuuji@72: (if (string-match "/" sectcol) yuuji@72: (let ((fmin (nth 0 YaTeX-hilit-sectioning-attenuation-rate)) yuuji@72: (bmin (nth 1 YaTeX-hilit-sectioning-attenuation-rate)) yuuji@72: colorvalue fR fG fB bR bG bB pat fg bg level from face list lm) yuuji@72: (require 'yatexsec) yuuji@72: (setq fg (substring sectcol 0 (string-match "/" sectcol)) yuuji@72: bg (substring sectcol (1+ (string-match "/" sectcol))) yuuji@72: colorvalue (x-color-values fg) yuuji@72: fR (/ (nth 0 colorvalue) 256) yuuji@72: fG (/ (nth 1 colorvalue) 256) yuuji@72: fB (/ (nth 2 colorvalue) 256) yuuji@72: colorvalue (x-color-values bg) yuuji@72: bR (/ (nth 0 colorvalue) 256) yuuji@72: bG (/ (nth 1 colorvalue) 256) yuuji@72: bB (/ (nth 2 colorvalue) 256) yuuji@72: lm YaTeX-sectioning-max-level yuuji@72: list YaTeX-sectioning-level) yuuji@72: (while list yuuji@72: (setq pat (concat YaTeX-ec-regexp (car (car list)) yuuji@72: ;;"\\*?\\(\\[[^]]*\\]\\)?\\>" ;改行はさむと駄目 yuuji@72: "\\>" yuuji@72: ) yuuji@72: level (cdr (car list)) yuuji@72: fg (format form yuuji@72: (- fR (/ (* level fR fmin) lm 100)) yuuji@72: (- fG (/ (* level fG fmin) lm 100)) yuuji@72: (- fB (/ (* level fB fmin) lm 100))) yuuji@72: bg (format form yuuji@72: (- bR (/ (* level bR bmin) lm 100)) yuuji@72: (- bG (/ (* level bG bmin) lm 100)) yuuji@72: (- bB (/ (* level bB bmin) lm 100))) yuuji@72: from (intern (format "YaTeX-sectioning-%d" level)) yuuji@72: ;;face (intern (concat fg "/" bg)) yuuji@72: ) yuuji@72: (setq face (YaTeX-19-create-face from fg bg)) yuuji@72: (setq sect-pat-alist yuuji@72: (cons;;(list pat "}" face) yuuji@72: (list 'YaTeX-19-region-section-type pat face) yuuji@72: sect-pat-alist)) yuuji@72: (setq list (cdr list))) yuuji@72: (setq YaTeX-sectioning-patterns-alist sect-pat-alist))))) yuuji@72: (t ;not window-system yuuji@72: (setq YaTeX-sectioning-patterns-alist yuuji@72: (list yuuji@72: (list yuuji@72: (concat YaTeX-ec-regexp yuuji@72: "\\(\\(sub\\)*\\(section\\|paragraph\\)\\|chapter" yuuji@72: "\\|part\\){[^}]*}") yuuji@72: 0 yuuji@72: 'define))))))) yuuji@52: yuuji@53: ;; ローカルなマクロを読み込んだ後 redraw すると yuuji@53: ;; ローカルマクロを keyword として光らせる(keywordじゃまずいかな…)。 yuuji@72: (defvar hilit-patterns-alist nil) ;for absence of hilit19 yuuji@72: yuuji@53: (defun YaTeX-19-collect-macros () yuuji@46: (cond yuuji@72: (YaTeX-use-highlighting yuuji@47: (let ((get-face yuuji@47: (function yuuji@47: (lambda (table) yuuji@47: (cond yuuji@72: ((eq YaTeX-background-mode 'light) (car table)) yuuji@72: ((eq YaTeX-background-mode 'dark) (cdr table)) yuuji@73: ;; Default case equals to 'light mode...is it OK? yuuji@73: (t (car table)))))) yuuji@73: sect single pattern-alist) yuuji@72: (YaTeX-19-create-face ;;hilit-translate yuuji@52: ;;sectioning (funcall get-face YaTeX-hilit-sectioning-face) yuuji@72: 'macro (funcall get-face YaTeX-hilit-singlecmd-face)) yuuji@57: (if (setq sect (append user-section-table tmp-section-table)) yuuji@57: (setq sect (concat "\\\\\\(" yuuji@57: (mapconcat yuuji@57: (function yuuji@57: (lambda (s) (regexp-quote (car s)))) yuuji@57: sect yuuji@57: "\\|") yuuji@64: "\\)\\>"))) yuuji@57: (if (setq single (append user-singlecmd-table tmp-singlecmd-table)) yuuji@57: (setq single (concat "\\\\\\(" yuuji@57: (mapconcat yuuji@57: (function (lambda (s) (regexp-quote (car s)))) yuuji@57: single yuuji@57: "\\|") yuuji@57: "\\)\\b"))) yuuji@73: (cons 'yatex-mode yuuji@73: (append yuuji@73: (list nil) yuuji@73: YaTeX-sectioning-patterns-alist yuuji@73: YaTeX-hilit-pattern-adjustment-private yuuji@73: ;;YaTeX-hilit-pattern-adjustment-default yuuji@73: YaTeX-hilit-patterns-alist yuuji@73: (delq nil yuuji@73: (list yuuji@73: (if sect (list yuuji@73: 'YaTeX-19-region-section-type yuuji@73: sect yuuji@73: 'keyword)) yuuji@73: (if single (list single 0 'macro)))))))))) yuuji@80: yuuji@80: ;;2006/6/23 new face, `delimiter' introduced yuuji@376: (YaTeX-19-create-face yuuji@376: 'delimiter '("saddlebrown" . "lightyellow") '("ivory". "navy")) yuuji@80: yuuji@53: ;;(YaTeX-19-collect-macros) ;causes an error yuuji@73: (defun YaTeX-hilit-setup-alist () yuuji@73: (cond yuuji@73: ((boundp 'hilit-patterns-alist) yuuji@73: (setq hilit-patterns-alist yuuji@73: (delq (assq 'yatex-mode hilit-patterns-alist) hilit-patterns-alist)) yuuji@73: (if YaTeX-use-hilit19 yuuji@73: (setq hilit-patterns-alist yuuji@73: (cons (YaTeX-19-collect-macros) hilit-patterns-alist)))))) yuuji@73: yuuji@46: (defun YaTeX-hilit-recenter (arg) yuuji@46: "Collect current local macro and hilit-recenter." yuuji@46: (interactive "P") yuuji@73: (YaTeX-hilit-setup-alist) yuuji@73: (if (fboundp 'font-lock-mode) (font-lock-mode -1)) yuuji@46: (hilit-recenter arg)) yuuji@72: yuuji@73: (let ((k (append (where-is-internal 'hilit-recenter) yuuji@73: (where-is-internal 'recenter)))) yuuji@73: (while k yuuji@73: (define-key YaTeX-mode-map (car k) 'YaTeX-19-recenter) yuuji@73: (setq k (cdr k)))) yuuji@73: yuuji@73: (defun YaTeX-19-recenter (&optional arg) yuuji@73: (interactive "P") yuuji@73: (if YaTeX-use-hilit19 yuuji@73: (YaTeX-hilit-recenter arg) yuuji@73: (YaTeX-font-lock-recenter arg))) yuuji@72: yuuji@72: (defun YaTeX-font-lock-recenter (&optional arg) yuuji@72: (interactive "P") yuuji@73: (cond yuuji@73: ((and (boundp 'hilit-patterns-alist) yuuji@73: (assq 'yatex-mode hilit-patterns-alist)) yuuji@73: (if (fboundp 'hilit-unhighlight-region) yuuji@73: (hilit-unhighlight-region (point-min) (point-max))) yuuji@73: (setq hilit-patterns-alist ;ensure to remove yuuji@73: (delq (assq 'yatex-mode hilit-patterns-alist) yuuji@73: hilit-patterns-alist)))) yuuji@72: (setq YaTeX-font-lock-keywords yuuji@72: (YaTeX-convert-pattern-hilit2fontlock yuuji@73: (cdr (YaTeX-19-collect-macros))) yuuji@80: ;;; Keep this section for debugging. yuuji@80: ;; YaTeX-font-lock-keywords yuuji@80: ;; (append (YaTeX-convert-pattern-hilit2fontlock yuuji@80: ;; (cdr (YaTeX-19-collect-macros))) yuuji@80: ;; '(((lambda (lim) yuuji@80: ;; (YaTeX-19-re-search-in-env '("foo" . "tabular")) yuuji@80: ;; ;(search-forward "foo" nil t) yuuji@80: ;; ) yuuji@80: ;; (0 YaTeX-font-lock-delimiter-face)))) yuuji@80: ;;font-lock-keywords nil yuuji@80: font-lock-set-defaults nil) yuuji@80: ;;(save-excursion yuuji@80: ;; (font-lock-fontify-region (window-start) (window-end)) yuuji@72: (font-lock-mode -1) ;is stupid, but sure. yuuji@73: (font-lock-mode 1) yuuji@73: (recenter arg)) yuuji@72: yuuji@80: (defun YaTeX-font-lock-fontify-region (beg end) yuuji@80: (interactive "r") yuuji@80: (save-excursion (font-lock-fontify-region beg end))) yuuji@80: yuuji@80: (defun YaTeX-font-lock-fontify-environment () yuuji@80: (interactive) yuuji@80: (save-excursion yuuji@80: (save-match-data ;is safe after emacs-19 yuuji@80: (YaTeX-mark-environment) yuuji@80: (message "") yuuji@80: (YaTeX-font-lock-fontify-region (region-beginning) (region-end))))) yuuji@80: yuuji@80: (defun YaTeX-font-lock-highlight-menu () yuuji@80: (interactive) yuuji@80: (message "Force Highlight: R)egion E)nvironment") yuuji@80: (let ((c (read-char))) yuuji@80: (cond yuuji@80: ((memq c '(?R ?r)) yuuji@80: (YaTeX-font-lock-fontify-region (region-beginning) (region-end))) yuuji@80: ((memq c '(?e ?e)) yuuji@80: (YaTeX-font-lock-fontify-environment))))) yuuji@80: yuuji@80: (if YaTeX-use-font-lock yuuji@80: (YaTeX-define-key "u" 'YaTeX-font-lock-highlight-menu)) yuuji@80: yuuji@72: (defvar YaTeX-font-lock-keywords nil yuuji@72: "Pattern-face alist of yahtml-mode for font-lock") yuuji@72: yuuji@72: (defun YaTeX-font-lock-set-default-keywords () yuuji@72: (put 'yatex-mode 'font-lock-defaults yuuji@72: (list 'YaTeX-font-lock-keywords nil nil)) yuuji@72: (setq YaTeX-font-lock-keywords yuuji@72: (YaTeX-convert-pattern-hilit2fontlock yuuji@72: (cons nil yuuji@72: (append YaTeX-sectioning-patterns-alist yuuji@72: YaTeX-hilit-pattern-adjustment-private yuuji@72: YaTeX-hilit-patterns-alist))))) yuuji@72: yuuji@72: (if YaTeX-use-font-lock yuuji@72: (progn yuuji@72: (if (and (boundp 'hilit-mode-enable-list) hilit-mode-enable-list) yuuji@72: ;;for those who use both hilit19 and font-lock yuuji@72: (if (eq (car hilit-mode-enable-list) 'not) yuuji@72: (or (member 'yatex-mode hilit-mode-enable-list) yuuji@72: (nconc hilit-mode-enable-list (list 'yatex-mode))) yuuji@72: (setq hilit-mode-enable-list yuuji@72: (delq 'yatex-mode hilit-mode-enable-list)))) yuuji@72: (YaTeX-font-lock-set-default-keywords))) yuuji@46: yuuji@53: (defun YaTeX-switch-to-new-window () yuuji@53: (let ((c 0) (i 1) (free (make-string win:max-configs ? ))) yuuji@53: (while (< i win:max-configs) yuuji@53: (or (aref win:configs i) (aset free i (+ i win:base-key))) yuuji@53: (setq i (1+ i))) yuuji@53: (while (not (string-match (char-to-string c) free)) yuuji@53: (message "Which window to create? [%s]: " free) yuuji@53: (setq c (read-char))) yuuji@53: (message "Creating window [%c]" c) yuuji@53: (set-buffer (get-buffer-create "*scratch*")) yuuji@53: (win:switch-window (- c win:base-key)))) yuuji@53: yuuji@53: (defun YaTeX-visit-main-other-frame () yuuji@53: "Visit main file in other frame. yuuji@53: WARNING, This code is not perfect." yuuji@53: (interactive) yuuji@53: (if (YaTeX-main-file-p) (message "I think this is main LaTeX source.") yuuji@53: (let (parent) yuuji@53: (save-excursion (YaTeX-visit-main t) (setq parent (current-buffer))) yuuji@53: (cond yuuji@53: ((get-buffer-window parent t) yuuji@53: (goto-buffer-window parent)) yuuji@53: ((and (featurep 'windows) win:use-frame) yuuji@53: (YaTeX-switch-to-new-window) yuuji@53: (switch-to-buffer parent)) yuuji@53: (t (switch-to-buffer-other-frame (buffer-name parent))))))) yuuji@53: yuuji@53: (defun YaTeX-goto-corresponding-*-other-frame (arg) yuuji@53: "Go to corresponding object in other frame." yuuji@53: (interactive "P") yuuji@53: (let (b p) yuuji@53: (save-window-excursion yuuji@53: (save-excursion yuuji@53: (YaTeX-goto-corresponding-* arg) yuuji@53: (setq b (current-buffer) p (point)))) yuuji@53: (cond yuuji@53: ((get-buffer-window b t) yuuji@53: (goto-buffer-window b) yuuji@53: (goto-char p)) yuuji@53: ((and (featurep 'windows) win:use-frame) yuuji@53: (YaTeX-switch-to-new-window) yuuji@53: (switch-to-buffer b) yuuji@53: (goto-char p)) yuuji@53: (t (switch-to-buffer-other-frame (buffer-name b)) yuuji@72: (goto-char p))))) yuuji@53: yuuji@49: ;;; reverseVideo にして hilit-background-mode を 'dark yuuji@49: ;;; にしている人は数式などが暗くなりすぎて見づらいかもしれない。 yuuji@49: ;;; 次のコードを hilit19 をロードしている場所の直後に置くとちょっ yuuji@49: ;;; とはまし。 yuuji@46: ;;; (if (eq hilit-background-mode 'dark) yuuji@46: ;;; (hilit-translate yuuji@46: ;;; string 'mediumspringgreen yuuji@46: ;;; formula 'khaki yuuji@46: ;;; label 'yellow-underlined)) yuuji@57: (and YaTeX-emacs-19 yuuji@64: (not (featurep 'xemacs)) yuuji@58: (boundp 'byte-compile-current-file) yuuji@72: byte-compile-current-file yuuji@72: (progn yuuji@72: (if YaTeX-emacs-20 (require 'font-lock)) yuuji@72: (if (and (boundp 'window-system) window-system) yuuji@72: (require 'hilit19) yuuji@72: (error "Byte compile this file on window system! Not `-nw'!")))) yuuji@46: yuuji@46: (provide 'yatex19) yuuji@72: yuuji@72: yuuji@72: ; Local variables: yuuji@72: ; fill-prefix: ";;; " yuuji@72: ; paragraph-start: "^$\\| \\|;;;$" yuuji@72: ; paragraph-separate: "^$\\| \\|;;;$" yuuji@72: ; End: