yatex

annotate yatexmth.el @ 460:1790e0d35156

Capitalized varGREEK with amssymb, added
author HIROSE Yuuji <yuuji@gentei.org>
date Tue, 23 May 2017 11:34:14 +0859
parents 7bf780961390
children 9db0e1522847
rev   line source
yuuji@395 1 ;;; yatexmth.el --- YaTeX math-mode-specific functions -*- coding: sjis -*-
yuuji@287 2 ;;;
yuuji@443 3 ;;; (c)1993-2017 by HIROSE Yuuji [yuuji@yatex.org]
yuuji@460 4 ;;; Last modified Tue May 23 11:32:21 2017 on firestorm
yuuji@366 5 ;;; $Id$
yuuji@11 6
yuuji@287 7 ;;; Commentary:
yuuji@13 8 ;;; [Customization guide]
yuuji@13 9 ;;;
yuuji@13 10 ;;; By default, you can use two completion groups in YaTeX math
yuuji@52 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@51 45 ;;; completion in the 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@52 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@51 84 ;;; これらを ~/.emacs に書いておけば、math-mode で自分専用のイメージ
yuuji@51 85 ;;; 補完が利用できます。
yuuji@13 86
yuuji@287 87 ;;; Code:
yuuji@13 88 (defvar YaTeX-jisold
yuuji@13 89 (and (boundp 'dos-machine-type)
yuuji@13 90 (eq dos-machine-type 'pc98)))
yuuji@13 91
yuuji@13 92 (defmacro YaTeX-setq-math-sym (sym old new)
yuuji@13 93 (list 'setq sym (list 'if 'YaTeX-jisold old new)))
yuuji@13 94
yuuji@13 95 (YaTeX-setq-math-sym YaTeX-image-in "E" "∈")
yuuji@13 96 (YaTeX-setq-math-sym YaTeX-image-ni "ヨ" "∋")
yuuji@13 97 (YaTeX-setq-math-sym YaTeX-image-subset " _\n(\n ~" "⊂")
yuuji@13 98 (YaTeX-setq-math-sym YaTeX-image-subseteq " _\n(_\n ~" "⊆")
yuuji@13 99 (YaTeX-setq-math-sym YaTeX-image-supset "_\n )\n~" "⊃")
yuuji@13 100 (YaTeX-setq-math-sym YaTeX-image-supseteq "_\n_)\n~" "⊇")
yuuji@13 101 (YaTeX-setq-math-sym YaTeX-image-nabla "___\n\\\\/" "∇")
yuuji@13 102 (YaTeX-setq-math-sym YaTeX-image-partial " -+\n+-+\n+-+" "∂")
yuuji@13 103 (YaTeX-setq-math-sym YaTeX-image-dagger "+\n|" "†")
yuuji@13 104 (YaTeX-setq-math-sym YaTeX-image-ddagger "+\n+\n|" "‡")
yuuji@13 105 (YaTeX-setq-math-sym YaTeX-image-equiv "=\n ̄" "≡")
yuuji@13 106 (YaTeX-setq-math-sym YaTeX-image-int " /\\\n \\\n\\/" "∫")
yuuji@13 107 (YaTeX-setq-math-sym YaTeX-image-bot "|\n ̄" "⊥")
yuuji@13 108 (YaTeX-setq-math-sym YaTeX-image-neg "イ" "¬")
yuuji@13 109 (YaTeX-setq-math-sym YaTeX-image-flat "b" "♭")
yuuji@23 110 (YaTeX-setq-math-sym YaTeX-image-sqrt "" "√")
yuuji@80 111 (defvar YaTeX-image-nearrow '("__\n /|\n/" " _\n /|\n/" ))
yuuji@80 112 (defvar YaTeX-image-nwarrow '(" __\n|\\\n \\" " _\n|\\n \"))
yuuji@80 113 (defvar YaTeX-image-searrow '("\\\n \\|\n--`" "\\n \|\n  ̄"))
yuuji@80 114 (defvar YaTeX-image-swarrow '(" /\n|/\n'~~" " /\n|/\n  ̄"))
yuuji@80 115
yuuji@13 116
yuuji@52 117 (defvar
yuuji@13 118 YaTeX-math-sign-alist-default
yuuji@11 119 '(
yuuji@11 120 ;frequently used
yuuji@11 121 ("||" "|" ("||" "‖"))
yuuji@11 122 ("sum" "sum" ("\\-+\n >\n/-+" "Σ"))
yuuji@11 123 ("sigma" "sum" ("\\-+\n >\n/-+" "Σ"))
yuuji@13 124 ("integral" "int" (" /\\\n \\\n\\/" YaTeX-image-int))
yuuji@11 125 ("ointegral" "oint" " /\\\n(\\)\n\\/")
yuuji@23 126 ("sqrt" "sqrt" (" __\n,/" YaTeX-image-sqrt))
yuuji@23 127 ("root" "sqrt" (" __\n,/" YaTeX-image-sqrt))
yuuji@11 128 ("A" "forall" "|_|\nV")
yuuji@11 129 ("E" "exists" "-+\n-+\n-+")
yuuji@13 130 ("!" "neg" ("--+\n |" YaTeX-image-neg))
yuuji@11 131 ("oo" "infty" ("oo" "∞"))
yuuji@11 132 ("\\" "backslash" ("\\" "\"))
yuuji@68 133 ("..." "cdots" ("..." "…"))
yuuji@11 134
yuuji@11 135 ;;binary operators
yuuji@11 136 ("+-" "pm" ("+\n-" "±"))
yuuji@11 137 ("-+" "mp" "-\n+")
yuuji@11 138 ("x" "times" ("x" "×"))
yuuji@11 139 ("/" "div" (",\n-\n'" "÷"))
yuuji@23 140 ("f" "frac" "xxx\n---\nyyy" "÷")
yuuji@11 141 ("*" "ast" "*")
yuuji@11 142 ("#" "star" ("_/\\_\n\\ /\n//\\\\" "★"))
yuuji@11 143 ("o" "circ" "o")
yuuji@11 144 ("o*" "bullet" " _\n(*)\n ~")
yuuji@11 145 ("." "cdot" ".")
yuuji@11 146 ("cap" "cap" "/-\\\n| |")
yuuji@11 147 ("cup" "cup" "| |\n\\-/")
yuuji@11 148 ("u+" "uplus" "|+|\n\\-/")
yuuji@11 149 ("|~|" "sqcap" "|~|")
yuuji@11 150 ("|_|" "sqcup" "|_|")
yuuji@11 151 ("v" "vee" "v")
yuuji@11 152 ("^" "wedge" "^")
yuuji@11 153 ("\\\\" "setminus" "\\")
yuuji@11 154 (")(" "wr" " )\n(")
yuuji@11 155 ("<>" "diamond" "<>")
yuuji@128 156 ("/\\-" "bigtriangleup" ("/\\\n~~" "△"))
yuuji@11 157 ("-\\/" "bigtriangledown" ("__\n\\/" "▽"))
yuuji@11 158 ("<|" "triangleleft" "<|")
yuuji@11 159 ("|>" "triangleright" "|>")
yuuji@11 160 ("<||" "lhd" "/|\n\\|")
yuuji@11 161 ("||>" "rhd" "|\\\n|/")
yuuji@11 162 ("<|-" "unlhd" "<|\n~~")
yuuji@11 163 ("|>-" "unrhd" "|>\n~~")
yuuji@11 164 ("o+" "oplus" " _\n(+)\n ~")
yuuji@11 165 ("o-" "ominus" " _\n(-)\n ~")
yuuji@11 166 ("ox" "otimes" " _\n(x)\n ~")
yuuji@11 167 ("o/" "oslash" " _\n(/)\n ~")
yuuji@11 168 ("o." "odot" "(.)")
yuuji@11 169 ("O" "bigcirc" "O")
yuuji@13 170 ("t" "dagger" ("+\n|" YaTeX-image-dagger))
yuuji@13 171 ("tt" "ddagger" ("+\n+\n|" YaTeX-image-ddagger))
yuuji@11 172 ("II" "amalg" "II")
yuuji@11 173 ; :
yuuji@11 174 ;;relational operators
yuuji@134 175 ("<" "leq" ("<\n-" "<\n-"))
yuuji@134 176 ("=<" "leqq" ("<\n=" "≦"))
yuuji@134 177 (">" "geq" (">\n-" ">\n-"))
yuuji@134 178 (">=" "geqq" (">\n=" "≧"))
yuuji@143 179 ("=:" "fallingdotseq" (".\n==\n ." "≒"))
yuuji@13 180 ("-=" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 181 ("=-" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 182 ("---" "equiv" ("=\n-" YaTeX-image-equiv))
yuuji@13 183 ("(" "subset" (" _\n(\n ~" YaTeX-image-subset))
yuuji@13 184 ("(-" "subseteq" (" _\n(_\n ~" YaTeX-image-subseteq))
yuuji@13 185 (")" "supset" ("_\n )\n~" YaTeX-image-supset))
yuuji@13 186 (")-" "supseteq" ("_\n_)\n~" YaTeX-image-supseteq))
yuuji@11 187 ("[" "sqsubset" "[")
yuuji@11 188 ("[-" "sqsubseteq" "[\n~")
yuuji@11 189 ("]" "sqsupset" "]")
yuuji@11 190 ("]-" "sqsupseteq" "]\n~")
yuuji@13 191 ("{" "in" ("(-" YaTeX-image-in))
yuuji@13 192 ("}" "ni" ("-)" YaTeX-image-ni))
yuuji@11 193 ("|-" "vdash" "|-")
yuuji@11 194 ("-|" "dashv" "-|")
yuuji@11 195 ("~" "sim" "~(tild)")
yuuji@11 196 ("~-" "simeq" "~\n-")
yuuji@11 197 ("asymp" "asymp" "v\n^")
yuuji@11 198 ("~~" "approx" "~\n~")
yuuji@11 199 ("~=" "cong" "~\n=")
yuuji@11 200 ("=/" "neq" ("=/=" "≠"))
yuuji@11 201 (".=" "doteq" ".\n=")
yuuji@11 202 ("o<" "propto" "o<")
yuuji@11 203 ("|=" "models" "|=")
yuuji@11 204 ("_|_" "perp" "_|_")
yuuji@11 205 ("|" "mid" "|")
yuuji@11 206 ("||" "parallel" "||")
yuuji@11 207 ("bowtie" "bowtie" "|><|(wide)")
yuuji@11 208 ("|><|" "join" "|><|")
yuuji@11 209 ("\\_/" "smile" "\\_/")
yuuji@11 210 ("/~\\" "frown" "/~~\\")
yuuji@11 211 ("-<" "prec" ("-<" "く"))
yuuji@11 212 ("-<=" "preceq" ("-<\n-" "く\n="))
yuuji@11 213 ("<<" "ll" ("<<" "《"))
yuuji@134 214 ("<<" "lll" "<<<")
yuuji@80 215 (">>" "gg" (">>" "》"))
yuuji@134 216 (">>>" "ggg" ">>>")
yuuji@11 217 ; :
yuuji@11 218 ;;arrows
yuuji@11 219 ("<-" "leftarrow" ("<-" "←"))
yuuji@13 220 ("\C-b" "leftarrow" ("<-" "←"))
yuuji@13 221 ("<--" "longleftarrow" ("<--" "←--"))
yuuji@11 222 ("<=" "Leftarrow" "<=")
yuuji@11 223 ("<==" "Longleftarrow" "<==")
yuuji@11 224 ("->" "rightarrow" ("->" "→"))
yuuji@13 225 ("\C-f" "rightarrow" ("->" "→"))
yuuji@11 226 ("-->" "longrightarrow" ("-->" "--→"))
yuuji@64 227 ("=>" "Rightarrow" "=>")
yuuji@11 228 ("==>" "Longrightarrow" "==>")
yuuji@11 229 ("<->" "leftrightarrow" ("<->" "←→"))
yuuji@11 230 ("<-->" "longleftrightarrow" ("<---->" "←--→"))
yuuji@47 231 ("<=>" "Leftrightarrow" "<=>")
yuuji@11 232 ("<==>" "Longleftrightarrow" "<==>")
yuuji@11 233 ("^|" "uparrow" ("^\n|" "↑"))
yuuji@13 234 ("\C-p" "uparrow" ("^\n|" "↑"))
yuuji@11 235 ("^||" "Uparrow" "/\\\n||")
yuuji@11 236 ("\C-n" "downarrow" ("|\nv" "↓"))
yuuji@13 237 ("v|" "downarrow" ("|\nv" "↓"))
yuuji@13 238 ("v||" "Downarrow" "||\n\\/")
yuuji@80 239 ("\C-p\C-f" "nearrow" YaTeX-image-nearrow)
yuuji@80 240 ("\C-f\C-p" "nearrow" YaTeX-image-nearrow)
yuuji@80 241 ("ne" "nearrow" YaTeX-image-nearrow)
yuuji@80 242 ("\C-p\C-b" "nwarrow" YaTeX-image-nwarrow)
yuuji@80 243 ("\C-b\C-p" "nwarrow" YaTeX-image-nwarrow)
yuuji@80 244 ("nw" "nwarrow" YaTeX-image-nwarrow)
yuuji@80 245 ("\C-n\C-f" "searrow" YaTeX-image-searrow)
yuuji@80 246 ("\C-f\C-n" "searrow" YaTeX-image-searrow)
yuuji@80 247 ("se" "searrow" YaTeX-image-searrow)
yuuji@80 248 ("\C-n\C-b" "swarrow" YaTeX-image-swarrow)
yuuji@80 249 ("\C-b\C-n" "swarrow" YaTeX-image-swarrow)
yuuji@80 250 ("sw" "swarrow" YaTeX-image-swarrow)
yuuji@11 251 ("|->" "mapsto" ("|->" "|→"))
yuuji@11 252 ("<-)" "hookleftarrow" (" ,\n<--+" " ヽ\n<--/"))
yuuji@69 253 ("(->" "hookrightarrow" ("`\n+-->" "/\n\-->"))
yuuji@11 254 ("/-" "leftharpoonup" "/\n~~~")
yuuji@11 255 ("\\-" "leftharpoondown" "__\n\\")
yuuji@11 256 ("-/" "rightharpoondown" "__\n/")
yuuji@11 257 ("-\\" "rightharpoonup" "~~\n\\")
yuuji@53 258 ;;left and right
yuuji@53 259 ("left" "left" "(leftmark)")
yuuji@53 260 ("right" "right" "(rightmark)")
yuuji@68 261 ;;accent marks
yuuji@68 262 ("tilde" "tilde" "~\n?")
yuuji@68 263 ("T" "tilde" "~\n?")
yuuji@68 264 ("wtilde" "widetilde" "~\n?")
yuuji@68 265 ("hat" "hat" "^\n?")
yuuji@68 266 ("what" "widehat" "/\\\n??")
yuuji@68 267 ("w^" "widehat" "/\\\n?")
yuuji@68 268 ("check" "check" "v\n?")
yuuji@68 269 ("bar" "bar" "_\n?")
yuuji@68 270 ("overline" "overline" "_\n?")
yuuji@68 271 ("wbar" "overline" "--\n??")
yuuji@68 272 ("dot" "dot" ".\n?")
yuuji@68 273 ("ddot" "ddot" "..\n??")
yuuji@68 274 ("vec" "vec" ("->\n??" "→\n??"))
yuuji@68 275 ("~>" "overrightarrow" ("-->\nAB" "→\nAB"))
yuuji@68 276 ("VEC" "overrightarrow" ("-->\nAB" "→\nAB"))
yuuji@68 277 ;;rage-aware stuffs
yuuji@68 278 ("prod" "prod" ("-+--+-\n | |" "Π"))
yuuji@68 279 ("CUP" "bigcup" "|~~|\n| |\n| |")
yuuji@68 280 ("union" "bigcup" "|~~|\n| |\n| |")
yuuji@68 281 ("CAP" "bigcap" "| |\n| |\n|__|")
yuuji@68 282 ("isc" "bigcap" "| |\n| |\n|__|")
yuuji@68 283 ("O+" "bigoplus" "/~~~\\\n| + |\n\\___/")
yuuji@68 284 ("Ox" "bigotimes" "/~~~\\\n| X |\n\\___/")
yuuji@68 285 ;;other marks
yuuji@80 286 ("angle" "angle" ("/\n~" "∠"))
yuuji@80 287 ("/_" "angle" ("/\n~" "∠"))
yuuji@11 288 ("Z" "aleph" "|\\|")
yuuji@11 289 ("|\\|" "aleph" "|\\|")
yuuji@11 290 ("h-" "hbar" "_\nh")
yuuji@68 291 ; ("i" "imath" "i") ;These chars are appeared only
yuuji@68 292 ; ("j" "jmath" "j") ;as section-type arguments
yuuji@11 293 ("l" "ell" "l")
yuuji@11 294 ("wp" "wp" "???")
yuuji@11 295 ("R" "Re" ")R")
yuuji@11 296 ("Im" "Im" "???")
yuuji@11 297 ("mho" "mho" "~|_|~")
yuuji@11 298 ("'" "prime" "'")
yuuji@11 299 ("0" "emptyset" "0")
yuuji@13 300 ("nabla" "nabla" ("___\n\\\\/" YaTeX-image-nabla))
yuuji@11 301 ("\\/" "surd" "-\\/")
yuuji@11 302 ("surd" "surd" "-\\/")
yuuji@11 303 ("top" "top" "T")
yuuji@13 304 ("bot" "bot" ("_|_" YaTeX-image-bot))
yuuji@13 305 ("b" "flat" ("b" YaTeX-image-flat))
yuuji@11 306 ("LT" "natural" "|\nLT\n |")
yuuji@13 307 ("6" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@13 308 ("partial" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@13 309 ("round" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial))
yuuji@59 310 ("[]" "Box" "[]")
yuuji@80 311 ("no" "notag" "\\notag")
yuuji@80 312 (":" "colon" ":")
yuuji@305 313 (".'." "therefore" (".'." "∴"))
yuuji@305 314 ("'.'" "because" ("'.'" "∵"))
yuuji@11 315 ("Diamond" "Diamond" "/\\\n\\/")
yuuji@11 316 ("3" "triangle" "/\\\n~~")
yuuji@11 317 ("C" "clubsuit" " o\no+o\n |")
yuuji@11 318 ("D" "diamondsuit" "/\\\n\\/")
yuuji@11 319 ("H" "heartsuit" "<^^>\n \\/")
yuuji@11 320 ("S" "spadesuit" " /\\\n<++>\n /\\")
yuuji@229 321 ("mi" "mathit" "\\mathit{}")
yuuji@229 322 ("mr" "mathrm" "\\mathrm{}")
yuuji@229 323 ("mb" "mathbf" "\\mathbf{}")
yuuji@456 324 ("mB" "mathbb" "\\mathbb{}")
yuuji@229 325 ("mt" "mathtt" "\\mathtt{}")
yuuji@229 326 ("ms" "mathsf" "\\mathsf{}")
yuuji@229 327 ("mc" "mathcal" "\\mathcal{}")
yuuji@229 328 ("mn" "mathnormal" "\\mathnormal{}")
yuuji@52 329 )
yuuji@52 330 "Default LaTeX-math-command alist.")
yuuji@11 331
yuuji@13 332 (defvar YaTeX-math-sign-alist-private nil
yuuji@11 333 "*User definable key vs LaTeX-math-command alist.")
yuuji@11 334
yuuji@11 335 (defvar YaTeX-math-quit-with-strict-match nil
yuuji@11 336 "*T for quitting completion as soon as strict-match is found.")
yuuji@52 337 (defvar YaTeX-math-sign-alist
yuuji@13 338 (append YaTeX-math-sign-alist-private YaTeX-math-sign-alist-default))
yuuji@11 339
yuuji@13 340 ;;(defun YaTeX-math-alist2array (alist array)
yuuji@13 341 ;; (set array
yuuji@13 342 ;; (let ((array (make-vector (length alist) "")) (list alist) (i 0))
yuuji@13 343 ;; (while list
yuuji@13 344 ;; (aset array i (car (car list)))
yuuji@13 345 ;; (setq i (1+ i) list (cdr list)))
yuuji@13 346 ;; array))
yuuji@13 347 ;;)
yuuji@11 348
yuuji@52 349 (defvar YaTeX-greek-key-alist-default
yuuji@460 350 (append
yuuji@460 351 '(
yuuji@460 352 ("a" "alpha" ("a" "α"))
yuuji@460 353 ("b" "beta" ("|>\n|>\n|" "β"))
yuuji@460 354 ("g" "gamma" ("~r" "γ"))
yuuji@460 355 ("G" "Gamma" ("|~" "Γ"))
yuuji@460 356 ("d" "delta" ("<~\n<>" "δ"))
yuuji@460 357 ("D" "Delta" ("/\\\n~~" "Δ"))
yuuji@460 358 ("e" "epsilon" "<\n<~")
yuuji@460 359 ("e-" "varepsilon" " <\n<~")
yuuji@460 360 ("e-" "varepsilon" ("(\n(~" "ε"))
yuuji@460 361 ("z" "zeta" ("(~\n >" "ζ"))
yuuji@460 362 ("et" "eta" ("n\n/" "η"))
yuuji@460 363 ("th" "theta" ("8" "θ"))
yuuji@460 364 ("th-" "vartheta" (" o\no" "θ"))
yuuji@460 365 ("Th" "Theta" ("(8)" "Θ"))
yuuji@460 366 ("th-" "vartheta" ("-8" "-θ"))
yuuji@460 367 ("i" "iota" ("i\n\\_/" "ι"))
yuuji@460 368 ("k" "kappa" ("k" "κ"))
yuuji@460 369 ("l" "lambda" ("\\n/\\" "λ"))
yuuji@460 370 ("L" "Lambda" ("/\\" "Λ"))
yuuji@460 371 ("m" "mu" (" u_\n/" "μ"))
yuuji@460 372 ("n" "nu" ("|/" "ν"))
yuuji@460 373 ("x" "xi" ("E\n >" "ξ"))
yuuji@460 374 ("X" "Xi" ("---\n -\n---" "Ξ"))
yuuji@460 375 ("p" "pi" ("__\n)(" "π"))
yuuji@460 376 ("p-" "varpi" (" __\n)(" "π"))
yuuji@460 377 ("P" "Pi" ("__\n||" "Π"))
yuuji@460 378 ("p-" "varpi" ("_\nw" "__\nω"))
yuuji@460 379 ("r" "rho" ("/O" "ρ"))
yuuji@460 380 ("r-" "varrho" ("~O" "ρ"))
yuuji@460 381 ("r-" "varrho" ("/O\n~~" "ρ\n~~"))
yuuji@460 382 ("s" "sigma" ("o~" "σ"))
yuuji@460 383 ("s-" "varsigma" ("o~~" "σ"))
yuuji@460 384 ("S" "Sigma" ("\\-+\n >\n/-+" "Σ"))
yuuji@460 385 ("s-" "varsigma" "(~~ \n>")
yuuji@460 386 ("t" "tau" ("__\n(" "τ"))
yuuji@460 387 ("u" "upsilon" ("~v" "υ"))
yuuji@460 388 ("y" "upsilon" ("~v" "υ"))
yuuji@460 389 ("U" "Upsilon" ("~Y~" "Υ"))
yuuji@460 390 ("Y" "Upsilon" ("~Y~" "Υ"))
yuuji@460 391 ("ph" "phi" (" /\n(/)\n/" "φ"))
yuuji@460 392 ("ph-" "varphi" (" /\n(/)\n/" "φ"))
yuuji@460 393 ("Ph" "Phi" (" _\n(|)\n ~" "Φ"))
yuuji@460 394 ("ph-" "varphi" "\\O\n|")
yuuji@460 395 ("c" "chi" ("x" "χ"))
yuuji@460 396 ("ps" "psi" ("\\|/\\n |" "ψ"))
yuuji@460 397 ("Ps" "Psi" (" ~\n\\|/\\n |" "Ψ"))
yuuji@460 398 ("o" "omega" ("w" "ω"))
yuuji@460 399 ("w" "omega" ("w" "ω"))
yuuji@460 400 ("O" "Omega" ("(~)\n~ ~" "Ω"))
yuuji@460 401 ("W" "Omega" ("(~)\n~ ~" "Ω"))
yuuji@460 402 ("f" "foo")
yuuji@460 403 )
yuuji@460 404 (if YaTeX-use-AMS-LaTeX
yuuji@460 405 '(
yuuji@460 406 ("G-" "varGamma" ("/~" "_Γ"))
yuuji@460 407 ("D-" "varDelta" ("/|\n~~" "_Δ"))
yuuji@460 408 ("Th-" "varTheta" ("/8/" "_Θ"))
yuuji@460 409 ("L-" "varLambda" ("/|" "_Λ"))
yuuji@460 410 ("X-" "varXi" (" --\n -\n-- " "_Ξ"))
yuuji@460 411 ("S-" "varSigma" (" \\-+\n >\n/-+" "_Σ"))
yuuji@460 412 ("U-" "varUpsilon" ("~~Y~" "_Υ"))
yuuji@460 413 ("Ph-" "varPhi" (" _\n(|)\n~" "_Φ"))
yuuji@460 414 ("Ps-" "varPsi" (" ~\n\\//\\n /" "Ψ"))
yuuji@460 415 ("O-" "varOmega" ("/~/\n~ ~" "_Ω")))))
yuuji@52 416 "Default LaTeX-math-command alist.")
yuuji@13 417
yuuji@13 418 (defvar YaTeX-greek-key-alist-private nil
yuuji@13 419 "*User definable key vs LaTeX-math-command alist.")
yuuji@13 420
yuuji@52 421 (defvar YaTeX-greek-key-alist
yuuji@13 422 (append YaTeX-greek-key-alist-private YaTeX-greek-key-alist-default))
yuuji@13 423
yuuji@13 424 ;;(mapcar (function (lambda (x) (YaTeX-math-alist2array x)))
yuuji@13 425 ;; YaTeX-math-key-list)
yuuji@13 426
yuuji@52 427 (defvar YaTeX-math-indicator "KEY\tLaTeX sequence\t\tsign")
yuuji@11 428
yuuji@11 429 (defvar YaTeX-math-need-image t
yuuji@11 430 "*T for displaying pseudo image momentarily.")
yuuji@11 431 (defvar YaTeX-math-max-key 8)
yuuji@11 432 (defvar YaTeX-math-max-seq
yuuji@11 433 (* 8 (1+ (/ (length "\\longleftrightarrow") 8))))
yuuji@11 434 (defvar YaTeX-math-max-sign 5)
yuuji@11 435 (defvar YaTeX-math-sign-width
yuuji@11 436 (+ YaTeX-math-max-key YaTeX-math-max-seq YaTeX-math-max-sign))
yuuji@11 437 (defvar YaTeX-math-display-width
yuuji@11 438 (* 8 (1+ (/ YaTeX-math-sign-width 8))))
yuuji@11 439 (defvar YaTeX-math-menu-map nil
yuuji@80 440 "Keymap used in YaTeX mathematical sign menu mode.")
yuuji@80 441
yuuji@11 442 (if YaTeX-math-menu-map nil
yuuji@11 443 (setq YaTeX-math-menu-map (make-sparse-keymap))
yuuji@11 444 (define-key YaTeX-math-menu-map "n" 'next-line)
yuuji@11 445 (define-key YaTeX-math-menu-map "p" 'previous-line)
yuuji@11 446 (define-key YaTeX-math-menu-map "f" 'YaTeX-math-forward)
yuuji@11 447 (define-key YaTeX-math-menu-map "b" 'YaTeX-math-backward)
yuuji@11 448 (define-key YaTeX-math-menu-map "v" 'scroll-up)
yuuji@11 449 (define-key YaTeX-math-menu-map " " 'scroll-up)
yuuji@11 450 (define-key YaTeX-math-menu-map "c" 'scroll-up)
yuuji@11 451 (define-key YaTeX-math-menu-map "V" 'scroll-down)
yuuji@11 452 (define-key YaTeX-math-menu-map "r" 'scroll-down)
yuuji@11 453 (define-key YaTeX-math-menu-map "\^h" 'scroll-down)
yuuji@11 454 (define-key YaTeX-math-menu-map "<" 'beginning-of-buffer)
yuuji@11 455 (define-key YaTeX-math-menu-map ">" 'end-of-buffer)
yuuji@11 456 (define-key YaTeX-math-menu-map "\^m" 'exit-recursive-edit)
yuuji@11 457 (define-key YaTeX-math-menu-map "q" 'abort-recursive-edit))
yuuji@11 458
yuuji@13 459 (defvar YaTeX-math-exit-key "\e"
yuuji@80 460 "*Key sequence after prefix key of YaTeX-math-mode to exit from math-mode.")
yuuji@13 461
yuuji@11 462 (defmacro YaTeX-math-japanese-sign (list)
yuuji@11 463 (list 'nth 1 list))
yuuji@11 464
yuuji@72 465 (defvar YaTeX-math-cmd-regexp (concat (regexp-quote YaTeX-ec) "[A-z|]"))
yuuji@177 466
yuuji@177 467 ;;; alltt goes into YaTeX-verbatim-environments 2011/3/16
yuuji@177 468 ;;(defvar YaTeX-math-verbatim-environments
yuuji@177 469 ;; '("alltt")
yuuji@177 470 ;; "*List of environments in which LaTeX math mode is disabled.
yuuji@177 471 ;;This value is appended with YaTeX-verbatim-environments.")
yuuji@11 472
yuuji@13 473 ;;;
yuuji@13 474 ;;YaTeX math-mode functions
yuuji@13 475 ;;;
yuuji@417 476 ;;;###autoload
yuuji@13 477 (defun YaTeX-toggle-math-mode (&optional arg)
yuuji@13 478 (interactive "P")
yuuji@13 479 (or (memq 'YaTeX-math-mode mode-line-format) nil
yuuji@13 480 (setq mode-line-format
yuuji@13 481 (append (list "" 'YaTeX-math-mode) mode-line-format)))
yuuji@23 482 (if YaTeX-auto-math-mode nil ;Only effective on manual mode.
yuuji@23 483 (if (or arg (null YaTeX-math-mode))
yuuji@23 484 (let (keys)
yuuji@23 485 (setq YaTeX-math-mode "math:")
yuuji@23 486 (message "Turn on math mode. Prefix keys are %s"
yuuji@23 487 (mapconcat 'car YaTeX-math-key-list " "))
yuuji@23 488 (sit-for 3)
yuuji@23 489 (message
yuuji@23 490 (concat "To exit from math-mode, type `ESC' after prefix, "
yuuji@23 491 "or type `"
yuuji@23 492 (key-description
yuuji@23 493 (car
yuuji@23 494 (where-is-internal
yuuji@23 495 'YaTeX-switch-mode-menu YaTeX-mode-map)))
yuuji@23 496 " $'")))
yuuji@23 497 (setq YaTeX-math-mode nil)
yuuji@23 498 (message "Exit from math mode."))
yuuji@80 499 (set-buffer-modified-p (buffer-modified-p))))
yuuji@13 500
yuuji@11 501 (defun YaTeX-math-forward (arg)
yuuji@11 502 (interactive "p")
yuuji@11 503 (re-search-forward YaTeX-math-cmd-regexp nil t arg))
yuuji@11 504
yuuji@11 505 (defun YaTeX-math-backward (arg)
yuuji@11 506 (interactive "p")
yuuji@11 507 (re-search-backward YaTeX-math-cmd-regexp nil t arg))
yuuji@11 508
yuuji@13 509 (defun YaTeX-math-gets (sign)
yuuji@13 510 (cond
yuuji@13 511 ((null sign) nil)
yuuji@13 512 ((listp sign)
yuuji@13 513 (setq sign
yuuji@13 514 (cond
yuuji@13 515 (YaTeX-japan (YaTeX-math-japanese-sign sign))
yuuji@13 516 (t (car sign))))
yuuji@13 517 (YaTeX-math-gets sign))
yuuji@13 518 ((symbolp sign)
yuuji@13 519 (YaTeX-math-gets (symbol-value sign)))
yuuji@80 520 (t sign)))
yuuji@13 521
yuuji@11 522 (defun YaTeX-math-get-sign (list)
yuuji@80 523 (YaTeX-math-gets (car (cdr-safe (cdr-safe list)))))
yuuji@80 524
yuuji@77 525 (defvar YaTeX-math-section-type-regexp
yuuji@77 526 "eqn\\\\\\sw+\\b"
yuuji@77 527 "*Regexp of section-type math-mode macro")
yuuji@77 528
yuuji@23 529 (defun YaTeX-in-math-mode-p ()
yuuji@80 530 "If current position is supposed to be in LaTeX-math-mode, return t.
yuuji@80 531 This function refers a local variable `source-window' in YaTeX-make-section."
yuuji@80 532 (save-excursion
yuuji@80 533 (and (boundp 'source-window) source-window
yuuji@80 534 (set-buffer (window-buffer source-window)))
yuuji@80 535 (or (YaTeX-quick-in-environment-p
yuuji@80 536 (append
yuuji@80 537 '("math" "eqnarray" "equation" "eqnarray*" "displaymath") ;LaTeX
yuuji@80 538 (if YaTeX-use-AMS-LaTeX
yuuji@80 539 ;; And math modes of AMS-LaTeX
yuuji@80 540 ;;'("align" "align*" "split" "multline" "multline*" "gather"
yuuji@80 541 ;; "gather*" "aligned*" "gathered" "gathered*" "alignat"
yuuji@80 542 ;; "equation*" "cases" "flalign" "flalign*"
yuuji@80 543 ;; "alignat*" "xalignat" "xalignat*" "xxalignat" "xxalignat*"
yuuji@80 544 YaTeX-math-begin-list
yuuji@449 545 )
yuuji@450 546 YaTeX-math-other-env-list))
yuuji@130 547 (let*((p (point)) (nest 0) me0 r firstp dollar
yuuji@80 548 (delim (concat YaTeX-sectioning-regexp "\\|^$\\|^\C-l"))
yuuji@80 549 (boundary
yuuji@80 550 (save-excursion
yuuji@80 551 (if (looking-at delim)
yuuji@80 552 (goto-char (max (point-min) (1- (point)))))
yuuji@80 553 (re-search-backward delim nil 1)
yuuji@80 554 (point))))
yuuji@80 555 (save-excursion
yuuji@80 556 (cond
yuuji@80 557 ((catch 'open
yuuji@80 558 (save-excursion
yuuji@80 559 (while (and (>= nest 0)
yuuji@80 560 (re-search-backward
yuuji@80 561 (concat YaTeX-ec-regexp ;\
yuuji@80 562 "\\([()]\\|[][]\\)") boundary t))
yuuji@80 563 (setq me0 (match-end 0))
yuuji@80 564 (if (or (YaTeX-on-comment-p)
yuuji@80 565 (YaTeX-literal-p)) nil
yuuji@80 566 (if (or (= (char-after (1- me0)) ?\))
yuuji@80 567 (= (char-after (1- me0)) ?\]))
yuuji@80 568 (setq nest (1+ nest))
yuuji@80 569 (if (= (preceding-char) ?\\ ) nil ;;\\[5pt]
yuuji@80 570 (setq nest (1- nest))))))
yuuji@130 571 (if (< nest 0)
yuuji@130 572 (throw 'open (cons (YaTeX-match-string 0) (point)))))))
yuuji@80 573 ((and (setq r (YaTeX-on-section-command-p
yuuji@80 574 YaTeX-math-section-type-regexp))
yuuji@80 575 (numberp r)
yuuji@80 576 (> r 0))
yuuji@80 577 t)
yuuji@80 578 (t (catch 'dollar
yuuji@80 579 (while ;(search-backward "$" boundary t);little bit fast.
yuuji@80 580 (YaTeX-re-search-active-backward ;;;;;; Too slow???
yuuji@80 581 "\\$" (concat "[^\\\\]" YaTeX-comment-prefix) boundary t)
yuuji@130 582 (setq dollar "$")
yuuji@80 583 (cond
yuuji@80 584 ((equal (char-after (1- (point))) ?$) ; $$ equation $$
yuuji@130 585 (setq dollar "$$")
yuuji@80 586 (backward-char 1)
yuuji@80 587 (setq nest (1+ nest)))
yuuji@177 588 ((YaTeX-literal-p)
yuuji@80 589 nil)
yuuji@80 590 ((and (equal (char-after (1- (point))) ?\\ )
yuuji@80 591 (not (equal (char-after (- (point) 3)) ?\\ )))
yuuji@80 592 nil) ;\$
yuuji@130 593 (t (setq nest (1+ nest))))
yuuji@130 594 (if (and (= nest 1) (null firstp))
yuuji@130 595 (setq firstp (cons dollar (point)))))
yuuji@130 596 (if (= (% nest 2) 1)
yuuji@130 597 (throw 'dollar firstp))))))))))
yuuji@130 598
yuuji@130 599 (defun YaTeX-mark-mathenv ()
yuuji@130 600 "Mark current mathematic environment."
yuuji@130 601 (interactive)
yuuji@130 602 (let ((mmp (YaTeX-in-math-mode-p)) type bpt)
yuuji@130 603 (if (or (null mmp) (not (stringp (setq type (car mmp)))))
yuuji@130 604 nil ;if nil or not string, do nothing
yuuji@130 605 (setq bpt (cdr mmp))
yuuji@130 606 (goto-char bpt)
yuuji@130 607 (cond
yuuji@130 608 ((string-match "\\$" type)
yuuji@130 609 (set-mark-command nil)
yuuji@130 610 (skip-chars-forward "$")
yuuji@130 611 (YaTeX-search-active-forward
yuuji@130 612 type YaTeX-comment-prefix nil) ;if it cause error, obey it
yuuji@130 613 (goto-char (match-end 0)))
yuuji@130 614 ;;
yuuji@130 615 ((string-match "^\\\\[\\[(]" type)
yuuji@130 616 (set-mark-command nil)
yuuji@130 617 (YaTeX-goto-corresponding-leftright)
yuuji@130 618 (skip-chars-forward "])\\\\"))
yuuji@130 619 ;;
yuuji@130 620 ((string-match "^[a-z]" type) ; \begin\end type math
yuuji@130 621 (set-mark-command nil)
yuuji@130 622 (YaTeX-goto-corresponding-environment)
yuuji@130 623 (goto-char (match-end 0)))))))
yuuji@23 624
yuuji@11 625 (defun YaTeX-math-display-list (list cols)
yuuji@11 626 (goto-char (point-max))
yuuji@11 627 (if (= cols 0) (if (not (eolp)) (newline 1))
yuuji@11 628 (forward-line -1)
yuuji@11 629 (while (looking-at "[ \t\n]") (forward-line -1)))
yuuji@11 630 (end-of-line)
yuuji@11 631 (let ((indent (* YaTeX-math-display-width cols)) sign str to)
yuuji@11 632 (indent-to indent)
yuuji@11 633 (insert (car list))
yuuji@11 634 (indent-to (setq indent (+ indent YaTeX-math-max-key)))
yuuji@11 635 (insert "\\" (car (cdr list)))
yuuji@11 636 (setq indent (+ indent YaTeX-math-max-seq))
yuuji@11 637 (setq sign (YaTeX-math-get-sign list))
yuuji@13 638 (while (and sign (not (string= "" sign)))
yuuji@11 639 (setq to (string-match "\n" sign)
yuuji@11 640 str (if to (substring sign 0 to) sign))
yuuji@11 641 (end-of-line)
yuuji@11 642 (indent-to indent)
yuuji@11 643 (insert str)
yuuji@11 644 (cond ((eobp) (newline 1))
yuuji@11 645 ((> cols 0) (forward-line 1)))
yuuji@11 646 (setq sign (if to (substring sign (1+ to)) "")))))
yuuji@11 647
yuuji@11 648 (defvar YaTeX-math-menu-buffer "*math-mode-signs*")
yuuji@11 649
yuuji@11 650 (defun YaTeX-math-show-menu (match-str)
yuuji@11 651 (save-window-excursion
yuuji@59 652 (YaTeX-showup-buffer YaTeX-math-menu-buffer nil t)
yuuji@70 653 (let ((maxcols (max 1 (/ (YaTeX-screen-width) YaTeX-math-sign-width)))
yuuji@11 654 (case-fold-search nil)
yuuji@13 655 (cols 0) (list alist) command)
yuuji@11 656 (erase-buffer)
yuuji@13 657 (insert
yuuji@13 658 "Candidates of sign. [n:next p:prev f:forw b:back q:quit RET:select]\n")
yuuji@11 659 (insert YaTeX-math-indicator "\t")
yuuji@11 660 (insert YaTeX-math-indicator)
yuuji@11 661 (newline 1)
yuuji@70 662 (insert-char ?- (1- (YaTeX-screen-width)))
yuuji@11 663 (newline 1)
yuuji@11 664 (while list
yuuji@11 665 (if (string-match match-str (car (car list)))
yuuji@11 666 (progn (YaTeX-math-display-list (car list) cols)
yuuji@11 667 (setq cols (% (1+ cols) maxcols))))
yuuji@11 668 (setq list (cdr list)))
yuuji@178 669 (goto-char (point-min)) (forward-line 3)
yuuji@11 670 (use-local-map YaTeX-math-menu-map)
yuuji@60 671 (setq buffer-read-only t)
yuuji@11 672 (unwind-protect
yuuji@11 673 (recursive-edit)
yuuji@11 674 (skip-chars-backward "^ \t\n")
yuuji@11 675 (setq command
yuuji@11 676 (if (re-search-forward YaTeX-math-cmd-regexp nil t)
yuuji@11 677 (buffer-substring
yuuji@11 678 (match-beginning 0)
yuuji@11 679 (prog2 (skip-chars-forward "^ \t\n") (point)))
yuuji@11 680 nil))
yuuji@11 681 (kill-buffer YaTeX-math-menu-buffer))
yuuji@80 682 command)))
yuuji@11 683
yuuji@11 684 (defun YaTeX-math-show-image (image &optional exit-char)
yuuji@11 685 "Momentarily display IMAGE at the beginning of the next line;
yuuji@11 686 erase it on the next keystroke. The window is recentered if necessary
yuuji@11 687 to make the whole string visible. If the window isn't large enough,
yuuji@11 688 at least you get to read the beginning."
yuuji@13 689 (if (and image (not (string= image "")))
yuuji@13 690 (let ((buffer-read-only nil)
yuuji@13 691 (modified (buffer-modified-p))
yuuji@13 692 (name buffer-file-name)
yuuji@13 693 insert-start
yuuji@13 694 insert-end)
yuuji@13 695 (unwind-protect
yuuji@13 696 (progn
yuuji@13 697 (save-excursion
yuuji@13 698 ;; defeat file locking... don't try this at home, kids!
yuuji@13 699 (setq buffer-file-name nil)
yuuji@13 700 (forward-line 1)
yuuji@13 701 (setq insert-start (point))
yuuji@13 702 (if (eobp) (newline))
yuuji@13 703 (insert image)
yuuji@13 704 (setq insert-end (point)))
yuuji@13 705 ; make sure the whole string is visible
yuuji@13 706 (if (not (pos-visible-in-window-p insert-end))
yuuji@13 707 (recenter (max 0
yuuji@13 708 (- (window-height)
yuuji@13 709 (count-lines insert-start insert-end)
yuuji@13 710 2))))
yuuji@13 711 (let ((char (read-char)))
yuuji@13 712 (or (eq char exit-char)
yuuji@292 713 (if (boundp 'unread-command-events)
yuuji@292 714 (setq unread-command-events (list char))
yuuji@292 715 (setq unread-command-char char)))))
yuuji@13 716 (if insert-end
yuuji@13 717 (save-excursion
yuuji@13 718 (delete-region insert-start insert-end)))
yuuji@13 719 (setq buffer-file-name name)
yuuji@13 720 (set-buffer-modified-p modified)))))
yuuji@11 721
yuuji@52 722 (defun YaTeX-math-insert-sequence (&optional force initial)
yuuji@23 723 "Insert math-mode sequence with image completion."
yuuji@23 724 (interactive "P")
yuuji@52 725 (let*((key (or initial "")) regkey str last-char list i
yuuji@13 726 (case-fold-search nil) match sign
yuuji@290 727 (this-key (char-to-string (YaTeX-last-key)))
yuuji@60 728 (alistsym (cdr (assoc this-key YaTeX-math-key-list)))
yuuji@60 729 (alistname (symbol-name alistsym))
yuuji@60 730 (alist (symbol-value alistsym))
yuuji@13 731 (n (length alist)) (beg (point)) result)
yuuji@52 732 (if initial (insert YaTeX-ec (car (cdr (assoc initial alist)))))
yuuji@60 733 (if (string-match "^YaTeX-" alistname)
yuuji@60 734 (setq alistname (substring alistname (length "YaTeX-"))))
yuuji@60 735 (setq alistname (substring alistname 0 (string-match "-" alistname)))
yuuji@11 736 (setq result
yuuji@11 737 (catch 'complete
yuuji@23 738 (if (and (not force)
yuuji@51 739 (if YaTeX-auto-math-mode
yuuji@51 740 (not (YaTeX-in-math-mode-p))
yuuji@51 741 (not YaTeX-math-mode)))
yuuji@23 742 (throw 'complete 'escape));this tag should be exit, but...
yuuji@11 743 (while t
yuuji@60 744 (message "%ssequence%s: %s"
yuuji@60 745 (if YaTeX-simple-messages "" (concat alistname " "))
yuuji@56 746 (if YaTeX-simple-messages "" "(TAB for menu)") key)
yuuji@11 747 (setq last-char (read-char)
yuuji@11 748 key (concat key (char-to-string last-char))
yuuji@13 749 i 0)
yuuji@11 750 (cond
yuuji@13 751 ((string= key this-key) ;;invoke key itself
yuuji@11 752 (throw 'complete 'escape))
yuuji@13 753 ((string= key YaTeX-math-exit-key) ;;exit from math-mode
yuuji@13 754 (throw 'complete 'exit))
yuuji@23 755 ((string-match "\r" key) ;;RET = kakutei
yuuji@23 756 (throw 'complete 'select))
yuuji@23 757 ((string-match "[\C-g\C-c]" key) ;;C-g = abort
yuuji@23 758 (throw 'complete 'abort))
yuuji@23 759 ((string-match "[\t\n]" key) ;;TAB, LFD = menu
yuuji@23 760 (throw 'complete 'menu))
yuuji@23 761 ((string-match "[\C-h\C-?]" key) ;;BS, DEL = BS
yuuji@23 762 (if (< (length key) 2) (throw 'complete 'abort))
yuuji@13 763 (setq key (substring key 0 -2))))
yuuji@13 764
yuuji@13 765 (setq regkey (concat "^" (regexp-quote key)))
yuuji@56 766 (message "Sequence%s: %s"
yuuji@56 767 (if YaTeX-simple-messages "" "(TAB for menu)") key)
yuuji@11 768 (if
yuuji@11 769 (catch 'found
yuuji@11 770 ;;(1)input string strictly matches with alist
yuuji@23 771 (setq match (assoc key alist))
yuuji@23 772 ;;remember previous match
yuuji@23 773
yuuji@11 774 ;;(2)search partial match into alist
yuuji@13 775 (setq list alist)
yuuji@11 776 (while (< i n)
yuuji@11 777 (if (string-match
yuuji@13 778 regkey
yuuji@13 779 ;;(aref array i)
yuuji@13 780 ;;(car (nth i alist))
yuuji@23 781 (car (car list)))
yuuji@11 782 (progn
yuuji@11 783 (or match
yuuji@13 784 ;;(setq match (nth i alist))
yuuji@13 785 (setq match (car list)))
yuuji@11 786 (throw 'found t)))
yuuji@13 787 (setq i (1+ i) list (cdr list)))) ;catch 'found
yuuji@11 788 nil ;;if any match, continue reading
yuuji@11 789 ;;else reading of sequence has been done.
yuuji@11 790 (message "complete.")
yuuji@23 791 (throw 'complete t))
yuuji@23 792
yuuji@11 793 (if match
yuuji@11 794 (progn (delete-region beg (point))
yuuji@80 795 (setq YaTeX-single-command (car (cdr match)))
yuuji@80 796 (insert YaTeX-ec YaTeX-single-command)
yuuji@13 797 (if (and YaTeX-math-need-image
yuuji@13 798 (setq sign (YaTeX-math-get-sign match)))
yuuji@13 799 (YaTeX-math-show-image (concat sign "\n")))
yuuji@11 800 )
yuuji@11 801 nil)
yuuji@11 802 )))
yuuji@68 803 (delete-region beg (point))
yuuji@11 804 (cond
yuuji@68 805 ((memq result '(t select))
yuuji@68 806 (if (eq result t)
yuuji@292 807 (if (boundp 'unread-command-events)
yuuji@292 808 (setq unread-command-events (list last-char))
yuuji@292 809 (setq unread-command-char last-char))
yuuji@68 810 (message "Done."))
yuuji@80 811 (if (assoc YaTeX-single-command section-table)
yuuji@80 812 (YaTeX-make-section nil nil nil YaTeX-single-command)
yuuji@68 813 (setq YaTeX-current-completion-type 'maketitle)
yuuji@80 814 (YaTeX-make-singlecmd YaTeX-single-command)))
yuuji@11 815 ((eq result 'abort)
yuuji@11 816 (message "Abort."))
yuuji@11 817 ((eq result 'escape)
yuuji@80 818 (call-interactively (lookup-key global-map this-key)))
yuuji@13 819 ((eq result 'exit)
yuuji@13 820 (YaTeX-toggle-math-mode))
yuuji@11 821 ((eq result 'menu)
yuuji@11 822 (setq key (concat "^" (regexp-quote (substring key 0 -1))))
yuuji@68 823 (insert (YaTeX-math-show-menu key))))))
yuuji@52 824
yuuji@52 825 ;; ----- Change image completion types -----
yuuji@52 826 (defun YaTeX-math-member-p (item)
yuuji@52 827 "Check if ITEM is a member of image completion.
yuuji@52 828 If so return the cons of its invocation key and image-string."
yuuji@52 829 (let ((lists YaTeX-math-key-list) list)
yuuji@52 830 (catch 'found
yuuji@52 831 (while lists
yuuji@52 832 (setq list (symbol-value (cdr (car lists))))
yuuji@52 833 (while list
yuuji@52 834 (if (string= item (nth 1 (car list)))
yuuji@52 835 (throw 'found (cons (car (car lists)) (nth 0 (car list)))))
yuuji@52 836 (setq list (cdr list)))
yuuji@52 837 (setq lists (cdr lists))))))
yuuji@52 838
yuuji@193 839 ;;; ----- for AMS LaTeX (by matsu<at>math.s.chiba-u.ac.jp) -----
yuuji@69 840 (defvar YaTeX-ams-paren-modifier
yuuji@69 841 '(("Biggl" . "Biggr") ("biggl" . "biggr")
yuuji@69 842 ("Bigl" . "Bigr") ("bigl" . "bigr")
yuuji@69 843 ("left" . "right") ("" . ""))
yuuji@69 844 "Alist of modifier of parentheses.")
yuuji@69 845
yuuji@69 846 (defvar YaTeX-left-paren "(\\|\\[\\|\\\\{")
yuuji@69 847 (defvar YaTeX-right-paren ")\\|\\]\\|\\\\}")
yuuji@69 848 (defvar YaTeX-paren
yuuji@69 849 (concat YaTeX-left-paren "\\|" YaTeX-right-paren))
yuuji@69 850
yuuji@69 851 (defun YaTeX-on-parenthesis-p ()
yuuji@69 852 "If cursor is on an (AMS-LaTeX) parenthesis, return the parenthesis."
yuuji@69 853 (interactive)
yuuji@69 854 (let* ((list YaTeX-ams-paren-modifier)
yuuji@69 855 (longest 0) ;; the longest length of parenthesis command strings
yuuji@69 856 (flag t) ;; flag for whether on braces not following \
yuuji@69 857 (point (point))
yuuji@69 858 (move 0)
yuuji@69 859 (paren))
yuuji@69 860 (while list
yuuji@69 861 (setq longest
yuuji@69 862 (max longest (length (car (car list))) (length (cdr (car list)))))
yuuji@69 863 (setq list (cdr list)))
yuuji@69 864 (save-excursion
yuuji@69 865 ;; search {} and, if it does not follow `\', set flag nil.
yuuji@69 866 ;; if it is right after `\', set flag t and move to the position of \.
yuuji@69 867 ;; mmmmm.
yuuji@69 868 (if (looking-at "{\\|}")
yuuji@69 869 (if (not (equal (char-after (1- (point))) 92))
yuuji@69 870 (setq flag nil)
yuuji@69 871 (forward-char -1)))
yuuji@69 872 ;; if flag is nil, do nothing.
yuuji@69 873 (if (and flag (re-search-forward YaTeX-paren
yuuji@69 874 (+ (point) 3 longest) t))
yuuji@69 875 (progn
yuuji@69 876 (setq move (- (point) point))
yuuji@80 877 (setq paren (YaTeX-match-string 0))
yuuji@69 878 (setq list YaTeX-ams-paren-modifier)
yuuji@69 879 ;; criterion for whether on [] () \{\} or not.
yuuji@69 880 (if (string-match YaTeX-left-paren paren)
yuuji@69 881 (while (and list flag)
yuuji@69 882 (let* ((mod (car (car list)))
yuuji@69 883 (mod-length 0) ;; length of modifier
yuuji@69 884 paren-regexp ;; regexp of paren.
yuuji@69 885 mod-regexp) ;; regexp of modifier.
yuuji@69 886 (if (> (length mod) 0)
yuuji@69 887 (setq mod-regexp (concat "\\\\" mod)
yuuji@69 888 mod-length (1+ (length mod))))
yuuji@69 889 (cond ((string= paren "\\{")
yuuji@69 890 (setq paren-regexp (concat "\\" paren)))
yuuji@69 891 ((string= paren "[")
yuuji@69 892 (setq paren-regexp "\\["))
yuuji@69 893 (t (setq paren-regexp paren)))
yuuji@69 894 (save-excursion
yuuji@69 895 (if (and (>= (- (point) (point-min))
yuuji@69 896 (+ mod-length (length paren)))
yuuji@69 897 (not (forward-char
yuuji@69 898 (- 0 mod-length (length paren))))
yuuji@69 899 (looking-at (concat "\\(" mod-regexp "\\)\\("
yuuji@69 900 paren-regexp "\\)")))
yuuji@69 901 (setq flag nil)))
yuuji@69 902 (setq list (cdr list))))
yuuji@69 903 (while (and list flag)
yuuji@69 904 (let* ((mod (cdr (car list)))
yuuji@69 905 (mod-length 0)
yuuji@69 906 paren-regexp
yuuji@69 907 mod-regexp)
yuuji@69 908 (if (> (length mod) 0)
yuuji@69 909 (setq mod-regexp (concat "\\\\" mod)
yuuji@69 910 mod-length (1+ (length mod))))
yuuji@69 911 (cond ((string= paren "\\}")
yuuji@69 912 (setq paren-regexp (concat "\\" paren)))
yuuji@69 913 ((string= paren "]")
yuuji@69 914 (setq paren-regexp "\\]"))
yuuji@69 915 (t (setq paren-regexp paren)))
yuuji@69 916 (save-excursion
yuuji@69 917 (if (and (>= (- (point) (point-min))
yuuji@69 918 (+ mod-length (length paren)))
yuuji@69 919 (not (forward-char
yuuji@69 920 (- 0 mod-length (length paren))))
yuuji@69 921 (looking-at (concat "\\(" mod-regexp "\\)\\("
yuuji@69 922 paren-regexp "\\)")))
yuuji@69 923 (setq flag nil)))
yuuji@69 924 (setq list (cdr list)))))
yuuji@80 925 (if (<= move (length (YaTeX-match-string 0)))
yuuji@80 926 (YaTeX-match-string 0)))))))
yuuji@69 927
yuuji@77 928 (defun YaTeX-goto-open-paren (&optional jumpto-co)
yuuji@77 929 "Jump to the exact position of open parenthesis.
yuuji@77 930 If optional argument JUMPTO-CO is non-nil, goto corresponding parentheses."
yuuji@69 931 (interactive)
yuuji@69 932 (let ((paren)
yuuji@69 933 (backslash-syntax (char-to-string (char-syntax ?\\))))
yuuji@69 934 (if (setq paren (YaTeX-on-parenthesis-p))
yuuji@69 935 (if (string-match "(\\|{\\|\\[" paren (1- (length paren)))
yuuji@69 936 (progn
yuuji@69 937 (re-search-forward "(\\|{\\|\\[" (+ (point) (length paren)) t)
yuuji@77 938 (backward-char)
yuuji@77 939 (if jumpto-co
yuuji@77 940 (unwind-protect
yuuji@77 941 (progn
yuuji@77 942 (modify-syntax-entry ?\\ " ")
yuuji@77 943 (forward-list)
yuuji@77 944 (backward-char))
yuuji@77 945 (modify-syntax-entry ?\\ backslash-syntax)))
yuuji@77 946 (point))
yuuji@69 947 (re-search-forward ")\\|}\\|\\]" (+ (point) (length paren)) t)
yuuji@69 948 (unwind-protect
yuuji@69 949 (progn
yuuji@69 950 (modify-syntax-entry ?\\ " ")
yuuji@77 951 (backward-list)
yuuji@77 952 (point))
yuuji@69 953 (modify-syntax-entry ?\\ backslash-syntax))))))
yuuji@69 954
yuuji@77 955 ;;;###autoload
yuuji@77 956 (defun YaTeX-goto-corresponding-paren ()
yuuji@77 957 "Go to corresponding mathematical parentheses."
yuuji@77 958 (if (YaTeX-on-parenthesis-p)
yuuji@77 959 (YaTeX-goto-open-paren t)
yuuji@77 960 nil))
yuuji@77 961
yuuji@69 962 (defun YaTeX-change-parentheses ()
yuuji@69 963 "Change the size of parentheses, braces, and brackets of AMS-LaTeX."
yuuji@69 964 (interactive)
yuuji@69 965 (if (not (and YaTeX-use-AMS-LaTeX (YaTeX-on-parenthesis-p)))
yuuji@69 966 nil
yuuji@80 967 (let* ((mod (YaTeX-match-string 1)) ;; modifier
yuuji@80 968 (paren (if mod (YaTeX-match-string 2) (YaTeX-match-string 0))) ;; paren
yuuji@69 969 (mod-length (if (or (string= mod "\\left") (string= mod "\\right"))
yuuji@69 970 5 ;; 5 in case left or right
yuuji@69 971 (length mod))) ;; length of modifier
yuuji@69 972 (paren-length (length paren)) ;; length of paren
yuuji@69 973 (length (+ mod-length paren-length)) ;; length of whole string
yuuji@69 974 (big-p t) ;; flag whether new modifier is "[Bb]ig+" or not.
yuuji@69 975 size ;; left, big, Big etc.
yuuji@77 976 type ;; parentheses type
yuuji@69 977 lr ;; "l" or "r".
yuuji@69 978 char newsize newsize-length
yuuji@69 979 (backslash-syntax (char-to-string (char-syntax ?\\)))
yuuji@69 980 (case-fold-search))
yuuji@69 981 ;; decide lr and size from mod and paren.
yuuji@69 982 (cond ((string-match "\\(\\\\[Bb]ig+\\)[lr]" mod)
yuuji@69 983 (setq size (substring mod 1 (match-end 1))
yuuji@69 984 lr (substring mod (match-end 1) (match-end 0))))
yuuji@69 985 ((string-match "\\\\left" mod)
yuuji@69 986 (setq size "left-right" lr "l"))
yuuji@69 987 ((string-match "\\\\right" mod)
yuuji@69 988 (setq size "left-right" lr "r"))
yuuji@69 989 ((string-match "(\\|\\[\\|\\\\{" paren)
yuuji@69 990 (setq size "null" lr "l"))
yuuji@69 991 ((string-match ")\\|\\]\\|\\\\}" paren)
yuuji@69 992 (setq size "null" lr "r"))
yuuji@69 993 (t
yuuji@69 994 (setq size nil lr nil)))
yuuji@69 995 (while (not newsize)
yuuji@69 996 (message (format (concat "Change from %s: "
yuuji@69 997 "l(big) L(Big) h(bigg) H(Bigg) "
yuuji@77 998 "r(left-right) n(NONE) ( { [") size))
yuuji@69 999 (setq char (read-char)
yuuji@69 1000 newsize (cond ((char-equal char ?l) "\\big")
yuuji@69 1001 ((char-equal char ?L) "\\Big")
yuuji@69 1002 ((char-equal char ?h) "\\bigg")
yuuji@69 1003 ((char-equal char ?H) "\\Bigg")
yuuji@69 1004 ((char-equal char ?r)
yuuji@69 1005 (setq big-p nil) "\\left")
yuuji@77 1006 ((memq char '(?\( ?\)))
yuuji@77 1007 (setq big-p nil type '("(" . ")")) "")
yuuji@77 1008 ((memq char '(?\{ ?\}))
yuuji@77 1009 (setq big-p nil type '("\\{" . "\\}")) "")
yuuji@77 1010 ((memq char '(?\[ ?\]))
yuuji@77 1011 (setq big-p nil type '("[" . "]")) "")
yuuji@69 1012 ((char-equal char ?n)
yuuji@69 1013 (setq big-p nil) "")
yuuji@69 1014 (t nil))
yuuji@69 1015 newsize-length (length newsize)))
yuuji@69 1016 (YaTeX-goto-open-paren)
yuuji@69 1017 (forward-char)
yuuji@77 1018 (cond
yuuji@77 1019 (type
yuuji@77 1020 (delete-region (point) (- (point) paren-length))
yuuji@77 1021 (save-excursion (insert (car type))))
yuuji@77 1022 (t
yuuji@77 1023 (delete-region (- (point) length) (- (point) paren-length))
yuuji@77 1024 (backward-char paren-length)))
yuuji@69 1025 (insert-string newsize)
yuuji@69 1026 (if big-p (insert ?l))
yuuji@69 1027 (unwind-protect
yuuji@69 1028 (progn
yuuji@69 1029 (modify-syntax-entry ?\\ " ")
yuuji@69 1030 (forward-list)
yuuji@69 1031 (if (string= size "left-right") (setq length (1+ length)))
yuuji@69 1032 (if (eq char ?r) (setq newsize "\\right"))
yuuji@77 1033 (cond
yuuji@77 1034 (type
yuuji@77 1035 (delete-region (point) (- (point) paren-length))
yuuji@77 1036 (insert (cdr type)))
yuuji@77 1037 (t
yuuji@77 1038 (delete-region (- (point) length) (- (point) paren-length))
yuuji@77 1039 (backward-char paren-length)
yuuji@77 1040 (insert-string newsize)
yuuji@77 1041 (if big-p (insert ?r))
yuuji@77 1042 (forward-char paren-length)))
yuuji@69 1043 (if (string= lr "l") (backward-list)))
yuuji@69 1044 (modify-syntax-entry ?\\ backslash-syntax))
yuuji@69 1045 t)))
yuuji@69 1046
yuuji@69 1047 (defun YaTeX-insert-amsparens-region (beg end char)
yuuji@69 1048 (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ")
yuuji@69 1049 (let* ((case-fold-search)
yuuji@69 1050 (st (cond ((char-equal char ?l) "big")
yuuji@69 1051 ((char-equal char ?L) "Big")
yuuji@69 1052 ((char-equal char ?h) "bigg")
yuuji@69 1053 ((char-equal char ?H) "Bigg"))))
yuuji@69 1054 (if st
yuuji@69 1055 (YaTeX-insert-braces-region
yuuji@69 1056 beg end (concat "\\" st "l(") (concat "\\" st "r)"))
yuuji@69 1057 (YaTeX-insert-braces-region beg end "(" ")"))))
yuuji@69 1058
yuuji@69 1059 (defun YaTeX-insert-amsbraces-region (beg end char)
yuuji@69 1060 (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ")
yuuji@69 1061 (let* ((case-fold-search)
yuuji@69 1062 (st (cond ((char-equal char ?l) "big")
yuuji@69 1063 ((char-equal char ?L) "Big")
yuuji@69 1064 ((char-equal char ?h) "bigg")
yuuji@69 1065 ((char-equal char ?H) "Bigg"))))
yuuji@69 1066 (if st
yuuji@69 1067 (YaTeX-insert-braces-region
yuuji@69 1068 beg end (concat "\\" st "l\\{") (concat "\\" st "r\\}"))
yuuji@69 1069 (YaTeX-insert-braces-region beg end "\\{" "\\}"))))
yuuji@69 1070
yuuji@69 1071 (defun YaTeX-insert-amsbrackets-region (beg end char)
yuuji@69 1072 (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ")
yuuji@69 1073 (let* ((case-fold-search)
yuuji@69 1074 (st (cond ((char-equal char ?l) "big")
yuuji@69 1075 ((char-equal char ?L) "Big")
yuuji@69 1076 ((char-equal char ?h) "bigg")
yuuji@69 1077 ((char-equal char ?H) "Bigg"))))
yuuji@69 1078 (if st
yuuji@69 1079 (YaTeX-insert-braces-region
yuuji@69 1080 beg end (concat "\\" st "l[") (concat "\\" st "r]"))
yuuji@69 1081 (YaTeX-insert-braces-region beg end "[" "]"))))
yuuji@69 1082
yuuji@69 1083
yuuji@11 1084 ;;
yuuji@11 1085 (provide 'yatexmth)
yuuji@13 1086
yuuji@13 1087 ; Local variables:
yuuji@13 1088 ; fill-prefix: ";;; "
yuuji@13 1089 ; paragraph-start: "^$\\| \\|;;;$"
yuuji@13 1090 ; paragraph-separate: "^$\\| \\|;;;$"
yuuji@13 1091 ; End: