Mercurial > hgrepos > hgweb.cgi > yatex
diff yatexmth.el @ 11:390df0e505da
Label completion works.
author | yuuji |
---|---|
date | Mon, 20 Sep 1993 08:56:09 +0000 |
parents | |
children | eafae54794a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/yatexmth.el Mon Sep 20 08:56:09 1993 +0000 @@ -0,0 +1,388 @@ +;;; -*- Emacs-Lisp -*- +;;; YaTeX interface for math-mode. +;;; yatexmth.el rev.0 +;;; (C)1993 by HIROSE Yuuji [yuuji@ae.keio.ac.jp] +;;; Last modified Tue Aug 3 23:37:07 1993 on 98fa +;;; $Id$ + +(setq + YaTeX-math-key-alist-default + '( + ;frequently used + ("||" "|" ("||" "a")) + ("sum" "sum" ("\\-+\n >\n/-+" "")) + ("sigma" "sum" ("\\-+\n >\n/-+" "")) + ("integral" "int" " /\\\n \\\n\\/") + ("ointegral" "oint" " /\\\n(\\)\n\\/") + ("A" "forall" "|_|\nV") + ("E" "exists" "-+\n-+\n-+") + ("!" "neg" "--+\n |") + ("oo" "infty" ("oo" "")) + ("\\" "backslash" ("\\" "_")) + + ;;binary operators + ("+-" "pm" ("+\n-" "}")) + ("-+" "mp" "-\n+") + ("x" "times" ("x" "~")) + ("/" "div" (",\n-\n'" "")) + ("*" "ast" "*") + ("#" "star" ("_/\\_\n\\ /\n//\\\\" "")) + ("o" "circ" "o") + ("o*" "bullet" " _\n(*)\n ~") + ("." "cdot" ".") + ("cap" "cap" "/-\\\n| |") + ("cup" "cup" "| |\n\\-/") + ("u+" "uplus" "|+|\n\\-/") + ("|~|" "sqcap" "|~|") + ("|_|" "sqcup" "|_|") + ("v" "vee" "v") + ("^" "wedge" "^") + ("\\\\" "setminus" "\\") + (")(" "wr" " )\n(") + ("<>" "diamond" "<>") + ("/\-" "bigtriangleup" ("/\\\n~~" "")) + ("-\\/" "bigtriangledown" ("__\n\\/" "")) + ("<|" "triangleleft" "<|") + ("|>" "triangleright" "|>") + ("<||" "lhd" "/|\n\\|") + ("||>" "rhd" "|\\\n|/") + ("<|-" "unlhd" "<|\n~~") + ("|>-" "unrhd" "|>\n~~") + ("o+" "oplus" " _\n(+)\n ~") + ("o-" "ominus" " _\n(-)\n ~") + ("ox" "otimes" " _\n(x)\n ~") + ("o/" "oslash" " _\n(/)\n ~") + ("o." "odot" "(.)") + ("O" "bigcirc" "O") + ("t" "dagger" "+\n|") + ("tt" "ddagger" "+\n+\n|") + ("II" "amalg" "II") + ; : + ;;relational operators + ("<" "leq" ("<\n-" "")) + (">" "geq" (">\n-" "")) + ("-=" "equiv" "=\n-") + ("=-" "equiv" "=\n-") + ("---" "equiv" "=\n-") + ("(" "subset" " _\n(\n ~") + ("(-" "subseteq" " _\n(_\n~") + (")" "supset" "_\n )\n~") + (")-" "supseteq" "_\n_)\n~") + ("[" "sqsubset" "[") + ("[-" "sqsubseteq" "[\n~") + ("]" "sqsupset" "]") + ("]-" "sqsupseteq" "]\n~") + ("{" "in" "(-") + ("}" "ni" "-)") + ("|-" "vdash" "|-") + ("-|" "dashv" "-|") + ("~" "sim" "~(tild)") + ("~-" "simeq" "~\n-") + ("asymp" "asymp" "v\n^") + ("~~" "approx" "~\n~") + ("~=" "cong" "~\n=") + ("=/" "neq" ("=/=" "")) + (".=" "doteq" ".\n=") + ("o<" "propto" "o<") + ("|=" "models" "|=") + ("_|_" "perp" "_|_") + ("|" "mid" "|") + ("||" "parallel" "||") + ("bowtie" "bowtie" "|><|(wide)") + ("|><|" "join" "|><|") + ("\\_/" "smile" "\\_/") + ("/~\\" "frown" "/~~\\") + ("-<" "prec" ("-<" "")) + ("-<=" "preceq" ("-<\n-" "\n=")) + ("<<" "ll" ("<<" "s")) + ; : + ;;arrows + ("<-" "leftarrow" ("<-" "")) + ("<--" "longleftarrow" ("<-" "--")) + ("<=" "Leftarrow" "<=") + ("<==" "Longleftarrow" "<==") + ("->" "rightarrow" ("->" "")) + ("-->" "longrightarrow" ("-->" "--")) + ("==>" "Longrightarrow" "==>") + ("<->" "leftrightarrow" ("<->" "")) + ("<-->" "longleftrightarrow" ("<---->" "--")) + ("<=>" "leftrightarrow" "<=>") + ("<==>" "Longleftrightarrow" "<==>") + ("^|" "uparrow" ("^\n|" "")) + ("^||" "Uparrow" "/\\\n||") + ("\C-n" "downarrow" ("|\nv" "")) + ("^|" "uparrow" ("^\n|" "")) + ("|->" "mapsto" ("|->" "|")) + ("<-)" "hookleftarrow" (" ,\n<--+" " R\n<--/")) + ("/-" "leftharpoonup" "/\n~~~") + ("\\-" "leftharpoondown" "__\n\\") + ("-/" "rightharpoondown" "__\n/") + ("-\\" "rightharpoonup" "~~\n\\") + ;other marks + ("Z" "aleph" "|\\|") + ("|\\|" "aleph" "|\\|") + ("h-" "hbar" "_\nh") + ("i" "imath" "i") + ("j" "jmath" "j") + ("l" "ell" "l") + ("wp" "wp" "???") + ("R" "Re" ")R") + ("Im" "Im" "???") + ("mho" "mho" "~|_|~") + ("'" "prime" "'") + ("0" "emptyset" "0") + ("nabla" "nabla" "___\n\\\\/") + ("\\/" "surd" "-\\/") + ("surd" "surd" "-\\/") + ("top" "top" "T") + ("bot" "bot" "_|_") + ("b" "flat" "b") + ("LT" "natural" "|\nLT\n |") + ("6" "partial" " -+\n+-+\n+-+") + ("partial" "partial" " -+\n+-+\n+-+") + ("round" "partial" " -+\n+-+\n+-+") + ("[]" "box" "[]") + ("Diamond" "Diamond" "/\\\n\\/") + ("3" "triangle" "/\\\n~~") + ("C" "clubsuit" " o\no+o\n |") + ("D" "diamondsuit" "/\\\n\\/") + ("H" "heartsuit" "<^^>\n \\/") + ("S" "spadesuit" " /\\\n<++>\n /\\") + + )) + +(defvar YaTeX-math-key-alist-private nil + "*User definable key vs LaTeX-math-command alist.") + +(defvar YaTeX-math-quit-with-strict-match nil + "*T for quitting completion as soon as strict-match is found.") +(setq YaTeX-math-key-alist + (append YaTeX-math-key-alist-private YaTeX-math-key-alist-default)) + +(setq YaTeX-math-key-array + (let ((array (make-vector (length YaTeX-math-key-alist) "")) + (list YaTeX-math-key-alist) (i 0)) + (while list + (aset array i (car (car list))) + (setq i (1+ i) list (cdr list))) + array)) + +(defvar YaTeX-ec "\\" "Escape character of mark-up language.") +(setq YaTeX-math-indicator + "KEY\tLaTeX sequence\t\tsign") + +(defvar YaTeX-math-need-image t + "*T for displaying pseudo image momentarily.") +(defvar YaTeX-math-max-key 8) +(defvar YaTeX-math-max-seq + (* 8 (1+ (/ (length "\\longleftrightarrow") 8)))) +(defvar YaTeX-math-max-sign 5) +(defvar YaTeX-math-sign-width + (+ YaTeX-math-max-key YaTeX-math-max-seq YaTeX-math-max-sign)) +(defvar YaTeX-math-display-width + (* 8 (1+ (/ YaTeX-math-sign-width 8)))) +(defvar YaTeX-math-menu-map nil + "Keymap used in YaTeX mathematical sign menu mode." +) +(if YaTeX-math-menu-map nil + (setq YaTeX-math-menu-map (make-sparse-keymap)) + (define-key YaTeX-math-menu-map "n" 'next-line) + (define-key YaTeX-math-menu-map "p" 'previous-line) + (define-key YaTeX-math-menu-map "f" 'YaTeX-math-forward) + (define-key YaTeX-math-menu-map "b" 'YaTeX-math-backward) + (define-key YaTeX-math-menu-map "v" 'scroll-up) + (define-key YaTeX-math-menu-map " " 'scroll-up) + (define-key YaTeX-math-menu-map "c" 'scroll-up) + (define-key YaTeX-math-menu-map "V" 'scroll-down) + (define-key YaTeX-math-menu-map "r" 'scroll-down) + (define-key YaTeX-math-menu-map "\^h" 'scroll-down) + (define-key YaTeX-math-menu-map "<" 'beginning-of-buffer) + (define-key YaTeX-math-menu-map ">" 'end-of-buffer) + (define-key YaTeX-math-menu-map "\^m" 'exit-recursive-edit) + (define-key YaTeX-math-menu-map "q" 'abort-recursive-edit)) + +(defmacro YaTeX-math-japanese-sign (list) + (list 'nth 1 list)) + +(defvar YaTeX-math-cmd-regexp (concat (regexp-quote YaTeX-ec) "[A-z]")) + +(defun YaTeX-math-forward (arg) + (interactive "p") + (re-search-forward YaTeX-math-cmd-regexp nil t arg)) + +(defun YaTeX-math-backward (arg) + (interactive "p") + (re-search-backward YaTeX-math-cmd-regexp nil t arg)) + +(defun YaTeX-math-get-sign (list) + (let ((sign (car (cdr (cdr list))))) + (if (listp sign) + (setq sign (cond + (YaTeX-japan (YaTeX-math-japanese-sign sign)) + (t (car sign))))) + sign) +) + +(defun YaTeX-math-display-list (list cols) + (goto-char (point-max)) + (if (= cols 0) (if (not (eolp)) (newline 1)) + (forward-line -1) + (while (looking-at "[ \t\n]") (forward-line -1))) + (end-of-line) + (let ((indent (* YaTeX-math-display-width cols)) sign str to) + (indent-to indent) + (insert (car list)) + (indent-to (setq indent (+ indent YaTeX-math-max-key))) + (insert "\\" (car (cdr list))) + (setq indent (+ indent YaTeX-math-max-seq)) + (setq sign (YaTeX-math-get-sign list)) + (while (not (string= "" sign)) + (setq to (string-match "\n" sign) + str (if to (substring sign 0 to) sign)) + (end-of-line) + (indent-to indent) + (insert str) + (cond ((eobp) (newline 1)) + ((> cols 0) (forward-line 1))) + (setq sign (if to (substring sign (1+ to)) ""))))) + +(defvar YaTeX-math-menu-buffer "*math-mode-signs*") + +(defun YaTeX-math-show-menu (match-str) + (save-window-excursion + (pop-to-buffer YaTeX-math-menu-buffer) + (let ((maxcols (max 1 (/ (screen-width) YaTeX-math-sign-width))) + (case-fold-search nil) + (cols 0) (list YaTeX-math-key-alist) command) + (erase-buffer) + (insert YaTeX-math-indicator "\t") + (insert YaTeX-math-indicator) + (newline 1) + (insert-char ?- (1- (screen-width))) + (newline 1) + (while list + (if (string-match match-str (car (car list))) + (progn (YaTeX-math-display-list (car list) cols) + (setq cols (% (1+ cols) maxcols)))) + (setq list (cdr list))) + (goto-char (point-min)) + (use-local-map YaTeX-math-menu-map) + (unwind-protect + (recursive-edit) + (skip-chars-backward "^ \t\n") + (setq command + (if (re-search-forward YaTeX-math-cmd-regexp nil t) + (buffer-substring + (match-beginning 0) + (prog2 (skip-chars-forward "^ \t\n") (point))) + nil)) + (kill-buffer YaTeX-math-menu-buffer)) + command)) +) + +; +(defun YaTeX-math-show-image (image &optional exit-char) + "Momentarily display IMAGE at the beginning of the next line; +erase it on the next keystroke. The window is recentered if necessary +to make the whole string visible. If the window isn't large enough, +at least you get to read the beginning." + (let ((buffer-read-only nil) + (modified (buffer-modified-p)) + (name buffer-file-name) + insert-start + insert-end) + (unwind-protect + (progn + (save-excursion + ;; defeat file locking... don't try this at home, kids! + (setq buffer-file-name nil) + (forward-line 1) + (setq insert-start (point)) + (if (eobp) (newline)) + (insert image) + (setq insert-end (point))) + ; make sure the whole string is visible + (if (not (pos-visible-in-window-p insert-end)) + (recenter (max 0 + (- (window-height) + (count-lines insert-start insert-end) + 2)))) + (let ((char (read-char))) + (or (eq char exit-char) + (setq unread-command-char char)))) + (if insert-end + (save-excursion + (delete-region insert-start insert-end))) + (setq buffer-file-name name) + (set-buffer-modified-p modified)))) + +(defun YaTeX-math-insert-sequence () + (interactive) + (let ((key "") regkey str last-char list i + (case-fold-search nil) match + (n (length YaTeX-math-key-array)) (beg (point)) result) + (setq result + (catch 'complete + (while t + (setq last-char (read-char) + key (concat key (char-to-string last-char)) + regkey (concat "^" (regexp-quote key)) i 0) + (cond + ((string= key YaTeX-math-invoke-key) ;;invoke key itself + (throw 'complete 'escape)) + ((string-match "[\C-g\C-c]" key) (throw 'complete 'abort)) + ((string-match "[\n\r]" key) (throw 'complete 'menu))) + (if + (catch 'found + ;;(1)input string strictly matches with alist + (setq single-command (car (cdr match)) + ;;remember previous match + match (assoc key YaTeX-math-key-alist)) + ;;(2)search partial match into alist + (while (< i n) + (if (string-match + regkey (aref YaTeX-math-key-array i)) + (progn + (or match + (setq match (nth i YaTeX-math-key-alist))) + (throw 'found t))) + (setq i (1+ i)))) ;catch 'found + nil ;;if any match, continue reading + ;;else reading of sequence has been done. + (message "complete.") + (throw 'complete t) + ) + (if match + (progn (delete-region beg (point)) + (insert YaTeX-ec (car (cdr match))) + (if YaTeX-math-need-image + (YaTeX-math-show-image + (concat (YaTeX-math-get-sign match) "\n"))) + ) + nil) + ))) + (cond + ((eq result t) + (setq YaTeX-current-completion-type 'maketitle) + (if t nil + (delete-region beg (point)) + (setq single-command (car (cdr match))) + ;;(recursive-edit) + (insert YaTeX-ec single-command) + ) + (sit-for 1) + (setq unread-command-char last-char) + (insert (YaTeX-addin single-command))) + ((eq result 'abort) + (delete-region beg (point)) + (message "Abort.")) + ((eq result 'escape) + (delete-region beg (point)) + (insert YaTeX-math-invoke-key)) + ((eq result 'menu) + (delete-region beg (point)) + (setq key (concat "^" (regexp-quote (substring key 0 -1)))) + (insert (YaTeX-math-show-menu key))))) +) +;; +(provide 'yatexmth)