diff options
Diffstat (limited to 'x-symbol/lisp/x-symbol-tex.el')
-rw-r--r-- | x-symbol/lisp/x-symbol-tex.el | 1291 |
1 files changed, 0 insertions, 1291 deletions
diff --git a/x-symbol/lisp/x-symbol-tex.el b/x-symbol/lisp/x-symbol-tex.el deleted file mode 100644 index d9c073f9..00000000 --- a/x-symbol/lisp/x-symbol-tex.el +++ /dev/null @@ -1,1291 +0,0 @@ -;;; x-symbol-tex.el --- token language "TeX macro" for package x-symbol - -;; Copyright (C) 1996-2003 Free Software Foundation, Inc. -;; -;; Author: Christoph Wedler <wedler@users.sourceforge.net> -;; Maintainer: (Please use `M-x x-symbol-package-bug' to contact the maintainer) -;; Version: 4.5.X -;; Keywords: WYSIWYG, LaTeX, wp, math, internationalization -;; X-URL: http://x-symbol.sourceforge.net/ - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Commentary: - -;; If you want to use package x-symbol, please visit the URL (use -;; \\[x-symbol-package-web]) and read the info (use \\[x-symbol-package-info]). - -;; Token language tex is registered in x-symbol-hooks. - -;;; Code: - -(provide 'x-symbol-tex) - -(eval-when-compile - (require 'cl) - (require 'x-symbol-macs) - (require 'x-symbol)) - -(eval-when-compile - (defvar TeX-master) - (defvar file) (defvar line) (defvar offset) - (defvar string) (defvar after-string)) - -;; (defgroup x-symbol-tex ...) in x-symbol-hooks.el -;; (defcustom x-symbol-tex-name ...) in x-symbol-hooks.el -;; (defcustom x-symbol-tex-modes ...) in x-symbol-hooks.el - - -;;;=========================================================================== -;;; Auto-style -;;;=========================================================================== - -(defcustom x-symbol-tex-auto-style - '(;; during eval, `buffer-file-name' is sans-version and mode-suffixes - (if buffer-file-name (string-match "\\.tex\\'" buffer-file-name) t) - (if x-symbol-mode - (x-symbol-auto-coding-alist x-symbol-tex-auto-coding-alist nil - (if x-symbol-tex-coding-master - 'x-symbol-tex-auto-coding-alist))) - x-symbol-coding (not x-symbol-mode) - x-symbol-mode x-symbol-mode) - "Values for X-Symbol's buffer-local variables with language `tex'. -See language access `x-symbol-LANG-auto-style'." - :group 'x-symbol-tex - :group 'x-symbol-mode - :type 'x-symbol-auto-style) - -(defcustom x-symbol-tex-auto-coding-alist - '(("\\\\usepackage[ \t]*\\[\\([A-Za-z]+[0-9]+\\)\\]{inputenc}" 1 - ("latin1" . iso-8859-1) - ("latin2" . iso-8859-2) - ("latin3" . iso-8859-3) - ("latin5" . iso-8859-9) - ("latin9" . iso-8859-15)) - ("\\`[ \t]*%&.*[ \t]+--?translate-file[ \t]*=[ \t]*i\\([A-Za-z]+[0-9]+\\)-" 1 - ("l1" . iso-8859-1) - ("l2" . iso-8859-2))) - "*Alist used to determine the file coding with language `tex'. -Used in the default value of `x-symbol-tex-auto-style'. See variable -`x-symbol-auto-coding-alist' for details." - :group 'x-symbol-tex - :group 'x-symbol-mode - :type 'x-symbol-auto-coding) - -(defcustom x-symbol-tex-coding-master 'TeX-master - "*If non-nil, symbol of local variable with name of master file. -Used inside function `x-symbol-tex-auto-coding-alist'." - :group 'x-symbol-tex - :group 'x-symbol-mode - :type 'boolean) - - -;;;=========================================================================== -;;; General language accesses, see `x-symbol-language-access-alist' -;;;=========================================================================== - -(defcustom x-symbol-tex-modeline-name "tex" - "Modeline name of token language `tex'. -See language access `x-symbol-LANG-modeline-name'." - :group 'x-symbol-tex - :type 'string) - -(defcustom x-symbol-tex-header-groups-alist nil - "Header/submenu specification of the specific menu for language `tex'. -See language access `x-symbol-LANG-header-groups-alist'." - :group 'x-symbol-tex - :group 'x-symbol-input-init - :type 'x-symbol-headers) - -(defcustom x-symbol-tex-electric-ignore 'x-symbol-tex-default-electric-ignore - "Specification restricting input method ELECTRIC with language `tex'. -See language access `x-symbol-LANG-electric-ignore'." - :group 'x-symbol-tex - :group 'x-symbol-input-control - :type 'x-symbol-function-or-regexp) - -(defcustom x-symbol-tex-electric-ignore-regexp "[A-Za-z]~\\'" - "*Regexp matching contexts not to be used for input method ELECTRIC. -Used by `x-symbol-tex-default-electric-ignore'." - :group 'x-symbol-tex - :group 'x-symbol-input-control - :type '(choice (const :tag "None" nil) regexp)) - -(defcustom x-symbol-tex-token-suppress-space t - "*If non-nil, suppress space after text-mode control words. -If non-nil, inserting SPC without prefix argument after a text-mode only -control word will only replace the control word with the character -according to `x-symbol-token-input', it will not insert the space." - :group 'x-symbol-tex - :group 'x-symbol-input-control - :type 'boolean) - -(defvar x-symbol-tex-extra-menu-items - '(("Conversion" - "---" - ["tex: Decode Accented Letters (alt)" x-symbol-tex-xdecode-latex - :active (and x-symbol-mode (not buffer-read-only))] - ["tex: Remove Braces around Letters" x-symbol-tex-xdecode-old - :active (and x-symbol-mode (not buffer-read-only))])) - "Extra menu entries in menu for language `tex'. -See language access `x-symbol-LANG-extra-menu-items'.") - -(defvar x-symbol-tex-token-grammar - '(x-symbol-make-grammar - :encode-spec x-symbol-tex-encode - :decode-regexp "\\\\\\(?:[@A-Za-z]+\\|[-{}#_&|%$]\\|[.~^\"'`=]\\(?:[A-Za-z]\\|{}\\|\\(\\\\\\)[ij][@A-Za-z]?\\)\\)" - :decode-spec x-symbol-tex-decode - :input-regexp ("\\\\\\(?:[.~^\"'`=]\\\\[ij]\\|[ckvuHr]\\(?: [A-Za-z]\\|{ ?}\\)\\)\\'" "\\\\\\(?:[@A-Za-z]+\\|[-{}#_&|%$]\\|[.~^\"'`=]\\(?:[A-Za-z]\\|{}\\)\\)\\'") - :input-spec x-symbol-tex-token-input - :token-list x-symbol-tex-default-token-list - :after-init x-symbol-tex-after-init-language) - "Grammar of token language `tex'. -See language access `x-symbol-LANG-token-grammar'.") - -;; The following vars could be made customizable, but it would not be a good -;; idea if different users have a different decode behavior: - -(defvar x-symbol-tex-verb-delimiter-regexp "[-!#$&*+/=?^|~]" - "Regexp matching delimiters of \verb arguments not to be decoded.") -;; by default: not letter, digits, punctuation and quotation - -(defvar x-symbol-tex-env-verbatim-regexp "{verbatim\\*?}" - "Regexp matching environments with a contents not to be decoded. -The regexp should also match the surrounding braces.") - -(defvar x-symbol-tex-env-tabbing-regexp "{tabbing}" - "Regexp matching environments with a contents not to be decoded. -The regexp should also match the surrounding braces.") - -(defvar x-symbol-tex-user-table nil - "User table defining TeX macros, used in `x-symbol-tex-table'.") - -(defvar x-symbol-tex-generated-data nil - "Generated data for token language `tex'. -See language access `x-symbol-LANG-generated-data'.") - - -;;;=========================================================================== -;;; Image support -;;;=========================================================================== - -(defcustom x-symbol-tex-master-directory 'x-symbol-tex-default-master-directory - "Specification of the master directory for images for language `tex'. -See language access `x-symbol-LANG-master-directory'." - :group 'x-symbol-tex - :group 'x-symbol-image-language - :type 'function) - -(defcustom x-symbol-tex-image-searchpath - (let ((dirs (or (getenv "TEXPICTS") (getenv "TEXINPUTS"))) - dir result) - (if dirs (setq dirs (if (fboundp 'split-path) - (split-path dirs) - (parse-colon-path dirs)))) - (while dirs - (when (setq dir (pop dirs)) - (or (member dir '("" "/")) ; `parse-colon-path': foo// -> / - (member (setq dir (file-name-as-directory dir)) result) - (push dir result)))) - (nreverse (if (member "./" result) result (cons "./" result)))) - "Search path for implicitly relative image file names. -See language access `x-symbol-LANG-image-searchpath'." - :group 'x-symbol-tex - :group 'x-symbol-image-language - :type '(repeat directory)) - -(defcustom x-symbol-tex-image-cached-dirs '("figures/") - "Directory parts of images stored in the memory cache. -See language access `x-symbol-LANG-image-cached-dirs'." - :group 'x-symbol-tex - :group 'x-symbol-image-language - :type '(repeat string)) - -(defcustom x-symbol-tex-image-keywords - ;; keep it short! - '("\\.\\(eps\\|ps\\(tex\\)?\\|gif\\|png\\|jpe?g\\|pdf\\)\\'" - ("\\\\epsf\\(box\\|file\\)[ \t]*\\(\\[[^][\n]*\\]\\)?{\\([^ \t\n,{}]+\\.e?ps\\)}" 3) - ("\\\\e?psfig[ \t]*{file=\\([^ \t\n,{}]+\\.e?ps\\)[^\n{}]*}" 1) - ("\\\\includegraphics\\*?[ \t]*\\(\\[[^][\n]*\\]\\)?\\(\\[[^][\n]*\\]\\)?{\\([^ \t\n,{}]+\\)}" 3 ".\\.[^./]+\\'" ".eps") - ("\\\\input[ \t]*{\\([^ \t\n,{}]+\\.pstex\\)_t}" 1)) - "Keywords for image insertion commands of language `tex'. -See language access `x-symbol-LANG-image-keywords'." - :group 'x-symbol-tex - :group 'x-symbol-image-language - :type 'x-symbol-image-keywords) - - -;;;=========================================================================== -;;; Super- and Subscripts -;;;=========================================================================== - -(defcustom x-symbol-tex-subscript-matcher 'x-symbol-tex-subscript-matcher - "Function matching super-/subscripts for language `tex'. -See language access `x-symbol-LANG-subscript-matcher'." - :group 'x-symbol-tex - :type 'function) - -(defcustom x-symbol-tex-invisible-braces nil - "TODO" - :group 'x-symbol-tex - :type 'boolean) - -(defcustom x-symbol-tex-font-lock-allowed-faces - '(tex-math-face - font-lock-string-face font-lock-doc-string-face font-latex-math-face) - "*Faces which are allowed when fontifying simple super- and subscripts. -Package x-symbol only uses super- and subscripts if they are in braces, -if the \"^\"/\"_\" has not been fontified yet or is only fontified with -faces which appear in this list. Value t means, always use super- and -subscripts." - :group 'x-symbol-tex - :type '(repeat (symbol :tag "Face name"))) ; face would create faces... :-( - -(defvar x-symbol-tex-font-lock-regexp - "[^\000-\040\134\177-\237]\\([_^]\\)\\([^ \t\n\f%\\}^_$#&~]\\|\\\\[@A-Za-z]+\\)" - "Regexp matching the prefix of super-/subscripts. -The first regexp group should match the super-/subscript command.") - -(defvar x-symbol-tex-font-lock-limit-regexp "[\n^_]" - "Regexp matching the limit for the end of super-/subscripts. -This regexp should match the end of line.") - - -;;;=========================================================================== -;;; Charsym Info -;;;=========================================================================== - -(defface x-symbol-tex-math-face - '((((class color) (background light)) - (:foreground "purple3"))) - "*Face, normally used for tokens only allowed in TeX's math mode. -Used in `x-symbol-tex-class-face-alist'." - :group 'x-symbol-tex - :group 'x-symbol-info-general) - -(defface x-symbol-tex-text-face - '((((class color) (background light)) - (:foreground "Royalblue"))) - "*Face, normally used for tokens only allowed in TeX's text mode. -Used in `x-symbol-tex-class-face-alist'." - :group 'x-symbol-tex - :group 'x-symbol-info-general) - -(defcustom x-symbol-tex-class-alist - '((text) - (math) - (accent "accent" (x-symbol-info-face)) - (aletter "acc.letter" (x-symbol-info-face)) - (letter "letter" (x-symbol-info-face)) - (greek "greek" (x-symbol-info-face)) - (ordinary "ordinary" (x-symbol-info-face)) - (binop "binop" (x-symbol-info-face)) - (bigop "bigop" (x-symbol-info-face)) - (relation "relation" (x-symbol-info-face)) - (delim "delimiter" (x-symbol-info-face)) - (punct "punctuation" (x-symbol-info-face)) - (quote "quote" (x-symbol-info-face)) - (space "space" (x-symbol-info-face)) - (special "special" (x-symbol-info-face)) - (latexsym "latexsym.sty" (x-symbol-emph-info-face)) ; w/ latexsym or amssymb - (amssymb "amssymb.sty" (x-symbol-emph-info-face)) - (stmaryrd "stmaryrd.sty" (x-symbol-emph-info-face)) - (T1 "T1 fontenc.sty" (x-symbol-emph-info-face)) - (correct-T1 "correct: T1 fontenc.sty" (x-symbol-info-face)) - (inputenc "inputenc.sty" (x-symbol-emph-info-face)) ; v0.97 - (inputenc-unavail "inputenc.sty: unavailable" (x-symbol-emph-info-face)) -;;; (inputenc-incorrect "old inputenc: incorrect" . red) ; IMHO - (gobbles-spc "gobbles space" (x-symbol-info-face)) - (user "user" (x-symbol-emph-info-face)) - (VALID "unknown TeX class" (x-symbol-emph-info-face)) - (INVALID "no TeX macro" (x-symbol-emph-info-face))) - "Token classes displayed by info in echo area, for language `tex'. -See language access `x-symbol-LANG-class-alist'." - :group 'x-symbol-tex - :group 'x-symbol-info-strings - :type 'x-symbol-class-info) - -(defcustom x-symbol-tex-class-face-alist - '((math x-symbol-tex-math-face (x-symbol-tex-math-face)) - (text x-symbol-tex-text-face (x-symbol-tex-text-face))) - "Color scheme in language specific grid and info, for language `tex'. -See language access `x-symbol-LANG-class-face-alist'." - :group 'x-symbol-tex - :group 'x-symbol-input-init - :group 'x-symbol-info-general - :type 'x-symbol-class-faces) - - -;;;=========================================================================== -;;; Misc -;;;=========================================================================== - -;;;###autoload -(defun x-symbol-tex-auto-coding-alist (alist &optional limit) - "Find encoding in file `x-symbol-tex-coding-master'. -For ALIST and LIMIT, see `x-symbol-auto-coding-alist'." - ;; called inside `save-excursion' - (and (local-variable-p x-symbol-tex-coding-master (current-buffer)) - ;; I don't like the idea of having to visit a second file in order to - ;; visit first one, but people have complained about X-Symbol not - ;; recognizing \usepackage[latinN]{inputenc} in the master file... Not - ;; only that, a file should describe its encoding itself... - (stringp (symbol-value x-symbol-tex-coding-master)) - (condition-case nil - (let ((master (expand-file-name - (symbol-value x-symbol-tex-coding-master)))) - ;; I have absolutely no intention to use `find-file-noselect' - ;; here, i.e., decode the master file via X-Symbol in order to get - ;; the correct coding for the current buffer - (set-buffer (get-buffer-create " x-symbol master")) - (insert-file-contents master nil nil nil - ;; 5th arg not t with empty accessible part - ;; (XEmacs bug workaround: would infloop) - (> (point-max) (point-min))) - (x-symbol-auto-coding-alist alist limit)) - (error nil)))) - -(defun x-symbol-tex-default-master-directory () - "Convert NAME to absolute file name, respecting `TeX-master'. -Variable `TeX-master' should be buffer-local and a string to be used. -Used as default value of `x-symbol-tex-master-directory'." - (and (local-variable-p 'TeX-master (current-buffer)) - (stringp TeX-master) - (file-name-directory (expand-file-name TeX-master)))) - -(defun x-symbol-tex-default-electric-ignore (context charsym) - "Non nil, if CONTEXT should not be replaced by input method ELECTRIC. -Return non-nil if `x-symbol-tex-electric-ignore-regexp' matches CONTEXT -or if CHARSYM represents a TeX macro which can only be used in math mode -whereas point is in a text area or vice versa. This function uses -package \"texmathp\" whose variables you might want to customize. Used -as default value for `x-symbol-tex-electric-ignore'." - (or (and x-symbol-tex-electric-ignore-regexp - (string-match x-symbol-tex-electric-ignore-regexp context)) - (condition-case nil - (let ((class (car (gethash charsym - (x-symbol-generated-token-classes - x-symbol-tex-generated-data))))) - (cond ((eq class 'math) (not (texmathp))) - ((eq class 'text) (texmathp)))) - (error nil)))) - - -;;;=========================================================================== -;;; The tables -;;;=========================================================================== - -(defun x-symbol-tex-default-token-list (tokens) - (if (stringp tokens) - (list (cons (if (string-match "\\\\ \\'" tokens) - (concat (substring tokens 0 (match-beginning 0)) "{ }") - tokens) - (if (string-match "\\\\[A-Za-z]+\\'" tokens) t))) - (mapcar (lambda (x) - (cons x (if (string-match "\\\\[A-Za-z]+\\'" x) 'math))) - tokens))) - -(defun x-symbol-tex-after-init-language () - (let ((decode-obarray (x-symbol-generated-decode-obarray - x-symbol-tex-generated-data)) - (tex-accent '(nil tex-accent))) - (set (intern "\\begin" decode-obarray) '(nil tex-begin)) - (set (intern "\\end" decode-obarray) '(nil tex-end)) - (set (intern "\\verb" decode-obarray) '(nil tex-verb)) - (set (intern "\\c" decode-obarray) tex-accent) - (set (intern "\\k" decode-obarray) tex-accent) - (set (intern "\\v" decode-obarray) tex-accent) - (set (intern "\\u" decode-obarray) tex-accent) - (set (intern "\\H" decode-obarray) tex-accent) - (set (intern "\\r" decode-obarray) tex-accent))) - - -;;;=========================================================================== -;;; The tables -;;;=========================================================================== - -(defvar x-symbol-tex-required-fonts nil - "Features providing required fonts for language `tex'. -See language access `x-symbol-LANG-required-fonts'.") - -(defvar x-symbol-tex-latin1-table - '((nobreakspace (space) . "\\nobreakspace") - (exclamdown (text punct) . "\\textexclamdown") - (cent (text inputenc-unavail) . "\\textcent") - (sterling (ordinary) . "\\pounds") - (currency (text inputenc) . "\\textcurrency") - (yen (text inputenc-unavail) . "\\textyen") - (brokenbar (text inputenc-unavail) . "\\textbrokenbar") - (section (ordinary) . "\\S") - (diaeresis (text accent) . "\\\"{}") - (copyright (text ordinary) . "\\textcopyright") - (ordfeminine (text ordinary inputenc) . "\\textordfeminine") - (guillemotleft (text quote T1) . "\\guillemotleft") - (notsign (math ordinary) "\\lnot" "\\neg") - (hyphen (special) "\\-") - (registered (text ordinary) . "\\textregistered") - (macron (text accent) . "\\={}") - (degree (text ordinary inputenc) . "\\textdegree") - (plusminus (math binop) "\\pm") - (twosuperior (math ordinary inputenc) "\\mathtwosuperior") - (threesuperior (math ordinary inputenc) "\\maththreesuperior") - (acute (text accent) . "\\'{}") - (mu1 (math greek user) "\\mathmicro") - (paragraph (ordinary) . "\\P") - (periodcentered (text punct) . "\\textperiodcentered") - (cedilla (text accent) . "\\c\\ ") - (onesuperior (math ordinary inputenc) "\\mathonesuperior") - (masculine (text ordinary inputenc) . "\\textordmasculine") - (guillemotright (text quote T1) . "\\guillemotright") - (onequarter (text ordinary inputenc) . "\\textonequarter") - (onehalf (text ordinary inputenc) . "\\textonehalf") - (threequarters (text ordinary inputenc) . "\\textthreequarters") - (questiondown (text punct) . "\\textquestiondown") - (Agrave (text aletter) . "\\`A") - (Aacute (text aletter) . "\\'A") - (Acircumflex (text aletter) . "\\^A") - (Atilde (text aletter) . "\\~A") - (Adiaeresis (text aletter) . "\\\"A") - (Aring (text aletter) . "\\AA") - (AE (text letter) . "\\AE") - (Ccedilla (text aletter) . "\\c C") - (Egrave (text aletter) . "\\`E") - (Eacute (text aletter) . "\\'E") - (Ecircumflex (text aletter) . "\\^E") - (Ediaeresis (text aletter) . "\\\"E") - (Igrave (text aletter) . "\\`I") - (Iacute (text aletter) . "\\'I") - (Icircumflex (text aletter) . "\\^I") - (Idiaeresis (text aletter) . "\\\"I") - (ETH (text letter T1) . "\\DH") - (Ntilde (text aletter) . "\\~N") - (Ograve (text aletter) . "\\`O") - (Oacute (text aletter) . "\\'O") - (Ocircumflex (text aletter) . "\\^O") - (Otilde (text aletter) . "\\~O") - (Odiaeresis (text aletter) . "\\\"O") - (multiply (math binop) "\\times") - (Ooblique (text letter) . "\\O") - (Ugrave (text aletter) . "\\`U") - (Uacute (text aletter) . "\\'U") - (Ucircumflex (text aletter) . "\\^U") - (Udiaeresis (text aletter) . "\\\"U") - (Yacute (text aletter) . "\\'Y") - (THORN (text letter T1) . "\\TH") - (ssharp (text letter) . "\\ss") - (agrave (text aletter) . "\\`a") - (aacute (text aletter) . "\\'a") - (acircumflex (text aletter) . "\\^a") - (atilde (text aletter) . "\\~a") - (adiaeresis (text aletter) . "\\\"a") - (aring (text aletter) . "\\aa") - (ae (text letter) . "\\ae") - (ccedilla (text aletter) . "\\c c") - (egrave (text aletter) . "\\`e") - (eacute (text aletter) . "\\'e") - (ecircumflex (text aletter) . "\\^e") - (ediaeresis (text aletter) . "\\\"e") - (igrave (text aletter) . "\\`\\i") - (iacute (text aletter) . "\\'\\i") - (icircumflex (text aletter) . "\\^\\i") - (idiaeresis (text aletter) . "\\\"\\i") - (eth (text letter T1) . "\\dh") - (ntilde (text aletter) . "\\~n") - (ograve (text aletter) . "\\`o") - (oacute (text aletter) . "\\'o") - (ocircumflex (text aletter) . "\\^o") - (otilde (text aletter) . "\\~o") - (odiaeresis (text aletter) . "\\\"o") - (division (math binop) "\\div") - (oslash (text letter) . "\\o") - (ugrave (text aletter) . "\\`u") - (uacute (text aletter) . "\\'u") - (ucircumflex (text aletter) . "\\^u") - (udiaeresis (text aletter) . "\\\"u") - (yacute (text aletter) . "\\'y") - (thorn (text letter T1) . "\\th") - (ydiaeresis (text aletter) . "\\\"y")) - "Table defining TeX macros, see `x-symbol-tex-table'.") - -(defvar x-symbol-tex-latinN-table - '((Aogonek (text aletter T1) . "\\k A") - (breve (text accent) . "\\u{}") - (Lslash (text letter) . "\\L") - (Lcaron (text aletter correct-T1) . "\\v L") - (Sacute (text aletter) . "\\'S") - (Scaron (text aletter) . "\\v S") - (Scedilla (text aletter) . "\\c S") - (Tcaron (text aletter) . "\\v T") - (Zacute (text aletter) . "\\'Z") - (Zcaron (text aletter) . "\\v Z") - (Zdotaccent (text aletter) . "\\.Z") - (aogonek (text aletter T1) . "\\k a") - (ogonek (text accent T1) . "\\k\\ ") - (lslash (text letter) . "\\l") - (lcaron (text aletter correct-T1) . "\\v l") - (sacute (text aletter) . "\\'s") - (caron (text accent) . "\\v{}") - (scaron (text aletter) . "\\v s") - (scedilla (text aletter) . "\\c s") - (tcaron (text aletter correct-T1) . "\\v t") - (zacute (text aletter) . "\\'z") - (hungarumlaut (text accent) . "\\H{}") - (zcaron (text aletter) . "\\v z") - (zdotaccent (text aletter) . "\\.z") - (Racute (text aletter) . "\\'R") - (Abreve (text aletter) . "\\u A") - (Lacute (text aletter) . "\\'L") - (Cacute (text aletter) . "\\'C") - (Ccaron (text aletter) . "\\v C") - (Eogonek (text aletter T1) . "\\k E") - (Ecaron (text aletter) . "\\v E") - (Dcaron (text aletter) . "\\v D") - (Dbar (text letter inputenc T1) . "\\DJ") - (Nacute (text aletter) . "\\'N") - (Ncaron (text aletter) . "\\v N") - (Ohungarumlaut (text aletter) . "\\H O") - (Rcaron (text aletter) . "\\v R") - (Uring (text aletter) . "\\r U") - (Uhungarumlaut (text aletter) . "\\H U") - (Tcedilla (text aletter) . "\\c T") - (racute (text aletter) . "\\'r") - (abreve (text aletter) . "\\u a") - (lacute (text aletter) . "\\'l") - (cacute (text aletter) . "\\'c") - (ccaron (text aletter) . "\\v c") - (eogonek (text aletter T1) . "\\k e") - (ecaron (text aletter) . "\\v e") - (dcaron (text aletter correct-T1) . "\\v d") - (dbar (text letter inputenc T1) . "\\dj") - (nacute (text aletter) . "\\'n") - (ncaron (text aletter) . "\\v n") - (ohungarumlaut (text aletter) . "\\H o") - (rcaron (text aletter) . "\\v r") - (uring (text aletter) . "\\r u") - (uhungarumlaut (text aletter) . "\\H u") - (tcedilla (text aletter) . "\\c t") - (dotaccent (text accent) . "\\.{}") - (Hbar (text letter inputenc-unavail) . "\\textmalteseH") - (Hcircumflex (text aletter) . "\\^H") - (Idotaccent (text aletter) . "\\.I") - (Gbreve (text aletter) . "\\u G") - (Jcircumflex (text aletter) . "\\^J") - (hbar (text letter inputenc-unavail) . "\\textmalteseh") - (hcircumflex (text aletter) . "\\^h") - (dotlessi (text letter) . "\\i") - (gbreve (text aletter) . "\\u g") - (jcircumflex (text aletter) . "\\^\\j") - (Cdotaccent (text aletter) . "\\.C") - (Ccircumflex (text aletter) . "\\^C") - (Gdotaccent (text aletter) . "\\.G") - (Gcircumflex (text aletter) . "\\^G") - (Ubreve (text aletter) . "\\u U") - (Scircumflex (text aletter) . "\\^S") - (cdotaccent (text aletter) . "\\.c") - (ccircumflex (text aletter) . "\\^c") - (gdotaccent (text aletter) . "\\.g") - (gcircumflex (text aletter) . "\\^g") - (ubreve (text aletter) . "\\u u") - (scircumflex (text aletter) . "\\^s") - (euro (text ordinary inputenc-unavail) . "\\texteuro") - (OE (text letter) . "\\OE") - (oe (text letter) . "\\oe") - (Ydiaeresis (text aletter) . "\\\"Y")) - "Table defining TeX macros, see `x-symbol-tex-table'.") - -;; Characters w/ NEW weren't defined before, w/ (NEW) were defined at other -;; positions. If we get problems in the nomule version (e.g., w/ font-lock), -;; we could be forced to move these characters to the xsymb1 font. -(defvar x-symbol-tex-xsymb0-table - ;; With elems (SYMBOL (TEX-CLASS ...) TEX-MACRO ...) - '((numbersign1 (ordinary) "\\#") ; NEW - ;;(existential) - (suchthat (math relation) "\\ni" "\\owns") - (asterisk1 (math binop) "\\ast") ; NEW - ;;(comma1 (mark) "\\quotesinglbase") ; not in {}! (spacing) - (period1 (math punct) "\\ldotp") ; (NEW) - (colon1 (math punct) "\\colon") ; (NEW) - (congruent (math relation) "\\cong") - (Delta (math greek) "\\Delta") - (Phi (math greek) "\\Phi") - (Gamma (math greek) "\\Gamma") - (theta1 (math greek) "\\vartheta") - (Lambda (math greek) "\\Lambda") - (Pi (math greek) "\\Pi") - (Theta (math greek) "\\Theta") - (Sigma (math greek) "\\Sigma") - (sigma1 (math greek) "\\varsigma") - (Omega (math greek) "\\Omega") - (Xi (math greek) "\\Xi") - (Psi (math greek) "\\Psi") - ;;(therefore (math relation) "\\therefore") - (perpendicular (math ordinary) "\\bot") ; (NEW) - (underscore1 (ordinary) "\\_") ; NEW - ;;(radicalex) - (alpha (math greek) "\\alpha") - (beta (math greek) "\\beta") - (chi (math greek) "\\chi") - (delta (math greek) "\\delta") - (epsilon (math greek) "\\epsilon") - (phi (math greek) "\\phi") - (gamma (math greek) "\\gamma") - (eta (math greek) "\\eta") - (iota (math greek) "\\iota") - (phi1 (math greek) "\\varphi") - (kappa (math greek) "\\kappa") - (lambda (math greek) "\\lambda") - (mu (math greek) "\\mu") - (nu (math greek) "\\nu") - (pi (math greek) "\\pi") - (theta (math greek) "\\theta") - (rho (math greek) "\\rho") - (sigma (math greek) "\\sigma") - (tau (math greek) "\\tau") - (upsilon (math greek) "\\upsilon") - (omega1 (math greek) "\\varpi") - (omega (math greek) "\\omega") - (xi (math greek) "\\xi") - (psi (math greek) "\\psi") - (zeta (math greek) "\\zeta") - (bar1 (math relation) "\\mid") ; (NEW) - (similar (math relation) "\\sim") - (Upsilon1 (math greek) "\\Upsilon") - (minute (math ordinary) "\\prime") - (lessequal (math relation) "\\leq" "\\le") - ;;(fraction) - (infinity (math ordinary) "\\infty") - (florin (text ordinary user) . "\\textflorin") ; NEW - (club (math ordinary) "\\clubsuit") - (diamond (math ordinary) "\\diamondsuit") - (heart (math ordinary) "\\heartsuit") - (spade (math ordinary) "\\spadesuit") - (arrowboth (math relation) "\\leftrightarrow") - (arrowleft (math relation) "\\gets" "\\leftarrow") - (arrowup (math relation delim) "\\uparrow") - (arrowright (math relation) "\\to" "\\rightarrow") - (arrowdown (math relation delim) "\\downarrow") - (ring (text accent) . "\\r{}") ; NEW - ;;(second) - (greaterequal (math relation) "\\geq" "\\ge") - (proportional (math relation) "\\propto") - (partialdiff (math ordinary) "\\partial") - (bullet (math binop) "\\bullet") - (notequal (math relation) "\\neq" "\\ne") - (equivalence (math relation) "\\equiv") - (approxequal (math relation) "\\approx") - (ellipsis (ordinary gobbles-spc) "\\ldots") - ;;(carriagereturn) - (aleph (math letter) "\\aleph") - (Ifraktur (math letter) "\\Im") - (Rfraktur (math letter) "\\Re") - (weierstrass (math letter) "\\wp") - (circlemultiply (math binop) "\\otimes") - (circleplus (math binop) "\\oplus") - (emptyset (math ordinary) "\\emptyset") - (intersection (math binop) "\\cap") - (union (math binop) "\\cup") - (propersuperset (math relation) "\\supset") - (reflexsuperset (math relation) "\\supseteq") - (notsubset (math relation user) "\\nsubset") - (propersubset (math relation) "\\subset") - (reflexsubset (math relation) "\\subseteq") - (element (math relation) "\\in") - (notelement (math relation) "\\notin") - (angle (ordinary gobbles-spc) "\\angle") - (gradient (math ordinary) "\\nabla") - (product (math bigop) "\\prod") - (radical (math ordinary) "\\surd") - (periodcentered1 (math binop) "\\cdot") ; (NEW) - (logicaland (math binop) "\\land" "\\wedge") - (logicalor (math binop) "\\lor" "\\vee") - (arrowdblboth (math relation) "\\Leftrightarrow" "\\lequiv") - (arrowdblleft (math relation) "\\Leftarrow") - (arrowdblup (math relation delim) "\\Uparrow") - (arrowdblright (math relation) "\\Rightarrow") - (arrowdbldown (math relation delim) "\\Downarrow") - (lozenge (math ordinary amssymb) "\\lozenge") - (angleleft (math delim) "\\langle") ; (NEW) - (trademark (text ordinary) . "\\texttrademark") - (summation (math bigop) "\\sum") - (angleright (math delim) "\\rangle") ; (NEW) - (integral (math bigop) "\\int")) - "Table defining TeX macros, see `x-symbol-tex-table'.") - -(defvar x-symbol-tex-xsymb1-table - ;; With elems (SYMBOL (TEX-CLASS ...) TEX-MACRO ...) - '((verticaldots (ordinary gobbles-spc) "\\vdots") - (backslash1 (text ordinary) . "\\textbackslash") - (dagger (ordinary) . "\\dag") - (percent2 (ordinary) "\\%") ; NEW - (guilsinglright (text quote T1) . "\\guilsinglright") - (NG (text letter T1) . "\\NG") - (dotlessj (text letter) . "\\j") - (ng (text letter T1) . "\\ng") - (sharp (math ordinary) "\\sharp") - (ceilingleft (math delim) "\\lceil") - (ceilingright (math delim) "\\rceil") - (star (math binop) "\\star") - (lozenge1 (math ordinary latexsym) "\\Diamond") - (braceleft2 (delim) "\\{") ; \lbrace is math-only - (circleslash (math binop) "\\oslash") - (braceright2 (delim) "\\}") ; \rbrace is math-only - (triangle1 (math binop) "\\bigtriangleup") - (smltriangleright (math binop) "\\triangleright") - (triangleleft (math binop latexsym) "\\lhd") - (triangle (math ordinary) "\\triangle") - (triangleright (math binop latexsym) "\\rhd") - (trianglelefteq (math binop latexsym) "\\unlhd") - (trianglerighteq (math binop latexsym) "\\unrhd") - (periodcentered2 (math punct) "\\cdotp") - (dotequal (math relation) "\\doteq") - (wrong (math binop) "\\wr") - (natural (math ordinary) "\\natural") - (flat (math ordinary) "\\flat") - (epsilon1 (math greek) "\\varepsilon") - (hbarmath (math letter) "\\hbar") - (imath (math letter) "\\imath") - (kappa1 (math greek amssymb) "\\varkappa") - (jmath (math letter) "\\jmath") - (ell (math letter) "\\ell") - (amalg (math binop) "\\amalg") - (rho1 (math greek) "\\varrho") - (top (math ordinary) "\\top") - (Mho (math greek latexsym) "\\mho") - (floorleft (math delim) "\\lfloor") - (floorright (math delim) "\\rfloor") - (perpendicular1 (math relation) "\\perp") - (box (math ordinary latexsym) "\\Box") - (asciicircum1 (text ordinary) . "\\textasciicircum") - (asciitilde1 (text ordinary) . "\\textasciitilde") - (leadsto (math relation latexsym) "\\leadsto") - (longarrowleft (math relation) "\\longleftarrow") - (arrowupdown (math relation delim) "\\updownarrow") - (longarrowright (math relation) "\\longrightarrow") - (longmapsto (math relation) "\\longmapsto") - (longarrowdblboth (math relation) "\\Longleftrightarrow") - (longarrowdblleft (math relation) "\\Longleftarrow") - (arrowdblupdown (math relation delim) "\\Updownarrow") - (longarrowdblright (math relation) "\\Longrightarrow") - (mapsto (math relation) "\\mapsto") - (iff (math relation) "\\iff") - (hookleftarrow (math relation) "\\hookleftarrow") - (hookrightarrow (math relation) "\\hookrightarrow") - (arrownortheast (math relation) "\\nearrow") - (arrowsoutheast (math relation) "\\searrow") - (arrownorthwest (math relation) "\\nwarrow") - (arrowsouthwest (math relation) "\\swarrow") - (rightleftharpoons (math relation) "\\rightleftharpoons") - (leftharpoondown (math relation) "\\leftharpoondown") - (rightharpoondown (math relation) "\\rightharpoondown") - (leftharpoonup (math relation) "\\leftharpoonup") - (rightharpoonup (math relation) "\\rightharpoonup") - (bardbl (math ordinary delim) "\\|") ; removed \Vert - (bardbl1 (math relation) "\\parallel") - (backslash2 (math ordinary delim) "\\backslash") - (backslash3 (math binop) "\\setminus") - (diagonaldots (math ordinary) "\\ddots") - (simequal (math relation) "\\simeq") - (digamma (math ordinary amssymb) "\\digamma") - (asym (math relation) "\\asymp") - (minusplus (math binop) "\\mp") - (bowtie (math relation) "\\bowtie") - (centraldots (math ordinary) "\\cdots") - (visiblespace (text ordinary) . "\\textvisiblespace") - (dagger1 (math binop) "\\dagger") - (circledot (math binop) "\\odot") - (propersqsuperset (math relation latexsym) "\\sqsupset") - (reflexsqsuperset (math relation) "\\sqsupseteq") - (gradient1 (math binop) "\\bigtriangledown") - (propersqsubset (math relation latexsym) "\\sqsubset") - (reflexsqsubset (math relation) "\\sqsubseteq") - (smllozenge (math binop) "\\diamond") - (lessless (math relation) "\\ll") - (greatergreater (math relation) "\\gg") - (unionplus (math binop) "\\uplus") - (sqintersection (math binop) "\\sqcap") - (squnion (math binop) "\\sqcup") - (frown (math relation) "\\frown") - (smile (math relation) "\\smile") - (reflexprec (math relation) "\\preceq") - (reflexsucc (math relation) "\\succeq") - (properprec (math relation) "\\prec") - (propersucc (math relation) "\\succ") - (bardash (math relation) "\\vdash") - (dashbar (math relation) "\\dashv") - (bardashdbl (math relation) "\\models") - (smlintegral (math ordinary) "\\smallint") - (circleintegral (math bigop) "\\oint") - (coproduct (math bigop) "\\coprod") - (bigcircledot (math bigop) "\\bigodot") - (bigcirclemultiply (math bigop) "\\bigotimes") - (bigcircleplus (math bigop) "\\bigoplus") - (biglogicaland (math bigop) "\\bigwedge") - (biglogicalor (math bigop) "\\bigvee") - (bigintersection (math bigop) "\\bigcap") - (bigunion (math bigop) "\\bigcup") - (bigunionplus (math bigop) "\\biguplus") - (bigsqunion (math bigop) "\\bigsqcup") - (bigcircle (math binop) "\\bigcirc") - (guilsinglleft (text quote T1) . "\\guilsinglleft") - (circleminus (math binop) "\\ominus") - (smltriangleleft (math binop) "\\triangleleft") - (existential1 (math ordinary) "\\exists") - (daggerdbl1 (math binop) "\\ddagger") - (daggerdbl (ordinary) . "\\ddag") - (bigbowtie (math relation latexsym) "\\Join") - (circ (math binop) "\\circ") - (grave (text accent) . "\\`{}") ; NEW - (circumflex (text accent) . "\\^{}") ; NEW - (tilde (text accent) . "\\~{}") ; NEW - (longarrowboth (math relation) "\\longleftrightarrow") - (endash (text ordinary) . "\\textendash") ; NEW - (emdash (text ordinary) . "\\textemdash") - (ampersand2 (ordinary) "\\&") ; NEW - (universal1 (math ordinary) "\\forall") - (booleans (math letter user) "\\setB") - (complexnums (math letter user) "\\setC") - (natnums (math letter user) "\\setN") - (rationalnums (math letter user) "\\setQ") - (realnums (math letter user) "\\setR") - (integers (math letter user) "\\setZ") - (lesssim (math relation amssymb) "\\lesssim") - (greatersim (math relation amssymb) "\\gtrsim") - (lessapprox (math relation amssymb) "\\lessapprox") - (greaterapprox (math relation amssymb) "\\gtrapprox") - (definedas (math relation amssymb) "\\triangleq") - (circleminus1 (math binop amssymb) "\\circleddash") - (circleasterisk (math binop amssymb) "\\circledast") - (circlecirc (math binop amssymb) "\\circledcirc") - (dollar1 (ordinary) "\\$") - (therefore1 (math relation amssymb) "\\therefore") - (coloncolon (math relation user) "\\coloncolon") - (bigsqintersection (math bigop stmaryrd) "\\bigsqcap") - (semanticsleft (math delim stmaryrd) "\\llbracket") - (semanticsright (math delim stmaryrd) "\\rrbracket") - (cataleft (math delim stmaryrd) "\\llparenthesis") - (cataright (math delim stmaryrd) "\\rrparenthesis") - ;;(quotedblbase (mark T1) "\\quotedblbase") ; not in {}! (spacing) - ;;(quotedblleft (mark) . "\\textquotedblleft") ; not in {}! (spacing) - ;;(quotedblright (mark) . "\\textquotedblright") ; not in {}! (spacing) - ;;(perthousand) - ) - "Table defining TeX macros, see `x-symbol-tex-table'.") - -(defvar x-symbol-tex-table - (append x-symbol-tex-user-table - '(nil) - x-symbol-tex-latin1-table - x-symbol-tex-latinN-table - x-symbol-tex-xsymb0-table - x-symbol-tex-xsymb1-table) - "Table defining `tex' tokens for the characters. -See language access `x-symbol-LANG-table'. Use -`x-symbol-tex-user-table' to define private TeX macros or shadow -existing ones.") - - -;;;=========================================================================== -;;; Super- and Subscripts -;;;=========================================================================== - -(defun x-symbol-tex-subscript-matcher (limit) - (block nil - (let (beg mid) - (or (bolp) (backward-char)) - ;; (backward-char) is not necessary in the loop because: if a simple = - ;; braces-less subscript is not allowed according to the "allowed" faces, - ;; then a directly following _ or ^ is also not allowed... - (while (re-search-forward x-symbol-tex-font-lock-regexp limit t) - (setq beg (match-beginning 1) - mid (match-beginning 2)) - (if (if (eq (char-after mid) ?\{) - (let ((end (save-restriction - (narrow-to-region - (point) - (save-excursion - (re-search-forward - x-symbol-tex-font-lock-limit-regexp - limit 'limit) - (point))) - (ignore-errors (scan-lists (point) 1 1))))) - (when (and end (eq (char-before end) ?})) - (goto-char end) - (store-match-data - (if x-symbol-tex-invisible-braces - (list beg end - beg (1+ mid) - (1+ mid) (1- end) - (1- end) end) - (list beg end beg mid mid end))) - t)) - (or (eq x-symbol-tex-font-lock-allowed-faces t) - (let ((faces (plist-get (text-properties-at beg) 'face))) - (cond ((null faces)) - ((consp faces) - (while (and faces (memq (car faces) x-symbol-tex-font-lock-allowed-faces)) - (setq faces (cdr faces))) - (null faces)) - ((memq faces - x-symbol-tex-font-lock-allowed-faces)))))) - (return (if (eq (char-after beg) ?_) - 'x-symbol-sub-face - 'x-symbol-sup-face))))))) - - -;;;=========================================================================== -;;; Conversion -;;;=========================================================================== - -(defun x-symbol-tex-encode (encode-table fchar-table fchar-fb-table) - (let (char) - (x-symbol-encode-for-charsym ((encode-table fchar-table fchar-fb-table) - token) - (and (eq (char-before) ?\\) - (x-symbol-even-escapes-before-p (1- (point)) ?\\) - (insert ?\ )) - (insert (car token)) - (delete-char x-symbol-encode-rchars) - (when (cdr token) ; \MACRO - (setq char (char-after)) - (cond ((memq char '(?\ ?\t ?\n ?\r nil)) - ;; faster than any `looking-at' or `or'ed `eq's - (or (eq (cdr token) 'math) - (insert-before-markers "{}"))) - ((or (and (<= ?a char) (<= char ?z)) - (and (<= ?@ char) (<= char ?Z))) - ;; much faster than any `looking-at', XEmacs' 3-arg `<=' is - ;; slower than `and'ed 2-arg `<='s - (insert-before-markers " "))))))) - -(defun x-symbol-tex-decode (decode-regexp decode-obarray unique) - (let ((in-tabbing nil) - retry charsym after) - (x-symbol-decode-for-charsym ((decode-regexp decode-obarray) - token beg end) - (if (setq retry (match-beginning 1)) - (goto-char retry)) - (cond ((and (eq (char-before beg) ?\\) - (x-symbol-even-escapes-before-p (1- beg) ?\\)) - (if (setq retry (match-beginning 1)) (goto-char retry))) - ((and in-tabbing - (memq (char-after (1+ beg)) '(?\` ?\' ?= ?-))) - (if (setq retry (match-beginning 1)) (goto-char retry))) - ((x-symbol-decode-unique-test token unique)) - ;; would be bad to decode a part only because of unique decoding - ((setq charsym (car token)) - (if (eq (cadr token) t) ; text-mode \MACRO - (unless - (cond ((eq (setq after (char-after)) ?\ ) - (setq after (char-after (incf end))) - (if unique - (not (or (and (<= ?a after) (<= after ?z)) - (and (<= ?@ after) (<= after ?Z)))) - (memq after '(?\ ?\t ?\n ?\r ?% nil)))) - ((eq after ?\{) - (if (eq (char-after (incf end)) ?\}) - (or (memq (char-after (incf end)) - '(?\ ?\t ?\n ?\r nil)) - (decf end 2)) - (decf end)) - nil) - (t - (memq (char-after) '(?\t ?\n ?\r ?% nil)))) - (goto-char end) - (insert-before-markers (gethash charsym - x-symbol-cstring-table)) - (delete-region beg end)) - (replace-match (gethash charsym x-symbol-cstring-table) t t))) - ;; special definitions ------------------------------------------- - ((eq (setq charsym (cadr token)) 'tex-begin) ; \begin - (skip-chars-forward " \t") - (cond ((looking-at x-symbol-tex-env-verbatim-regexp) - (setq retry (concat "\\\\end[ \t]*" - (regexp-quote (match-string 0)))) - (while (and (re-search-forward retry nil t) - (not (x-symbol-even-escapes-before-p - (match-beginning 0) ?\\))))) - ((looking-at x-symbol-tex-env-tabbing-regexp) - (setq in-tabbing t)))) - ((eq charsym 'tex-end) ; \end - (skip-chars-forward " \t") - (and in-tabbing - (looking-at x-symbol-tex-env-tabbing-regexp) - (setq in-tabbing nil))) - ((eq charsym 'tex-verb) ; \verb - (skip-chars-forward " \t") - (when (looking-at x-symbol-tex-verb-delimiter-regexp) - (setq after (char-after)) - (forward-char) - (while (not (or (eq (char-after) after) (eobp))) - (forward-char)))) - ((eq charsym 'tex-accent) ; accents \c, \k, \v, \u, \H, \r - ;; there are 41 chars using these accents => do something special - ;; here instead using an complicated regexp for the main search - (when (looking-at " [A-Za-z]\\|{}") - (goto-char (setq end (match-end 0))) - (when (setq token (symbol-value - (intern-soft (buffer-substring beg end) - decode-obarray))) - (unless (x-symbol-decode-unique-test token unique) - (goto-char end) - (insert-before-markers (gethash (car token) - x-symbol-cstring-table)) - (delete-region beg end))))))))) - -(defun x-symbol-tex-token-input (input-regexp decode-obarray command-char) - (let ((res (x-symbol-match-token-before - '(?\\ (math . "[a-z@-Z]") (t . "[a-z@-Z]")) - input-regexp decode-obarray command-char))) - (and x-symbol-tex-token-suppress-space - (eq (caddr res) t) ; text mode \MACRO - (eq command-char ?\ ) - (null prefix-arg) - (setq prefix-arg 0)) - res)) - - -;;;=========================================================================== -;;; AucTeX, preview-latex -;;;=========================================================================== - -(defun x-symbol-tex-translate-locations (file-buffer beg end locations) - ;;(set-buffer conv-buffer) - (let ((char-offset (1- beg)) - changed - ;; Kludge to prevent undo list truncation: - (undo-limit most-positive-fixnum) ; Emacs - (undo-strong-limit most-positive-fixnum) ; Emacs - (undo-high-threshold -1) ; XEmacs - (undo-threshold -1)) ; XEmacs - (setq buffer-undo-list t) - (erase-buffer) - (insert-buffer-substring file-buffer beg end) - (map-extents (lambda (e dummy) (delete-extent e) nil)) - (setq buffer-undo-list nil) - (x-symbol-encode-all) - (let* ((curr (car locations)) - (file (aref curr 0)) - (line (aref curr 1)) - string after-string) - (while curr - (when buffer-undo-list - (setq string (aref curr 2)) - (if (number-or-marker-p string) - (setq string (- string char-offset)) - (goto-char 1) - (setq string (or (and (stringp (setq after-string (aref curr 3))) - (search-forward (concat string after-string) - nil t) - (- (point) (length after-string))) - (search-forward string nil t)))) - (when string - (aset curr 2 (copy-marker string t)) - ;; The second arg t is important in both Emacs and XEmacs: this is - ;; a marker which should keep its correct position after the - ;; `primitive-undo's, the encoding has already been done. - (aset curr 3 beg) - (push curr changed))) - (or (and (setq locations (cdr locations)) - (eq line (aref (setq curr (car locations)) 1)) - (equal file (aref curr 0))) - (setq curr nil)))) - (when changed - (let ((tail buffer-undo-list) - mpos) - (setq buffer-undo-list t) - (while tail (setq tail (primitive-undo (length tail) tail))) - (dolist (curr changed) - (setq mpos (aref curr 2)) - (aset curr 2 (+ char-offset mpos)) - (aset curr 3 beg) - (set-marker mpos nil)))) - locations)) - -(put 'x-symbol-tex-error-location 'TeX-translate-via-list - 'x-symbol-tex-preview-locations) - -(defun x-symbol-tex-error-location () - (unless (string= string " ") - (save-excursion - (set-buffer (find-file-noselect file)) - (when x-symbol-mode - (save-restriction - (widen) - (let ((file-buffer (current-buffer)) - (conv-buffer (get-buffer-create " x-symbol error location")) - (location (vector nil nil string - (and (boundp 'after-string) after-string))) - beg end pos) - (goto-line (+ offset line)) - (setq beg (point)) - (end-of-line) - (setq end (point)) - (set-buffer conv-buffer) - (erase-buffer) - (when (fboundp 'set-buffer-multibyte) - (set-buffer-multibyte t)) - (x-symbol-inherit-from-buffer file-buffer) - (x-symbol-tex-translate-locations file-buffer beg end - (list location)) - ;; narrow-to-region gets confused otherwise... - (set-buffer file-buffer) - (when (numberp (setq pos (aref location 2))) - (setq string (buffer-substring beg pos)) - (and (boundp 'after-string) - (setq after-string (buffer-substring pos end)))))))))) - -(defun x-symbol-tex-preview-locations (locations) - (when locations - (prog1 locations - (let* ((conv-buffer (get-buffer-create " x-symbol error location")) - file - (dir default-directory)) - (save-excursion - (set-buffer conv-buffer) - (erase-buffer) - (when (fboundp 'set-buffer-multibyte) - (set-buffer-multibyte t)) - (while locations - (setq file (aref (car locations) 0)) - (set-buffer (find-file-noselect (expand-file-name file dir))) - (if x-symbol-mode - (save-restriction - (widen) - (goto-char 1) - (let ((file-buffer (current-buffer)) - (pline 1) - (line (aref (car locations) 1)) - beg end) - (set-buffer conv-buffer) - (x-symbol-inherit-from-buffer file-buffer) - (while line - (set-buffer file-buffer) - (if (>= line pline) - (if (eq selective-display t) - (re-search-forward "[\n\C-m]" - nil 'end (- line pline)) - (forward-line (- line pline))) - (goto-line line)) - (setq beg (point)) - (end-of-line) - (setq end (point)) - (set-buffer conv-buffer) - (setq locations - (x-symbol-tex-translate-locations file-buffer - beg end - locations)) - (setq pline line - line (and locations - (equal (aref (car locations) 0) file) - (aref (car locations) 1)))) - ;; narrow-to-region gets confused otherwise... - (set-buffer file-buffer))) - (while (and (setq locations (cdr locations)) - (equal (aref (car locations) 0) file)))))))))) - - -;;;=========================================================================== -;;; Extra decoding = executed after normal decoding -;;;=========================================================================== - -(defun x-symbol-tex-xdecode-old (&optional beg end) - "Remove braces around text-mode characters like {C}." - (interactive (and (region-active-p) (list (region-beginning) (region-end)))) - (unless (eq x-symbol-language 'tex) - (error "Command is meant to be used with token language `tex'")) - (unless x-symbol-mode - (error "Command is meant to be used if X-Symbol mode is enabled")) - (or beg (setq beg (point-min))) - (or end (setq end (point-max))) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (let ((first-change-hook nil) ; no `flyspell-mode' here - (after-change-functions nil) ; no fontification! - (count 0) - (case-fold-search (x-symbol-grammar-case-function - x-symbol-tex-token-grammar)) - (regexp (if (featurep 'mule) - "{[^\000-\177]}" - "{\\(?:[\240-\377]\\|[\200-\237][\240-\377]\\)}")) - (token-classes (x-symbol-generated-token-classes - x-symbol-tex-generated-data)) - charsym - (end (make-marker))) - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (set-marker end (point)) - (goto-char (1+ (match-beginning 0))) - (when (and (setq charsym (x-symbol-encode-charsym-after)) - (x-symbol-even-escapes-before-p (match-beginning 0) ?\\) - (eq (car (gethash charsym token-classes)) 'text)) - (goto-char (match-beginning 0)) - (delete-char 1) - (goto-char end) - (delete-char -1) - (incf count))) - (if font-lock-mode (x-symbol-fontify (point-min) (point-max))) - (set-marker end nil) - (if (interactive-p) - (message "Converted %d old TeX sequences like {C} in %s" - count (x-symbol-region-text t))))))) - -(defvar x-symbol-tex-xdecode-obarray nil) - -(defun x-symbol-tex-xdecode-latex (&optional beg end) - "Decode LaTeX sequences for accented characters like \'{C}." - (interactive (and (region-active-p) (list (region-beginning) (region-end)))) - (unless (eq x-symbol-language 'tex) - (error "Command is meant to be used with token language `tex'")) - (unless x-symbol-mode - (error "Command is meant to be used if X-Symbol mode is enabled")) - (or beg (setq beg (point-min))) - (or end (setq end (point-max))) - (unless x-symbol-tex-xdecode-obarray - (let ((re "\\`\\(\\\\[.~^\"'`=ckvuHr]\\) ?\\([A-Za-z]\\|\\\\[ij]\\)\\'") - (ij (list (cons "\\i" (gethash 'dotlessi x-symbol-cstring-table)) - (cons "\\j" (gethash 'dotlessj x-symbol-cstring-table)))) - alist) - (maphash (lambda (charsym value) - (setq value (car value)) - (when (string-match re value) - (push (list (format "%s{%s}" - (match-string 1 value) - (or (cdr (assoc (match-string 2 value) - ij)) - (match-string 2 value))) - charsym nil) - alist))) - (x-symbol-generated-encode-table x-symbol-tex-generated-data)) - (setq x-symbol-tex-xdecode-obarray (x-symbol-alist-to-obarray alist)))) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (let ((first-change-hook nil) ; no `flyspell-mode' here - (after-change-functions nil)) ; no fontification! - (goto-char (point-min)) - (x-symbol-decode-lisp - '(?\\) - (format "\\\\[.~^\"'`=ckvuHr]{\\(?:[A-Za-z]\\|%s\\|%s\\)}" - (gethash 'dotlessi x-symbol-cstring-table) - (gethash 'dotlessj x-symbol-cstring-table)) - x-symbol-tex-xdecode-obarray nil) - (if font-lock-mode (x-symbol-fontify (point-min) (point-max))) - (if (interactive-p) - (message "Decoded alternative TeX sequences like \\'{C} in %s" - (x-symbol-region-text t))))))) - -;;; Local IspellPersDict: .ispell_xsymb -;;; x-symbol-tex.el ends here |