yatex
annotate yatexenv.el @ 53:5f4b18da14b3
Fix functions relating YaTeX-beginning-of-environment or
YaTeX-end-of-environment.
Line indentation by TAB much improved.
Functions that work at enclosing environments, YaTeX-enclose-<ENVNAME>,
introduced. Functions for enclosing verbatim and equations are supplied.
SPC, DEL, +, - in YaTeX-hierarchy buffer.
Compensate odd highlighting of hilit19.
author | yuuji |
---|---|
date | Thu, 02 Feb 1995 17:18:29 +0000 |
parents | eb0512bfcb7f |
children | a9653fbd1c1c |
rev | line source |
---|---|
yuuji@23 | 1 ;;; -*- Emacs-Lisp -*- |
yuuji@23 | 2 ;;; YaTeX environment-specific functions. |
yuuji@23 | 3 ;;; yatexenv.el |
yuuji@23 | 4 ;;; (c ) 1994 by HIROSE Yuuji.[yuuji@ae.keio.ac.jp] |
yuuji@53 | 5 ;;; Last modified Thu Feb 2 16:11:12 1995 on pajero |
yuuji@23 | 6 ;;; $Id$ |
yuuji@23 | 7 |
yuuji@23 | 8 ;;; |
yuuji@23 | 9 ;; Functions for tabular environment |
yuuji@23 | 10 ;;; |
yuuji@23 | 11 |
yuuji@23 | 12 ;; Showing the matching column of tabular environment. |
yuuji@23 | 13 (defun YaTeX-array-what-column () |
yuuji@23 | 14 "Show matching columne title of array environment. |
yuuji@23 | 15 When calling from a program, make sure to be in array/tabular environment." |
yuuji@49 | 16 (let ((p (point)) beg eot bor (nlptn "\\\\\\\\") (andptn "[^\\]&") |
yuuji@49 | 17 (n 0) j |
yuuji@23 | 18 (firsterr "This line might be the first row.")) |
yuuji@23 | 19 (save-excursion |
yuuji@23 | 20 (YaTeX-beginning-of-environment) |
yuuji@23 | 21 (search-forward "{" p) (up-list 1) |
yuuji@23 | 22 (search-forward "{" p) (up-list 1) |
yuuji@23 | 23 ;;(re-search-forward andptn p) |
yuuji@23 | 24 (while (progn (search-forward "&" p) |
yuuji@23 | 25 (equal (char-after (1- (match-beginning 0))) ?\\ ))) |
yuuji@23 | 26 (setq beg (1- (point))) ;beg is the point of the first & |
yuuji@23 | 27 (or (re-search-forward nlptn p t) |
yuuji@23 | 28 (error firsterr)) |
yuuji@23 | 29 (setq eot (point)) ;eot is the point of the first \\ |
yuuji@23 | 30 (goto-char p) |
yuuji@23 | 31 (or (re-search-backward nlptn beg t) |
yuuji@23 | 32 (error firsterr)) |
yuuji@23 | 33 (setq bor (point)) ;bor is the beginning of this row. |
yuuji@23 | 34 (while (< (1- (point)) p) |
yuuji@23 | 35 (if (equal (following-char) ?&) |
yuuji@23 | 36 (forward-char 1) |
yuuji@23 | 37 (re-search-forward andptn nil 1)) |
yuuji@23 | 38 (setq n (1+ n))) ;Check current column number |
yuuji@23 | 39 (goto-char p) |
yuuji@23 | 40 (cond ;Start searching \multicolumn{N} |
yuuji@23 | 41 ((> n 1) |
yuuji@23 | 42 (re-search-backward andptn) ;Sure to find! |
yuuji@23 | 43 (while (re-search-backward "\\\\multicolumn{\\([0-9]+\\)}" bor t) |
yuuji@23 | 44 (setq n (+ n (string-to-int |
yuuji@23 | 45 (buffer-substring (match-beginning 1) |
yuuji@23 | 46 (match-end 1))) |
yuuji@23 | 47 -1))))) |
yuuji@23 | 48 (message "%s" n) |
yuuji@23 | 49 (goto-char (1- beg)) |
yuuji@49 | 50 (setq j n) |
yuuji@49 | 51 (while (> j 1) |
yuuji@49 | 52 (or (re-search-forward andptn p nil) |
yuuji@49 | 53 (error "This column exceeds the limit.")) |
yuuji@49 | 54 (setq j (1- j))) |
yuuji@49 | 55 (skip-chars-forward "\\s ") |
yuuji@49 | 56 (message |
yuuji@49 | 57 "This is the column(#%d) of: %s" n |
yuuji@49 | 58 (buffer-substring |
yuuji@49 | 59 (point) |
yuuji@49 | 60 (progn |
yuuji@49 | 61 (re-search-forward (concat andptn "\\|" nlptn) eot) |
yuuji@49 | 62 (goto-char (match-beginning 0)) |
yuuji@49 | 63 (if (looking-at andptn) |
yuuji@49 | 64 (forward-char 1)) |
yuuji@49 | 65 (skip-chars-backward "\\s ") |
yuuji@49 | 66 (point)))))) |
yuuji@23 | 67 ) |
yuuji@23 | 68 |
yuuji@23 | 69 ;;;###autoload |
yuuji@23 | 70 (defun YaTeX-what-column () |
yuuji@23 | 71 "Show which kind of column the current position is belonging to." |
yuuji@23 | 72 (interactive) |
yuuji@23 | 73 (cond |
yuuji@23 | 74 ((YaTeX-quick-in-environment-p '("tabular" "tabular*" "array" "array*")) |
yuuji@23 | 75 (YaTeX-array-what-column)) |
yuuji@23 | 76 (t (message "Not in array/tabuar environment."))) |
yuuji@23 | 77 ) |
yuuji@23 | 78 |
yuuji@31 | 79 (defun YaTeX-tabular-parse-format (&optional tabular*) |
yuuji@31 | 80 "Parse `tabular' format. |
yuuji@31 | 81 Return the list of (No.ofCols PointEndofFormat)" |
yuuji@31 | 82 (let ((p (point)) elt boform eoform (cols 0)) |
yuuji@31 | 83 (save-excursion |
yuuji@31 | 84 (if (null (YaTeX-beginning-of-environment t)) |
yuuji@31 | 85 (error "Beginning of tabular not found.")) |
yuuji@31 | 86 (skip-chars-forward "^{") |
yuuji@31 | 87 (forward-list 1) |
yuuji@31 | 88 (if tabular* |
yuuji@31 | 89 (progn (skip-chars-forward "^{") |
yuuji@31 | 90 (forward-list 1))) |
yuuji@31 | 91 (skip-chars-forward "^{" p) |
yuuji@31 | 92 (if (/= (following-char) ?\{) (error "Tabular format not found.")) |
yuuji@31 | 93 (setq boform (1+ (point)) |
yuuji@31 | 94 eoform (progn (forward-list 1) (1- (point)))) |
yuuji@31 | 95 (if (> eoform p) (error "Non-terminated tabular format.")) |
yuuji@31 | 96 (goto-char boform) |
yuuji@31 | 97 (while (< (point) eoform) |
yuuji@31 | 98 (setq elt (following-char)) |
yuuji@31 | 99 (cond |
yuuji@31 | 100 ((string-match (char-to-string elt) "clr") ;normal indicators. |
yuuji@31 | 101 (setq cols (1+ cols)) |
yuuji@31 | 102 (forward-char 1)) |
yuuji@31 | 103 ((equal elt ?|) ;vertical |
yuuji@31 | 104 (forward-char 1)) |
yuuji@31 | 105 ((string-match (char-to-string elt) "p@") ;p or @ expression |
yuuji@31 | 106 (setq cols (+ (if (eq elt ?p) 1 0) cols)) |
yuuji@31 | 107 (skip-chars-forward "^{" p) |
yuuji@31 | 108 (forward-list 1)))) |
yuuji@31 | 109 (list cols (1+ eoform)))) |
yuuji@31 | 110 ) |
yuuji@31 | 111 ;; Insert & |
yuuji@31 | 112 (defun YaTeX-intelligent-newline-tabular (&optional tabular*) |
yuuji@31 | 113 "Parse current tabular format and insert that many `&'s." |
yuuji@31 | 114 (let*((p (point)) (format (YaTeX-tabular-parse-format tabular*)) |
yuuji@31 | 115 (cols (car format)) (beg (car (cdr format))) |
yuuji@31 | 116 space hline) |
yuuji@31 | 117 (setq hline (search-backward "\\hline" beg t)) |
yuuji@31 | 118 (goto-char p) |
yuuji@31 | 119 (setq space (if (search-backward "\t&" beg t) "\t" " ")) |
yuuji@31 | 120 (goto-char p) |
yuuji@31 | 121 (YaTeX-indent-line) |
yuuji@31 | 122 (setq p (point)) |
yuuji@31 | 123 (while (> (1- cols) 0) |
yuuji@31 | 124 (insert "&" space) |
yuuji@31 | 125 (setq cols (1- cols))) |
yuuji@31 | 126 (insert "\\\\") |
yuuji@31 | 127 (if hline (insert " \\hline")) |
yuuji@31 | 128 (goto-char p)) |
yuuji@31 | 129 ) |
yuuji@31 | 130 |
yuuji@31 | 131 (defun YaTeX-intelligent-newline-tabular* () |
yuuji@31 | 132 "Parse current tabular* format and insert that many `&'s." |
yuuji@31 | 133 (YaTeX-intelligent-newline-tabular t) |
yuuji@31 | 134 ) |
yuuji@31 | 135 |
yuuji@31 | 136 (fset 'YaTeX-intelligent-newline-array 'YaTeX-intelligent-newline-tabular) |
yuuji@31 | 137 |
yuuji@23 | 138 ;;; |
yuuji@23 | 139 ;; Functions for tabbing environment |
yuuji@23 | 140 ;;; |
yuuji@23 | 141 (defun YaTeX-intelligent-newline-tabbing () |
yuuji@23 | 142 "Check the number of \\= in the first line and insert that many \\>." |
yuuji@23 | 143 (let ((p (point)) begenv tabcount) |
yuuji@23 | 144 (save-excursion |
yuuji@23 | 145 (YaTeX-beginning-of-environment) |
yuuji@23 | 146 (setq begenv (point-end-of-line)) |
yuuji@23 | 147 (if (YaTeX-search-active-forward "\\\\" YaTeX-comment-prefix p t) |
yuuji@23 | 148 (progn |
yuuji@23 | 149 (setq tabcount 0) |
yuuji@23 | 150 (while (> (point) begenv) |
yuuji@23 | 151 (if (search-backward "\\=" begenv 1) |
yuuji@23 | 152 (setq tabcount (1+ tabcount))))))) |
yuuji@23 | 153 (YaTeX-indent-line) |
yuuji@23 | 154 (if tabcount |
yuuji@23 | 155 (progn |
yuuji@23 | 156 (save-excursion |
yuuji@23 | 157 (while (> tabcount 0) |
yuuji@23 | 158 (insert "\\>\t") |
yuuji@23 | 159 (setq tabcount (1- tabcount)))) |
yuuji@23 | 160 (forward-char 2)) |
yuuji@23 | 161 (insert "\\="))) |
yuuji@23 | 162 ) |
yuuji@23 | 163 |
yuuji@23 | 164 ;;; |
yuuji@23 | 165 ;; Functions for itemize/enumerate/list environments |
yuuji@23 | 166 ;;; |
yuuji@23 | 167 |
yuuji@23 | 168 (defvar YaTeX-item-for-insert "\\item ") |
yuuji@23 | 169 (defun YaTeX-intelligent-newline-itemize () |
yuuji@23 | 170 "Insert '\\item '." |
yuuji@23 | 171 (insert YaTeX-item-for-insert) |
yuuji@53 | 172 (YaTeX-indent-line) |
yuuji@23 | 173 ) |
yuuji@23 | 174 (fset 'YaTeX-intelligent-newline-enumerate 'YaTeX-intelligent-newline-itemize) |
yuuji@23 | 175 (fset 'YaTeX-intelligent-newline-list 'YaTeX-intelligent-newline-itemize) |
yuuji@23 | 176 |
yuuji@23 | 177 (defun YaTeX-intelligent-newline-description () |
yuuji@23 | 178 (insert "\\item[] ") |
yuuji@23 | 179 (forward-char -2) |
yuuji@53 | 180 (YaTeX-indent-line) |
yuuji@23 | 181 ) |
yuuji@23 | 182 |
yuuji@23 | 183 |
yuuji@23 | 184 ;;; |
yuuji@23 | 185 ;; Intelligent newline |
yuuji@23 | 186 ;;; |
yuuji@23 | 187 ;;;###autoload |
yuuji@23 | 188 (defun YaTeX-intelligent-newline (arg) |
yuuji@23 | 189 "Insert newline and environment-specific entry. |
yuuji@23 | 190 `\\item' for some itemizing environment, |
yuuji@23 | 191 `\\> \\> \\' for tabbing environemnt, |
yuuji@23 | 192 `& & \\ \hline' for tabular environment." |
yuuji@23 | 193 (interactive "P") |
yuuji@23 | 194 (let*((env (YaTeX-inner-environment)) |
yuuji@23 | 195 func) |
yuuji@23 | 196 (if arg (setq env (YaTeX-read-environment "For what environment? "))) |
yuuji@23 | 197 (setq func (intern-soft (concat "YaTeX-intelligent-newline-" env))) |
yuuji@23 | 198 (end-of-line) |
yuuji@23 | 199 (newline) |
yuuji@23 | 200 (if (and env func (fboundp func)) |
yuuji@23 | 201 (funcall func))) |
yuuji@23 | 202 ) |
yuuji@53 | 203 |
yuuji@53 | 204 ;;; |
yuuji@53 | 205 ;; Environment-specific line indenting functions |
yuuji@53 | 206 ;;; |
yuuji@53 | 207 ;;;###autoload |
yuuji@53 | 208 (defun YaTeX-indent-line-equation () |
yuuji@53 | 209 "Indent a line in equation family." |
yuuji@53 | 210 (let ((p (point)) (l-r 0) right-p peol depth (mp YaTeX-environment-indent)) |
yuuji@53 | 211 (if (save-excursion |
yuuji@53 | 212 (beginning-of-line) |
yuuji@53 | 213 (skip-chars-forward " \t") |
yuuji@53 | 214 (looking-at "\\\\right\\b")) |
yuuji@53 | 215 (progn (YaTeX-reindent |
yuuji@53 | 216 (save-excursion (YaTeX-goto-corresponding-leftright) |
yuuji@53 | 217 (current-column)))) |
yuuji@53 | 218 (save-excursion |
yuuji@53 | 219 (forward-line -1) |
yuuji@53 | 220 (while (and (not (bobp)) (YaTeX-on-comment-p)) |
yuuji@53 | 221 (forward-line -1)) |
yuuji@53 | 222 ;;(beginning-of-line) ;must be unnecessary |
yuuji@53 | 223 (skip-chars-forward " \t") |
yuuji@53 | 224 (if (eolp) (error "Math-environment can't have a null line!!")) |
yuuji@53 | 225 (setq depth (current-column) |
yuuji@53 | 226 peol (point-end-of-line)) |
yuuji@53 | 227 (while (re-search-forward |
yuuji@53 | 228 "\\\\\\(\\(left\\)\\|\\(right\\)\\)\\b" peol t) |
yuuji@53 | 229 (setq l-r (+ l-r (if (match-beginning 2) 1 -1)))) |
yuuji@53 | 230 (cond |
yuuji@53 | 231 ((progn (beginning-of-line) |
yuuji@53 | 232 (re-search-forward "\\\\\\\\\\s *$" (point-end-of-line) t)) |
yuuji@53 | 233 ;;If previous line has `\\', this indentation is always normal. |
yuuji@53 | 234 (setq depth (+ (YaTeX-current-indentation) mp))) |
yuuji@53 | 235 ((> l-r 0) |
yuuji@53 | 236 (beginning-of-line) |
yuuji@53 | 237 (search-forward "\\left" peol) |
yuuji@53 | 238 (goto-char (1+ (match-beginning 0))) |
yuuji@53 | 239 (setq depth (current-column))) |
yuuji@53 | 240 ((< l-r 0) |
yuuji@53 | 241 (goto-char (match-beginning 0)) ;should be \right |
yuuji@53 | 242 (YaTeX-goto-corresponding-leftright) |
yuuji@53 | 243 (beginning-of-line) |
yuuji@53 | 244 (skip-chars-forward " \t") |
yuuji@53 | 245 (setq depth (+ (current-column) mp))) ;+mp is good? |
yuuji@53 | 246 (t ;if \left - \right = 0 |
yuuji@53 | 247 (cond |
yuuji@53 | 248 ((re-search-forward "\\\\\\\\\\s *$" peol t) |
yuuji@53 | 249 (setq depth (+ (YaTeX-current-indentation) mp))) |
yuuji@53 | 250 ((re-search-forward "\\\\end{" peol t) |
yuuji@53 | 251 nil) ;same indentation as previous line's |
yuuji@53 | 252 ((re-search-forward "\\\\begin{" peol t) |
yuuji@53 | 253 (setq depth (+ depth mp))) |
yuuji@53 | 254 (t |
yuuji@53 | 255 (or (bobp) (forward-line -1)) |
yuuji@53 | 256 (cond |
yuuji@53 | 257 ((re-search-forward |
yuuji@53 | 258 "\\\\\\\\\\s *$\\|\\\\begin{" (point-end-of-line) t) |
yuuji@53 | 259 (setq depth (+ depth mp))) |
yuuji@53 | 260 ))))) |
yuuji@53 | 261 (goto-char p)) |
yuuji@53 | 262 (YaTeX-reindent depth)))) |
yuuji@53 | 263 |
yuuji@53 | 264 ;;;###autoload |
yuuji@53 | 265 (defun YaTeX-goto-corresponding-leftright () |
yuuji@53 | 266 "Go to corresponding \left or \right. |
yuuji@53 | 267 Note that this function assumes the corresponding \left\right |
yuuji@53 | 268 is on another line." |
yuuji@53 | 269 (let ((YaTeX-struct-begin "\\left%1") |
yuuji@53 | 270 (YaTeX-struct-end "\\right%1") |
yuuji@53 | 271 (YaTeX-struct-name-regexp "[][(){}.|]")) |
yuuji@53 | 272 (YaTeX-goto-corresponding-environment t))) |
yuuji@53 | 273 |
yuuji@53 | 274 ;;; |
yuuji@53 | 275 ;; Functions for formatting region being enclosed with environment |
yuuji@53 | 276 ;;; |
yuuji@53 | 277 ; These functions must take two argument; region-beginning, region-end. |
yuuji@53 | 278 |
yuuji@53 | 279 (defun YaTeX-enclose-equation (beg end) |
yuuji@53 | 280 (goto-char beg) |
yuuji@53 | 281 (save-restriction |
yuuji@53 | 282 (let (m0 bsl) |
yuuji@53 | 283 (narrow-to-region beg end) |
yuuji@53 | 284 (while (YaTeX-re-search-active-forward |
yuuji@53 | 285 "\\(\\$\\)" YaTeX-comment-prefix nil t) |
yuuji@53 | 286 (goto-char (setq m0 (match-beginning 0))) |
yuuji@53 | 287 (setq bsl 0) |
yuuji@53 | 288 (if (and (not (bobp)) (= (char-after (1- (point))) ?\\ )) |
yuuji@53 | 289 (while (progn (forward-char -1) (= (char-after (point)) ?\\ )) |
yuuji@53 | 290 (setq bsl (1+ bsl)))) |
yuuji@53 | 291 (goto-char m0) |
yuuji@53 | 292 (if (= 0 (% bsl 2)) |
yuuji@53 | 293 (delete-char 1) |
yuuji@53 | 294 (forward-char 1)))))) |
yuuji@53 | 295 |
yuuji@53 | 296 (fset 'YaTeX-enclose-eqnarray 'YaTeX-enclose-equation) |
yuuji@53 | 297 (fset 'YaTeX-enclose-eqnarray* 'YaTeX-enclose-equation) |
yuuji@53 | 298 |
yuuji@53 | 299 (defun YaTeX-enclose-verbatim (beg end)) ;do nothing when enclose verbatim |
yuuji@53 | 300 (fset 'YaTeX-enclose-verbatim* 'YaTeX-enclose-verbatim) |
yuuji@53 | 301 |
yuuji@53 | 302 (provide 'yatexenv) |