yuuji@395: ;;; yatexmth.el --- YaTeX math-mode-specific functions -*- coding: sjis -*- yuuji@287: ;;; yuuji@558: ;;; (c)1993-2018 by HIROSE Yuuji [yuuji@yatex.org] yuuji@558: ;;; Last modified Tue Dec 25 20:02:12 2018 on firestorm yuuji@366: ;;; $Id$ yuuji@11: yuuji@287: ;;; Commentary: yuuji@13: ;;; [Customization guide] yuuji@13: ;;; yuuji@13: ;;; By default, you can use two completion groups in YaTeX math yuuji@52: ;;; mode, `;' for mathematical signs and `:' for greek letters. But yuuji@13: ;;; you can add other completion groups by defining the alist of yuuji@13: ;;; `prefix key' vs `completion list' into the variable yuuji@13: ;;; YaTeX-math-key-list-private. If you wish to accomplish the yuuji@23: ;;; completion as follows(prefix key is `,'): yuuji@13: ;;; yuuji@13: ;;; KEY COMPLETION yuuji@13: ;;; s \sin yuuji@13: ;;; S \arcsin yuuji@13: ;;; c \cos yuuji@13: ;;; C \arccos yuuji@13: ;;; : yuuji@13: ;;; T \arctan yuuji@13: ;;; l \log yuuji@13: ;;; hs \sinh yuuji@13: ;;; yuuji@23: ;;; Typing `s' after `,' makes `\sin', `hs' after `,' makes `\sinh' yuuji@13: ;;; and so on. First, you have to define list of key-completion yuuji@13: ;;; pairs. Variable name(YaTeX-math-funcs-list) is arbitrary. yuuji@13: ;;; yuuji@13: ;;; (setq YaTeX-math-funcs-list yuuji@13: ;;; '(("s" "sin") yuuji@13: ;;; ("S" "arcsin") yuuji@13: ;;; : yuuji@13: ;;; ("hs" "sinh"))) yuuji@13: ;;; yuuji@13: ;;; Next, define the list of prefix-key vs completion list(defined yuuji@13: ;;; above) into the variable YaTeX-math-key-list-private. yuuji@13: ;;; yuuji@13: ;;; (setq YaTeX-math-key-list-private yuuji@23: ;;; '(("," . YaTeX-math-funcs-list) yuuji@13: ;;; ("'" . Other-List-if-any))) yuuji@13: ;;; yuuji@13: ;;; Put these expressions into your ~/.emacs, and you can use this yuuji@51: ;;; completion in the math-mode. yuuji@13: ;;; yuuji@13: ;;; And you can add your favorite completion sequences to the yuuji@23: ;;; default completion list invoked with `;', by defining those lists yuuji@13: ;;; into variable YaTeX-math-sign-alist-private. yuuji@13: yuuji@13: ;;; 【イメージ補完の追加方法】 yuuji@13: ;;; yuuji@52: ;;; 標準のイメージ補完では、「;」で始まる数式記号補完と、「:」で始 yuuji@13: ;;; まるギリシャ文字補完が使用可能ですが、これ以外の文字で始まる補完 yuuji@23: ;;; シリーズも定義することができます。例えば、「,」で始まる次のよう yuuji@13: ;;; な補完シリーズを定義する場合を考えてみます。 yuuji@13: ;;; yuuji@13: ;;; 補完キー 補完結果 yuuji@13: ;;; s \sin yuuji@13: ;;; S \arcsin yuuji@13: ;;; c \cos yuuji@13: ;;; C \arccos yuuji@13: ;;; : yuuji@13: ;;; T \arctan yuuji@13: ;;; l \log yuuji@13: ;;; hs \sinh yuuji@13: ;;; yuuji@23: ;;; 「,」のあとに s を押すと \sin が、hs を押すと \sinh が入力されま yuuji@13: ;;; す。このような補完リストの登録は以下のようにします(変数名は任意)。 yuuji@13: ;;; yuuji@13: ;;; (setq YaTeX-math-funcs-list yuuji@13: ;;; '(("s" "sin") yuuji@13: ;;; ("S" "arcsin") yuuji@13: ;;; : yuuji@13: ;;; ("hs" "sinh"))) yuuji@13: ;;; yuuji@23: ;;; さらに、「,」を押した時にイメージ補完が始まるよう次の変数に、起動キー yuuji@13: ;;; と上で定義した補完用変数の登録を行ないます。 yuuji@13: ;;; yuuji@13: ;;; (setq YaTeX-math-key-list-private yuuji@23: ;;; '(("," . YaTeX-math-funcs-list) yuuji@13: ;;; ("'" . ほかに定義したいシリーズがあれば…))) yuuji@13: ;;; yuuji@51: ;;; これらを ~/.emacs に書いておけば、math-mode で自分専用のイメージ yuuji@51: ;;; 補完が利用できます。 yuuji@13: yuuji@287: ;;; Code: yuuji@13: (defvar YaTeX-jisold yuuji@13: (and (boundp 'dos-machine-type) yuuji@13: (eq dos-machine-type 'pc98))) yuuji@13: yuuji@13: (defmacro YaTeX-setq-math-sym (sym old new) yuuji@13: (list 'setq sym (list 'if 'YaTeX-jisold old new))) yuuji@13: yuuji@13: (YaTeX-setq-math-sym YaTeX-image-in "E" "∈") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-ni "ヨ" "∋") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-subset " _\n(\n ~" "⊂") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-subseteq " _\n(_\n ~" "⊆") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-supset "_\n )\n~" "⊃") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-supseteq "_\n_)\n~" "⊇") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-nabla "___\n\\\\/" "∇") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-partial " -+\n+-+\n+-+" "∂") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-dagger "+\n|" "†") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-ddagger "+\n+\n|" "‡") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-equiv "=\n ̄" "≡") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-int " /\\\n \\\n\\/" "∫") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-bot "|\n ̄" "⊥") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-neg "イ" "¬") yuuji@13: (YaTeX-setq-math-sym YaTeX-image-flat "b" "♭") yuuji@23: (YaTeX-setq-math-sym YaTeX-image-sqrt "" "√") yuuji@80: (defvar YaTeX-image-nearrow '("__\n /|\n/" " _\n /|\n/" )) yuuji@80: (defvar YaTeX-image-nwarrow '(" __\n|\\\n \\" " _\n|\\n \")) yuuji@80: (defvar YaTeX-image-searrow '("\\\n \\|\n--`" "\\n \|\n  ̄")) yuuji@80: (defvar YaTeX-image-swarrow '(" /\n|/\n'~~" " /\n|/\n  ̄")) yuuji@80: yuuji@13: yuuji@52: (defvar yuuji@13: YaTeX-math-sign-alist-default yuuji@11: '( yuuji@11: ;frequently used yuuji@11: ("||" "|" ("||" "‖")) yuuji@11: ("sum" "sum" ("\\-+\n >\n/-+" "Σ")) yuuji@11: ("sigma" "sum" ("\\-+\n >\n/-+" "Σ")) yuuji@13: ("integral" "int" (" /\\\n \\\n\\/" YaTeX-image-int)) yuuji@11: ("ointegral" "oint" " /\\\n(\\)\n\\/") yuuji@23: ("sqrt" "sqrt" (" __\n,/" YaTeX-image-sqrt)) yuuji@23: ("root" "sqrt" (" __\n,/" YaTeX-image-sqrt)) yuuji@11: ("A" "forall" "|_|\nV") yuuji@11: ("E" "exists" "-+\n-+\n-+") yuuji@13: ("!" "neg" ("--+\n |" YaTeX-image-neg)) yuuji@11: ("oo" "infty" ("oo" "∞")) yuuji@11: ("\\" "backslash" ("\\" "\")) yuuji@68: ("..." "cdots" ("..." "…")) yuuji@11: yuuji@11: ;;binary operators yuuji@11: ("+-" "pm" ("+\n-" "±")) yuuji@11: ("-+" "mp" "-\n+") yuuji@11: ("x" "times" ("x" "×")) yuuji@11: ("/" "div" (",\n-\n'" "÷")) yuuji@23: ("f" "frac" "xxx\n---\nyyy" "÷") yuuji@11: ("*" "ast" "*") yuuji@11: ("#" "star" ("_/\\_\n\\ /\n//\\\\" "★")) yuuji@11: ("o" "circ" "o") yuuji@11: ("o*" "bullet" " _\n(*)\n ~") yuuji@11: ("." "cdot" ".") yuuji@11: ("cap" "cap" "/-\\\n| |") yuuji@11: ("cup" "cup" "| |\n\\-/") yuuji@11: ("u+" "uplus" "|+|\n\\-/") yuuji@11: ("|~|" "sqcap" "|~|") yuuji@11: ("|_|" "sqcup" "|_|") yuuji@11: ("v" "vee" "v") yuuji@11: ("^" "wedge" "^") yuuji@11: ("\\\\" "setminus" "\\") yuuji@11: (")(" "wr" " )\n(") yuuji@11: ("<>" "diamond" "<>") yuuji@128: ("/\\-" "bigtriangleup" ("/\\\n~~" "△")) yuuji@11: ("-\\/" "bigtriangledown" ("__\n\\/" "▽")) yuuji@11: ("<|" "triangleleft" "<|") yuuji@11: ("|>" "triangleright" "|>") yuuji@11: ("<||" "lhd" "/|\n\\|") yuuji@11: ("||>" "rhd" "|\\\n|/") yuuji@11: ("<|-" "unlhd" "<|\n~~") yuuji@11: ("|>-" "unrhd" "|>\n~~") yuuji@11: ("o+" "oplus" " _\n(+)\n ~") yuuji@11: ("o-" "ominus" " _\n(-)\n ~") yuuji@11: ("ox" "otimes" " _\n(x)\n ~") yuuji@11: ("o/" "oslash" " _\n(/)\n ~") yuuji@11: ("o." "odot" "(.)") yuuji@11: ("O" "bigcirc" "O") yuuji@13: ("t" "dagger" ("+\n|" YaTeX-image-dagger)) yuuji@13: ("tt" "ddagger" ("+\n+\n|" YaTeX-image-ddagger)) yuuji@11: ("II" "amalg" "II") yuuji@11: ; : yuuji@11: ;;relational operators yuuji@134: ("<" "leq" ("<\n-" "<\n-")) yuuji@134: ("=<" "leqq" ("<\n=" "≦")) yuuji@134: (">" "geq" (">\n-" ">\n-")) yuuji@134: (">=" "geqq" (">\n=" "≧")) yuuji@143: ("=:" "fallingdotseq" (".\n==\n ." "≒")) yuuji@13: ("-=" "equiv" ("=\n-" YaTeX-image-equiv)) yuuji@13: ("=-" "equiv" ("=\n-" YaTeX-image-equiv)) yuuji@13: ("---" "equiv" ("=\n-" YaTeX-image-equiv)) yuuji@13: ("(" "subset" (" _\n(\n ~" YaTeX-image-subset)) yuuji@13: ("(-" "subseteq" (" _\n(_\n ~" YaTeX-image-subseteq)) yuuji@13: (")" "supset" ("_\n )\n~" YaTeX-image-supset)) yuuji@13: (")-" "supseteq" ("_\n_)\n~" YaTeX-image-supseteq)) yuuji@11: ("[" "sqsubset" "[") yuuji@11: ("[-" "sqsubseteq" "[\n~") yuuji@11: ("]" "sqsupset" "]") yuuji@11: ("]-" "sqsupseteq" "]\n~") yuuji@13: ("{" "in" ("(-" YaTeX-image-in)) yuuji@13: ("}" "ni" ("-)" YaTeX-image-ni)) yuuji@11: ("|-" "vdash" "|-") yuuji@11: ("-|" "dashv" "-|") yuuji@11: ("~" "sim" "~(tild)") yuuji@11: ("~-" "simeq" "~\n-") yuuji@11: ("asymp" "asymp" "v\n^") yuuji@11: ("~~" "approx" "~\n~") yuuji@11: ("~=" "cong" "~\n=") yuuji@11: ("=/" "neq" ("=/=" "≠")) yuuji@11: (".=" "doteq" ".\n=") yuuji@11: ("o<" "propto" "o<") yuuji@11: ("|=" "models" "|=") yuuji@11: ("_|_" "perp" "_|_") yuuji@11: ("|" "mid" "|") yuuji@11: ("||" "parallel" "||") yuuji@11: ("bowtie" "bowtie" "|><|(wide)") yuuji@11: ("|><|" "join" "|><|") yuuji@11: ("\\_/" "smile" "\\_/") yuuji@11: ("/~\\" "frown" "/~~\\") yuuji@11: ("-<" "prec" ("-<" "く")) yuuji@11: ("-<=" "preceq" ("-<\n-" "く\n=")) yuuji@11: ("<<" "ll" ("<<" "《")) yuuji@134: ("<<" "lll" "<<<") yuuji@80: (">>" "gg" (">>" "》")) yuuji@134: (">>>" "ggg" ">>>") yuuji@11: ; : yuuji@11: ;;arrows yuuji@11: ("<-" "leftarrow" ("<-" "←")) yuuji@13: ("\C-b" "leftarrow" ("<-" "←")) yuuji@13: ("<--" "longleftarrow" ("<--" "←--")) yuuji@11: ("<=" "Leftarrow" "<=") yuuji@11: ("<==" "Longleftarrow" "<==") yuuji@11: ("->" "rightarrow" ("->" "→")) yuuji@13: ("\C-f" "rightarrow" ("->" "→")) yuuji@11: ("-->" "longrightarrow" ("-->" "--→")) yuuji@64: ("=>" "Rightarrow" "=>") yuuji@11: ("==>" "Longrightarrow" "==>") yuuji@11: ("<->" "leftrightarrow" ("<->" "←→")) yuuji@11: ("<-->" "longleftrightarrow" ("<---->" "←--→")) yuuji@47: ("<=>" "Leftrightarrow" "<=>") yuuji@11: ("<==>" "Longleftrightarrow" "<==>") yuuji@11: ("^|" "uparrow" ("^\n|" "↑")) yuuji@13: ("\C-p" "uparrow" ("^\n|" "↑")) yuuji@11: ("^||" "Uparrow" "/\\\n||") yuuji@11: ("\C-n" "downarrow" ("|\nv" "↓")) yuuji@13: ("v|" "downarrow" ("|\nv" "↓")) yuuji@13: ("v||" "Downarrow" "||\n\\/") yuuji@80: ("\C-p\C-f" "nearrow" YaTeX-image-nearrow) yuuji@80: ("\C-f\C-p" "nearrow" YaTeX-image-nearrow) yuuji@80: ("ne" "nearrow" YaTeX-image-nearrow) yuuji@80: ("\C-p\C-b" "nwarrow" YaTeX-image-nwarrow) yuuji@80: ("\C-b\C-p" "nwarrow" YaTeX-image-nwarrow) yuuji@80: ("nw" "nwarrow" YaTeX-image-nwarrow) yuuji@80: ("\C-n\C-f" "searrow" YaTeX-image-searrow) yuuji@80: ("\C-f\C-n" "searrow" YaTeX-image-searrow) yuuji@80: ("se" "searrow" YaTeX-image-searrow) yuuji@80: ("\C-n\C-b" "swarrow" YaTeX-image-swarrow) yuuji@80: ("\C-b\C-n" "swarrow" YaTeX-image-swarrow) yuuji@80: ("sw" "swarrow" YaTeX-image-swarrow) yuuji@11: ("|->" "mapsto" ("|->" "|→")) yuuji@11: ("<-)" "hookleftarrow" (" ,\n<--+" " ヽ\n<--/")) yuuji@69: ("(->" "hookrightarrow" ("`\n+-->" "/\n\-->")) yuuji@11: ("/-" "leftharpoonup" "/\n~~~") yuuji@11: ("\\-" "leftharpoondown" "__\n\\") yuuji@11: ("-/" "rightharpoondown" "__\n/") yuuji@11: ("-\\" "rightharpoonup" "~~\n\\") yuuji@53: ;;left and right yuuji@53: ("left" "left" "(leftmark)") yuuji@53: ("right" "right" "(rightmark)") yuuji@68: ;;accent marks yuuji@68: ("tilde" "tilde" "~\n?") yuuji@68: ("T" "tilde" "~\n?") yuuji@68: ("wtilde" "widetilde" "~\n?") yuuji@68: ("hat" "hat" "^\n?") yuuji@68: ("what" "widehat" "/\\\n??") yuuji@68: ("w^" "widehat" "/\\\n?") yuuji@68: ("check" "check" "v\n?") yuuji@68: ("bar" "bar" "_\n?") yuuji@68: ("overline" "overline" "_\n?") yuuji@68: ("wbar" "overline" "--\n??") yuuji@68: ("dot" "dot" ".\n?") yuuji@68: ("ddot" "ddot" "..\n??") yuuji@68: ("vec" "vec" ("->\n??" "→\n??")) yuuji@68: ("~>" "overrightarrow" ("-->\nAB" "→\nAB")) yuuji@68: ("VEC" "overrightarrow" ("-->\nAB" "→\nAB")) yuuji@68: ;;rage-aware stuffs yuuji@68: ("prod" "prod" ("-+--+-\n | |" "Π")) yuuji@68: ("CUP" "bigcup" "|~~|\n| |\n| |") yuuji@68: ("union" "bigcup" "|~~|\n| |\n| |") yuuji@68: ("CAP" "bigcap" "| |\n| |\n|__|") yuuji@68: ("isc" "bigcap" "| |\n| |\n|__|") yuuji@68: ("O+" "bigoplus" "/~~~\\\n| + |\n\\___/") yuuji@68: ("Ox" "bigotimes" "/~~~\\\n| X |\n\\___/") yuuji@68: ;;other marks yuuji@80: ("angle" "angle" ("/\n~" "∠")) yuuji@80: ("/_" "angle" ("/\n~" "∠")) yuuji@11: ("Z" "aleph" "|\\|") yuuji@11: ("|\\|" "aleph" "|\\|") yuuji@11: ("h-" "hbar" "_\nh") yuuji@68: ; ("i" "imath" "i") ;These chars are appeared only yuuji@68: ; ("j" "jmath" "j") ;as section-type arguments yuuji@11: ("l" "ell" "l") yuuji@11: ("wp" "wp" "???") yuuji@11: ("R" "Re" ")R") yuuji@11: ("Im" "Im" "???") yuuji@11: ("mho" "mho" "~|_|~") yuuji@11: ("'" "prime" "'") yuuji@11: ("0" "emptyset" "0") yuuji@13: ("nabla" "nabla" ("___\n\\\\/" YaTeX-image-nabla)) yuuji@11: ("\\/" "surd" "-\\/") yuuji@11: ("surd" "surd" "-\\/") yuuji@11: ("top" "top" "T") yuuji@13: ("bot" "bot" ("_|_" YaTeX-image-bot)) yuuji@13: ("b" "flat" ("b" YaTeX-image-flat)) yuuji@11: ("LT" "natural" "|\nLT\n |") yuuji@13: ("6" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial)) yuuji@13: ("partial" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial)) yuuji@13: ("round" "partial" (" -+\n+-+\n+-+" YaTeX-image-partial)) yuuji@59: ("[]" "Box" "[]") yuuji@80: ("no" "notag" "\\notag") yuuji@80: (":" "colon" ":") yuuji@305: (".'." "therefore" (".'." "∴")) yuuji@305: ("'.'" "because" ("'.'" "∵")) yuuji@11: ("Diamond" "Diamond" "/\\\n\\/") yuuji@11: ("3" "triangle" "/\\\n~~") yuuji@11: ("C" "clubsuit" " o\no+o\n |") yuuji@11: ("D" "diamondsuit" "/\\\n\\/") yuuji@11: ("H" "heartsuit" "<^^>\n \\/") yuuji@11: ("S" "spadesuit" " /\\\n<++>\n /\\") yuuji@229: ("mi" "mathit" "\\mathit{}") yuuji@229: ("mr" "mathrm" "\\mathrm{}") yuuji@229: ("mb" "mathbf" "\\mathbf{}") yuuji@456: ("mB" "mathbb" "\\mathbb{}") yuuji@229: ("mt" "mathtt" "\\mathtt{}") yuuji@229: ("ms" "mathsf" "\\mathsf{}") yuuji@229: ("mc" "mathcal" "\\mathcal{}") yuuji@229: ("mn" "mathnormal" "\\mathnormal{}") yuuji@52: ) yuuji@52: "Default LaTeX-math-command alist.") yuuji@11: yuuji@13: (defvar YaTeX-math-sign-alist-private nil yuuji@11: "*User definable key vs LaTeX-math-command alist.") yuuji@11: yuuji@11: (defvar YaTeX-math-quit-with-strict-match nil yuuji@11: "*T for quitting completion as soon as strict-match is found.") yuuji@52: (defvar YaTeX-math-sign-alist yuuji@13: (append YaTeX-math-sign-alist-private YaTeX-math-sign-alist-default)) yuuji@11: yuuji@13: ;;(defun YaTeX-math-alist2array (alist array) yuuji@13: ;; (set array yuuji@13: ;; (let ((array (make-vector (length alist) "")) (list alist) (i 0)) yuuji@13: ;; (while list yuuji@13: ;; (aset array i (car (car list))) yuuji@13: ;; (setq i (1+ i) list (cdr list))) yuuji@13: ;; array)) yuuji@13: ;;) yuuji@11: yuuji@52: (defvar YaTeX-greek-key-alist-default yuuji@460: (append yuuji@461: '(("a" "alpha" ("a" "α")) yuuji@460: ("b" "beta" ("|>\n|>\n|" "β")) yuuji@460: ("g" "gamma" ("~r" "γ")) yuuji@460: ("G" "Gamma" ("|~" "Γ")) yuuji@460: ("d" "delta" ("<~\n<>" "δ")) yuuji@460: ("D" "Delta" ("/\\\n~~" "Δ")) yuuji@460: ("e" "epsilon" "<\n<~") yuuji@461: ("e-" "varepsilon" ("(\n(~" "_ε")) yuuji@460: ("z" "zeta" ("(~\n >" "ζ")) yuuji@460: ("et" "eta" ("n\n/" "η")) yuuji@460: ("th" "theta" ("8" "θ")) yuuji@460: ("Th" "Theta" ("(8)" "Θ")) yuuji@461: ("th-" "vartheta" ("-8" "_θ")) yuuji@460: ("i" "iota" ("i\n\\_/" "ι")) yuuji@460: ("k" "kappa" ("k" "κ")) yuuji@460: ("l" "lambda" ("\\n/\\" "λ")) yuuji@460: ("L" "Lambda" ("/\\" "Λ")) yuuji@460: ("m" "mu" (" u_\n/" "μ")) yuuji@460: ("n" "nu" ("|/" "ν")) yuuji@460: ("x" "xi" ("E\n >" "ξ")) yuuji@460: ("X" "Xi" ("---\n -\n---" "Ξ")) yuuji@460: ("p" "pi" ("__\n)(" "π")) yuuji@460: ("P" "Pi" ("__\n||" "Π")) yuuji@461: ("p-" "varpi" ("__\n/(" "_π")) yuuji@460: ("r" "rho" ("/O" "ρ")) yuuji@460: ("r-" "varrho" ("/O\n~~" "ρ\n~~")) yuuji@460: ("s" "sigma" ("o~" "σ")) yuuji@460: ("S" "Sigma" ("\\-+\n >\n/-+" "Σ")) yuuji@461: ("s-" "varsigma" "/~~ \n /") yuuji@460: ("t" "tau" ("__\n(" "τ")) yuuji@460: ("u" "upsilon" ("~v" "υ")) yuuji@460: ("y" "upsilon" ("~v" "υ")) yuuji@460: ("U" "Upsilon" ("~Y~" "Υ")) yuuji@460: ("Y" "Upsilon" ("~Y~" "Υ")) yuuji@460: ("ph" "phi" (" /\n(/)\n/" "φ")) yuuji@460: ("Ph" "Phi" (" _\n(|)\n ~" "Φ")) yuuji@460: ("ph-" "varphi" "\\O\n|") yuuji@460: ("c" "chi" ("x" "χ")) yuuji@460: ("ps" "psi" ("\\|/\\n |" "ψ")) yuuji@460: ("Ps" "Psi" (" ~\n\\|/\\n |" "Ψ")) yuuji@460: ("o" "omega" ("w" "ω")) yuuji@460: ("w" "omega" ("w" "ω")) yuuji@460: ("O" "Omega" ("(~)\n~ ~" "Ω")) yuuji@460: ("W" "Omega" ("(~)\n~ ~" "Ω")) yuuji@461: ("f" "foo")) yuuji@460: (if YaTeX-use-AMS-LaTeX yuuji@460: '( yuuji@460: ("G-" "varGamma" ("/~" "_Γ")) yuuji@460: ("D-" "varDelta" ("/|\n~~" "_Δ")) yuuji@460: ("Th-" "varTheta" ("/8/" "_Θ")) yuuji@460: ("L-" "varLambda" ("/|" "_Λ")) yuuji@460: ("X-" "varXi" (" --\n -\n-- " "_Ξ")) yuuji@460: ("S-" "varSigma" (" \\-+\n >\n/-+" "_Σ")) yuuji@460: ("U-" "varUpsilon" ("~~Y~" "_Υ")) yuuji@460: ("Ph-" "varPhi" (" _\n(|)\n~" "_Φ")) yuuji@460: ("Ps-" "varPsi" (" ~\n\\//\\n /" "Ψ")) yuuji@460: ("O-" "varOmega" ("/~/\n~ ~" "_Ω"))))) yuuji@52: "Default LaTeX-math-command alist.") yuuji@13: yuuji@13: (defvar YaTeX-greek-key-alist-private nil yuuji@13: "*User definable key vs LaTeX-math-command alist.") yuuji@13: yuuji@52: (defvar YaTeX-greek-key-alist yuuji@13: (append YaTeX-greek-key-alist-private YaTeX-greek-key-alist-default)) yuuji@13: yuuji@13: ;;(mapcar (function (lambda (x) (YaTeX-math-alist2array x))) yuuji@13: ;; YaTeX-math-key-list) yuuji@13: yuuji@52: (defvar YaTeX-math-indicator "KEY\tLaTeX sequence\t\tsign") yuuji@11: yuuji@11: (defvar YaTeX-math-need-image t yuuji@11: "*T for displaying pseudo image momentarily.") yuuji@11: (defvar YaTeX-math-max-key 8) yuuji@11: (defvar YaTeX-math-max-seq yuuji@11: (* 8 (1+ (/ (length "\\longleftrightarrow") 8)))) yuuji@11: (defvar YaTeX-math-max-sign 5) yuuji@11: (defvar YaTeX-math-sign-width yuuji@11: (+ YaTeX-math-max-key YaTeX-math-max-seq YaTeX-math-max-sign)) yuuji@11: (defvar YaTeX-math-display-width yuuji@11: (* 8 (1+ (/ YaTeX-math-sign-width 8)))) yuuji@11: (defvar YaTeX-math-menu-map nil yuuji@80: "Keymap used in YaTeX mathematical sign menu mode.") yuuji@80: yuuji@11: (if YaTeX-math-menu-map nil yuuji@11: (setq YaTeX-math-menu-map (make-sparse-keymap)) yuuji@11: (define-key YaTeX-math-menu-map "n" 'next-line) yuuji@11: (define-key YaTeX-math-menu-map "p" 'previous-line) yuuji@11: (define-key YaTeX-math-menu-map "f" 'YaTeX-math-forward) yuuji@11: (define-key YaTeX-math-menu-map "b" 'YaTeX-math-backward) yuuji@11: (define-key YaTeX-math-menu-map "v" 'scroll-up) yuuji@11: (define-key YaTeX-math-menu-map " " 'scroll-up) yuuji@11: (define-key YaTeX-math-menu-map "c" 'scroll-up) yuuji@11: (define-key YaTeX-math-menu-map "V" 'scroll-down) yuuji@11: (define-key YaTeX-math-menu-map "r" 'scroll-down) yuuji@11: (define-key YaTeX-math-menu-map "\^h" 'scroll-down) yuuji@11: (define-key YaTeX-math-menu-map "<" 'beginning-of-buffer) yuuji@11: (define-key YaTeX-math-menu-map ">" 'end-of-buffer) yuuji@11: (define-key YaTeX-math-menu-map "\^m" 'exit-recursive-edit) yuuji@11: (define-key YaTeX-math-menu-map "q" 'abort-recursive-edit)) yuuji@11: yuuji@13: (defvar YaTeX-math-exit-key "\e" yuuji@80: "*Key sequence after prefix key of YaTeX-math-mode to exit from math-mode.") yuuji@13: yuuji@11: (defmacro YaTeX-math-japanese-sign (list) yuuji@11: (list 'nth 1 list)) yuuji@11: yuuji@72: (defvar YaTeX-math-cmd-regexp (concat (regexp-quote YaTeX-ec) "[A-z|]")) yuuji@177: yuuji@177: ;;; alltt goes into YaTeX-verbatim-environments 2011/3/16 yuuji@177: ;;(defvar YaTeX-math-verbatim-environments yuuji@177: ;; '("alltt") yuuji@177: ;; "*List of environments in which LaTeX math mode is disabled. yuuji@177: ;;This value is appended with YaTeX-verbatim-environments.") yuuji@11: yuuji@13: ;;; yuuji@13: ;;YaTeX math-mode functions yuuji@13: ;;; yuuji@417: ;;;###autoload yuuji@13: (defun YaTeX-toggle-math-mode (&optional arg) yuuji@13: (interactive "P") yuuji@13: (or (memq 'YaTeX-math-mode mode-line-format) nil yuuji@13: (setq mode-line-format yuuji@13: (append (list "" 'YaTeX-math-mode) mode-line-format))) yuuji@23: (if YaTeX-auto-math-mode nil ;Only effective on manual mode. yuuji@23: (if (or arg (null YaTeX-math-mode)) yuuji@23: (let (keys) yuuji@23: (setq YaTeX-math-mode "math:") yuuji@23: (message "Turn on math mode. Prefix keys are %s" yuuji@23: (mapconcat 'car YaTeX-math-key-list " ")) yuuji@23: (sit-for 3) yuuji@23: (message yuuji@23: (concat "To exit from math-mode, type `ESC' after prefix, " yuuji@23: "or type `" yuuji@23: (key-description yuuji@23: (car yuuji@23: (where-is-internal yuuji@23: 'YaTeX-switch-mode-menu YaTeX-mode-map))) yuuji@23: " $'"))) yuuji@23: (setq YaTeX-math-mode nil) yuuji@23: (message "Exit from math mode.")) yuuji@80: (set-buffer-modified-p (buffer-modified-p)))) yuuji@13: yuuji@11: (defun YaTeX-math-forward (arg) yuuji@11: (interactive "p") yuuji@11: (re-search-forward YaTeX-math-cmd-regexp nil t arg)) yuuji@11: yuuji@11: (defun YaTeX-math-backward (arg) yuuji@11: (interactive "p") yuuji@11: (re-search-backward YaTeX-math-cmd-regexp nil t arg)) yuuji@11: yuuji@13: (defun YaTeX-math-gets (sign) yuuji@13: (cond yuuji@13: ((null sign) nil) yuuji@13: ((listp sign) yuuji@13: (setq sign yuuji@13: (cond yuuji@13: (YaTeX-japan (YaTeX-math-japanese-sign sign)) yuuji@13: (t (car sign)))) yuuji@13: (YaTeX-math-gets sign)) yuuji@13: ((symbolp sign) yuuji@13: (YaTeX-math-gets (symbol-value sign))) yuuji@80: (t sign))) yuuji@13: yuuji@11: (defun YaTeX-math-get-sign (list) yuuji@80: (YaTeX-math-gets (car (cdr-safe (cdr-safe list))))) yuuji@80: yuuji@77: (defvar YaTeX-math-section-type-regexp yuuji@77: "eqn\\\\\\sw+\\b" yuuji@77: "*Regexp of section-type math-mode macro") yuuji@77: yuuji@23: (defun YaTeX-in-math-mode-p () yuuji@80: "If current position is supposed to be in LaTeX-math-mode, return t. yuuji@80: This function refers a local variable `source-window' in YaTeX-make-section." yuuji@80: (save-excursion yuuji@80: (and (boundp 'source-window) source-window yuuji@80: (set-buffer (window-buffer source-window))) yuuji@80: (or (YaTeX-quick-in-environment-p yuuji@80: (append yuuji@80: '("math" "eqnarray" "equation" "eqnarray*" "displaymath") ;LaTeX yuuji@80: (if YaTeX-use-AMS-LaTeX yuuji@80: ;; And math modes of AMS-LaTeX yuuji@80: ;;'("align" "align*" "split" "multline" "multline*" "gather" yuuji@80: ;; "gather*" "aligned*" "gathered" "gathered*" "alignat" yuuji@80: ;; "equation*" "cases" "flalign" "flalign*" yuuji@80: ;; "alignat*" "xalignat" "xalignat*" "xxalignat" "xxalignat*" yuuji@80: YaTeX-math-begin-list yuuji@449: ) yuuji@450: YaTeX-math-other-env-list)) yuuji@130: (let*((p (point)) (nest 0) me0 r firstp dollar yuuji@80: (delim (concat YaTeX-sectioning-regexp "\\|^$\\|^\C-l")) yuuji@80: (boundary yuuji@80: (save-excursion yuuji@80: (if (looking-at delim) yuuji@80: (goto-char (max (point-min) (1- (point))))) yuuji@80: (re-search-backward delim nil 1) yuuji@80: (point)))) yuuji@80: (save-excursion yuuji@80: (cond yuuji@80: ((catch 'open yuuji@80: (save-excursion yuuji@80: (while (and (>= nest 0) yuuji@80: (re-search-backward yuuji@80: (concat YaTeX-ec-regexp ;\ yuuji@80: "\\([()]\\|[][]\\)") boundary t)) yuuji@80: (setq me0 (match-end 0)) yuuji@80: (if (or (YaTeX-on-comment-p) yuuji@80: (YaTeX-literal-p)) nil yuuji@80: (if (or (= (char-after (1- me0)) ?\)) yuuji@80: (= (char-after (1- me0)) ?\])) yuuji@80: (setq nest (1+ nest)) yuuji@80: (if (= (preceding-char) ?\\ ) nil ;;\\[5pt] yuuji@80: (setq nest (1- nest)))))) yuuji@130: (if (< nest 0) yuuji@130: (throw 'open (cons (YaTeX-match-string 0) (point))))))) yuuji@80: ((and (setq r (YaTeX-on-section-command-p yuuji@80: YaTeX-math-section-type-regexp)) yuuji@80: (numberp r) yuuji@80: (> r 0)) yuuji@80: t) yuuji@80: (t (catch 'dollar yuuji@80: (while ;(search-backward "$" boundary t);little bit fast. yuuji@80: (YaTeX-re-search-active-backward ;;;;;; Too slow??? yuuji@80: "\\$" (concat "[^\\\\]" YaTeX-comment-prefix) boundary t) yuuji@130: (setq dollar "$") yuuji@80: (cond yuuji@80: ((equal (char-after (1- (point))) ?$) ; $$ equation $$ yuuji@130: (setq dollar "$$") yuuji@80: (backward-char 1) yuuji@80: (setq nest (1+ nest))) yuuji@177: ((YaTeX-literal-p) yuuji@80: nil) yuuji@80: ((and (equal (char-after (1- (point))) ?\\ ) yuuji@80: (not (equal (char-after (- (point) 3)) ?\\ ))) yuuji@80: nil) ;\$ yuuji@130: (t (setq nest (1+ nest)))) yuuji@130: (if (and (= nest 1) (null firstp)) yuuji@130: (setq firstp (cons dollar (point))))) yuuji@130: (if (= (% nest 2) 1) yuuji@130: (throw 'dollar firstp)))))))))) yuuji@130: yuuji@130: (defun YaTeX-mark-mathenv () yuuji@130: "Mark current mathematic environment." yuuji@130: (interactive) yuuji@130: (let ((mmp (YaTeX-in-math-mode-p)) type bpt) yuuji@130: (if (or (null mmp) (not (stringp (setq type (car mmp))))) yuuji@130: nil ;if nil or not string, do nothing yuuji@130: (setq bpt (cdr mmp)) yuuji@130: (goto-char bpt) yuuji@130: (cond yuuji@130: ((string-match "\\$" type) yuuji@130: (set-mark-command nil) yuuji@130: (skip-chars-forward "$") yuuji@130: (YaTeX-search-active-forward yuuji@130: type YaTeX-comment-prefix nil) ;if it cause error, obey it yuuji@130: (goto-char (match-end 0))) yuuji@130: ;; yuuji@130: ((string-match "^\\\\[\\[(]" type) yuuji@130: (set-mark-command nil) yuuji@130: (YaTeX-goto-corresponding-leftright) yuuji@130: (skip-chars-forward "])\\\\")) yuuji@130: ;; yuuji@130: ((string-match "^[a-z]" type) ; \begin\end type math yuuji@130: (set-mark-command nil) yuuji@130: (YaTeX-goto-corresponding-environment) yuuji@130: (goto-char (match-end 0))))))) yuuji@23: yuuji@11: (defun YaTeX-math-display-list (list cols) yuuji@11: (goto-char (point-max)) yuuji@11: (if (= cols 0) (if (not (eolp)) (newline 1)) yuuji@11: (forward-line -1) yuuji@11: (while (looking-at "[ \t\n]") (forward-line -1))) yuuji@11: (end-of-line) yuuji@11: (let ((indent (* YaTeX-math-display-width cols)) sign str to) yuuji@11: (indent-to indent) yuuji@11: (insert (car list)) yuuji@11: (indent-to (setq indent (+ indent YaTeX-math-max-key))) yuuji@11: (insert "\\" (car (cdr list))) yuuji@11: (setq indent (+ indent YaTeX-math-max-seq)) yuuji@11: (setq sign (YaTeX-math-get-sign list)) yuuji@13: (while (and sign (not (string= "" sign))) yuuji@11: (setq to (string-match "\n" sign) yuuji@11: str (if to (substring sign 0 to) sign)) yuuji@11: (end-of-line) yuuji@11: (indent-to indent) yuuji@11: (insert str) yuuji@11: (cond ((eobp) (newline 1)) yuuji@11: ((> cols 0) (forward-line 1))) yuuji@11: (setq sign (if to (substring sign (1+ to)) ""))))) yuuji@11: yuuji@11: (defvar YaTeX-math-menu-buffer "*math-mode-signs*") yuuji@11: yuuji@11: (defun YaTeX-math-show-menu (match-str) yuuji@11: (save-window-excursion yuuji@59: (YaTeX-showup-buffer YaTeX-math-menu-buffer nil t) yuuji@70: (let ((maxcols (max 1 (/ (YaTeX-screen-width) YaTeX-math-sign-width))) yuuji@11: (case-fold-search nil) yuuji@13: (cols 0) (list alist) command) yuuji@11: (erase-buffer) yuuji@13: (insert yuuji@13: "Candidates of sign. [n:next p:prev f:forw b:back q:quit RET:select]\n") yuuji@11: (insert YaTeX-math-indicator "\t") yuuji@11: (insert YaTeX-math-indicator) yuuji@11: (newline 1) yuuji@70: (insert-char ?- (1- (YaTeX-screen-width))) yuuji@11: (newline 1) yuuji@11: (while list yuuji@11: (if (string-match match-str (car (car list))) yuuji@11: (progn (YaTeX-math-display-list (car list) cols) yuuji@11: (setq cols (% (1+ cols) maxcols)))) yuuji@11: (setq list (cdr list))) yuuji@178: (goto-char (point-min)) (forward-line 3) yuuji@11: (use-local-map YaTeX-math-menu-map) yuuji@60: (setq buffer-read-only t) yuuji@11: (unwind-protect yuuji@11: (recursive-edit) yuuji@11: (skip-chars-backward "^ \t\n") yuuji@11: (setq command yuuji@11: (if (re-search-forward YaTeX-math-cmd-regexp nil t) yuuji@11: (buffer-substring yuuji@11: (match-beginning 0) yuuji@11: (prog2 (skip-chars-forward "^ \t\n") (point))) yuuji@11: nil)) yuuji@11: (kill-buffer YaTeX-math-menu-buffer)) yuuji@80: command))) yuuji@11: yuuji@11: (defun YaTeX-math-show-image (image &optional exit-char) yuuji@11: "Momentarily display IMAGE at the beginning of the next line; yuuji@11: erase it on the next keystroke. The window is recentered if necessary yuuji@11: to make the whole string visible. If the window isn't large enough, yuuji@11: at least you get to read the beginning." yuuji@13: (if (and image (not (string= image ""))) yuuji@13: (let ((buffer-read-only nil) yuuji@13: (modified (buffer-modified-p)) yuuji@13: (name buffer-file-name) yuuji@13: insert-start yuuji@13: insert-end) yuuji@13: (unwind-protect yuuji@13: (progn yuuji@13: (save-excursion yuuji@13: ;; defeat file locking... don't try this at home, kids! yuuji@13: (setq buffer-file-name nil) yuuji@13: (forward-line 1) yuuji@13: (setq insert-start (point)) yuuji@13: (if (eobp) (newline)) yuuji@13: (insert image) yuuji@13: (setq insert-end (point))) yuuji@13: ; make sure the whole string is visible yuuji@13: (if (not (pos-visible-in-window-p insert-end)) yuuji@13: (recenter (max 0 yuuji@13: (- (window-height) yuuji@13: (count-lines insert-start insert-end) yuuji@13: 2)))) yuuji@13: (let ((char (read-char))) yuuji@13: (or (eq char exit-char) yuuji@292: (if (boundp 'unread-command-events) yuuji@292: (setq unread-command-events (list char)) yuuji@292: (setq unread-command-char char))))) yuuji@13: (if insert-end yuuji@13: (save-excursion yuuji@13: (delete-region insert-start insert-end))) yuuji@13: (setq buffer-file-name name) yuuji@13: (set-buffer-modified-p modified))))) yuuji@11: yuuji@52: (defun YaTeX-math-insert-sequence (&optional force initial) yuuji@23: "Insert math-mode sequence with image completion." yuuji@23: (interactive "P") yuuji@52: (let*((key (or initial "")) regkey str last-char list i yuuji@13: (case-fold-search nil) match sign yuuji@290: (this-key (char-to-string (YaTeX-last-key))) yuuji@60: (alistsym (cdr (assoc this-key YaTeX-math-key-list))) yuuji@60: (alistname (symbol-name alistsym)) yuuji@60: (alist (symbol-value alistsym)) yuuji@13: (n (length alist)) (beg (point)) result) yuuji@52: (if initial (insert YaTeX-ec (car (cdr (assoc initial alist))))) yuuji@60: (if (string-match "^YaTeX-" alistname) yuuji@60: (setq alistname (substring alistname (length "YaTeX-")))) yuuji@60: (setq alistname (substring alistname 0 (string-match "-" alistname))) yuuji@11: (setq result yuuji@11: (catch 'complete yuuji@23: (if (and (not force) yuuji@51: (if YaTeX-auto-math-mode yuuji@51: (not (YaTeX-in-math-mode-p)) yuuji@51: (not YaTeX-math-mode))) yuuji@23: (throw 'complete 'escape));this tag should be exit, but... yuuji@11: (while t yuuji@60: (message "%ssequence%s: %s" yuuji@60: (if YaTeX-simple-messages "" (concat alistname " ")) yuuji@56: (if YaTeX-simple-messages "" "(TAB for menu)") key) yuuji@11: (setq last-char (read-char) yuuji@11: key (concat key (char-to-string last-char)) yuuji@13: i 0) yuuji@11: (cond yuuji@13: ((string= key this-key) ;;invoke key itself yuuji@11: (throw 'complete 'escape)) yuuji@13: ((string= key YaTeX-math-exit-key) ;;exit from math-mode yuuji@13: (throw 'complete 'exit)) yuuji@23: ((string-match "\r" key) ;;RET = kakutei yuuji@23: (throw 'complete 'select)) yuuji@23: ((string-match "[\C-g\C-c]" key) ;;C-g = abort yuuji@23: (throw 'complete 'abort)) yuuji@23: ((string-match "[\t\n]" key) ;;TAB, LFD = menu yuuji@23: (throw 'complete 'menu)) yuuji@23: ((string-match "[\C-h\C-?]" key) ;;BS, DEL = BS yuuji@23: (if (< (length key) 2) (throw 'complete 'abort)) yuuji@13: (setq key (substring key 0 -2)))) yuuji@13: yuuji@13: (setq regkey (concat "^" (regexp-quote key))) yuuji@56: (message "Sequence%s: %s" yuuji@56: (if YaTeX-simple-messages "" "(TAB for menu)") key) yuuji@11: (if yuuji@11: (catch 'found yuuji@11: ;;(1)input string strictly matches with alist yuuji@23: (setq match (assoc key alist)) yuuji@23: ;;remember previous match yuuji@23: yuuji@11: ;;(2)search partial match into alist yuuji@13: (setq list alist) yuuji@11: (while (< i n) yuuji@11: (if (string-match yuuji@13: regkey yuuji@13: ;;(aref array i) yuuji@13: ;;(car (nth i alist)) yuuji@23: (car (car list))) yuuji@11: (progn yuuji@11: (or match yuuji@13: ;;(setq match (nth i alist)) yuuji@13: (setq match (car list))) yuuji@11: (throw 'found t))) yuuji@13: (setq i (1+ i) list (cdr list)))) ;catch 'found yuuji@11: nil ;;if any match, continue reading yuuji@11: ;;else reading of sequence has been done. yuuji@11: (message "complete.") yuuji@23: (throw 'complete t)) yuuji@23: yuuji@11: (if match yuuji@11: (progn (delete-region beg (point)) yuuji@80: (setq YaTeX-single-command (car (cdr match))) yuuji@80: (insert YaTeX-ec YaTeX-single-command) yuuji@13: (if (and YaTeX-math-need-image yuuji@13: (setq sign (YaTeX-math-get-sign match))) yuuji@13: (YaTeX-math-show-image (concat sign "\n"))) yuuji@11: ) yuuji@11: nil) yuuji@11: ))) yuuji@68: (delete-region beg (point)) yuuji@11: (cond yuuji@68: ((memq result '(t select)) yuuji@68: (if (eq result t) yuuji@292: (if (boundp 'unread-command-events) yuuji@292: (setq unread-command-events (list last-char)) yuuji@292: (setq unread-command-char last-char)) yuuji@68: (message "Done.")) yuuji@80: (if (assoc YaTeX-single-command section-table) yuuji@80: (YaTeX-make-section nil nil nil YaTeX-single-command) yuuji@68: (setq YaTeX-current-completion-type 'maketitle) yuuji@80: (YaTeX-make-singlecmd YaTeX-single-command))) yuuji@11: ((eq result 'abort) yuuji@11: (message "Abort.")) yuuji@11: ((eq result 'escape) yuuji@80: (call-interactively (lookup-key global-map this-key))) yuuji@13: ((eq result 'exit) yuuji@13: (YaTeX-toggle-math-mode)) yuuji@11: ((eq result 'menu) yuuji@11: (setq key (concat "^" (regexp-quote (substring key 0 -1)))) yuuji@68: (insert (YaTeX-math-show-menu key)))))) yuuji@52: yuuji@52: ;; ----- Change image completion types ----- yuuji@52: (defun YaTeX-math-member-p (item) yuuji@52: "Check if ITEM is a member of image completion. yuuji@52: If so return the cons of its invocation key and image-string." yuuji@52: (let ((lists YaTeX-math-key-list) list) yuuji@52: (catch 'found yuuji@52: (while lists yuuji@52: (setq list (symbol-value (cdr (car lists)))) yuuji@52: (while list yuuji@52: (if (string= item (nth 1 (car list))) yuuji@52: (throw 'found (cons (car (car lists)) (nth 0 (car list))))) yuuji@52: (setq list (cdr list))) yuuji@52: (setq lists (cdr lists)))))) yuuji@52: yuuji@193: ;;; ----- for AMS LaTeX (by matsumath.s.chiba-u.ac.jp) ----- yuuji@69: (defvar YaTeX-ams-paren-modifier yuuji@69: '(("Biggl" . "Biggr") ("biggl" . "biggr") yuuji@69: ("Bigl" . "Bigr") ("bigl" . "bigr") yuuji@69: ("left" . "right") ("" . "")) yuuji@69: "Alist of modifier of parentheses.") yuuji@69: yuuji@69: (defvar YaTeX-left-paren "(\\|\\[\\|\\\\{") yuuji@69: (defvar YaTeX-right-paren ")\\|\\]\\|\\\\}") yuuji@69: (defvar YaTeX-paren yuuji@69: (concat YaTeX-left-paren "\\|" YaTeX-right-paren)) yuuji@69: yuuji@69: (defun YaTeX-on-parenthesis-p () yuuji@69: "If cursor is on an (AMS-LaTeX) parenthesis, return the parenthesis." yuuji@69: (interactive) yuuji@69: (let* ((list YaTeX-ams-paren-modifier) yuuji@69: (longest 0) ;; the longest length of parenthesis command strings yuuji@69: (flag t) ;; flag for whether on braces not following \ yuuji@69: (point (point)) yuuji@69: (move 0) yuuji@69: (paren)) yuuji@69: (while list yuuji@69: (setq longest yuuji@69: (max longest (length (car (car list))) (length (cdr (car list))))) yuuji@69: (setq list (cdr list))) yuuji@69: (save-excursion yuuji@69: ;; search {} and, if it does not follow `\', set flag nil. yuuji@69: ;; if it is right after `\', set flag t and move to the position of \. yuuji@69: ;; mmmmm. yuuji@69: (if (looking-at "{\\|}") yuuji@69: (if (not (equal (char-after (1- (point))) 92)) yuuji@69: (setq flag nil) yuuji@69: (forward-char -1))) yuuji@69: ;; if flag is nil, do nothing. yuuji@69: (if (and flag (re-search-forward YaTeX-paren yuuji@69: (+ (point) 3 longest) t)) yuuji@69: (progn yuuji@69: (setq move (- (point) point)) yuuji@80: (setq paren (YaTeX-match-string 0)) yuuji@69: (setq list YaTeX-ams-paren-modifier) yuuji@69: ;; criterion for whether on [] () \{\} or not. yuuji@69: (if (string-match YaTeX-left-paren paren) yuuji@69: (while (and list flag) yuuji@69: (let* ((mod (car (car list))) yuuji@69: (mod-length 0) ;; length of modifier yuuji@69: paren-regexp ;; regexp of paren. yuuji@69: mod-regexp) ;; regexp of modifier. yuuji@69: (if (> (length mod) 0) yuuji@69: (setq mod-regexp (concat "\\\\" mod) yuuji@69: mod-length (1+ (length mod)))) yuuji@69: (cond ((string= paren "\\{") yuuji@69: (setq paren-regexp (concat "\\" paren))) yuuji@69: ((string= paren "[") yuuji@69: (setq paren-regexp "\\[")) yuuji@69: (t (setq paren-regexp paren))) yuuji@69: (save-excursion yuuji@69: (if (and (>= (- (point) (point-min)) yuuji@69: (+ mod-length (length paren))) yuuji@69: (not (forward-char yuuji@69: (- 0 mod-length (length paren)))) yuuji@69: (looking-at (concat "\\(" mod-regexp "\\)\\(" yuuji@69: paren-regexp "\\)"))) yuuji@69: (setq flag nil))) yuuji@69: (setq list (cdr list)))) yuuji@69: (while (and list flag) yuuji@69: (let* ((mod (cdr (car list))) yuuji@69: (mod-length 0) yuuji@69: paren-regexp yuuji@69: mod-regexp) yuuji@69: (if (> (length mod) 0) yuuji@69: (setq mod-regexp (concat "\\\\" mod) yuuji@69: mod-length (1+ (length mod)))) yuuji@69: (cond ((string= paren "\\}") yuuji@69: (setq paren-regexp (concat "\\" paren))) yuuji@69: ((string= paren "]") yuuji@69: (setq paren-regexp "\\]")) yuuji@69: (t (setq paren-regexp paren))) yuuji@69: (save-excursion yuuji@69: (if (and (>= (- (point) (point-min)) yuuji@69: (+ mod-length (length paren))) yuuji@69: (not (forward-char yuuji@69: (- 0 mod-length (length paren)))) yuuji@69: (looking-at (concat "\\(" mod-regexp "\\)\\(" yuuji@69: paren-regexp "\\)"))) yuuji@69: (setq flag nil))) yuuji@69: (setq list (cdr list))))) yuuji@80: (if (<= move (length (YaTeX-match-string 0))) yuuji@80: (YaTeX-match-string 0))))))) yuuji@69: yuuji@77: (defun YaTeX-goto-open-paren (&optional jumpto-co) yuuji@77: "Jump to the exact position of open parenthesis. yuuji@77: If optional argument JUMPTO-CO is non-nil, goto corresponding parentheses." yuuji@69: (interactive) yuuji@69: (let ((paren) yuuji@69: (backslash-syntax (char-to-string (char-syntax ?\\)))) yuuji@69: (if (setq paren (YaTeX-on-parenthesis-p)) yuuji@69: (if (string-match "(\\|{\\|\\[" paren (1- (length paren))) yuuji@69: (progn yuuji@69: (re-search-forward "(\\|{\\|\\[" (+ (point) (length paren)) t) yuuji@77: (backward-char) yuuji@77: (if jumpto-co yuuji@77: (unwind-protect yuuji@77: (progn yuuji@77: (modify-syntax-entry ?\\ " ") yuuji@77: (forward-list) yuuji@77: (backward-char)) yuuji@77: (modify-syntax-entry ?\\ backslash-syntax))) yuuji@77: (point)) yuuji@69: (re-search-forward ")\\|}\\|\\]" (+ (point) (length paren)) t) yuuji@69: (unwind-protect yuuji@69: (progn yuuji@69: (modify-syntax-entry ?\\ " ") yuuji@77: (backward-list) yuuji@77: (point)) yuuji@69: (modify-syntax-entry ?\\ backslash-syntax)))))) yuuji@69: yuuji@77: ;;;###autoload yuuji@77: (defun YaTeX-goto-corresponding-paren () yuuji@77: "Go to corresponding mathematical parentheses." yuuji@77: (if (YaTeX-on-parenthesis-p) yuuji@77: (YaTeX-goto-open-paren t) yuuji@77: nil)) yuuji@77: yuuji@69: (defun YaTeX-change-parentheses () yuuji@69: "Change the size of parentheses, braces, and brackets of AMS-LaTeX." yuuji@69: (interactive) yuuji@69: (if (not (and YaTeX-use-AMS-LaTeX (YaTeX-on-parenthesis-p))) yuuji@69: nil yuuji@80: (let* ((mod (YaTeX-match-string 1)) ;; modifier yuuji@80: (paren (if mod (YaTeX-match-string 2) (YaTeX-match-string 0))) ;; paren yuuji@69: (mod-length (if (or (string= mod "\\left") (string= mod "\\right")) yuuji@69: 5 ;; 5 in case left or right yuuji@69: (length mod))) ;; length of modifier yuuji@69: (paren-length (length paren)) ;; length of paren yuuji@69: (length (+ mod-length paren-length)) ;; length of whole string yuuji@69: (big-p t) ;; flag whether new modifier is "[Bb]ig+" or not. yuuji@69: size ;; left, big, Big etc. yuuji@77: type ;; parentheses type yuuji@69: lr ;; "l" or "r". yuuji@69: char newsize newsize-length yuuji@69: (backslash-syntax (char-to-string (char-syntax ?\\))) yuuji@69: (case-fold-search)) yuuji@69: ;; decide lr and size from mod and paren. yuuji@69: (cond ((string-match "\\(\\\\[Bb]ig+\\)[lr]" mod) yuuji@69: (setq size (substring mod 1 (match-end 1)) yuuji@69: lr (substring mod (match-end 1) (match-end 0)))) yuuji@69: ((string-match "\\\\left" mod) yuuji@69: (setq size "left-right" lr "l")) yuuji@69: ((string-match "\\\\right" mod) yuuji@69: (setq size "left-right" lr "r")) yuuji@69: ((string-match "(\\|\\[\\|\\\\{" paren) yuuji@69: (setq size "null" lr "l")) yuuji@69: ((string-match ")\\|\\]\\|\\\\}" paren) yuuji@69: (setq size "null" lr "r")) yuuji@69: (t yuuji@69: (setq size nil lr nil))) yuuji@69: (while (not newsize) yuuji@527: (message (concat "Change from %s: " yuuji@69: "l(big) L(Big) h(bigg) H(Bigg) " yuuji@527: "r(left-right) n(NONE) ( { [") size) yuuji@69: (setq char (read-char) yuuji@69: newsize (cond ((char-equal char ?l) "\\big") yuuji@69: ((char-equal char ?L) "\\Big") yuuji@69: ((char-equal char ?h) "\\bigg") yuuji@69: ((char-equal char ?H) "\\Bigg") yuuji@69: ((char-equal char ?r) yuuji@69: (setq big-p nil) "\\left") yuuji@77: ((memq char '(?\( ?\))) yuuji@77: (setq big-p nil type '("(" . ")")) "") yuuji@77: ((memq char '(?\{ ?\})) yuuji@77: (setq big-p nil type '("\\{" . "\\}")) "") yuuji@77: ((memq char '(?\[ ?\])) yuuji@77: (setq big-p nil type '("[" . "]")) "") yuuji@69: ((char-equal char ?n) yuuji@69: (setq big-p nil) "") yuuji@69: (t nil)) yuuji@69: newsize-length (length newsize))) yuuji@69: (YaTeX-goto-open-paren) yuuji@69: (forward-char) yuuji@77: (cond yuuji@77: (type yuuji@77: (delete-region (point) (- (point) paren-length)) yuuji@77: (save-excursion (insert (car type)))) yuuji@77: (t yuuji@77: (delete-region (- (point) length) (- (point) paren-length)) yuuji@77: (backward-char paren-length))) yuuji@558: (insert newsize) yuuji@69: (if big-p (insert ?l)) yuuji@69: (unwind-protect yuuji@69: (progn yuuji@69: (modify-syntax-entry ?\\ " ") yuuji@69: (forward-list) yuuji@69: (if (string= size "left-right") (setq length (1+ length))) yuuji@69: (if (eq char ?r) (setq newsize "\\right")) yuuji@77: (cond yuuji@77: (type yuuji@77: (delete-region (point) (- (point) paren-length)) yuuji@77: (insert (cdr type))) yuuji@77: (t yuuji@77: (delete-region (- (point) length) (- (point) paren-length)) yuuji@77: (backward-char paren-length) yuuji@558: (insert newsize) yuuji@77: (if big-p (insert ?r)) yuuji@77: (forward-char paren-length))) yuuji@69: (if (string= lr "l") (backward-list))) yuuji@69: (modify-syntax-entry ?\\ backslash-syntax)) yuuji@69: t))) yuuji@69: yuuji@69: (defun YaTeX-insert-amsparens-region (beg end char) yuuji@69: (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ") yuuji@69: (let* ((case-fold-search) yuuji@69: (st (cond ((char-equal char ?l) "big") yuuji@69: ((char-equal char ?L) "Big") yuuji@69: ((char-equal char ?h) "bigg") yuuji@69: ((char-equal char ?H) "Bigg")))) yuuji@69: (if st yuuji@69: (YaTeX-insert-braces-region yuuji@69: beg end (concat "\\" st "l(") (concat "\\" st "r)")) yuuji@69: (YaTeX-insert-braces-region beg end "(" ")")))) yuuji@69: yuuji@69: (defun YaTeX-insert-amsbraces-region (beg end char) yuuji@69: (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ") yuuji@69: (let* ((case-fold-search) yuuji@69: (st (cond ((char-equal char ?l) "big") yuuji@69: ((char-equal char ?L) "Big") yuuji@69: ((char-equal char ?h) "bigg") yuuji@69: ((char-equal char ?H) "Bigg")))) yuuji@69: (if st yuuji@69: (YaTeX-insert-braces-region yuuji@69: beg end (concat "\\" st "l\\{") (concat "\\" st "r\\}")) yuuji@69: (YaTeX-insert-braces-region beg end "\\{" "\\}")))) yuuji@69: yuuji@69: (defun YaTeX-insert-amsbrackets-region (beg end char) yuuji@69: (interactive "r\ncWhich one ? l(big) L(Big) h(bigg) H(Bigg): ") yuuji@69: (let* ((case-fold-search) yuuji@69: (st (cond ((char-equal char ?l) "big") yuuji@69: ((char-equal char ?L) "Big") yuuji@69: ((char-equal char ?h) "bigg") yuuji@69: ((char-equal char ?H) "Bigg")))) yuuji@69: (if st yuuji@69: (YaTeX-insert-braces-region yuuji@69: beg end (concat "\\" st "l[") (concat "\\" st "r]")) yuuji@69: (YaTeX-insert-braces-region beg end "[" "]")))) yuuji@69: yuuji@69: yuuji@11: ;; yuuji@11: (provide 'yatexmth) yuuji@13: yuuji@13: ; Local variables: yuuji@13: ; fill-prefix: ";;; " yuuji@13: ; paragraph-start: "^$\\| \\|;;;$" yuuji@13: ; paragraph-separate: "^$\\| \\|;;;$" yuuji@13: ; End: