yatex

view yatex19.el @ 53:5f4b18da14b3

Fix functions relating YaTeX-beginning-of-environment or YaTeX-end-of-environment. Line indentation by TAB much improved. Functions that work at enclosing environments, YaTeX-enclose-<ENVNAME>, introduced. Functions for enclosing verbatim and equations are supplied. SPC, DEL, +, - in YaTeX-hierarchy buffer. Compensate odd highlighting of hilit19.
author yuuji
date Thu, 02 Feb 1995 17:18:29 +0000
parents 5d94deabb9f9
children a9653fbd1c1c
line source
1 ;;; -*- Emacs-Lisp -*-
2 ;;; YaTeX facilities for Emacs 19
3 ;;; (c )1994-1995 by HIROSE Yuuji.[yuuji@ae.keio.ac.jp]
4 ;;; Last modified Thu Feb 2 23:44:30 1995 on figaro
5 ;;; $Id$
7 ;;; とりあえず hilit19 を使っている時に色が付くようにして
8 ;;; メニューバーでごにょごにょできるようにしただけ。
9 ;;; いったい誰がメニューバー使ってLaTeXソース書くんだろうか?
10 ;;; まあいいや練習練習。後ろの方にちょっとコメントあり。
11 ;;; 真中辺にあるけど、hilit19.el 対応の方は結構本気。
13 (require 'yatex)
15 (defun YaTeX-19-define-sub-menu (map vec &rest bindings)
16 "Define sub-menu-item in MAP at vector VEC as BINDINGS.
17 BINDINGS is a form with optional length: (symbol title binding).
18 When you defined menu-bar keymap such like:
19 (define-key foo-map [menu-bar foo] (make-sparse-keymap \"foo menu\"))
20 and you want to define sub menu for `foo menu' as followings.
21 foo -> menu1 (calling function `func1')
22 menu2 (doing interactive call `(func2 ...)'
23 Call this function like this:
24 (YaTeX-19-define-sub-menu foo-map [menu-bar foo]
25 '(m1 \"Function 1\" func1)
26 '(m2 \"Function 2\" (lambda () (interactive) (func2 ...))))
27 where
28 `m1' and `m2' are the keymap symbol for sub-menu of `[menu-bar foo].
29 `Funtion 1' and `Function 2' are the title strings for sub-menu.
30 "
31 (let ((i 0) (vec2 (make-vector (1+ (length vec)) nil)))
32 (while (< i (length vec))
33 (aset vec2 i (aref vec i))
34 (setq i (1+ i)))
35 (setq bindings (reverse bindings))
36 (mapcar
37 (function
38 (lambda (bind)
39 (aset vec2 (1- (length vec2)) (car bind)) ;set menu-symbol
40 (define-key map vec2
41 (cons (car (cdr bind))
42 (car (cdr (cdr bind)))))))
43 bindings)))
45 ;; Menu for Typeset relating processes ----------------------------------------
46 (define-key YaTeX-mode-map [menu-bar yatex]
47 (cons "YaTeX" (make-sparse-keymap "YaTeX")))
48 (define-key YaTeX-mode-map [menu-bar yatex process]
49 (cons "Process" (make-sparse-keymap "Process")))
50 (YaTeX-19-define-sub-menu
51 YaTeX-mode-map [menu-bar yatex process]
52 '(buffer "LaTeX" (lambda () (interactive) (YaTeX-typeset-menu nil ?j)))
53 '(kill "Kill LaTeX" (lambda () (interactive) (YaTeX-typeset-menu nil ?k)))
54 '(bibtex "BibTeX" (lambda () (interactive) (YaTeX-typeset-menu nil ?b)))
55 '(makeindex "makeindex" (lambda () (interactive) (YaTeX-typeset-menu nil ?i)))
56 '(preview "Preview" (lambda () (interactive) (YaTeX-typeset-menu nil ?p)))
57 '(lpr "lpr" (lambda () (interactive) (YaTeX-typeset-menu nil ?l)))
58 '(lpq "lpq" (lambda () (interactive) (YaTeX-typeset-menu nil ?q)))
59 )
61 ;; Help for LaTeX ------------------------------------------------------------
62 (YaTeX-19-define-sub-menu
63 YaTeX-mode-map [menu-bar yatex]
64 '(sephelp "--")
65 '(help "Help on LaTeX commands" YaTeX-help)
66 '(apropos "Apropos on LaTeX commands" YaTeX-apropos))
68 ;; Switch modes --------------------------------------------------------------
69 (define-key YaTeX-mode-map [menu-bar yatex switch]
70 (cons "Switching YaTeX's modes" (make-sparse-keymap "modes")))
71 (or YaTeX-auto-math-mode
72 (define-key YaTeX-mode-map [menu-bar yatex switch math]
73 '("Toggle math mode" . (lambda () (interactive)
74 (YaTeX-switch-mode-menu nil ?t)))))
75 (define-key YaTeX-mode-map [menu-bar yatex switch mod]
76 '("Toggle modify mode" . (lambda () (interactive)
77 (YaTeX-switch-mode-menu nil ?m))))
79 ;; % menu --------------------------------------------------------------------
80 (define-key YaTeX-mode-map [menu-bar yatex percent]
81 (cons "Edit %# notation" (make-sparse-keymap "Edit %# notation")))
82 (YaTeX-19-define-sub-menu
83 YaTeX-mode-map [menu-bar yatex percent]
84 '(! "Change LaTeX typesetter(%#!)"
85 (lambda () (interactive) (YaTeX-%-menu nil nil ?!)))
86 '(begend "Set %#BEGIN-%#END on region"
87 (lambda () (interactive) (YaTeX-%-menu nil nil ?b)))
88 '(lpr "Change LPR format"
89 (lambda () (interactive) (YaTeX-%-menu nil nil ?l))))
91 ;; What position -------------------------------------------------------------
92 (YaTeX-19-define-sub-menu
93 YaTeX-mode-map [menu-bar yatex]
94 '(what "What column in tabular" YaTeX-what-column))
96 ;; Document hierarchy ------------------------------------------------------
97 (YaTeX-19-define-sub-menu
98 YaTeX-mode-map [menu-bar yatex]
99 '(hier "Display document hierarchy" YaTeX-display-hierarchy-directly))
101 ;; Jump cursor ---------------------------------------------------------------
102 (define-key YaTeX-mode-map [menu-bar yatex jump]
103 (cons "Jump cursor"
104 (make-sparse-keymap "Jump cursor")))
105 (YaTeX-19-define-sub-menu
106 YaTeX-mode-map [menu-bar yatex jump]
107 '(corres "Goto corersponding position" YaTeX-goto-corresponding-*)
108 '(main "Visit main source" (lambda () (interactive) (YaTeX-visit-main)))
109 '(main-other "Visit main source other window" YaTeX-visit-main-other-window)
110 )
112 ;; ===========================================================================
113 (define-key YaTeX-mode-map [menu-bar yatex sepcom]
114 '("---" . nil))
116 ;; Comment/Uncomment ---------------------------------------------------------
117 (YaTeX-19-define-sub-menu
118 YaTeX-mode-map [menu-bar yatex]
119 '(comment "Comment region or environment" YaTeX-comment-region)
120 '(uncomment "Unomment region or environment" YaTeX-uncomment-region)
121 '(commentp "Comment paragraph" YaTeX-comment-paragraph)
122 '(uncommentp "Uncomment paragraph" YaTeX-uncomment-paragraph)
123 '(sepcom "--" nil)
124 )
127 ;; ===========================================================================
128 ;; Change/Kill/Fill
129 (YaTeX-19-define-sub-menu
130 YaTeX-mode-map [menu-bar yatex]
131 '(change "Change macros" YaTeX-change-*)
132 '(kill "Kill macros" YaTeX-kill-*)
133 '(fillitem "Fill \\item" YaTeX-fill-item)
134 '(newline "Newline" YaTeX-intelligent-newline)
135 '(sepchg "--" nil)
136 )
138 ;; Menu for completions ------------------------------------------------------
141 ;;;(YaTeX-19-define-sub-menu
142 ;;; YaTeX-mode-map [menu-bar yatex]
143 ;;; '(secr "Section-type command on region" YaTeX-make-section-region)
144 ;;; '(sec "Section-type command" YaTeX-make-section))
146 (define-key YaTeX-mode-map [menu-bar yatex sectionr]
147 (cons "Section-type region(long name)"
148 (make-sparse-keymap "Enclose region with section-type macro")))
149 (define-key YaTeX-mode-map [menu-bar yatex section]
150 (cons "Section-type(long name)"
151 (make-sparse-keymap "Section-type macro")))
152 (let ((sorted-section
153 (sort
154 (delq nil
155 (mapcar (function (lambda (s)
156 (if (> (length (car s)) 5)
157 (car s))))
158 (append section-table user-section-table)))
159 'string<)))
160 (apply 'YaTeX-19-define-sub-menu
161 YaTeX-mode-map [menu-bar yatex section]
162 (mapcar (function (lambda (secname)
163 (list (intern secname) secname
164 (list 'lambda ()
165 (list 'interactive)
166 (list 'YaTeX-make-section
167 nil nil nil secname)))))
168 sorted-section))
169 (apply 'YaTeX-19-define-sub-menu
170 YaTeX-mode-map [menu-bar yatex sectionr]
171 (mapcar (function (lambda (secname)
172 (list (intern secname) secname
173 (list 'lambda ()
174 (list 'interactive)
175 (list 'YaTeX-make-section
176 nil
177 (list 'region-beginning)
178 (list 'region-end)
179 secname)))))
180 sorted-section)))
182 (define-key YaTeX-mode-map [menu-bar yatex envr]
183 (cons "Environment region" (make-sparse-keymap "Environment region")))
184 (define-key YaTeX-mode-map [menu-bar yatex env]
185 (cons "Environment" (make-sparse-keymap "Environment")))
186 (let (prev envname)
187 (mapcar
188 (function
189 (lambda (envalist)
190 (setq envname (car envalist))
191 (define-key-after
192 (lookup-key YaTeX-mode-map [menu-bar yatex env])
193 (vector (intern envname))
194 (cons envname
195 (list 'lambda () (list 'interactive)
196 (list 'YaTeX-insert-begin-end
197 envname nil)))
198 prev)
199 (define-key-after
200 (lookup-key YaTeX-mode-map [menu-bar yatex envr])
201 (vector (intern envname))
202 (cons envname
203 (list 'lambda () (list 'interactive)
204 (list 'YaTeX-insert-begin-end
205 envname t)))
206 prev)
207 (setq prev (intern envname))))
208 (sort (append env-table user-env-table)
209 '(lambda (x y) (string< (car x) (car y))))))
211 ;; Other key bindings for window-system
212 ;(YaTeX-define-key [?\C- ] 'YaTeX-do-completion)
213 (define-key YaTeX-mode-map [?\M-\C- ] 'YaTeX-mark-environment)
215 ;; Highlightening
216 ;; メニューに比べてこっちは結構本気でやってます。
217 ;; だって文書構造がとっても分かり易いんだもん。
218 ;; みんなも hilit19.el を使おう!
219 ;;
220 ;; さて、まずは対応する {} をピカピカ範囲とするような関数を作る。
221 ;; これは hilit-LaTeX.el を参考にした。でも、ちゃんと section 型コマンドの
222 ;; 引数を数えて正しい位置までピカピカさせるよ〜ん!
224 (defun YaTeX-19-region-section-type (pattern)
225 "Return list of starting and end point of section-type commands of PATTERN."
226 (if (re-search-forward pattern nil t)
227 (let ((m0 (match-beginning 0)) cmd (argc 1))
228 (setq cmd (substring (YaTeX-match-string 0) 1 -1)
229 argc (or (car (cdr (YaTeX-lookup-table cmd 'section))) argc))
230 (cons m0
231 (progn (skip-chars-backward "^{") (forward-char -2)
232 (while (> argc 0)
233 (skip-chars-forward "^{")
234 (forward-list 1)
235 (setq argc (1- argc)))
236 (point))))))
238 (defun YaTeX-19-region-large-type (pattern)
239 "Return list of large-type contents.
240 Assumes PATTERN begins with `{'."
241 (if (re-search-forward pattern nil t)
242 (let ((m0 (match-beginning 0)))
243 (goto-char m0)
244 (skip-chars-forward "^ \t\n")
245 (skip-chars-forward " \t\n")
246 (cons (point)
247 (progn (goto-char m0) (forward-list 1)
248 (1- (point)))))))
250 ;; 些細なことだが % の前の文字もピカリとさせてしまうようで… >hilit19
251 ;; ↓この関数は下の hilit-set-mode-patterns の "[^\\]\\(%\\).*$" に
252 ;; 依存している
253 (defun YaTeX-19-region-comment (pattern)
254 "Return list of comment start and end point."
255 (if (re-search-forward pattern nil t)
256 (cons (match-beginning 1) (match-end 0))))
258 (defvar YaTeX-hilit-patterns-alist
259 '(
260 ;; comments
261 (YaTeX-19-region-comment "[^\\]\\(%\\).*$" comment)
263 (YaTeX-19-region-section-type "\\\\footnote\\(mark\\|text\\)?{" keyword)
264 ("\\\\[a-z]+box" 0 keyword)
265 (YaTeX-19-region-section-type "\\\\\\(v\\|h\\)space\\(\*\\)?{" keyword)
267 ;; (re-)define new commands/environments/counters
268 (YaTeX-19-region-section-type
269 "\\\\\\(re\\)?new\\(environment\\|command\\|theorem\\){" defun)
270 (YaTeX-19-region-section-type
271 "\\\\\\(re\\)?new\\(length\\|counter\\){" define)
273 ;; various declarations/definitions
274 (YaTeX-19-region-section-type
275 "\\\\\\(set\\|setto\\|addto\\)\\(length\\|width\\|counter\\){"
276 define)
277 (YaTeX-19-region-section-type
278 "\\\\\\(title\\|author\\|date\\|thanks\\){" define)
280 ("\\\\documentstyle\\(\\[.*\\]\\)?{" "}" decl)
281 ("\\\\\\(begin\\|end\\|nofiles\\|includeonly\\){" "}" decl)
282 ("\\\\\\(raggedright\\|makeindex\\|makeglossary\\|maketitle\\)\\b" 0 decl)
283 ("\\\\\\(pagestyle\\|thispagestyle\\|pagenumbering\\){" "}" decl)
284 ("\\\\\\(normalsize\\|small\\|footnotesize\\|scriptsize\\|tiny\\|large\\|Large\\|LARGE\\|huge\\|Huge\\)\\b" 0 decl)
285 ("\\\\\\(appendix\\|tableofcontents\\|listoffigures\\|listoftables\\)\\b"
286 0 decl)
287 ("\\\\\\(bf\\|em\\|it\\|rm\\|sf\\|sl\\|ss\\|tt\\)\\b" 0 decl)
289 ;; label-like things
290 ;;this should be customized by YaTeX-item-regexp
291 ("\\\\\\(sub\\)*item\\b\\(\\[[^]]*\\]\\)?" 0 label)
292 (YaTeX-19-region-section-type
293 "\\\\caption\\(\\[[^]]*\\]\\)?{" label)
295 ;; formulas
296 ("[^\\]\\\\(" "\\\\)" formula) ; \( \)
297 ("[^\\]\\\\\\[" "\\\\\\]" formula) ; \[ \]
298 ("\\\\begin{\\(eqn\\|equation\\)" "\\\\end{\\(eqn\\|equation\\)" formula)
299 ("[^\\$]\\($\\($[^$]*\\$\\|[^$]*\\)\\$\\)" 1 formula) ; '$...$' or '$$...$$'
301 ;; things that bring in external files
302 ("\\\\\\(include\\|input\\|bibliography\\){" "}" include)
304 ;; "wysiwyg" emphasis -- these don't work with nested expressions
305 ;; ("{\\\\\\(em\\|it\\|sl\\)" "}" italic)
306 (YaTeX-19-region-large-type "{\\\\bf" bold)
308 ("``" "''" string)
310 ;; things that do some sort of cross-reference
311 (YaTeX-19-region-section-type
312 "\\\\\\(\\(no\\)?cite\\|\\(page\\)?ref\\|label\\|index\\|glossary\\){"
313 crossref)
314 )
315 "*Hiliting pattern alist for LaTeX text.")
317 ;;(defvar YaTeX-hilit-pattern-adjustment-default nil)
318 ;; ↑いらなくなった。
319 (defvar YaTeX-hilit-pattern-adjustment-private nil
320 "*Adjustment hilit-pattern-alist for default yatex-mode's pattern.")
321 (defvar YaTeX-hilit-sectioning-face
322 '(yellow/dodgerblue yellow/cornflowerblue)
323 "*Hilightening face for sectioning unit. '(FaceForLight FaceForDark)")
324 (defvar YaTeX-sectioning-patterns-alist nil
325 "Hilightening patterns for sectioning units.")
326 (defvar YaTeX-hilit-singlecmd-face
327 '(slateblue2 aquamarine)
328 "*Hilightening face for maketitle type. '(FaceForLight FaceForDark)")
330 ;;; セクションコマンドを、構造レベルの高さに応じて色の濃度を変える
331 ;;; 背景が黒でないと何が嬉しいのか分からないに違いない.
332 ;;; もしかして白地の時は構造レベルに応じて色を明るくしたほうが良いのか?
333 (cond
334 ((and (featurep 'hilit19) (fboundp 'x-color-values))
335 (let*((sectface
336 (car (if (eq hilit-background-mode 'dark)
337 (cdr YaTeX-hilit-sectioning-face)
338 YaTeX-hilit-sectioning-face)))
339 (sectcol (symbol-name sectface))
340 sect-pat-alist)
341 (if (string-match "/" sectcol)
342 (let (colorvalue fR fG fB bR bG bB list pat fg bg level from face)
343 (require 'yatexsec)
344 (setq fg (substring sectcol 0 (string-match "/" sectcol))
345 bg (substring sectcol (1+ (string-match "/" sectcol)))
346 colorvalue (x-color-values fg)
347 fR (/ (nth 0 colorvalue) 256)
348 fG (/ (nth 1 colorvalue) 256)
349 fB (/ (nth 2 colorvalue) 256)
350 colorvalue (x-color-values bg)
351 bR (/ (nth 0 colorvalue) 256)
352 bG (/ (nth 1 colorvalue) 256)
353 bB (/ (nth 2 colorvalue) 256)
354 list YaTeX-sectioning-level)
355 (while list
356 (setq pat (concat YaTeX-ec-regexp (car (car list)) "\\*?{")
357 level (cdr (car list))
358 fg (format "hex-%02x%02x%02x"
359 (- fR (/ (* level fR) 40)) ;40 musn't be constant
360 (- fG (/ (* level fG) 40))
361 (- fB (/ (* level fB) 40)))
362 bg (format "hex-%02x%02x%02x"
363 (- bR (/ (* level bR) 15)) ;20 musn't be constant
364 (- bG (/ (* level bG) 15))
365 (- bB (/ (* level bB) 15)))
366 from (intern (format "sectioning-%d" level))
367 face (intern (concat fg "/" bg)))
368 (hilit-translate from face)
369 (setq sect-pat-alist
370 (cons;;(list pat "}" face)
371 (list 'YaTeX-19-region-section-type pat face)
372 sect-pat-alist))
373 (setq list (cdr list)))
374 (setq YaTeX-sectioning-patterns-alist sect-pat-alist))))))
376 ;; ローカルなマクロを読み込んだ後 redraw すると
377 ;; ローカルマクロを keyword として光らせる(keywordじゃまずいかな…)。
378 (defun YaTeX-19-collect-macros ()
379 (cond
380 ((and (featurep 'hilit19) (fboundp 'hilit-translate))
381 (let ((get-face
382 (function
383 (lambda (table)
384 (cond
385 ((eq hilit-background-mode 'light) (car table))
386 ((eq hilit-background-mode 'dark) (car (cdr table)))
387 (t nil))))))
388 (hilit-translate
389 ;;sectioning (funcall get-face YaTeX-hilit-sectioning-face)
390 macro (funcall get-face YaTeX-hilit-singlecmd-face)))
391 (setq hilit-patterns-alist ;Remove at first.
392 (delq 'yatex-mode hilit-patterns-alist)
393 hilit-patterns-alist
394 (cons
395 (cons 'yatex-mode
396 (append
397 YaTeX-sectioning-patterns-alist
398 YaTeX-hilit-pattern-adjustment-private
399 ;;YaTeX-hilit-pattern-adjustment-default
400 YaTeX-hilit-patterns-alist
401 (list
402 (list
403 'YaTeX-19-region-section-type
404 (concat "\\\\\\("
405 (mapconcat
406 (function (lambda (s) (regexp-quote (car s))))
407 (append user-section-table tmp-section-table)
408 "\\|")
409 "\\){")
410 'keyword)
411 (list
412 (concat "\\\\\\("
413 (mapconcat
414 (function (lambda (s) (regexp-quote (car s))))
415 (append user-singlecmd-table tmp-singlecmd-table)
416 "\\|")
417 "\\)\\b")
418 0 'macro))))
419 hilit-patterns-alist)))))
420 ;;(YaTeX-19-collect-macros) ;causes an error
421 (defun YaTeX-hilit-recenter (arg)
422 "Collect current local macro and hilit-recenter."
423 (interactive "P")
424 (YaTeX-19-collect-macros)
425 (hilit-recenter arg))
426 (if (fboundp 'hilit-recenter) ;Replace hilit-recenter with
427 (mapcar (function (lambda (key) ;YaTeX-hilit-recenter in yatex-mode
428 (define-key YaTeX-mode-map key 'YaTeX-hilit-recenter)))
429 (where-is-internal 'hilit-recenter)))
431 (defun YaTeX-switch-to-new-window ()
432 (let ((c 0) (i 1) (free (make-string win:max-configs ? )))
433 (while (< i win:max-configs)
434 (or (aref win:configs i) (aset free i (+ i win:base-key)))
435 (setq i (1+ i)))
436 (while (not (string-match (char-to-string c) free))
437 (message "Which window to create? [%s]: " free)
438 (setq c (read-char)))
439 (message "Creating window [%c]" c)
440 (set-buffer (get-buffer-create "*scratch*"))
441 (win:switch-window (- c win:base-key))))
443 (defun YaTeX-visit-main-other-frame ()
444 "Visit main file in other frame.
445 WARNING, This code is not perfect."
446 (interactive)
447 (if (YaTeX-main-file-p) (message "I think this is main LaTeX source.")
448 (let (parent)
449 (save-excursion (YaTeX-visit-main t) (setq parent (current-buffer)))
450 (cond
451 ((get-buffer-window parent t)
452 (goto-buffer-window parent))
453 ((and (featurep 'windows) win:use-frame)
454 (YaTeX-switch-to-new-window)
455 (switch-to-buffer parent))
456 (t (switch-to-buffer-other-frame (buffer-name parent)))))))
458 (defun YaTeX-goto-corresponding-*-other-frame (arg)
459 "Go to corresponding object in other frame."
460 (interactive "P")
461 (let (b p)
462 (save-window-excursion
463 (save-excursion
464 (YaTeX-goto-corresponding-* arg)
465 (setq b (current-buffer) p (point))))
466 (cond
467 ((get-buffer-window b t)
468 (goto-buffer-window b)
469 (goto-char p))
470 ((and (featurep 'windows) win:use-frame)
471 (YaTeX-switch-to-new-window)
472 (switch-to-buffer b)
473 (goto-char p))
474 (t (switch-to-buffer-other-frame (buffer-name b))
475 (goto-char p))))
476 )
478 ;;; reverseVideo にして hilit-background-mode を 'dark
479 ;;; にしている人は数式などが暗くなりすぎて見づらいかもしれない。
480 ;;; 次のコードを hilit19 をロードしている場所の直後に置くとちょっ
481 ;;; とはまし。
482 ;;; (if (eq hilit-background-mode 'dark)
483 ;;; (hilit-translate
484 ;;; string 'mediumspringgreen
485 ;;; formula 'khaki
486 ;;; label 'yellow-underlined))
488 (provide 'yatex19)