yatex

annotate yatexmth.el @ 45:b0fc9c2950cd

Prepare for supporting Emacs-19.
author yuuji
date Sun, 24 Jul 1994 15:07:23 +0000
parents b00c74813e56
children d7e7b4654058
rev   line source
yuuji@11 1 ;;; -*- Emacs-Lisp -*-
yuuji@23 2 ;;; YaTeX math-mode-specific functions.
yuuji@13 3 ;;; yatexmth.el rev.2
yuuji@14 4 ;;; (c )1993-1994 by HIROSE Yuuji [yuuji@ae.keio.ac.jp]
yuuji@37 5 ;;; Last modified Thu Jul 14 22:42:05 1994 on figaro
yuuji@11 6 ;;; $Id$
yuuji@11 7
yuuji@13 8 ;;; [Customization guide]
yuuji@13 9 ;;;
yuuji@13 10 ;;; By default, you can use two completion groups in YaTeX math
yuuji@23 11 ;;; mode, `;' for mathematical signs and `/' for greek letters. But
yuuji@13 12 ;;; you can add other completion groups by defining the alist of
yuuji@13 13 ;;; `prefix key' vs `completion list' into the variable
yuuji@13 14 ;;; YaTeX-math-key-list-private. If you wish to accomplish the
yuuji@23 15 ;;; completion as follows(prefix key is `,'):
yuuji@13 16 ;;;
yuuji@13 17 ;;; KEY COMPLETION
yuuji@13 18 ;;; s \sin
yuuji@13 19 ;;; S \arcsin
yuuji@13 20 ;;; c \cos
yuuji@13 21 ;;; C \arccos
yuuji@13 22 ;;; :
yuuji@13 23 ;;; T \arctan
yuuji@13 24 ;;; l \log
yuuji@13 25 ;;; hs \sinh
yuuji@13 26 ;;;
yuuji@23 27 ;;; Typing `s' after `,' makes `\sin', `hs' after `,' makes `\sinh'
yuuji@13 28 ;;; and so on. First, you have to define list of key-completion
yuuji@13 29 ;;; pairs. Variable name(YaTeX-math-funcs-list) is arbitrary.
yuuji@13 30 ;;;
yuuji@13 31 ;;; (setq YaTeX-math-funcs-list
yuuji@13 32 ;;; '(("s" "sin")
yuuji@13 33 ;;; ("S" "arcsin")
yuuji@13 34 ;;; :
yuuji@13 35 ;;; ("hs" "sinh")))
yuuji@13 36 ;;;
yuuji@13 37 ;;; Next, define the list of prefix-key vs completion list(defined
yuuji@13 38 ;;; above) into the variable YaTeX-math-key-list-private.
yuuji@13 39 ;;;
yuuji@13 40 ;;; (setq YaTeX-math-key-list-private
yuuji@23 41 ;;; '(("," . YaTeX-math-funcs-list)
yuuji@13 42 ;;; ("'" . Other-List-if-any)))
yuuji@13 43 ;;;
yuuji@13 44 ;;; Put these expressions into your ~/.emacs, and you can use this
yuuji@13 45 ;;; completion in the YaTeX-math-mode.
yuuji@13 46 ;;;
yuuji@13 47 ;;; And you can add your favorite completion sequences to the
yuuji@23 48 ;;; default completion list invoked with `;', by defining those lists
yuuji@13 49 ;;; into variable YaTeX-math-sign-alist-private.
yuuji@13 50
yuuji@13 51 ;;; 【イメージ補完の追加方法】
yuuji@13 52 ;;;
yuuji@23 53 ;;; 標準のイメージ補完では、「;」で始まる数式記号補完と、「/」で始
yuuji@13 54 ;;; まるギリシャ文字補完が使用可能ですが、これ以外の文字で始まる補完
yuuji@23 55 ;;; シリーズも定義することができます。例えば、「,」で始まる次のよう
yuuji@13 56 ;;; な補完シリーズを定義する場合を考えてみます。
yuuji@13 57 ;;;
yuuji@13 58 ;;; 補完キー 補完結果
yuuji@13 59 ;;; s \sin
yuuji@13 60 ;;; S \arcsin
yuuji@13 61 ;;; c \cos
yuuji@13 62 ;;; C \arccos
yuuji@13 63 ;;; :
yuuji@13 64 ;;; T \arctan
yuuji@13 65 ;;; l \log
yuuji@13 66 ;;; hs \sinh
yuuji@13 67 ;;;
yuuji@23 68 ;;; 「,」のあとに s を押すと \sin が、hs を押すと \sinh が入力されま
yuuji@13 69 ;;; す。このような補完リストの登録は以下のようにします(変数名は任意)。
yuuji@13 70 ;;;
yuuji@13 71 ;;; (setq YaTeX-math-funcs-list
yuuji@13 72 ;;; '(("s" "sin")
yuuji@13 73 ;;; ("S" "arcsin")
yuuji@13 74 ;;; :
yuuji@13 75 ;;; ("hs" "sinh")))
yuuji@13 76 ;;;
yuuji@23 77 ;;; さらに、「,」を押した時にイメージ補完が始まるよう次の変数に、起動キー
yuuji@13 78 ;;; と上で定義した補完用変数の登録を行ないます。
yuuji@13 79 ;;;
yuuji@13 80 ;;; (setq YaTeX-math-key-list-private
yuuji@23 81 ;;; '(("," . YaTeX-math-funcs-list)
yuuji@13 82 ;;; ("'" . ほかに定義したいシリーズがあれば…)))
yuuji@13 83 ;;;
yuuji@13 84 ;;; これらを ~/.emacs に書いておけば、野鳥の math-mode で自分専用の
yuuji@13 85 ;;; イメージ補完が利用できます。
yuuji@13 86
yuuji@13 87 (defvar YaTeX-jisold
yuuji@13 88 (and (boundp 'dos-machine-type)
yuuji@13 89 (eq dos-machine-type 'pc98)))
yuuji@13 90
yuuji@13 91 (defmacro YaTeX-setq-math-sym (sym old new)
yuuji@13 92 (list 'setq sym (list 'if 'YaTeX-jisold old new)))
yuuji@13 93
yuuji@13 94 (YaTeX-setq-math-sym YaTeX-image-in "E" "∈")
yuuji@13 95 (YaTeX-setq-math-sym YaTeX-image-ni "ヨ" "∋")
yuuji@13 96 (YaTeX-setq-math-sym YaTeX-image-subset " _\n(\n ~" "⊂")
yuuji@13 97 (YaTeX-setq-math-sym YaTeX-image-subseteq " _\n(_\n ~" "⊆")
yuuji@13 98 (YaTeX-setq-math-sym YaTeX-image-supset "_\n )\n~" "⊃")
yuuji@13 99 (YaTeX-setq-math-sym YaTeX-image-supseteq "_\n_)\n~" "⊇")
yuuji@13 100 (YaTeX-setq-math-sym YaTeX-image-nabla "___\n\\\\/" "∇")
yuuji@13 101 (YaTeX-setq-math-sym YaTeX-image-partial " -+\n+-+\n+-+" "∂")
yuuji@13 102 (YaTeX-setq-math-sym YaTeX-image-dagger "+\n|" "†")
yuuji@13 103 (YaTeX-setq-math-sym YaTeX-image-ddagger "+\n+\n|" "‡")
yuuji@13 104 (YaTeX-setq-math-sym YaTeX-image-equiv "=\n ̄" "≡")
yuuji@13 105 (YaTeX-setq-math-sym YaTeX-image-int " /\\\n \\\n\\/" "∫")
yuuji@13 106 (YaTeX-setq-math-sym YaTeX-image-bot "|\n ̄" "⊥")
yuuji@13 107 (YaTeX-setq-math-sym YaTeX-image-neg "イ" "¬")
yuuji@13 108 (YaTeX-setq-math-sym YaTeX-image-flat "b" "♭")
yuuji@23 109 (YaTeX-setq-math-sym YaTeX-image-sqrt "" "√")
yuuji@13 110
yuuji@11 111 (setq
yuuji@13 112 YaTeX-math-sign-alist-default
yuuji@11 113 '(
yuuji@11 114 ;frequently used
yuuji@11 115 ("||" "|" ("||" "‖"))
yuuji@11 116 ("sum" "sum" ("\\-+\n >\n/-+" "Σ"))
yuuji@11 117 ("sigma" "sum" ("\\-+\n >\n/-+" "Σ"))
yuuji@13 118 ("integral" "int" (" /\\\n \\\n\\/" YaTeX-image-int))
yuuji@11 119 ("ointegral" "oint" " /\\\n(\\)\n\\/")
yuuji@23 120 ("sqrt" "sqrt" (" __\n,/" YaTeX-image-sqrt))
yuuji@23 121 ("root" "sqrt" (" __\n,/" YaTeX-image-sqrt))
yuuji@11 122 ("A" "forall" "|_|\nV")
yuuji@11 123 ("E" "exists" "-+\n-+\n-+")
yuuji@13 124 ("!" "neg" ("--+\n |" YaTeX-image-neg))
yuuji@11 125 ("oo" "infty" ("oo" "∞"))
yuuji@11 126 ("\\" "backslash" ("\\" "\"))
yuuji@11 127
yuuji@11 128 ;;binary operators
yuuji@11 129 ("+-" "pm" ("+\n-" "±"))
yuuji@11 130 ("-+" "mp" "-\n+")
yuuji@11 131 ("x" "times" ("x" "×"))
yuuji@11 132 ("/" "div" (",\n-\n'" "÷"))
yuuji@23 133 ("f" "frac" "xxx\n---\nyyy" "÷")
yuuji@11 134 ("*" "ast" "*")
yuuji@11 135 ("#" "star" ("_/\\_\n\\ /\n//\\\\" "★"))
yuuji@11 136 ("o" "circ" "o")
yuuji@11 137 ("o*" "bullet" " _\n(*)\n ~")
yuuji@11 138 ("." "cdot" ".")
yuuji@11 139 ("cap" "cap" "/-\\\n| |")
yuuji@11 140 ("cup" "cup" "| |\n\\-/")
yuuji@11 141 ("u+" "uplus" "|+|\n\\-/")
yuuji@11 142 ("|~|" "sqcap" "|~|")
yuuji@11 143 ("|_|" "sqcup" "|_|")
yuuji@11 144 ("v" "vee" "v")
yuuji@11 145 ("^" "wedge" "^")
yuuji@11 146 ("\\\\" "setminus" "\\")
yuuji@11 147 (")(" "wr" " )\n(")
yuuji@11 148 ("<>" "diamond" "<>")
yuuji@11 149 ("/\-" "bigtriangleup" ("/\\\n~~" "△"))
yuuji@11 150 ("-\\/" "bigtriangledown" ("__\n\\/" "▽"))
yuuji@11 151 ("<|" "triangleleft" "<|")
yuuji@11 152 ("|>" "triangleright" "|>")
yuuji@11 153 ("<||" "lhd" "/|\n\\|")
yuuji@11 154 ("||>" "rhd" "|\\\n|/")
yuuji@11 155 ("<|-" "unlhd" "<|\n~~")
yuuji@11 156 ("|>-" "unrhd" "|>\n~~")
yuuji@11 157 ("o+" "oplus" " _\n(+)\n ~")
yuuji@11 158 ("o-" "ominus" " _\n(-)\n ~")
yuuji@11 159 ("ox" "otimes" " _\n(x)\n ~")
yuuji@11 160 ("o/" "oslash" " _\n(/)\n ~")
yuuji@11 161 ("o." "odot" "(.)")
yuuji@11 162 ("O" "bigcirc" "O")
yuuji@13 163 ("t" "dagger" ("+\n|" YaTeX-image-dagger))
yuuji@13 164 ("tt" "ddagger" ("+\n+\n|" YaTeX-image-ddagger))
yuuji@11 165 ("II" "amalg" "II")
yuuji@11 166 ; :
yuuji@11 167 ;;relational operators
yuuji@11 168 ("<" "leq" ("<\n-" "≦"))
yuuji@11 169 (">" "geq" (">\n-" "≧"))
yuuji@13 170 ("-=" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 171 ("=-" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 172 ("---" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 173 ("(" "subset" (" _\n(\n ~" YaTeX-image-subset))
yuuji@13 174 ("(-" "subseteq" (" _\n(_\n ~" YaTeX-image-subseteq))
yuuji@13 175 (")" "supset" ("_\n )\n~" YaTeX-image-supset))
yuuji@13 176 (")-" "supseteq" ("_\n_)\n~" YaTeX-image-supseteq))
yuuji@11 177 ("[" "sqsubset" "[")
yuuji@11 178 ("[-" "sqsubseteq" "[\n~")
yuuji@11 179 ("]" "sqsupset" "]")
yuuji@11 180 ("]-" "sqsupseteq" "]\n~")
yuuji@13 181 ("{" "in" ("(-" YaTeX-image-in))
yuuji@13 182 ("}" "ni" ("-)" YaTeX-image-ni))
yuuji@11 183 ("|-" "vdash" "|-")
yuuji@11 184 ("-|" "dashv" "-|")
yuuji@11 185 ("~" "sim" "~(tild)")
yuuji@11 186 ("~-" "simeq" "~\n-")
yuuji@11 187 ("asymp" "asymp" "v\n^")
yuuji@11 188 ("~~" "approx" "~\n~")
yuuji@11 189 ("~=" "cong" "~\n=")
yuuji@11 190 ("=/" "neq" ("=/=" "≠"))
yuuji@11 191 (".=" "doteq" ".\n=")
yuuji@11 192 ("o<" "propto" "o<")
yuuji@11 193 ("|=" "models" "|=")
yuuji@11 194 ("_|_" "perp" "_|_")
yuuji@11 195 ("|" "mid" "|")
yuuji@11 196 ("||" "parallel" "||")
yuuji@11 197 ("bowtie" "bowtie" "|><|(wide)")
yuuji@11 198 ("|><|" "join" "|><|")
yuuji@11 199 ("\\_/" "smile" "\\_/")
yuuji@11 200 ("/~\\" "frown" "/~~\\")
yuuji@11 201 ("-<" "prec" ("-<" "く"))
yuuji@11 202 ("-<=" "preceq" ("-<\n-" "く\n="))
yuuji@11 203 ("<<" "ll" ("<<" "《"))
yuuji@11 204 ; :
yuuji@11 205 ;;arrows
yuuji@11 206 ("<-" "leftarrow" ("<-" "←"))
yuuji@13 207 ("\C-b" "leftarrow" ("<-" "←"))
yuuji@13 208 ("<--" "longleftarrow" ("<--" "←--"))
yuuji@11 209 ("<=" "Leftarrow" "<=")
yuuji@11 210 ("<==" "Longleftarrow" "<==")
yuuji@11 211 ("->" "rightarrow" ("->" "→"))
yuuji@13 212 ("\C-f" "rightarrow" ("->" "→"))
yuuji@11 213 ("-->" "longrightarrow" ("-->" "--→"))
yuuji@11 214 ("==>" "Longrightarrow" "==>")
yuuji@11 215 ("<->" "leftrightarrow" ("<->" "←→"))
yuuji@11 216 ("<-->" "longleftrightarrow" ("<---->" "←--→"))
yuuji@11 217 ("<=>" "leftrightarrow" "<=>")
yuuji@11 218 ("<==>" "Longleftrightarrow" "<==>")
yuuji@11 219 ("^|" "uparrow" ("^\n|" "↑"))
yuuji@13 220 ("\C-p" "uparrow" ("^\n|" "↑"))
yuuji@11 221 ("^||" "Uparrow" "/\\\n||")
yuuji@11 222 ("\C-n" "downarrow" ("|\nv" "↓"))
yuuji@13 223 ("v|" "downarrow" ("|\nv" "↓"))
yuuji@13 224 ("v||" "Downarrow" "||\n\\/")
yuuji@11 225 ("|->" "mapsto" ("|->" "|→"))
yuuji@11 226 ("<-)" "hookleftarrow" (" ,\n<--+" " ヽ\n<--/"))
yuuji@11 227 ("/-" "leftharpoonup" "/\n~~~")
yuuji@11 228 ("\\-" "leftharpoondown" "__\n\\")
yuuji@11 229 ("-/" "rightharpoondown" "__\n/")
yuuji@11 230 ("-\\" "rightharpoonup" "~~\n\\")
yuuji@11 231 ;other marks
yuuji@11 232 ("Z" "aleph" "|\\|")
yuuji@11 233 ("|\\|" "aleph" "|\\|")
yuuji@11 234 ("h-" "hbar" "_\nh")
yuuji@11 235 ("i" "imath" "i")
yuuji@11 236 ("j" "jmath" "j")
yuuji@11 237 ("l" "ell" "l")
yuuji@11 238 ("wp" "wp" "???")
yuuji@11 239 ("R" "Re" ")R")
yuuji@11 240 ("Im" "Im" "???")
yuuji@11 241 ("mho" "mho" "~|_|~")
yuuji@11 242 ("'" "prime" "'")
yuuji@11 243 ("0" "emptyset" "0")
yuuji@13 244 ("nabla" "nabla" ("___\n\\\\/" YaTeX-image-nabla))
yuuji@11 245 ("\\/" "surd" "-\\/")
yuuji@11 246 ("surd" "surd" "-\\/")
yuuji@11 247 ("top" "top" "T")
yuuji@13 248 ("bot" "bot" ("_|_" YaTeX-image-bot))
yuuji@13 249 ("b" "flat" ("b" YaTeX-image-flat))
yuuji@11 250 ("LT" "natural" "|\nLT\n |")
yuuji@13 251 ("6" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@13 252 ("partial" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@13 253 ("round" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@11 254 ("[]" "box" "[]")
yuuji@11 255 ("Diamond" "Diamond" "/\\\n\\/")
yuuji@11 256 ("3" "triangle" "/\\\n~~")
yuuji@11 257 ("C" "clubsuit" " o\no+o\n |")
yuuji@11 258 ("D" "diamondsuit" "/\\\n\\/")
yuuji@11 259 ("H" "heartsuit" "<^^>\n \\/")
yuuji@11 260 ("S" "spadesuit" " /\\\n<++>\n /\\")
yuuji@11 261
yuuji@11 262 ))
yuuji@11 263
yuuji@13 264 (defvar YaTeX-math-sign-alist-private nil
yuuji@11 265 "*User definable key vs LaTeX-math-command alist.")
yuuji@11 266
yuuji@11 267 (defvar YaTeX-math-quit-with-strict-match nil
yuuji@11 268 "*T for quitting completion as soon as strict-match is found.")
yuuji@13 269 (setq YaTeX-math-sign-alist
yuuji@13 270 (append YaTeX-math-sign-alist-private YaTeX-math-sign-alist-default))
yuuji@11 271
yuuji@13 272 ;;(defun YaTeX-math-alist2array (alist array)
yuuji@13 273 ;; (set array
yuuji@13 274 ;; (let ((array (make-vector (length alist) "")) (list alist) (i 0))
yuuji@13 275 ;; (while list
yuuji@13 276 ;; (aset array i (car (car list)))
yuuji@13 277 ;; (setq i (1+ i) list (cdr list)))
yuuji@13 278 ;; array))
yuuji@13 279 ;;)
yuuji@11 280
yuuji@13 281 (setq YaTeX-greek-key-alist-default
yuuji@13 282 '(
yuuji@13 283 ("a" "alpha" ("a" "α"))
yuuji@13 284 ("b" "beta" ("|>\n|>\n|" "β"))
yuuji@13 285 ("g" "gamma" ("~r" "γ"))
yuuji@13 286 ("G" "Gamma" ("|~" "Γ"))
yuuji@13 287 ("d" "delta" ("<~\n<>" "δ"))
yuuji@13 288 ("D" "Delta" ("/\\\n~~" "Δ"))
yuuji@13 289 ("e" "epsilon" "<\n<~")
yuuji@13 290 ("e-" "varepsilon" ("(\n(~" "ε"))
yuuji@13 291 ("z" "zeta" ("(~\n >" "ζ"))
yuuji@13 292 ("et" "eta" ("n\n/" "η"))
yuuji@13 293 ("th" "theta" ("8" "θ"))
yuuji@13 294 ("Th" "Theta" ("(8)" "Θ"))
yuuji@13 295 ("th-" "vartheta" ("-8" "-θ"))
yuuji@13 296 ("i" "iota" ("i\n\\_/" "ι"))
yuuji@13 297 ("k" "kappa" ("k" "κ"))
yuuji@13 298 ("l" "lambda" ("\\n/\\" "λ"))
yuuji@13 299 ("L" "Lambda" ("/\\" "Λ"))
yuuji@13 300 ("m" "mu" (" u_\n/" "μ"))
yuuji@13 301 ("n" "nu" ("|/" "ν"))
yuuji@13 302 ("x" "xi" ("E\n >" "ξ"))
yuuji@13 303 ("X" "Xi" ("---\n -\n---" "Ξ"))
yuuji@13 304 ("p" "pi" ("__\n)(" "π"))
yuuji@13 305 ("P" "Pi" ("__\n||" "Π"))
yuuji@13 306 ("p-" "varpi" ("_\nw" "__\nω"))
yuuji@13 307 ("r" "rho" ("/O" "ρ"))
yuuji@13 308 ("r-" "varrho" ("/O\n~~" "ρ\n~~"))
yuuji@13 309 ("s" "sigma" ("o~" "σ"))
yuuji@13 310 ("S" "Sigma" ("\\-+\n >\n/-+" "Σ"))
yuuji@13 311 ("s-" "varsigma" "(~~ \n>")
yuuji@13 312 ("t" "tau" ("__\n(" "τ"))
yuuji@13 313 ("u" "upsilon" ("~v" "υ"))
yuuji@13 314 ("y" "upsilon" ("~v" "υ"))
yuuji@13 315 ("U" "Upsilon" ("~Y~" "Υ"))
yuuji@13 316 ("Y" "Upsilon" ("~Y~" "Υ"))
yuuji@13 317 ("ph" "phi" (" /\n(/)\n/" "φ"))
yuuji@13 318 ("Ph" "Phi" (" _\n(|)\n ~" "Φ"))
yuuji@13 319 ("ph-" "varphi" "\\O\n|")
yuuji@13 320 ("c" "chi" ("x" "χ"))
yuuji@13 321 ("ps" "psi" ("\\|/\\n |" "ψ"))
yuuji@13 322 ("Ps" "Psi" (" ~\n\\|/\\n |" "Ψ"))
yuuji@13 323 ("o" "omega" ("w" "ω"))
yuuji@13 324 ("w" "omega" ("w" "ω"))
yuuji@13 325 ("O" "Omega" ("(~)\n~ ~" "Ω"))
yuuji@13 326 ("W" "Omega" ("(~)\n~ ~" "Ω"))
yuuji@13 327 ("f" "foo")
yuuji@13 328 )
yuuji@13 329 )
yuuji@13 330
yuuji@13 331 (defvar YaTeX-greek-key-alist-private nil
yuuji@13 332 "*User definable key vs LaTeX-math-command alist.")
yuuji@13 333
yuuji@13 334 (setq YaTeX-greek-key-alist
yuuji@13 335 (append YaTeX-greek-key-alist-private YaTeX-greek-key-alist-default))
yuuji@13 336
yuuji@13 337 ;;(mapcar (function (lambda (x) (YaTeX-math-alist2array x)))
yuuji@13 338 ;; YaTeX-math-key-list)
yuuji@13 339
yuuji@11 340 (setq YaTeX-math-indicator
yuuji@11 341 "KEY\tLaTeX sequence\t\tsign")
yuuji@11 342
yuuji@11 343 (defvar YaTeX-math-need-image t
yuuji@11 344 "*T for displaying pseudo image momentarily.")
yuuji@11 345 (defvar YaTeX-math-max-key 8)
yuuji@11 346 (defvar YaTeX-math-max-seq
yuuji@11 347 (* 8 (1+ (/ (length "\\longleftrightarrow") 8))))
yuuji@11 348 (defvar YaTeX-math-max-sign 5)
yuuji@11 349 (defvar YaTeX-math-sign-width
yuuji@11 350 (+ YaTeX-math-max-key YaTeX-math-max-seq YaTeX-math-max-sign))
yuuji@11 351 (defvar YaTeX-math-display-width
yuuji@11 352 (* 8 (1+ (/ YaTeX-math-sign-width 8))))
yuuji@11 353 (defvar YaTeX-math-menu-map nil
yuuji@11 354 "Keymap used in YaTeX mathematical sign menu mode."
yuuji@11 355 )
yuuji@11 356 (if YaTeX-math-menu-map nil
yuuji@11 357 (setq YaTeX-math-menu-map (make-sparse-keymap))
yuuji@11 358 (define-key YaTeX-math-menu-map "n" 'next-line)
yuuji@11 359 (define-key YaTeX-math-menu-map "p" 'previous-line)
yuuji@11 360 (define-key YaTeX-math-menu-map "f" 'YaTeX-math-forward)
yuuji@11 361 (define-key YaTeX-math-menu-map "b" 'YaTeX-math-backward)
yuuji@11 362 (define-key YaTeX-math-menu-map "v" 'scroll-up)
yuuji@11 363 (define-key YaTeX-math-menu-map " " 'scroll-up)
yuuji@11 364 (define-key YaTeX-math-menu-map "c" 'scroll-up)
yuuji@11 365 (define-key YaTeX-math-menu-map "V" 'scroll-down)
yuuji@11 366 (define-key YaTeX-math-menu-map "r" 'scroll-down)
yuuji@11 367 (define-key YaTeX-math-menu-map "\^h" 'scroll-down)
yuuji@11 368 (define-key YaTeX-math-menu-map "<" 'beginning-of-buffer)
yuuji@11 369 (define-key YaTeX-math-menu-map ">" 'end-of-buffer)
yuuji@11 370 (define-key YaTeX-math-menu-map "\^m" 'exit-recursive-edit)
yuuji@11 371 (define-key YaTeX-math-menu-map "q" 'abort-recursive-edit))
yuuji@11 372
yuuji@13 373 (defvar YaTeX-math-exit-key "\e"
yuuji@13 374 "*Key sequence after prefix key of YaTeX-math-mode to exit from math-mode."
yuuji@13 375 )
yuuji@13 376
yuuji@11 377 (defmacro YaTeX-math-japanese-sign (list)
yuuji@11 378 (list 'nth 1 list))
yuuji@11 379
yuuji@11 380 (defvar YaTeX-math-cmd-regexp (concat (regexp-quote YaTeX-ec) "[A-z]"))
yuuji@11 381
yuuji@13 382 ;;;
yuuji@13 383 ;;YaTeX math-mode functions
yuuji@13 384 ;;;
yuuji@23 385 ;;;###autoload from yatex.el
yuuji@13 386 (defun YaTeX-toggle-math-mode (&optional arg)
yuuji@13 387 (interactive "P")
yuuji@13 388 (or (memq 'YaTeX-math-mode mode-line-format) nil
yuuji@13 389 (setq mode-line-format
yuuji@13 390 (append (list "" 'YaTeX-math-mode) mode-line-format)))
yuuji@23 391 (if YaTeX-auto-math-mode nil ;Only effective on manual mode.
yuuji@23 392 (if (or arg (null YaTeX-math-mode))
yuuji@23 393 (let (keys)
yuuji@23 394 (setq YaTeX-math-mode "math:")
yuuji@23 395 (message "Turn on math mode. Prefix keys are %s"
yuuji@23 396 (mapconcat 'car YaTeX-math-key-list " "))
yuuji@23 397 (sit-for 3)
yuuji@23 398 (message
yuuji@23 399 (concat "To exit from math-mode, type `ESC' after prefix, "
yuuji@23 400 "or type `"
yuuji@23 401 (key-description
yuuji@23 402 (car
yuuji@23 403 (where-is-internal
yuuji@23 404 'YaTeX-switch-mode-menu YaTeX-mode-map)))
yuuji@23 405 " $'")))
yuuji@23 406 (setq YaTeX-math-mode nil)
yuuji@23 407 (message "Exit from math mode."))
yuuji@23 408 (set-buffer-modified-p (buffer-modified-p)))
yuuji@13 409 )
yuuji@13 410
yuuji@11 411 (defun YaTeX-math-forward (arg)
yuuji@11 412 (interactive "p")
yuuji@11 413 (re-search-forward YaTeX-math-cmd-regexp nil t arg))
yuuji@11 414
yuuji@11 415 (defun YaTeX-math-backward (arg)
yuuji@11 416 (interactive "p")
yuuji@11 417 (re-search-backward YaTeX-math-cmd-regexp nil t arg))
yuuji@11 418
yuuji@13 419 (defun YaTeX-math-gets (sign)
yuuji@13 420 (cond
yuuji@13 421 ((null sign) nil)
yuuji@13 422 ((listp sign)
yuuji@13 423 (setq sign
yuuji@13 424 (cond
yuuji@13 425 (YaTeX-japan (YaTeX-math-japanese-sign sign))
yuuji@13 426 (t (car sign))))
yuuji@13 427 (YaTeX-math-gets sign))
yuuji@13 428 ((symbolp sign)
yuuji@13 429 (YaTeX-math-gets (symbol-value sign)))
yuuji@13 430 (t sign))
yuuji@13 431 )
yuuji@13 432
yuuji@11 433 (defun YaTeX-math-get-sign (list)
yuuji@13 434 (YaTeX-math-gets (car (cdr-safe (cdr-safe list))))
yuuji@11 435 )
yuuji@11 436
yuuji@23 437 (defun YaTeX-in-math-mode-p ()
yuuji@23 438 "If current position is supposed to be in LaTeX-math-mode, return t."
yuuji@23 439 (or (YaTeX-quick-in-environment-p
yuuji@23 440 '("math" "eqnarray" "equation" "eqnarray*" "displaymath"))
yuuji@23 441 (let ((p (point)) (nest 0) me0
yuuji@23 442 (boundary
yuuji@23 443 (save-excursion
yuuji@23 444 (if (looking-at YaTeX-paragraph-delimiter)
yuuji@23 445 (goto-char (max (point-min) (1- (point)))))
yuuji@23 446 (re-search-backward YaTeX-paragraph-delimiter nil 1)
yuuji@23 447 (point))))
yuuji@23 448 (save-excursion
yuuji@23 449 (cond
yuuji@23 450 ((catch 'open
yuuji@23 451 (save-excursion
yuuji@23 452 (while (and (>= nest 0)
yuuji@23 453 (re-search-backward
yuuji@23 454 (concat YaTeX-ec-regexp ;\
yuuji@23 455 "\\([()]\\|[][]\\)") boundary t))
yuuji@23 456 (setq me0 (match-end 0))
yuuji@23 457 (if (or (YaTeX-on-comment-p)
yuuji@23 458 (YaTeX-quick-in-environment-p "verbatim")) nil
yuuji@23 459 (if (or (= (char-after (1- me0)) ?\))
yuuji@23 460 (= (char-after (1- me0)) ?\]))
yuuji@23 461 (setq nest (1+ nest))
yuuji@37 462 (if (= (preceding-char) ?\\ ) nil;;\\[5pt]
yuuji@37 463 (setq nest (1- nest))))))
yuuji@23 464 (if (< nest 0) (throw 'open t))))
yuuji@23 465 t)
yuuji@23 466 (t (catch 'dollar
yuuji@23 467 (while (search-backward "$" boundary t)
yuuji@23 468 (cond
yuuji@23 469 ((equal (char-after (1- (point))) ?$) ; $$ equation $$
yuuji@23 470 (backward-char 1)
yuuji@23 471 (setq nest (1+ nest)))
yuuji@23 472 ((and (equal (char-after (1- (point))) ?\\ )
yuuji@23 473 (not (equal (char-after (- (point) 3)) ?\\ )))
yuuji@23 474 nil) ;\$
yuuji@23 475 (t (setq nest (1+ nest)))))
yuuji@23 476 (if (= (% nest 2) 1) (throw 'dollar t))))))))
yuuji@23 477 )
yuuji@23 478
yuuji@11 479 (defun YaTeX-math-display-list (list cols)
yuuji@11 480 (goto-char (point-max))
yuuji@11 481 (if (= cols 0) (if (not (eolp)) (newline 1))
yuuji@11 482 (forward-line -1)
yuuji@11 483 (while (looking-at "[ \t\n]") (forward-line -1)))
yuuji@11 484 (end-of-line)
yuuji@11 485 (let ((indent (* YaTeX-math-display-width cols)) sign str to)
yuuji@11 486 (indent-to indent)
yuuji@11 487 (insert (car list))
yuuji@11 488 (indent-to (setq indent (+ indent YaTeX-math-max-key)))
yuuji@11 489 (insert "\\" (car (cdr list)))
yuuji@11 490 (setq indent (+ indent YaTeX-math-max-seq))
yuuji@11 491 (setq sign (YaTeX-math-get-sign list))
yuuji@13 492 (while (and sign (not (string= "" sign)))
yuuji@11 493 (setq to (string-match "\n" sign)
yuuji@11 494 str (if to (substring sign 0 to) sign))
yuuji@11 495 (end-of-line)
yuuji@11 496 (indent-to indent)
yuuji@11 497 (insert str)
yuuji@11 498 (cond ((eobp) (newline 1))
yuuji@11 499 ((> cols 0) (forward-line 1)))
yuuji@11 500 (setq sign (if to (substring sign (1+ to)) "")))))
yuuji@11 501
yuuji@11 502 (defvar YaTeX-math-menu-buffer "*math-mode-signs*")
yuuji@11 503
yuuji@11 504 (defun YaTeX-math-show-menu (match-str)
yuuji@11 505 (save-window-excursion
yuuji@11 506 (pop-to-buffer YaTeX-math-menu-buffer)
yuuji@11 507 (let ((maxcols (max 1 (/ (screen-width) YaTeX-math-sign-width)))
yuuji@11 508 (case-fold-search nil)
yuuji@13 509 (cols 0) (list alist) command)
yuuji@11 510 (erase-buffer)
yuuji@13 511 (insert
yuuji@13 512 "Candidates of sign. [n:next p:prev f:forw b:back q:quit RET:select]\n")
yuuji@11 513 (insert YaTeX-math-indicator "\t")
yuuji@11 514 (insert YaTeX-math-indicator)
yuuji@11 515 (newline 1)
yuuji@11 516 (insert-char ?- (1- (screen-width)))
yuuji@11 517 (newline 1)
yuuji@11 518 (while list
yuuji@11 519 (if (string-match match-str (car (car list)))
yuuji@11 520 (progn (YaTeX-math-display-list (car list) cols)
yuuji@11 521 (setq cols (% (1+ cols) maxcols))))
yuuji@11 522 (setq list (cdr list)))
yuuji@13 523 (goto-line 4)
yuuji@11 524 (use-local-map YaTeX-math-menu-map)
yuuji@11 525 (unwind-protect
yuuji@11 526 (recursive-edit)
yuuji@11 527 (skip-chars-backward "^ \t\n")
yuuji@11 528 (setq command
yuuji@11 529 (if (re-search-forward YaTeX-math-cmd-regexp nil t)
yuuji@11 530 (buffer-substring
yuuji@11 531 (match-beginning 0)
yuuji@11 532 (prog2 (skip-chars-forward "^ \t\n") (point)))
yuuji@11 533 nil))
yuuji@11 534 (kill-buffer YaTeX-math-menu-buffer))
yuuji@11 535 command))
yuuji@11 536 )
yuuji@11 537
yuuji@11 538 ;
yuuji@11 539 (defun YaTeX-math-show-image (image &optional exit-char)
yuuji@11 540 "Momentarily display IMAGE at the beginning of the next line;
yuuji@11 541 erase it on the next keystroke. The window is recentered if necessary
yuuji@11 542 to make the whole string visible. If the window isn't large enough,
yuuji@11 543 at least you get to read the beginning."
yuuji@13 544 (if (and image (not (string= image "")))
yuuji@13 545 (let ((buffer-read-only nil)
yuuji@13 546 (modified (buffer-modified-p))
yuuji@13 547 (name buffer-file-name)
yuuji@13 548 insert-start
yuuji@13 549 insert-end)
yuuji@13 550 (unwind-protect
yuuji@13 551 (progn
yuuji@13 552 (save-excursion
yuuji@13 553 ;; defeat file locking... don't try this at home, kids!
yuuji@13 554 (setq buffer-file-name nil)
yuuji@13 555 (forward-line 1)
yuuji@13 556 (setq insert-start (point))
yuuji@13 557 (if (eobp) (newline))
yuuji@13 558 (insert image)
yuuji@13 559 (setq insert-end (point)))
yuuji@13 560 ; make sure the whole string is visible
yuuji@13 561 (if (not (pos-visible-in-window-p insert-end))
yuuji@13 562 (recenter (max 0
yuuji@13 563 (- (window-height)
yuuji@13 564 (count-lines insert-start insert-end)
yuuji@13 565 2))))
yuuji@13 566 (let ((char (read-char)))
yuuji@13 567 (or (eq char exit-char)
yuuji@13 568 (setq unread-command-char char))))
yuuji@13 569 (if insert-end
yuuji@13 570 (save-excursion
yuuji@13 571 (delete-region insert-start insert-end)))
yuuji@13 572 (setq buffer-file-name name)
yuuji@13 573 (set-buffer-modified-p modified)))))
yuuji@11 574
yuuji@23 575 (defun YaTeX-math-insert-sequence (&optional force)
yuuji@23 576 "Insert math-mode sequence with image completion."
yuuji@23 577 (interactive "P")
yuuji@13 578 (let*((key "") regkey str last-char list i
yuuji@13 579 (case-fold-search nil) match sign
yuuji@13 580 (this-key (char-to-string last-command-char))
yuuji@13 581 (alist (symbol-value (cdr (assoc this-key YaTeX-math-key-list))))
yuuji@13 582 (n (length alist)) (beg (point)) result)
yuuji@11 583 (setq result
yuuji@11 584 (catch 'complete
yuuji@23 585 (if (and (not force)
yuuji@23 586 (or (and (not YaTeX-auto-math-mode) (not YaTeX-math-mode))
yuuji@23 587 (not (YaTeX-in-math-mode-p))))
yuuji@23 588 (throw 'complete 'escape));this tag should be exit, but...
yuuji@11 589 (while t
yuuji@23 590 (message "Sequence(TAB for menu): %s" key)
yuuji@11 591 (setq last-char (read-char)
yuuji@11 592 key (concat key (char-to-string last-char))
yuuji@13 593 i 0)
yuuji@11 594 (cond
yuuji@13 595 ((string= key this-key) ;;invoke key itself
yuuji@11 596 (throw 'complete 'escape))
yuuji@13 597 ((string= key YaTeX-math-exit-key) ;;exit from math-mode
yuuji@13 598 (throw 'complete 'exit))
yuuji@23 599 ((string-match "\r" key) ;;RET = kakutei
yuuji@23 600 (throw 'complete 'select))
yuuji@23 601 ((string-match "[\C-g\C-c]" key) ;;C-g = abort
yuuji@23 602 (throw 'complete 'abort))
yuuji@23 603 ((string-match "[\t\n]" key) ;;TAB, LFD = menu
yuuji@23 604 (throw 'complete 'menu))
yuuji@23 605 ((string-match "[\C-h\C-?]" key) ;;BS, DEL = BS
yuuji@23 606 (if (< (length key) 2) (throw 'complete 'abort))
yuuji@13 607 (setq key (substring key 0 -2))))
yuuji@13 608
yuuji@13 609 (setq regkey (concat "^" (regexp-quote key)))
yuuji@23 610 (message "Sequence(TAB for menu): %s" key)
yuuji@11 611 (if
yuuji@11 612 (catch 'found
yuuji@11 613 ;;(1)input string strictly matches with alist
yuuji@23 614 (setq match (assoc key alist))
yuuji@23 615 ;;remember previous match
yuuji@23 616
yuuji@11 617 ;;(2)search partial match into alist
yuuji@13 618 (setq list alist)
yuuji@11 619 (while (< i n)
yuuji@11 620 (if (string-match
yuuji@13 621 regkey
yuuji@13 622 ;;(aref array i)
yuuji@13 623 ;;(car (nth i alist))
yuuji@23 624 (car (car list)))
yuuji@11 625 (progn
yuuji@11 626 (or match
yuuji@13 627 ;;(setq match (nth i alist))
yuuji@13 628 (setq match (car list)))
yuuji@11 629 (throw 'found t)))
yuuji@13 630 (setq i (1+ i) list (cdr list)))) ;catch 'found
yuuji@11 631 nil ;;if any match, continue reading
yuuji@11 632 ;;else reading of sequence has been done.
yuuji@11 633 (message "complete.")
yuuji@23 634 (throw 'complete t))
yuuji@23 635
yuuji@11 636 (if match
yuuji@11 637 (progn (delete-region beg (point))
yuuji@23 638 (setq single-command (car (cdr match)))
yuuji@23 639 (insert YaTeX-ec single-command)
yuuji@13 640 (if (and YaTeX-math-need-image
yuuji@13 641 (setq sign (YaTeX-math-get-sign match)))
yuuji@13 642 (YaTeX-math-show-image (concat sign "\n")))
yuuji@11 643 )
yuuji@11 644 nil)
yuuji@11 645 )))
yuuji@11 646 (cond
yuuji@11 647 ((eq result t)
yuuji@11 648 (setq YaTeX-current-completion-type 'maketitle)
yuuji@23 649
yuuji@13 650 ;;;(sit-for 1)
yuuji@11 651 (setq unread-command-char last-char)
yuuji@11 652 (insert (YaTeX-addin single-command)))
yuuji@11 653 ((eq result 'abort)
yuuji@11 654 (delete-region beg (point))
yuuji@11 655 (message "Abort."))
yuuji@11 656 ((eq result 'escape)
yuuji@11 657 (delete-region beg (point))
yuuji@13 658 (insert this-key))
yuuji@23 659 ((eq result 'select)
yuuji@23 660 (message "Done."))
yuuji@13 661 ((eq result 'exit)
yuuji@13 662 (delete-region beg (point))
yuuji@13 663 (YaTeX-toggle-math-mode))
yuuji@11 664 ((eq result 'menu)
yuuji@11 665 (delete-region beg (point))
yuuji@11 666 (setq key (concat "^" (regexp-quote (substring key 0 -1))))
yuuji@11 667 (insert (YaTeX-math-show-menu key)))))
yuuji@11 668 )
yuuji@11 669 ;;
yuuji@11 670 (provide 'yatexmth)
yuuji@13 671
yuuji@13 672 ; Local variables:
yuuji@13 673 ; fill-prefix: ";;; "
yuuji@13 674 ; paragraph-start: "^$\\| \\|;;;$"
yuuji@13 675 ; paragraph-separate: "^$\\| \\|;;;$"
yuuji@13 676 ; End: