yatex

view yatexadd.el @ 232:b46b927914c8

Add-in for \eqref{} searches only equations.
author yuuji@gentei.org
date Sat, 28 Jan 2012 10:00:26 +0900
parents 6eff724aba41
children b75390dd4260
line source
1 ;;; -*- Emacs-Lisp -*-
2 ;;; YaTeX add-in functions.
3 ;;; yatexadd.el rev.20
4 ;;; (c)1991-2012 by HIROSE Yuuji.[yuuji@yatex.org]
5 ;;; Last modified Sat Jan 28 09:55:19 2012 on firestorm
6 ;;; $Id$
8 ;;;
9 ;;Sample functions for LaTeX environment.
10 ;;;
11 (defvar YaTeX:tabular-default-rule
12 "@{\\vrule width 1pt\\ }c|c|c@{\\ \\vrule width 1pt}"
13 "*Your favorite default rule format.")
15 (defvar YaTeX:tabular-thick-vrule "\\vrule width %s"
16 "*Vertical thick line format (without @{}). %s'll be replaced by its width.")
18 (defvar YaTeX:tabular-thick-hrule "\\noalign{\\hrule height %s}"
19 "*Horizontal thick line format. %s will be replaced by its width.")
21 (defun YaTeX:tabular ()
22 "YaTeX add-in function for tabular environment.
23 Notice that this function refers the let-variable `env' in
24 YaTeX-make-begin-end."
25 (let ((width "") bars (rule "") (and "") (j 1) loc ans (hline "\\hline"))
26 (if (string= YaTeX-env-name "tabular*")
27 (setq width (concat "{" (read-string "Width: ") "}")))
28 (setq loc (YaTeX:read-position "tb")
29 bars (string-to-int
30 (read-string "Number of columns(0 for default format): " "3")))
31 (if (<= bars 0)
32 (setq ;if 0, simple format
33 rule YaTeX:tabular-default-rule
34 and "& &")
35 (while (< j bars) ;repeat bars-1 times
36 (setq rule (concat rule "c|")
37 and (concat and "& ")
38 j (1+ j)))
39 (setq rule (concat rule "c"))
40 (message "(N)ormal-frame or (T)hick frame? [nt]")
41 (setq ans (read-char))
42 (cond
43 ((or (equal ans ?t) (equal ans ?T))
44 (setq ans (read-string "Rule width: " "1pt")
45 rule (concat
46 "@{" (format YaTeX:tabular-thick-vrule ans) "}"
47 rule
48 "@{\\ " (format YaTeX:tabular-thick-vrule ans) "}")
49 hline (format YaTeX:tabular-thick-hrule ans)))
50 (t (setq rule (concat "|" rule "|")
51 hline "\\hline"))))
53 (setq rule (read-string "rule format: " rule))
54 (setq YaTeX-single-command "hline")
56 (format "%s%s{%s}" width loc rule)))
58 (fset 'YaTeX:tabular* 'YaTeX:tabular)
59 (fset 'YaTeX:supertabular 'YaTeX:tabular)
60 (defun YaTeX:alignat ()
61 (concat "{" (read-string "Number of columns: ") "}"))
62 (defun YaTeX:array ()
63 (concat (YaTeX:read-position "tb")
64 "{" (read-string "Column format: ") "}"))
65 (defun YaTeX:subequations ()
66 (message (if YaTeX-japan "分かりやすいコメントに変えるとref補完が楽よ"
67 "Changing comment string reduces effort at `ref' completion"))
68 (concat " " YaTeX-comment-prefix
69 (YaTeX::ref-default-label "%H:%M")
70 (if YaTeX-japan "の式群" "equations")))
72 (defun YaTeX:read-oneof (oneof &optional quick allow-dup)
73 (let ((pos "") loc (guide ""))
74 (and (boundp 'name) name (setq guide (format "%s " name)))
75 (catch 'quick
76 (while (not (string-match
77 (setq loc (read-key-sequence
78 (format "%s position (`%s') [%s]: "
79 guide oneof pos));name is in YaTeX-addin
80 loc (if (fboundp 'events-to-keys)
81 (events-to-keys loc) loc))
82 "\r\^g\n"))
83 (cond
84 ((string-match loc oneof)
85 (if (or allow-dup (not (string-match loc pos)))
86 (setq pos (concat pos loc)))
87 (if quick (throw 'quick t)))
88 ((and (string-match loc "\C-h\C-?") (> (length pos) 0))
89 (setq pos (substring pos 0 (1- (length pos)))))
90 (t
91 (ding)
92 (message "Please input one of `%s'." oneof)
93 (sit-for 3)))))
94 (message "")
95 pos))
97 (defun YaTeX:read-position (oneof)
98 "Read a LaTeX (optional) position format such as `[htbp]'."
99 (let ((pos (YaTeX:read-oneof oneof)))
100 (if (string= pos "") "" (concat "[" pos "]"))))
102 ;;;
103 ;; Functions for figure environemnt
104 ;;;
105 (defvar YaTeX:figure-caption-first nil
106 "Non-nil indicates put caption before figure.")
107 (defun YaTeX:figure (&optional type firstp)
108 "YaTeX add-in function for figure(*) environment."
109 (let*((caption "") (label "") (opts "")
110 (top (if type firstp YaTeX:figure-caption-first))
111 (tl (or type "Figure"))
112 (heremsg (format "%% %s here" tl)))
113 (setq label (read-string (concat tl " Label: ")))
114 (if (string= "" label)
115 (setq YaTeX-section-name "label")
116 (setq opts (format "\n\\label{%s}" label)))
117 (setq caption (read-string (concat tl " Caption: ")))
118 (if (string= "" caption)
119 (setq YaTeX-section-name "caption")
120 (setq caption (format "\\caption{%s}" caption)
121 opts (format "%s\n%s\n%s"
122 opts
123 (if top caption heremsg)
124 (if top heremsg caption)))
125 (format "\\caption{%s}" caption))
126 opts))
128 (fset 'YaTeX:figure* 'YaTeX:figure)
130 ;;;
131 ;; Functions for table environemnt
132 ;;;
133 (defvar YaTeX:table-caption-first t
134 "*Non-nil indicates put caption before tabular.")
135 (defun YaTeX:table ()
136 "YaTeX add-in function for table environment."
137 (cond
138 ((eq major-mode 'yatex-mode)
139 (setq YaTeX-env-name "tabular")
140 (YaTeX:figure "Table" YaTeX:table-caption-first))
141 ((eq major-mode 'texinfo-mode)
142 (concat " "
143 (completing-read
144 "Highlights with: "
145 '(("@samp")("@kbd")("@code")("@asis")("@file")("@var"))
146 nil nil "@")))))
147 (fset 'YaTeX:table* 'YaTeX:table)
149 (defun YaTeX:description ()
150 "Truly poor service:-)"
151 (setq YaTeX-single-command "item[]")
152 "")
154 (defun YaTeX:itemize ()
155 "It's also poor service."
156 (setq YaTeX-single-command "item")
157 "")
159 (fset 'YaTeX:enumerate 'YaTeX:itemize)
161 (defun YaTeX:picture ()
162 "Ask the size of coordinates of picture environment."
163 (concat (YaTeX:read-coordinates "Picture size")
164 (YaTeX:read-coordinates "Initial position")))
166 (defun YaTeX:equation ()
167 (YaTeX-jmode-off)
168 (if (fboundp 'YaTeX-toggle-math-mode)
169 (YaTeX-toggle-math-mode t))) ;force math-mode ON.
171 (mapcar '(lambda (f) (fset f 'YaTeX:equation))
172 '(YaTeX:eqnarray YaTeX:eqnarray* YaTeX:align YaTeX:align*
173 YaTeX:split YaTeX:multline YaTeX:multline* YaTeX:gather YaTeX:gather*
174 YaTeX:aligned* YaTeX:gathered YaTeX:gathered*
175 YaTeX:alignat YaTeX:alignat* YaTeX:xalignat YaTeX:xalignat*
176 YaTeX:xxalignat YaTeX:xxalignat*))
178 (defun YaTeX:alignat ()
179 (YaTeX:equation)
180 (concat "{" (read-string "Number of cols: ") "}"))
184 (defun YaTeX:list ()
185 "%\n{} %default label\n{} %formatting parameter")
187 (defun YaTeX:minipage ()
188 (concat (YaTeX:read-position "cbt")
189 "{" (read-string "Width: ") "}"))
191 (defun YaTeX:thebibliography ()
192 (setq YaTeX-section-name "bibitem")
193 (concat "{" (read-string "Longest label: ") "}"))
195 (defun YaTeX:multicols ()
196 (concat "{" (read-string "Number of columns: ") "}"))
198 ;;;
199 ;;Sample functions for section-type command.
200 ;;;
201 (defun YaTeX:multiput ()
202 (concat (YaTeX:read-coordinates "Pos")
203 (YaTeX:read-coordinates "Step")
204 "{" (read-string "How many times: ") "}"))
206 (defun YaTeX:put ()
207 (YaTeX:read-coordinates "Pos"))
209 (defun YaTeX:makebox ()
210 (cond
211 ((YaTeX-in-environment-p "picture")
212 (concat (YaTeX:read-coordinates "Dimension")
213 (YaTeX:read-position "lsrtb")))
214 (t
215 (let ((width (read-string "Width: ")))
216 (if (string< "" width)
217 (progn
218 (or (equal (aref width 0) ?\[)
219 (setq width (concat "[" width "]")))
220 (concat width (YaTeX:read-position
221 (if YaTeX-use-LaTeX2e "lrs" "lr")))))))))
223 ;; (defun YaTeX:framebox ()
224 ;; (if (YaTeX-quick-in-environment-p "picture")
225 ;; (YaTeX:makebox)))
226 (fset 'YaTeX:framebox 'YaTeX:makebox)
228 (defun YaTeX:parbox ()
229 (YaTeX:read-position "tbc"))
230 (defun YaTeX::parbox (argp)
231 (cond
232 ((= argp 1) (read-string "Width: "))
233 ((= argp 2) (read-string "Text: "))))
235 (defun YaTeX::dashbox ()
236 (concat "{" (read-string "Dash dimension: ") "}"
237 (YaTeX:read-coordinates "Dimension")))
239 (defun YaTeX::savebox (argp)
240 (cond
241 ((= argp 1) (read-string "Saved into name: " "\\"))
242 ((= argp 2) (read-string "Text: "))))
244 (defvar YaTeX-minibuffer-quick-map nil)
245 (if YaTeX-minibuffer-quick-map nil
246 (setq YaTeX-minibuffer-quick-map
247 (copy-keymap minibuffer-local-completion-map))
248 (let ((ch (1+ ? )))
249 (while (< ch 127)
250 (define-key YaTeX-minibuffer-quick-map (char-to-string ch)
251 'YaTeX-minibuffer-quick-complete)
252 (setq ch (1+ ch)))))
254 (defvar YaTeX:left-right-delimiters
255 '(("(" . ")") (")" . "(") ("[" . "]") ("]" . "[")
256 ("\\{" . "\\}") ("\\}" . "\\{") ("|") ("\\|")
257 ("\\lfloor" . "\\rfloor") ("\\lceil" . "\\rceil")
258 ("\\langle" . "\\rangle") ("/") (".")
259 ("\\rfloor" . "\\rfloor") ("\\rceil" . "\\lceil")
260 ("\\rangle" . "\\langle") ("\\backslash")
261 ("\\uparrow") ("\\downarrow") ("\\updownarrow") ("\\Updownarrow"))
262 "TeX math delimiter, which can be completed after \\right or \\left.")
264 (defvar YaTeX:left-right-default nil "Default string of YaTeX:right.")
266 (defun YaTeX:left ()
267 (let ((minibuffer-completion-table YaTeX:left-right-delimiters)
268 delimiter (leftp (string= YaTeX-single-command "left")))
269 (setq delimiter
270 (read-from-minibuffer
271 (format "Delimiter%s: "
272 (if YaTeX:left-right-default
273 (format "(default=`%s')" YaTeX:left-right-default)
274 "(SPC for menu)"))
275 nil YaTeX-minibuffer-quick-map))
276 (if (string= "" delimiter) (setq delimiter YaTeX:left-right-default))
277 (setq YaTeX-single-command (if leftp "right" "left")
278 YaTeX:left-right-default
279 (or (cdr (assoc delimiter YaTeX:left-right-delimiters)) delimiter))
280 delimiter))
282 (fset 'YaTeX:right 'YaTeX:left)
284 (defun YaTeX:langle ()
285 (setq YaTeX-single-command "rangle")
286 nil)
288 (defun YaTeX:read-coordinates (&optional mes varX varY)
289 (concat
290 "("
291 (read-string (format "%s %s: " (or mes "Dimension") (or varX "X")))
292 ","
293 (read-string (format "%s %s: " (or mes "Dimension") (or varY "Y")))
294 ")"))
296 (defun YaTeX:itembox ()
297 (concat "{" (read-string "Item heading string: ") "}"))
299 ;;;
300 ;;Sample functions for maketitle-type command.
301 ;;;
302 (defun YaTeX:sum ()
303 "Read range of summation."
304 (YaTeX:check-completion-type 'maketitle)
305 (concat (YaTeX:read-boundary "_") (YaTeX:read-boundary "^")))
307 (fset 'YaTeX:int 'YaTeX:sum)
309 (defun YaTeX:lim ()
310 "Insert limit notation of \\lim."
311 (YaTeX:check-completion-type 'maketitle)
312 (let ((var (read-string "Variable: ")) limit)
313 (if (string= "" var) ""
314 (setq limit (read-string "Limit ($ means infinity): "))
315 (if (string= "$" limit) (setq limit "\\infty"))
316 (concat "_{" var " \\rightarrow " limit "}"))))
318 (defun YaTeX:gcd ()
319 "Add-in function for \\gcd(m,n)."
320 (YaTeX:check-completion-type 'maketitle)
321 (YaTeX:read-coordinates "\\gcd" "(?,)" "(,?)"))
323 (defun YaTeX:read-boundary (ULchar)
324 "Read boundary usage by _ or ^. _ or ^ is indicated by argument ULchar."
325 (let ((bndry (read-string (concat ULchar "{???} ($ for infinity): "))))
326 (if (string= bndry "") ""
327 (if (string= bndry "$") (setq bndry "\\infty"))
328 (concat ULchar "{" bndry "}"))))
330 (defun YaTeX:verb ()
331 "Enclose \\verb's contents with the same characters."
332 (let ((quote-char (read-string "Quoting char: " "|"))
333 (contents (read-string "Quoted contents: ")))
334 (concat quote-char contents quote-char)))
336 (fset 'YaTeX:verb* 'YaTeX:verb)
338 (defun YaTeX:footnotemark ()
339 (setq YaTeX-section-name "footnotetext")
340 nil)
342 (defun YaTeX:cite ()
343 (let ((comment (read-string "Comment for citation: ")))
344 (if (string= comment "") ""
345 (concat "[" comment "]"))))
347 (defun YaTeX:bibitem ()
348 (let ((label (read-string "Citation label for bibitem: ")))
349 (if (string= label "") ""
350 (concat "[" label "]"))))
352 (defun YaTeX:item ()
353 (cond
354 ((eq major-mode 'yatex-mode)
355 (YaTeX-indent-line)
356 (setq YaTeX-section-name "label"))
357 ((eq major-mode 'texinfo-mode)
358 (setq YaTeX-section-name "dots"))) ;??
359 " ")
360 (fset 'YaTeX:item\[\] 'YaTeX:item)
361 (fset 'YaTeX:subitem 'YaTeX:item)
362 (fset 'YaTeX:subsubitem 'YaTeX:item)
364 (defun YaTeX:linebreak ()
365 (let (obl)
366 (message "Break strength 0,1,2,3,4 (default: 4): ")
367 (setq obl (char-to-string (read-char)))
368 (if (string-match "[0-4]" obl)
369 (concat "[" obl "]")
370 "")))
371 (fset 'YaTeX:pagebreak 'YaTeX:linebreak)
373 ;;;
374 ;;Subroutine
375 ;;;
377 (defun YaTeX:check-completion-type (type)
378 "Check valid completion type."
379 (if (not (eq type YaTeX-current-completion-type))
380 (error "This should be completed with %s-type completion." type)))
383 ;;;
384 ;;; [[Add-in functions for reading section arguments]]
385 ;;;
386 ;; All of add-in functions for reading sections arguments should
387 ;; take an argument ARGP that specify the argument position.
388 ;; If argument position is out of range, nil should be returned,
389 ;; else nil should NOT be returned.
391 ;;
392 ; Label selection
393 ;;
394 (defvar YaTeX-label-menu-other
395 (if YaTeX-japan "':他のバッファのラベル\n" "':LABEL IN OTHER BUFFER.\n"))
396 (defvar YaTeX-label-menu-repeat
397 (if YaTeX-japan ".:直前の\\refと同じ\n" "/:REPEAT LAST \ref{}\n"))
398 (defvar YaTeX-label-menu-any
399 (if YaTeX-japan "*:任意の文字列\n" "*:ANY STRING.\n"))
400 (defvar YaTeX-label-buffer "*Label completions*")
401 (defvar YaTeX-label-guide-msg "Select label and hit RETURN.")
402 (defvar YaTeX-label-select-map nil
403 "Key map used in label selection buffer.")
404 (defun YaTeX::label-setup-key-map ()
405 (if YaTeX-label-select-map nil
406 (message "Setting up label selection mode map...")
407 ;(setq YaTeX-label-select-map (copy-keymap global-map))
408 (setq YaTeX-label-select-map (make-keymap))
409 (suppress-keymap YaTeX-label-select-map)
410 (substitute-all-key-definition
411 'previous-line 'YaTeX::label-previous YaTeX-label-select-map)
412 (substitute-all-key-definition
413 'next-line 'YaTeX::label-next YaTeX-label-select-map)
414 (define-key YaTeX-label-select-map "\C-n" 'YaTeX::label-next)
415 (define-key YaTeX-label-select-map "\C-p" 'YaTeX::label-previous)
416 (define-key YaTeX-label-select-map "<" 'beginning-of-buffer)
417 (define-key YaTeX-label-select-map ">" 'end-of-buffer)
418 (define-key YaTeX-label-select-map "\C-m" 'exit-recursive-edit)
419 (define-key YaTeX-label-select-map "\C-j" 'exit-recursive-edit)
420 (define-key YaTeX-label-select-map " " 'exit-recursive-edit)
421 (define-key YaTeX-label-select-map "\C-g" 'abort-recursive-edit)
422 (define-key YaTeX-label-select-map "/" 'isearch-forward)
423 (define-key YaTeX-label-select-map "?" 'isearch-backward)
424 (define-key YaTeX-label-select-map "'" 'YaTeX::label-search-tag)
425 (define-key YaTeX-label-select-map "." 'YaTeX::label-search-tag)
426 (define-key YaTeX-label-select-map "*" 'YaTeX::label-search-tag)
427 (message "Setting up label selection mode map...Done")
428 (let ((key ?A))
429 (while (<= key ?Z)
430 (define-key YaTeX-label-select-map (char-to-string key)
431 'YaTeX::label-search-tag)
432 (define-key YaTeX-label-select-map (char-to-string (+ key (- ?a ?A)))
433 'YaTeX::label-search-tag)
434 (setq key (1+ key))))))
436 (defun YaTeX::label-next ()
437 (interactive) (forward-line 1) (message YaTeX-label-guide-msg))
438 (defun YaTeX::label-previous ()
439 (interactive) (forward-line -1) (message YaTeX-label-guide-msg))
440 (defun YaTeX::label-search-tag ()
441 (interactive)
442 (let ((case-fold-search t)
443 (tag (regexp-quote (char-to-string last-command-char))))
444 (cond
445 ((save-excursion
446 (forward-char 1)
447 (re-search-forward (concat "^" tag) nil t))
448 (goto-char (match-beginning 0)))
449 ((save-excursion
450 (goto-char (point-min))
451 (re-search-forward (concat "^" tag) nil t))
452 (goto-char (match-beginning 0))))
453 (message YaTeX-label-guide-msg)))
455 ; (defun YaTeX::ref (argp &optional labelcmd refcmd)
456 ; (cond
457 ; ((= argp 1)
458 ; (let ((lnum 0) e0 label label-list (buf (current-buffer))
459 ; (labelcmd (or labelcmd "label")) (refcmd (or refcmd "ref"))
460 ; (p (point)) initl line cf)
461 ; (message "Collecting labels...")
462 ; (save-window-excursion
463 ; (YaTeX-showup-buffer
464 ; YaTeX-label-buffer (function (lambda (x) (window-width x))))
465 ; (if (fboundp 'select-frame) (setq cf (selected-frame)))
466 ; (if (eq (window-buffer (minibuffer-window)) buf)
467 ; (progn
468 ; (other-window 1)
469 ; (setq buf (current-buffer))
470 ; (set-buffer buf)
471 ; ;(message "cb=%s" buf)(sit-for 3)
472 ; ))
473 ; (save-excursion
474 ; (set-buffer (get-buffer-create YaTeX-label-buffer))
475 ; (setq buffer-read-only nil)
476 ; (erase-buffer))
477 ; (save-excursion
478 ; (goto-char (point-min))
479 ; (let ((standard-output (get-buffer YaTeX-label-buffer)))
480 ; (princ (format "=== LABELS in [%s] ===\n" (buffer-name buf)))
481 ; (while (YaTeX-re-search-active-forward
482 ; (concat "\\\\" labelcmd "\\b")
483 ; (regexp-quote YaTeX-comment-prefix) nil t)
484 ; (goto-char (match-beginning 0))
485 ; (skip-chars-forward "^{")
486 ; (setq label
487 ; (buffer-substring
488 ; (1+ (point))
489 ; (prog2 (forward-list 1) (setq e0 (1- (point)))))
490 ; label-list (cons label label-list))
491 ; (or initl
492 ; (if (< p (point)) (setq initl lnum)))
493 ; (beginning-of-line)
494 ; (skip-chars-forward " \t\n" nil)
495 ; (princ (format "%c:{%s}\t<<%s>>\n" (+ (% lnum 26) ?A) label
496 ; (buffer-substring (point) (point-end-of-line))))
497 ; (setq lnum (1+ lnum))
498 ; (message "Collecting \\%s{}... %d" labelcmd lnum)
499 ; (goto-char e0))
500 ; (princ YaTeX-label-menu-other)
501 ; (princ YaTeX-label-menu-repeat)
502 ; (princ YaTeX-label-menu-any)
503 ; );standard-output
504 ; (goto-char p)
505 ; (or initl (setq initl lnum))
506 ; (message "Collecting %s...Done" labelcmd)
507 ; (if (fboundp 'select-frame) (select-frame cf))
508 ; (YaTeX-showup-buffer YaTeX-label-buffer nil t)
509 ; (YaTeX::label-setup-key-map)
510 ; (setq truncate-lines t)
511 ; (setq buffer-read-only t)
512 ; (use-local-map YaTeX-label-select-map)
513 ; (message YaTeX-label-guide-msg)
514 ; (goto-line (1+ initl)) ;goto recently defined label line
515 ; (switch-to-buffer (current-buffer))
516 ; (unwind-protect
517 ; (progn
518 ; (recursive-edit)
519 ; (set-buffer (get-buffer YaTeX-label-buffer)) ;assertion
520 ; (beginning-of-line)
521 ; (setq line (1- (count-lines (point-min)(point))))
522 ; (cond
523 ; ((= line -1) (setq label ""))
524 ; ((= line lnum) (setq label (YaTeX-label-other)))
525 ; ((= line (1+ lnum))
526 ; (save-excursion
527 ; (switch-to-buffer buf)
528 ; (goto-char p)
529 ; (if (re-search-backward
530 ; (concat "\\\\" refcmd "{\\([^}]+\\)}") nil t)
531 ; (setq label (YaTeX-match-string 1))
532 ; (setq label ""))))
533 ; ((>= line (+ lnum 2))
534 ; (setq label (read-string (format "\\%s{???}: " refcmd))))
535 ; (t (setq label (nth (- lnum line 1) label-list)))))
536 ; (bury-buffer YaTeX-label-buffer)))
537 ; label)))))
539 (defvar YaTeX-ref-default-label-string "%H%M%S_%d%b%y"
540 "*Default \\ref time string format.
541 This format is like strftime(3) but allowed conversion char are as follows;
542 %y -> Last 2 digit of year, %b -> Month name, %m -> Monthe number(1-12),
543 %d -> Day, %H -> Hour, %M -> Minute, %S -> Second,
544 %qx -> alphabetical-decimal conversion of yymmdd.
545 %qX -> alphabetical-decimal conversion of HHMMSS.
546 Beware defualt label-string should be always unique. So this format string
547 should have both time part (%H+%M+%S or %qX) and date
548 part (%y+(%b|%m)+%d or %qx).")
550 (defun YaTeX::ref-alphabex (n)
551 (let ((alphabex ""))
552 (while (> n 0)
553 (setq alphabex (concat (char-to-string (+ ?a (% n 26))) alphabex)
554 n (/ n 26)))
555 alphabex))
557 (defun YaTeX::ref-default-label (&optional format)
558 "Default auto-genarated label string."
559 ;; We do not use (format-time-string) for emacs-19
560 (let*((ts (substring (current-time-string) 4))
561 (y (substring ts -2))
562 (b (substring ts 0 3))
563 (d (format "%d" (string-to-int (substring ts 4 6))))
564 (H (substring ts 7 9))
565 (M (substring ts 10 12))
566 (S (substring ts 13 15))
567 (HMS (+ (* 10000 (string-to-int H))
568 (* 100 (string-to-int M))
569 (string-to-int S)))
570 (talphabex (YaTeX::ref-alphabex HMS))
571 (mnames "JanFebMarAprMayJunJulAugSepOctNovDec")
572 (m (format "%02d" (/ (string-match b mnames) 3)))
573 (ymd (+ (* 10000 (string-to-int y))
574 (* 100 (string-to-int m))
575 (string-to-int d)))
576 (dalphabex (YaTeX::ref-alphabex ymd)))
577 (YaTeX-replace-formats
578 (or format YaTeX-ref-default-label-string)
579 (list (cons "y" y)
580 (cons "b" b)
581 (cons "m" m)
582 (cons "d" d)
583 (cons "H" H)
584 (cons "M" M)
585 (cons "S" S)
586 (cons "qX" talphabex)
587 (cons "qx" dalphabex)))))
589 (defvar YaTeX-ref-generate-label-function 'YaTeX::ref-generate-label
590 "*Function to generate default label for unnamed \\label{}s.
591 The function pointed to this value should take two arguments.
592 First argument is LaTeX macro's name, second is macro's argument.")
594 (defun YaTeX::ref-generate-label (command arg)
595 "Generate a label string which is unique in current buffer."
596 (let ((default (condition-case nil
597 (YaTeX::ref-default-label)
598 (error (substring (current-time-string) 4)))))
599 (read-string "Give a label for this line: "
600 (if YaTeX-emacs-19 (cons default 1) default))))
602 (defun YaTeX::ref-getset-label (buffer point &optional noset)
603 "Get label string in the BUFFER near the POINT.
604 Make \\label{xx} if no label.
605 If optional third argument NOSET is non-nil, do not generate new label."
606 ;;Here, we rewrite the LaTeX source. Therefore we should be careful
607 ;;to decide the location suitable for \label. Do straightforward!
608 (let (boundary inspoint cc newlabel (labelholder "label") mathp exp1 env
609 (r-escape (regexp-quote YaTeX-comment-prefix))
610 command arg alreadysought foundpoint)
611 (set-buffer buffer)
612 (save-excursion
613 (goto-char point)
614 (setq cc (current-column))
615 (if (= (char-after (point)) ?\\) (forward-char 1))
616 (cond
617 ((looking-at YaTeX-sectioning-regexp)
618 (setq command (YaTeX-match-string 0))
619 (skip-chars-forward "^{")
620 (setq arg (buffer-substring
621 (1+ (point))
622 (progn (forward-list 1) (1- (point)))))
623 (skip-chars-forward " \t\n")
624 ;(setq boundary "[^\\]")
625 (setq inspoint (point))
626 (setq boundary
627 (save-excursion
628 (if (YaTeX-re-search-active-forward
629 (concat YaTeX-ec-regexp
630 "\\(" YaTeX-sectioning-regexp "\\|"
631 "begin\\|item\\)")
632 r-escape nil 1)
633 (match-beginning 0)
634 (1- (point))))))
635 ((looking-at "item\\s ")
636 (setq command "item"
637 cc (+ cc 6))
638 ;(setq boundary (concat YaTeX-ec-regexp "\\(item\\|begin\\|end\\)\\b"))
639 (setq boundary
640 (save-excursion
641 (if (YaTeX-re-search-active-forward
642 (concat YaTeX-ec-regexp "\\(item\\|begin\\|end\\)\\b")
643 r-escape nil 1)
644 (match-beginning 0)
645 (1- (point))))
646 inspoint boundary))
647 ((looking-at "bibitem")
648 (setq labelholder "bibitem" ; label holder is bibitem itself
649 command "bibitem")
650 (setq boundary
651 (save-excursion
652 (if (YaTeX-re-search-active-forward
653 (concat YaTeX-ec-regexp "\\(bibitem\\|end\\)\\b")
654 r-escape nil 1)
655 (match-beginning 0)
656 (1- (point))))
657 inspoint boundary))
658 ((string-match YaTeX::ref-nestable-counter-regexp
659 (setq env (or (YaTeX-inner-environment t) "document")))
660 (let ((curtop (get 'YaTeX-inner-environment 'point))
661 (end (point-max)) label)
662 (skip-chars-forward " \t\n")
663 (setq inspoint (point) ;initial candidate
664 cc (current-column)
665 command env
666 alreadysought t)
667 (if (condition-case nil
668 (progn
669 (goto-char curtop)
670 (YaTeX-goto-corresponding-environment))
671 (error nil))
672 (setq end (point)))
673 (goto-char inspoint)
674 (while (YaTeX-re-search-active-forward
675 (concat YaTeX-ec-regexp "label{\\([^}]+\\)}" )
676 r-escape end t)
677 (setq label (YaTeX-match-string 1))
678 (if (and (equal env (YaTeX-inner-environment t))
679 (= curtop (get 'YaTeX-inner-environment 'point)))
680 ;;I found the label
681 (setq alreadysought label
682 foundpoint (match-end 0))))
683 ))
684 ((string-match YaTeX::ref-mathenv-regexp env) ;env is set in above case
685 (setq command env
686 mathp t
687 exp1 (string-match YaTeX::ref-mathenv-exp1-regexp env))
688 ;;(setq boundary (concat YaTeX-ec-regexp "\\(\\\\\\|end{" env "}\\)"))
689 (setq boundary
690 (save-excursion
691 (if (YaTeX-re-search-active-forward
692 (concat
693 YaTeX-ec-regexp "\\("
694 (if exp1 "" "\\\\\\|")
695 "end{" env "}\\)")
696 r-escape nil 1)
697 (match-beginning 0)
698 (1- (point))))
699 inspoint boundary))
700 ((looking-at "footnote\\s *{")
701 (setq command "footnote")
702 (skip-chars-forward "^{") ;move onto `{'
703 (setq boundary
704 (save-excursion
705 (condition-case err
706 (forward-list 1)
707 (error (error "\\\\footnote at point %s's brace not closed"
708 (point))))
709 (1- (point)))
710 inspoint boundary))
711 ((looking-at "caption\\|\\(begin\\)")
712 (setq command (YaTeX-match-string 0))
713 (skip-chars-forward "^{")
714 ;;;;;;(if (match-beginning 1) (forward-list 1))
715 ;; caption can be treated as mathenv, is it right??
716 (setq arg (buffer-substring
717 (1+ (point))
718 (progn (forward-list 1) (1- (point)))))
719 ;;(setq boundary (concat YaTeX-ec-regexp "\\(begin\\|end\\)\\b"))
720 (setq inspoint (point))
721 (setq boundary
722 (save-excursion
723 (if (YaTeX-re-search-active-forward
724 (concat YaTeX-ec-regexp "\\(begin\\|end\\)\\b")
725 r-escape nil 1)
726 (match-beginning 0)
727 (1- (point))))))
728 (t ))
729 (if (save-excursion (skip-chars-forward " \t") (looking-at "%"))
730 (forward-line 1))
731 (cond
732 ((stringp alreadysought)
733 (put 'YaTeX::ref-getset-label 'foundpoint foundpoint) ;ugly...
734 alreadysought)
735 ((and (null alreadysought)
736 (> boundary (point))
737 (save-excursion
738 (YaTeX-re-search-active-forward
739 ;;(concat "\\(" labelholder "\\)\\|\\(" boundary "\\)")
740 labelholder
741 (regexp-quote YaTeX-comment-prefix)
742 boundary 1))
743 (match-beginning 0))
744 ;; if \label{hoge} found, return it
745 (put 'YaTeX::ref-getset-label 'foundpoint (1- (match-beginning 0)))
746 (buffer-substring
747 (progn
748 (goto-char (match-end 0))
749 (skip-chars-forward "^{") (1+ (point)))
750 (progn
751 (forward-sexp 1) (1- (point)))))
752 ;;else make a label
753 ;(goto-char (match-beginning 0))
754 (noset nil) ;do not set label if noset
755 (t
756 (goto-char inspoint)
757 (skip-chars-backward " \t\n")
758 (save-excursion
759 (setq newlabel
760 (funcall YaTeX-ref-generate-label-function command arg)))
761 (delete-region (point) (progn (skip-chars-backward " \t") (point)))
762 (if mathp nil
763 (insert "\n")
764 (YaTeX-reindent cc))
765 (insert (format "\\label{%s}" newlabel))
766 newlabel)))))
768 (defvar YaTeX::ref-labeling-regexp-alist-default
769 '(("\\\\begin{\\(java\\|program\\)}{\\([^}]+\\)}" . 2)
770 ("\\\\label{\\([^}]+\\)}" . 1))
771 "Alist of labeling regexp vs. its group number points to label string.
772 This alist is used in \\ref's argument's completion.")
773 (defvar YaTeX::ref-labeling-regexp-alist-private nil
774 "*Private extension to YaTeX::ref-labeling-regexp-alist.
775 See the documetation of YaTeX::ref-labeling-regexp-alist.")
776 (defvar YaTeX::ref-labeling-regexp-alist
777 (append YaTeX::ref-labeling-regexp-alist-default
778 YaTeX::ref-labeling-regexp-alist-private))
779 (defvar YaTeX::ref-labeling-regexp
780 (mapconcat 'car YaTeX::ref-labeling-regexp-alist "\\|"))
781 (defvar YaTeX::ref-mathenv-regexp
782 ;; See also YaTeX-ams-math-begin-alist in yatex.el
783 ;; Define only envs which has counter.(without *)
784 "equation\\|eqnarray\\|align\\(at\\)?\\|flalign\\|gather\\|xx?alignat\\|multline")
785 (defvar YaTeX::ref-mathenv-exp1-regexp
786 "\\(equation\\|multline\\)\\b"
787 "*Regexp of math-envname which has only one math-expression.")
788 (defvar YaTeX::ref-enumerateenv-regexp
789 "enumerate")
790 (defvar YaTeX::ref-nestable-counter-regexp
791 "subequations")
793 (defvar YaTeX::ref-labeling-section-level 2
794 "*ref補完で収集するセクショニングコマンドの下限レベル
795 YaTeX-sectioning-levelの数値で指定.")
797 (defun YaTeX::ref (argp &optional labelcmd refcmd predf)
798 (setplist 'YaTeX::ref-labeling-regexp nil) ;erase memory cache
799 (require 'yatexsec)
800 (cond
801 ((= argp 1)
802 (let*((lnum 0) m0 e0 x cmd label match-point point-list boundary
803 (buf (current-buffer))
804 (llv YaTeX::ref-labeling-section-level)
805 (mathenvs YaTeX::ref-mathenv-regexp) envname endrx
806 (enums YaTeX::ref-enumerateenv-regexp)
807 (counter
808 (or labelcmd
809 (concat
810 YaTeX-ec-regexp "\\(\\("
811 (mapconcat
812 'concat
813 (delq nil
814 (mapcar
815 (function
816 (lambda (s)
817 (if (>= llv (cdr s))
818 (car s))))
819 YaTeX-sectioning-level))
820 "\\|")
821 "\\|caption\\(\\[[^]]+\\]\\)?\\|footnote\\){"
822 "\\|\\(begin{\\(" mathenvs "\\|" enums "\\)}\\)"
823 (if YaTeX-use-AMS-LaTeX
824 (concat
825 "\\|\\(begin{"
826 YaTeX::ref-nestable-counter-regexp "}\\)"))
827 "\\)")))
828 (regexp (concat "\\(" counter
829 "\\)\\|\\(" YaTeX::ref-labeling-regexp "\\)"))
830 (itemsep (concat YaTeX-ec-regexp
831 "\\(\\(bib\\)?item\\|begin\\|end\\)"))
832 (refcmd (or refcmd "\\(page\\)?ref"))
833 (p (point)) initl line cf
834 (percent (regexp-quote YaTeX-comment-prefix))
835 (output
836 (function
837 (lambda (label p)
838 (while (setq x (string-match "[\n\t]" label))
839 (aset label x ? ))
840 (while (setq x (string-match " +" label))
841 (setq label (concat
842 (substring label 0 (1+ (match-beginning 0)))
843 (substring label (match-end 0)))))
844 (princ (format "%c: <<%s>>\n" (+ (% lnum 26) ?A) label))
845 (setq point-list (cons p point-list))
846 (message "Collecting labels... %d" lnum)
847 (setq lnum (1+ lnum)))))
848 (me (if (boundp 'me) me 'YaTeX::ref))
849 )
850 (message "Collecting labels...")
851 (save-window-excursion
852 (YaTeX-showup-buffer
853 YaTeX-label-buffer (function (lambda (x) (window-width x))))
854 (if (fboundp 'select-frame) (setq cf (selected-frame)))
855 (if (eq (window-buffer (minibuffer-window)) buf)
856 (progn
857 (other-window 1)
858 (setq buf (current-buffer))
859 (set-buffer buf)))
860 (save-excursion
861 (set-buffer (get-buffer-create YaTeX-label-buffer))
862 (condition-case ()
863 (if (and YaTeX-use-font-lock (fboundp 'font-lock-mode))
864 (font-lock-mode 1))
865 (error nil))
866 (setq buffer-read-only nil)
867 (erase-buffer))
868 (save-excursion
869 (set-buffer buf)
870 (goto-char (point-min))
871 (let ((standard-output (get-buffer YaTeX-label-buffer)) existlabel)
872 (princ (format "=== LABELS in [%s] ===\n" (buffer-name buf)))
873 (while (YaTeX-re-search-active-forward
874 regexp ;;counter
875 percent nil t)
876 ;(goto-char (match-beginning 0))
877 (setq e0 (match-end 0))
878 (cond
879 ;;
880 ;;2005/10/21 Skip it if predicate function returns nil
881 ((and predf
882 (let ((md (match-data)))
883 (prog1
884 (condition-case nil
885 (not (funcall predf))
886 (error nil))
887 (store-match-data md)))))
888 ((YaTeX-literal-p) nil)
889 ((YaTeX-match-string 1)
890 ;;if standard counter commands found
891 (setq cmd (YaTeX-match-string 2)
892 m0 (match-beginning 0))
893 (setq match-point (match-beginning 0))
894 (or initl
895 (if (< p (point)) (setq initl lnum)))
896 (cond
897 ;; In any case, variables e0 should be set
898 ((and YaTeX-use-AMS-LaTeX
899 (string-match YaTeX::ref-nestable-counter-regexp cmd))
900 (let (label)
901 (skip-chars-forward "}")
902 (setq label (buffer-substring
903 (point) (min (+ 80 (point)) (point-max))))
904 ;; to skip (maybe)auto-generated comment
905 (skip-chars-forward " \t")
906 (if (looking-at YaTeX-comment-prefix)
907 (forward-line 1))
908 (setq e0 (point))
909 (skip-chars-forward " \t\n")
910 (if (looking-at "\\\\label{\\([^}]+\\)}")
911 (setq label (format "(labe:%s)" (YaTeX-match-string 1))
912 e0 (match-end 1)))
913 (funcall output (format "--subequation--%s" label) e0)))
914 ((string-match mathenvs cmd) ;;if matches mathematical env
915 ;(skip-chars-forward "} \t\n")
916 ;(forward-line 1) ;2004/1/25
917 (skip-chars-forward "}")
918 (setq x (point)
919 envname (substring
920 cmd (match-beginning 0) (match-end 0)))
921 (save-restriction
922 (narrow-to-region
923 m0
924 (save-excursion
925 (YaTeX-re-search-active-forward
926 (setq endrx (format "%send{%s}" YaTeX-ec-regexp
927 (regexp-quote envname)))
928 percent nil t)))
929 (catch 'scan
930 (while (YaTeX-re-search-active-forward
931 (concat
932 "\\\\end{\\(" (regexp-quote envname) "\\)";;(1)
933 (if YaTeX-use-AMS-LaTeX
934 "\\|\\\\\\(notag\\)") ;;2
935 (if (string-match
936 YaTeX::ref-mathenv-exp1-regexp cmd)
937 "" "\\|\\\\\\\\$")
938 )
939 percent nil t)
940 (let*((quit (match-beginning 1))
941 (notag (match-beginning 2))
942 (label ".......................") l2
943 (e (point)) (m0 (match-beginning 0))
944 (ln (YaTeX-string-width label)))
945 (cond
946 (notag
947 (YaTeX-re-search-active-forward
948 "\\\\\\\\" percent nil 1)
949 (setq x (point)))
950 (t
951 (if (YaTeX-re-search-active-backward
952 YaTeX::ref-labeling-regexp
953 percent x t)
954 ;; if \label{x} in math-expression, display it
955 ;; because formula source is hard to recognize
956 (progn
957 (goto-char (match-end 0))
958 (setq l2 (format "\"label:%s\""
959 (buffer-substring
960 (1- (point))
961 (progn (forward-sexp -1)
962 (1+ (point))))))
963 (setq label
964 (if (< (YaTeX-string-width l2) ln)
965 (concat
966 l2
967 (substring
968 label
969 0 (- ln (YaTeX-string-width l2))))
970 l2))
971 (goto-char e)))
972 (funcall output
973 (concat
974 label " "
975 (buffer-substring x m0))
976 x)
977 (cond
978 ((YaTeX-quick-in-environment-p
979 YaTeX-math-gathering-list)
980 ;; if here is inner split/cases/gathered env.,
981 ;; counter for here is only one.
982 ;; Go out this environment and,
983 (YaTeX-end-of-environment)
984 ;; search next expression unit boundary.
985 (YaTeX-re-search-active-forward
986 (concat endrx "\\|\\\\begin{")
987 percent nil 1)
988 (end-of-line)))
989 (if quit (throw 'scan t)))))
990 (setq x (point)))))
991 (setq e0 (point)))
992 ((string-match enums cmd)
993 ;(skip-chars-forward "} \t\n")
994 (save-restriction
995 (narrow-to-region
996 (point)
997 (save-excursion
998 (YaTeX-goto-corresponding-environment) (point)))
999 (forward-line 1)
1000 (while (YaTeX-re-search-active-forward
1001 (concat YaTeX-ec-regexp "item\\s ")
1002 percent nil t)
1003 (setq x (match-beginning 0))
1004 (funcall
1005 output
1006 (concat
1007 existlabel
1008 (buffer-substring
1009 (match-beginning 0)
1010 (if (re-search-forward itemsep nil t)
1011 (progn (goto-char (match-beginning 0))
1012 (skip-chars-backward " \t")
1013 (1- (point)))
1014 (point-end-of-line))))
1015 x))
1016 (setq e0 (point-max))))
1017 ((string-match "bibitem" cmd) ;maybe generated by myself
1018 (setq label "")
1019 (skip-chars-forward " \t")
1020 (if (looking-at "{") ;sure to be true!!
1021 (forward-list 1))
1022 (let ((list '(30 10 65))
1023 (delim ";") q lim len l str)
1024 (save-excursion
1025 (setq lim (if (re-search-forward itemsep nil 1)
1026 (match-beginning 0) (point))))
1027 (while list
1028 (skip-chars-forward " \t\n\\")
1029 (setq q (looking-at "[\"'{]")
1030 len (car list)
1031 str
1032 (buffer-substring
1033 (point)
1034 (progn
1035 (if q (forward-sexp 1)
1036 (search-forward delim lim 1)
1037 (forward-char -1))
1038 (point))))
1039 (if (> (setq l (YaTeX-string-width str)) len)
1040 (setq str (concat
1041 (YaTeX-truncate-string-width
1042 str (- len (if q 5 4)))
1043 "... "
1044 (if q (substring str -1)))))
1045 (if (< (setq l (YaTeX-string-width str)) len)
1046 (setq str (concat str (make-string (- len l) ? ))))
1047 (if (looking-at delim) (goto-char (match-end 0)))
1048 (setq label (concat label " " str)
1049 list (cdr list)))
1050 (funcall output label match-point)))
1051 ;;else, simple section-type counter
1052 ((= (char-after (1- (point))) ?{)
1053 (setq label (buffer-substring
1054 (match-beginning 0)
1055 (progn (forward-char -1)
1056 (forward-list 1)
1057 (point))))
1058 (funcall output label match-point)
1059 ;; Skip preceding label if exists
1060 (if (YaTeX::ref-getset-label (current-buffer) match-point t)
1061 (goto-char (get 'YaTeX::ref-getset-label 'foundpoint)))
1062 (if (save-excursion
1063 (skip-chars-forward "\t \n")
1064 (looking-at YaTeX::ref-labeling-regexp))
1065 (setq e0 (match-end 0))))
1066 (t
1067 (skip-chars-forward " \t")
1068 (setq label (buffer-substring
1069 (match-beginning 0)
1070 (if (re-search-forward
1071 itemsep
1072 nil t)
1073 (progn
1074 (goto-char (match-beginning 0))
1075 (skip-chars-backward " \t")
1076 (1- (point)))
1077 (point-end-of-line))))
1078 (funcall output label match-point)
1079 (if (save-excursion
1080 (skip-chars-forward "\t \n")
1081 (looking-at YaTeX::ref-labeling-regexp))
1082 (setq e0 (match-end 0)))))
1083 ) ;;put label buffer
1084 ;;
1085 ;; if user defined label found
1086 (t
1087 ;; memorize line number and label into property
1088 (goto-char (match-beginning 0))
1089 (let ((list YaTeX::ref-labeling-regexp-alist)
1090 (cache (symbol-plist 'YaTeX::ref-labeling-regexp)))
1091 (while list
1092 (if (looking-at (car (car list)))
1093 (progn
1094 (setq label (YaTeX-match-string 0))
1095 (put 'YaTeX::ref-labeling-regexp lnum
1096 (YaTeX-match-string (cdr (car list))))
1097 (funcall output label 0) ;;0 is dummy, never used
1098 (setq list nil)))
1099 (setq list (cdr list))))
1100 ))
1101 (goto-char e0))
1102 (princ YaTeX-label-menu-other)
1103 (princ YaTeX-label-menu-repeat)
1104 (princ YaTeX-label-menu-any)
1105 );standard-output
1106 (goto-char p)
1107 (or initl (setq initl lnum))
1108 (message "Collecting labels...Done")
1109 (if (fboundp 'select-frame) (select-frame cf))
1110 (YaTeX-showup-buffer YaTeX-label-buffer nil t)
1111 (YaTeX::label-setup-key-map)
1112 (setq truncate-lines t)
1113 (setq buffer-read-only t)
1114 (use-local-map YaTeX-label-select-map)
1115 (message YaTeX-label-guide-msg)
1116 (goto-line (1+ initl)) ;goto recently defined label line
1117 (switch-to-buffer (current-buffer))
1118 (unwind-protect
1119 (progn
1120 (recursive-edit)
1122 (set-buffer (get-buffer YaTeX-label-buffer)) ;assertion
1123 (beginning-of-line)
1124 (setq line (1- (count-lines (point-min)(point))))
1125 (cond
1126 ((= line -1) (setq label ""))
1127 ((= line lnum) (setq label (YaTeX-label-other)))
1128 ((= line (1+ lnum))
1129 (save-excursion
1130 (switch-to-buffer buf)
1131 (goto-char p)
1132 (if (re-search-backward
1133 (concat "\\\\" refcmd "{") nil t)
1134 (setq label (YaTeX-buffer-substring
1135 (progn (goto-char (1- (match-end 0)))
1136 (1+ (point)))
1137 (progn (forward-list 1)
1138 (1- (point)))))
1139 (setq label ""))))
1140 ((>= line (+ lnum 2))
1141 (setq label (read-string (format "\\%s{???}: " refcmd))))
1142 (t ;(setq label (nth (- lnum line 1) label-list))
1143 (setq label
1144 (or (get 'YaTeX::ref-labeling-regexp line)
1145 (YaTeX::ref-getset-label
1146 buf (nth (- lnum line 1) point-list))))
1147 )))
1148 (bury-buffer YaTeX-label-buffer)))
1149 label)))))
1151 (defun YaTeX::label-rename-refs (old new &optional def ref)
1152 "Rename reference tag from OLD to NEW.
1153 Optional arguments DEF and REF specify defining command and
1154 referring command respectively.
1155 ---------------------------------------------------------
1156 CONTROL KEYS - キーの説明
1157 y Replace 置換する
1158 n Do not replace 置換しない
1159 ! Replace All w/o query 残る全部を確認なしで置換
1160 r Enter Recursive-edit 再帰編集モードへ
1161 q Quit from replacing ここまでで置換をやめる
1163 Don't forget to exit from recursive edit by typing \\[exit-recursive-edit]
1164 再帰編集に入ったら \\[exit-recursive-edit] で抜け忘れなきよう。"
1165 (save-window-excursion
1166 (catch 'exit
1167 (let*((bufs (YaTeX-yatex-buffer-list)) buf b e
1168 (oldptn (regexp-quote old))
1169 (sw (selected-window))
1170 (ptn (concat
1171 "\\(" YaTeX-refcommand-ref-regexp "\\)"
1172 "\\s *{" oldptn "}"))
1173 (repface (and (fboundp 'make-overlay)
1174 (fboundp 'internal-find-face)
1175 (if (internal-find-face 'isearch) 'isearch 'region)))
1176 ov
1177 (qmsg "Replace to `%s'? [yn!rq?]")
1178 continue ch)
1179 (while bufs
1180 (set-buffer (setq buf (car bufs)))
1181 (save-excursion
1182 (goto-char (point-min))
1183 (while (re-search-forward ptn nil t)
1184 (goto-char (match-end 1))
1185 (skip-chars-forward " \t\n{")
1186 (unwind-protect
1187 (if (and
1188 (looking-at oldptn)
1189 (setq b (match-beginning 0)
1190 e (match-end 0))
1191 (or continue
1192 (catch 'query
1193 (if repface
1194 (if ov (move-overlay ov b e)
1195 (overlay-put
1196 (setq ov (make-overlay b e))
1197 'face repface)))
1198 (switch-to-buffer buf)
1199 (while t
1200 (message qmsg new)
1201 (setq ch (read-char))
1202 (cond
1203 ((= ch ?q) (throw 'exit t))
1204 ((= ch ?r)
1205 (message
1206 "Don't forget to exit recursive-edit by `%s'"
1207 (key-description
1208 (where-is-internal
1209 'exit-recursive-edit '(keymap) t)))
1210 (sleep-for 2)
1211 (recursive-edit))
1212 ((= ch ?y) (throw 'query t))
1213 ((= ch ?!) (throw 'query (setq continue t)))
1214 ((= ch ??)
1215 (describe-function
1216 'YaTeX::label-rename-refs)
1217 (select-window (get-buffer-window "*Help*"))
1218 (search-forward "----")
1219 (forward-line 1)
1220 (set-window-start (selected-window) (point))
1221 (sit-for 0)
1222 (select-window sw))
1223 ((= ch ?n) (throw 'query nil)))))))
1224 (replace-match new))
1225 (and ov (delete-overlay ov)))))
1226 (setq bufs (cdr bufs)))))))
1228 (defun YaTeX::label (argp &optional labname refname)
1229 "Read label name and return it with copying \\ref{LABEL-NAME} to kill-ring."
1230 (cond
1231 ((= argp 1)
1232 (let*((chmode (boundp (intern-soft "old")))
1233 (dlab (if chmode old ;if called via YaTeX-change-section (tricky...)
1234 (YaTeX::ref-default-label)))
1235 (label (read-string
1236 (format "New %s name: " (or labname "label"))
1237 (cons dlab 1))))
1238 (if (string< "" label)
1239 (let ((refstr (format "\\%s{%s}" (or refname "ref") label))
1240 (key (key-description (where-is-internal 'yank nil t)))
1241 (msg
1242 (if YaTeX-japan
1243 "をkill-ringに入れました。yank(%s)で取り出せます。"
1244 " is stored into kill-ring. Paste it by yank(%s).")))
1245 (kill-new refstr)
1246 (and chmode
1247 (not (equal old label))
1248 (YaTeX::label-rename-refs old label))
1249 (message (concat "`%s'" msg) refstr key)))
1250 label))))
1253 (fset 'YaTeX::pageref 'YaTeX::ref)
1254 (defun YaTeX::tabref (argp) ; For the style file of IPSJ journal
1255 (YaTeX::ref
1256 argp nil nil
1257 (function
1258 (lambda ()
1259 (YaTeX-quick-in-environment-p "table")))))
1260 (defun YaTeX::figref (argp) ; For the style file of IPSJ journal
1261 (YaTeX::ref
1262 argp nil nil
1263 (function
1264 (lambda ()
1265 (YaTeX-quick-in-environment-p "figure")))))
1266 (defun YaTeX::eqref (argp)
1267 (YaTeX::ref
1268 argp nil nil
1269 (function
1270 (lambda ()
1271 (YaTeX-in-math-mode-p)))))
1273 (defun YaTeX::cite-collect-bibs-external (bibptn &rest files)
1274 "Collect bibentry from FILES(variable length argument) ;
1275 and print them to standard output."
1276 ;;Thanks; http://icarus.ilcs.hokudai.ac.jp/comp/biblio.html
1277 (let*((tb (get-buffer-create " *bibtmp*"))
1278 (bibitemsep "^\\s *@[A-Za-z]")
1279 (target (if (string< "" bibptn) bibptn bibitemsep))
1280 (checkrx (concat "\\(" bibptn "\\)\\|" bibitemsep))
1281 beg
1282 (searchnext
1283 (if (string< "" bibptn)
1284 (function
1285 (lambda()
1286 (setq beg (point))
1287 (and
1288 (prog1
1289 (re-search-forward target nil t)
1290 (end-of-line))
1291 (re-search-backward bibitemsep beg t))))
1292 (function
1293 (lambda()
1294 (re-search-forward target nil t)))))
1296 (save-excursion
1297 (set-buffer tb)
1298 (princ (format "%sbegin{thebibliography}\n" YaTeX-ec))
1299 (while files
1300 (erase-buffer)
1301 (cond
1302 ((file-exists-p (car files))
1303 (insert-file-contents (car files)))
1304 ((file-exists-p (concat (car files) ".bib"))
1305 (insert-file-contents (concat (car files) ".bib"))))
1306 (save-excursion
1307 (goto-char (point-min))
1308 (while (funcall searchnext)
1309 (skip-chars-forward "^{,")
1310 (setq beg (point))
1311 (if (= (char-after (point)) ?{)
1312 (princ (format "%sbibitem{%s}%s\n"
1313 YaTeX-ec
1314 (buffer-substring
1315 (1+ (point))
1316 (progn (skip-chars-forward "^,\n")
1317 (point)))
1318 (mapconcat
1319 (function
1320 (lambda (kwd)
1321 (goto-char beg)
1322 (if (re-search-forward
1323 (concat kwd "\\s *=") nil t)
1324 (buffer-substring
1325 (progn
1326 (goto-char (match-end 0))
1327 (skip-chars-forward " \t\n")
1328 (point))
1329 (progn
1330 (if (looking-at "[{\"]")
1331 (forward-sexp 1)
1332 (forward-char 1)
1333 (skip-chars-forward "^,}"))
1334 (point))))))
1335 '("author" "year" "title" )
1336 ";"))))
1337 (and (re-search-forward bibitemsep nil t)
1338 (forward-line -1))))
1339 (setq files (cdr files)))
1340 (princ (format "%sbegin{thebibliography}\n" YaTeX-ec)))))
1342 (defvar YaTeX::cite-bibitem-macro-regexp "bibitem\\|harvarditem"
1343 "*Regexp of macro name of bibitem definition")
1345 (defun YaTeX::cite-collect-bibs-internal (bibptn)
1346 "Collect bibentry in the current buffer and print them to standard output."
1347 (let ((ptn (concat YaTeX-ec-regexp
1348 "\\(" YaTeX::cite-bibitem-macro-regexp "\\)\\b"))
1349 (lim (concat YaTeX-ec-regexp
1350 "\\(" YaTeX::cite-bibitem-macro-regexp "\\b\\)"
1351 "\\|\\(end{\\)"))
1352 (pcnt (regexp-quote YaTeX-comment-prefix)))
1353 ;; Using bibptn not yet implemented.
1354 ;; Do you need it?? 2005/11/22
1355 (save-excursion
1356 (while (YaTeX-re-search-active-forward ptn pcnt nil t)
1357 (skip-chars-forward "^{\n")
1358 (or (eolp)
1359 (princ (format "%sbibitem%s %s\n"
1360 YaTeX-ec
1361 (buffer-substring
1362 (point)
1363 (progn (forward-sexp 1) (point)))
1364 (buffer-substring
1365 (progn (skip-chars-forward "\n \t") (point))
1366 (save-excursion
1367 (if (YaTeX-re-search-active-forward
1368 lim pcnt nil t)
1369 (progn
1370 (goto-char (match-beginning 0))
1371 (skip-chars-backward "\n \t")
1372 (point))
1373 (point-end-of-line)))))))))))
1375 (defun YaTeX::cite (argp &rest dummy)
1376 (cond
1377 ((eq argp 1)
1378 (let* ((cb (current-buffer))
1379 (f (file-name-nondirectory buffer-file-name))
1380 (d default-directory)
1381 (hilit-auto-highlight nil)
1382 (pcnt (regexp-quote YaTeX-comment-prefix))
1383 (bibrx (concat YaTeX-ec-regexp "bibliography{\\([^}]+\\)}"))
1384 (bibptn (read-string "Pattern: "))
1385 (bbuf (get-buffer-create " *bibitems*"))
1386 (standard-output bbuf)
1387 (me 'YaTeX::cite) ;shuld set this for using YaTeX::ref
1388 bibs files)
1389 (set-buffer bbuf)(erase-buffer)(set-buffer cb)
1390 (save-excursion
1391 (goto-char (point-min))
1392 ;;(1)search external bibdata
1393 (while (YaTeX-re-search-active-forward bibrx pcnt nil t)
1394 (apply 'YaTeX::cite-collect-bibs-external
1395 bibptn
1396 (YaTeX-split-string
1397 (YaTeX-match-string 1) ",")))
1398 ;;(2)search direct \bibitem usage
1399 (YaTeX::cite-collect-bibs-internal bibptn)
1400 (if (progn
1401 (YaTeX-visit-main t)
1402 (not (eq (current-buffer) cb)))
1403 (save-excursion
1404 (goto-char (point-min))
1405 ;;(1)search external bibdata
1406 (while (YaTeX-re-search-active-forward bibrx pcnt nil t)
1407 (apply 'YaTeX::cite-collect-bibs-external
1408 bibptn
1409 (YaTeX-split-string
1410 (YaTeX-match-string 1) ",")))
1411 ;;(2)search internal
1412 (YaTeX::cite-collect-bibs-internal bibptn)))
1413 ;;Now bbuf holds the list of bibitem
1414 (set-buffer bbuf)
1415 ;;;(switch-to-buffer bbuf)
1416 (if (fboundp 'font-lock-fontify-buffer) (font-lock-fontify-buffer))
1417 (YaTeX::ref
1418 argp
1419 (concat "\\\\\\("
1420 YaTeX::cite-bibitem-macro-regexp
1421 "\\)\\(\\[.*\\]\\)?")
1422 "cite"))))
1424 (t nil)))
1426 (defun YaTeX::bibitem (argp)
1427 "Add-in function to insert argument of \\bibitem."
1428 (YaTeX::label argp "label" "cite"))
1430 ;;; for Harvard citation style
1431 (fset 'YaTeX::citeasnoun 'YaTeX::cite)
1432 (fset 'YaTeX::possessivecite 'YaTeX::cite)
1433 (fset 'YaTeX::citeyear 'YaTeX::cite)
1434 (fset 'YaTeX::citename 'YaTeX::cite)
1435 (fset 'YaTeX::citep 'YaTeX::cite)
1436 (fset 'YaTeX::citet 'YaTeX::cite)
1438 (defun YaTeX-select-other-yatex-buffer ()
1439 "Select buffer from all yatex-mode's buffers interactivelly."
1440 (interactive)
1441 (let ((lbuf "*YaTeX mode buffers*") (blist (YaTeX-yatex-buffer-list))
1442 (lnum -1) buf rv
1443 (ff "**find-file**"))
1444 (YaTeX-showup-buffer
1445 lbuf (function (lambda (x) 1))) ;;Select next window surely.
1446 (save-excursion
1447 (set-buffer (get-buffer lbuf))
1448 (setq buffer-read-only nil)
1449 (erase-buffer))
1450 (let ((standard-output (get-buffer lbuf)))
1451 (while blist
1452 (princ
1453 (format "%c:{%s}\n" (+ (% (setq lnum (1+ lnum)) 26) ?A)
1454 (buffer-name (car blist))))
1455 (setq blist (cdr blist)))
1456 (princ (format "':{%s}" ff)))
1457 (YaTeX-showup-buffer lbuf nil t)
1458 (YaTeX::label-setup-key-map)
1459 (setq buffer-read-only t)
1460 (use-local-map YaTeX-label-select-map)
1461 (message YaTeX-label-guide-msg)
1462 (unwind-protect
1463 (progn
1464 (recursive-edit)
1465 (set-buffer lbuf)
1466 (beginning-of-line)
1467 (setq rv
1468 (if (re-search-forward "{\\([^\\}]+\\)}" (point-end-of-line) t)
1469 (buffer-substring (match-beginning 1) (match-end 1)) nil)))
1470 (kill-buffer lbuf))
1471 (if (string= rv ff)
1472 (progn
1473 (call-interactively 'find-file)
1474 (current-buffer))
1475 rv)))
1477 (defun YaTeX-label-other ()
1478 (let ((rv (YaTeX-select-other-yatex-buffer)))
1479 (cond
1480 ((null rv) "")
1481 (t
1482 (set-buffer rv)
1483 (funcall me argp labelcmd refcmd)))))
1485 ;;
1486 ; completion for the arguments of \newcommand
1487 ;;
1488 (defun YaTeX::newcommand (&optional argp)
1489 (cond
1490 ((= argp 1)
1491 (let ((command (read-string "Define newcommand: " "\\")))
1492 (put 'YaTeX::newcommand 'command (substring command 1))
1493 command))
1494 ((= argp 2)
1495 (let ((argc
1496 (string-to-int (read-string "Number of arguments(Default 0): ")))
1497 (def (read-string "Definition: "))
1498 (command (get 'YaTeX::newcommand 'command)))
1499 ;;!!! It's illegal to insert string in the add-in function !!!
1500 (if (> argc 0) (insert (format "[%d]" argc)))
1501 (if (and (stringp command)
1502 (string< "" command)
1503 (y-or-n-p "Update dictionary?"))
1504 (cond
1505 ((= argc 0)
1506 (YaTeX-update-table
1507 (list command)
1508 'singlecmd-table 'user-singlecmd-table 'tmp-singlecmd-table))
1509 ((= argc 1)
1510 (YaTeX-update-table
1511 (list command)
1512 'section-table 'user-section-table 'tmp-section-table))
1513 (t (YaTeX-update-table
1514 (list command argc)
1515 'section-table 'user-section-table 'tmp-section-table))))
1516 (message "")
1517 def ;return command name
1518 ))
1519 (t "")))
1521 (defun YaTeX::newcounter (&optional argp)
1522 (cond
1523 ((= argp 1)
1524 (read-string "New counter name: "))
1525 (t "")))
1527 ;;
1528 ; completion for the arguments of \pagestyle
1529 ;;
1530 (defun YaTeX::pagestyle (&optional argp)
1531 "Read the pagestyle with completion."
1532 (completing-read
1533 "Page style: "
1534 '(("plain") ("empty") ("headings") ("myheadings") ("normal") nil)))
1536 (fset 'YaTeX::thispagestyle 'YaTeX::pagestyle)
1538 ;;
1539 ; completion for the arguments of \pagenumbering
1540 ;;
1541 (defun YaTeX::pagenumbering (&optional argp)
1542 "Read the numbering style."
1543 (completing-read
1544 "Page numbering style: "
1545 '(("arabic") ("Alpha") ("alpha") ("Roman") ("roman"))))
1547 ;;
1548 ; Length
1549 ;;
1550 (defvar YaTeX:style-parameters-default
1551 '(("\\arraycolsep")
1552 ("\\arrayrulewidth")
1553 ("\\baselineskip")
1554 ("\\columnsep")
1555 ("\\columnseprule")
1556 ("\\doublerulesep")
1557 ("\\evensidemargin")
1558 ("\\footheight")
1559 ("\\footskip")
1560 ("\\headheight")
1561 ("\\headsep")
1562 ("\\itemindent")
1563 ("\\itemsep")
1564 ("\\labelsep")
1565 ("\\labelwidth")
1566 ("\\leftmargin")
1567 ("\\linewidth")
1568 ("\\listparindent")
1569 ("\\marginparsep")
1570 ("\\marginparwidth")
1571 ("\\mathindent")
1572 ("\\oddsidemargin")
1573 ("\\parindent")
1574 ("\\parsep")
1575 ("\\parskip")
1576 ("\\partopsep")
1577 ("\\rightmargin")
1578 ("\\tabcolsep")
1579 ("\\textheight")
1580 ("\\textwidth")
1581 ("\\topmargin")
1582 ("\\topsep")
1583 ("\\topskip")
1585 "Alist of LaTeX style parameters.")
1586 (defvar YaTeX:style-parameters-private nil
1587 "*User definable alist of style parameters.")
1588 (defvar YaTeX:style-parameters-local nil
1589 "*User definable alist of local style parameters.")
1591 (defvar YaTeX:length-history nil "Holds history of length.")
1592 (put 'YaTeX:length-history 'no-default t)
1593 (defun YaTeX::setlength (&optional argp)
1594 "YaTeX add-in function for arguments of \\setlength."
1595 (cond
1596 ((equal 1 argp)
1597 ;;(completing-read "Length variable: " YaTeX:style-parameters nil nil "\\")
1598 (YaTeX-cplread-with-learning
1599 "Length variable: "
1600 'YaTeX:style-parameters-default
1601 'YaTeX:style-parameters-private
1602 'YaTeX:style-parameters-local
1603 nil nil "\\")
1605 ((equal 2 argp)
1606 (read-string-with-history "Length: " nil 'YaTeX:length-history))))
1608 (fset 'YaTeX::addtolength 'YaTeX::setlength)
1610 (defun YaTeX::settowidth (&optional argp)
1611 "YaTeX add-in function for arguments of \\settowidth."
1612 (cond
1613 ((equal 1 argp)
1614 (YaTeX-cplread-with-learning
1615 "Length variable: "
1616 'YaTeX:style-parameters-default
1617 'YaTeX:style-parameters-private
1618 'YaTeX:style-parameters-local
1619 nil nil "\\"))
1620 ((equal 2 argp)
1621 (read-string "Text: "))))
1623 (defun YaTeX::newlength (&optional argp)
1624 "YaTeX add-in function for arguments of \\newlength"
1625 (cond
1626 ((equal argp 1)
1627 (let ((length (read-string "Length variable: " "\\")))
1628 (if (string< "" length)
1629 (YaTeX-update-table
1630 (list length)
1631 'YaTeX:style-parameters-default
1632 'YaTeX:style-parameters-private
1633 'YaTeX:style-parameters-local))
1634 length))))
1636 ;; \multicolumn's arguments
1637 (defun YaTeX::multicolumn (&optional argp)
1638 "YaTeX add-in function for arguments of \\multicolumn."
1639 (cond
1640 ((equal 1 argp)
1641 (read-string "Number of columns: "))
1642 ((equal 2 argp)
1643 (YaTeX:read-oneof "|lrc" nil t))
1644 ((equal 3 argp)
1645 (read-string "Item: "))))
1647 (defvar YaTeX:documentstyles-default
1648 '(("article") ("jarticle") ("j-article")
1649 ("book") ("jbook") ("j-book")
1650 ("report") ("jreport") ("j-report")
1651 ("letter") ("ascjletter"))
1652 "List of LaTeX documentstyles.")
1653 (defvar YaTeX:documentstyles-private nil
1654 "*User defined list of LaTeX documentstyles.")
1655 (defvar YaTeX:documentstyles-local nil
1656 "*User defined list of local LaTeX documentstyles.")
1657 (defvar YaTeX:documentstyle-options-default
1658 '(("a4j") ("a5j") ("b4j") ("b5j")
1659 ("twocolumn") ("jtwocolumn") ("epsf") ("epsfig") ("epsbox") ("nfig"))
1660 "List of LaTeX documentstyle options.")
1661 (defvar YaTeX:documentstyle-options-private nil
1662 "*User defined list of LaTeX documentstyle options.")
1663 (defvar YaTeX:documentstyle-options-local nil
1664 "List of LaTeX local documentstyle options.")
1666 (defun YaTeX:documentstyle ()
1667 (let*((delim ",")
1668 (dt (append YaTeX:documentstyle-options-local
1669 YaTeX:documentstyle-options-private
1670 YaTeX:documentstyle-options-default))
1671 (minibuffer-completion-table dt)
1672 (opt (read-from-minibuffer
1673 "Style options ([opt1,opt2,...]): "
1674 nil YaTeX-minibuffer-completion-map nil))
1675 (substr opt) o)
1676 (if (string< "" opt)
1677 (progn
1678 (while substr
1679 (setq o (substring substr 0 (string-match delim substr)))
1680 (or (assoc o dt)
1681 (YaTeX-update-table
1682 (list o)
1683 'YaTeX:documentstyle-options-default
1684 'YaTeX:documentstyle-options-private
1685 'YaTeX:documentstyle-options-local))
1686 (setq substr
1687 (if (string-match delim substr)
1688 (substring substr (1+ (string-match delim substr))))))
1689 (concat "[" opt "]"))
1690 "")))
1692 (defun YaTeX::documentstyle (&optional argp)
1693 "YaTeX add-in function for arguments of \\documentstyle."
1694 (cond
1695 ((equal argp 1)
1696 (setq YaTeX-env-name "document")
1697 (let ((sname
1698 (YaTeX-cplread-with-learning
1699 (format "Documentstyle (default %s): "
1700 YaTeX-default-document-style)
1701 'YaTeX:documentstyles-default
1702 'YaTeX:documentstyles-private
1703 'YaTeX:documentstyles-local)))
1704 (if (string= "" sname) (setq sname YaTeX-default-document-style))
1705 (setq YaTeX-default-document-style sname)))))
1707 (defun YaTeX::include (argp &optional prompt)
1708 "Read file name setting default directory to that of main file."
1709 (cond
1710 ((= argp 1)
1711 (save-excursion
1712 (YaTeX-visit-main t)
1713 (let*((insert-default-directory)
1714 (file (read-file-name (or prompt "Input file: ") "")))
1715 (setq file (substring file 0 (string-match "\\.tex$" file))))))))
1717 (fset 'YaTeX::input 'YaTeX::include)
1720 ;;; -------------------- LaTeX2e stuff --------------------
1721 (defvar YaTeX:documentclass-options-default
1722 '(("a4paper") ("a5paper") ("b4paper") ("b5paper") ("10pt") ("11pt") ("12pt")
1723 ("latterpaper") ("legalpaper") ("executivepaper") ("landscape")
1724 ("oneside") ("twoside") ("draft") ("final") ("leqno") ("fleqn") ("openbib")
1725 ("tombow") ("titlepage") ("notitlepage") ("dvips")
1726 ("mingoth") ;for jsarticle
1727 ("clock") ;for slides class only
1729 "Default options list for documentclass")
1730 (defvar YaTeX:documentclass-options-private nil
1731 "*User defined options list for documentclass")
1732 (defvar YaTeX:documentclass-options-local nil
1733 "*User defined options list for local documentclass")
1735 (defun YaTeX:documentclass ()
1736 (let*((delim ",")
1737 (dt (append YaTeX:documentclass-options-local
1738 YaTeX:documentclass-options-private
1739 YaTeX:documentclass-options-default))
1740 (minibuffer-completion-table dt)
1741 (opt (read-from-minibuffer
1742 "Documentclass options ([opt1,opt2,...]): "
1743 nil YaTeX-minibuffer-completion-map nil))
1744 (substr opt) o)
1745 (if (string< "" opt)
1746 (progn
1747 (while substr
1749 (setq o (substring substr 0 (string-match delim substr)))
1750 (or (assoc o dt)
1751 (YaTeX-update-table
1752 (list o)
1753 'YaTeX:documentclass-options-default
1754 'YaTeX:documentclass-options-private
1755 'YaTeX:documentclass-options-local))
1756 (setq substr
1757 (if (string-match delim substr)
1758 (substring substr (1+ (string-match delim substr))))))
1759 (concat "[" opt "]"))
1760 "")))
1762 (defvar YaTeX:documentclasses-default
1763 '(("article") ("jarticle") ("report") ("jreport") ("book") ("jbook")
1764 ("jsarticle") ("jsbook")
1765 ("j-article") ("j-report") ("j-book")
1766 ("letter") ("slides") ("ltxdoc") ("ltxguide") ("ltnews") ("proc"))
1767 "Default documentclass alist")
1768 (defvar YaTeX:documentclasses-private nil
1769 "*User defined documentclass alist")
1770 (defvar YaTeX:documentclasses-local nil
1771 "*User defined local documentclass alist")
1772 (defvar YaTeX-default-documentclass (if YaTeX-japan "jarticle" "article")
1773 "*Default documentclass")
1775 (defun YaTeX::documentclass (&optional argp)
1776 (cond
1777 ((equal argp 1)
1778 (setq YaTeX-env-name "document")
1779 (let ((sname
1780 (YaTeX-cplread-with-learning
1781 (format "Documentclass (default %s): " YaTeX-default-documentclass)
1782 'YaTeX:documentclasses-default
1783 'YaTeX:documentclasses-private
1784 'YaTeX:documentclasses-local)))
1785 (if (string= "" sname) (setq sname YaTeX-default-documentclass))
1786 (setq YaTeX-default-documentclass sname)))))
1788 (defvar YaTeX:latex2e-named-color-alist
1789 '(("GreenYellow") ("Yellow") ("Goldenrod") ("Dandelion") ("Apricot")
1790 ("Peach") ("Melon") ("YellowOrange") ("Orange") ("BurntOrange")
1791 ("Bittersweet") ("RedOrange") ("Mahogany") ("Maroon") ("BrickRed")
1792 ("Red") ("OrangeRed") ("RubineRed") ("WildStrawberry") ("Salmon")
1793 ("CarnationPink") ("Magenta") ("VioletRed") ("Rhodamine") ("Mulberry")
1794 ("RedViolet") ("Fuchsia") ("Lavender") ("Thistle") ("Orchid")("DarkOrchid")
1795 ("Purple") ("Plum") ("Violet") ("RoyalPurple") ("BlueViolet")
1796 ("Periwinkle") ("CadetBlue") ("CornflowerBlue") ("MidnightBlue")
1797 ("NavyBlue") ("RoyalBlue") ("Blue") ("Cerulean") ("Cyan") ("ProcessBlue")
1798 ("SkyBlue") ("Turquoise") ("TealBlue") ("Aquamarine") ("BlueGreen")
1799 ("Emerald") ("JungleGreen") ("SeaGreen") ("Green") ("ForestGreen")
1800 ("PineGreen") ("LimeGreen") ("YellowGreen") ("SpringGreen") ("OliveGreen")
1801 ("RawSienna") ("Sepia") ("Brown") ("Tan") ("Gray") ("Black") ("White"))
1802 "Colors defined in $TEXMF/tex/plain/dvips/colordvi.tex")
1804 (defvar YaTeX:latex2e-basic-color-alist
1805 '(("black") ("white") ("red") ("blue") ("yellow") ("green") ("cyan")
1806 ("magenta"))
1807 "Basic colors")
1809 (defun YaTeX:textcolor ()
1810 "Add-in for \\color's option"
1811 (if (y-or-n-p "Use `named' color? ")
1812 "[named]"))
1814 (defun YaTeX::color-completing-read (prompt)
1815 (let ((completion-ignore-case t)
1816 (namedp (save-excursion
1817 (skip-chars-backward "^\n\\[\\\\")
1818 (looking-at "named"))))
1819 (completing-read
1820 prompt
1821 (if namedp
1822 YaTeX:latex2e-named-color-alist
1823 YaTeX:latex2e-basic-color-alist)
1824 nil t)))
1826 (defun YaTeX::textcolor (argp)
1827 "Add-in for \\color's argument"
1828 (cond
1829 ((= argp 1) (YaTeX::color-completing-read "Color: "))
1830 ((= argp 2) (read-string "Colored string: "))))
1832 (fset 'YaTeX:color 'YaTeX:textcolor)
1833 (fset 'YaTeX::color 'YaTeX::textcolor)
1834 (fset 'YaTeX:colorbox 'YaTeX:textcolor)
1835 (fset 'YaTeX::colorbox 'YaTeX::textcolor)
1836 (fset 'YaTeX:fcolorbox 'YaTeX:textcolor)
1837 (fset 'YaTeX:pagecolor 'YaTeX:textcolor)
1838 (fset 'YaTeX::pagecolor 'YaTeX::textcolor)
1840 (defun YaTeX::fcolorbox (argp)
1841 (cond
1842 ((= argp 1) (YaTeX::color-completing-read "Frame color: "))
1843 ((= argp 2) (YaTeX::color-completing-read "Inner color: "))
1844 ((= argp 3) (read-string "Colored string: "))))
1846 (defun YaTeX:scalebox ()
1847 "Add-in for \\scalebox"
1848 (let ((vmag (read-string
1849 (if YaTeX-japan "倍率(負で反転): "
1850 "Magnification(Negative for flipped): ")))
1851 (hmag (read-string (if YaTeX-japan "縦倍率(省略可): "
1852 "Vertical magnification(Optional): "))))
1853 (if (and hmag (string< "" hmag))
1854 (format "{%s}[%s]" vmag hmag)
1855 (format "{%s}" vmag))))
1857 (defun YaTeX:rotatebox ()
1858 "Optional argument add-in for \\rotatebox"
1859 (message "Rotate origin? (N)one (O)rigin (X)-Y: ")
1860 (let ((c (read-char)) r (defx "x=mm") x (defy "y=mm") y something)
1861 (cond
1862 ((memq c '(?O ?o))
1863 (if (string< "" (setq r (YaTeX:read-oneof "htbpB")))
1864 (concat "[origin=" r "]")))
1865 ((memq c '(?X ?x ?Y ?y))
1866 (setq r (read-string "" (if YaTeX-emacs-19 (cons defx 3) defx))
1867 x (if (string< "x=" r) r)
1868 r (read-string "" (if YaTeX-emacs-19 (cons defy 3) defy))
1869 y (if (string< "y=" r) r)
1870 something (or x y))
1871 (format "%s%s%s%s%s"
1872 (if something "[" "")
1873 (if x x "")
1874 (if (and x y) "," "")
1875 (if y y "")
1876 (if something "]" ""))))))
1878 (defun YaTeX::rotatebox (argp)
1879 "Argument add-in for \\rotatebox"
1880 (cond
1881 ((= argp 1)
1882 (read-string (if YaTeX-japan "回転角(度; 左回り): "
1883 "Angle in degree(unclockwise): ")))
1884 ((= argp 2)
1885 (read-string (if YaTeX-japan "テキスト: " "Text: ")))))
1887 (defun YaTeX:includegraphics ()
1888 "Add-in for \\includegraphics's option"
1889 (let (width height (scale "") angle str)
1890 (setq width (read-string "Width: ")
1891 height (read-string "Height: "))
1892 (or (string< width "") (string< "" height)
1893 (setq scale (read-string "Scale: ")))
1894 (setq angle (read-string "Angle(0-359): "))
1895 (setq str
1896 (mapconcat
1897 'concat
1898 (delq nil
1899 (mapcar '(lambda (s)
1900 (and (stringp (symbol-value s))
1901 (string< "" (symbol-value s))
1902 (format "%s=%s" s (symbol-value s))))
1903 '(width height scale angle)))
1904 ","))
1905 (if (string= "" str) ""
1906 (concat "[" str "]"))))
1908 (defun YaTeX::includegraphics (argp)
1909 "Add-in for \\includegraphics"
1910 (YaTeX::include argp "Image File: "))
1912 (defun YaTeX::verbfile (argp)
1913 "Add-in for \\verbfile"
1914 (YaTeX::include argp "Virbatim File: "))
1916 (defun YaTeX:caption ()
1917 (setq YaTeX-section-name "label")
1918 nil)
1921 (defvar YaTeX::usepackage-alist-default
1922 '(("version") ("plext") ("url") ("fancybox") ("pifont") ("longtable")
1923 ("ascmac") ("bm") ("graphics") ("graphicx") ("alltt") ("misc") ("eclbkbox")
1924 ("amsmath") ("amssymb") ("xymtex") ("chemist")
1925 ("a4j") ("array") ("epsf") ("color") ("epsfig") ("floatfig")
1926 ("landscape") ("path") ("supertabular") ("twocolumn")
1927 ("latexsym") ("times") ("makeidx"))
1928 "Default completion table for arguments of \\usepackage")
1930 (defvar YaTeX::usepackage-alist-private nil
1931 "*Private completion list of the argument for usepackage")
1933 (defvar YaTeX::usepackage-alist-local nil
1934 "Directory local completion list of the argument for usepackage")
1936 (defun YaTeX::usepackage (&optional argp)
1937 (cond
1938 ((equal argp 1)
1939 (setq YaTeX-env-name "document")
1940 (let ((minibuffer-local-completion-map YaTeX-minibuffer-completion-map)
1941 (delim ","))
1942 (YaTeX-cplread-with-learning
1943 (if YaTeX-japan "Use package(カンマで区切ってOK): "
1944 "Use package(delimitable by comma): ")
1945 'YaTeX::usepackage-alist-default
1946 'YaTeX::usepackage-alist-private
1947 'YaTeX::usepackage-alist-local)))))
1949 (defun YaTeX::mask (argp)
1950 (cond
1951 ((equal argp 1)
1952 (read-string "String: "))
1953 ((equal argp 2)
1954 (let (c)
1955 (while (not (memq c '(?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K)))
1956 (message "Mask type(A..K): ")
1957 (setq c (upcase (read-char))))
1958 (format "%c" c)))))
1960 (defun YaTeX::maskbox (argp)
1961 (cond
1962 ((equal argp 1)
1963 (read-string "Width: "))
1964 ((equal argp 2)
1965 (read-string "Height: "))
1966 ((equal argp 3)
1967 (let (c)
1968 (while (not (memq c '(?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K)))
1969 (message "Mask type(A..K): ")
1970 (setq c (upcase (read-char))))
1971 (format "%c" c)))
1972 ((equal argp 4)
1973 (YaTeX:read-oneof "lcr" 'quick))
1974 ((equal argp 5)
1975 (read-string "String: "))))
1977 (defun YaTeX::textcircled (argp)
1978 (cond
1979 ((equal argp 1)
1980 (let ((char (read-string "Circled char: "))
1981 (left "") (right "") c)
1982 (setq c (read-char
1983 "Enclose also with (s)mall (t)iny s(C)riptsize (N)one:"))
1984 (cond
1985 ((memq c '(?s ?S)) (setq left "{\\small " right "}"))
1986 ((memq c '(?t ?T)) (setq left "{\\tiny " right "}"))
1987 ((memq c '(?c ?C)) (setq left "{\\scriptsize " right "}")))
1988 (format "%s%s%s" left char right)))))
1990 ;;; -------------------- math-mode stuff --------------------
1991 (defun YaTeX::tilde (&optional pos)
1992 "For accent macros in mathmode"
1993 (cond
1994 ((equal pos 1)
1995 (message "Put accent on variable: ")
1996 (let ((v (char-to-string (read-char))) (case-fold-search nil))
1997 (message "")
1998 (cond
1999 ((string-match "i\\|j" v)
2000 (concat "\\" v "math"))
2001 ((string-match "[\r\n\t ]" v)
2002 "")
2003 (t v))))
2004 (nil "")))
2006 (fset 'YaTeX::hat 'YaTeX::tilde)
2007 (fset 'YaTeX::check 'YaTeX::tilde)
2008 (fset 'YaTeX::bar 'YaTeX::tilde)
2009 (fset 'YaTeX::dot 'YaTeX::tilde)
2010 (fset 'YaTeX::ddot 'YaTeX::tilde)
2011 (fset 'YaTeX::vec 'YaTeX::tilde)
2013 (defun YaTeX::widetilde (&optional pos)
2014 "For multichar accent macros in mathmode"
2015 (cond
2016 ((equal pos 1)
2017 (let ((m "Put over chars[%s ]: ") v v2)
2018 (message m " ")
2019 (setq v (char-to-string (read-char)))
2020 (message "")
2021 (if (string-match "[\r\n\t ]" v)
2022 ""
2023 (message m v)
2024 (setq v2 (char-to-string (read-char)))
2025 (message "")
2026 (if (string-match "[\r\n\t ]" v2)
2028 (concat v v2)))))
2029 (nil "")))
2031 (fset 'YaTeX::widehat 'YaTeX::widetilde)
2032 (fset 'YaTeX::overline 'YaTeX::widetilde)
2033 (fset 'YaTeX::overrightarrow 'YaTeX::widetilde)
2036 ; for \frac{}{} region
2037 (defun YaTeX::frac-region (beg end)
2038 (if (catch 'done
2039 (while (re-search-forward "\\s *\\(\\\\over\\|/\\)\\s *" end t)
2040 (goto-char (match-beginning 0))
2041 (if (y-or-n-p
2042 (format "Replace this `%s' with `}{'" (YaTeX-match-string 0)))
2043 (throw 'done t))
2044 (goto-char (match-end 0))))
2045 (let (p (b0 (match-beginning 0)) e0)
2046 (replace-match "}{")
2047 (setq e0 (point))
2048 (save-restriction
2049 (narrow-to-region beg end)
2050 (goto-char e0)
2051 (skip-chars-forward " \t")
2052 (setq p (point))
2053 (YaTeX-goto-corresponding-paren)
2054 (forward-char 1)
2055 (skip-chars-forward " \t\r\n")
2056 (if (= end (1+ (point)))
2057 (progn
2058 (goto-char p)
2059 (if (looking-at "\\\\") (forward-char 1))
2060 (YaTeX-kill-paren nil)))
2061 (goto-char beg)
2062 (skip-chars-forward " \t")
2063 (setq p (point))
2064 (YaTeX-goto-corresponding-paren)
2065 (forward-char 1)
2066 (skip-chars-forward " \t\r\n")
2067 (if (>= (point) b0)
2068 (progn
2069 (goto-char p)
2070 (if (looking-at "\\\\") (forward-char 1))
2071 (YaTeX-kill-paren nil))))))
2072 (message ""))
2074 (defun YaTeX::DeclareMathOperator (argp)
2075 (cond
2076 ((equal argp 1)
2077 (read-string "Operator: " "\\"))))
2079 ;;;
2080 ;; Add-in functions for large-type command.
2081 ;;;
2082 (defun YaTeX:em ()
2083 (cond
2084 ((eq YaTeX-current-completion-type 'large) "\\/")
2085 (t nil)))
2086 (fset 'YaTeX:it 'YaTeX:em)
2088 ;;; -------------------- End of yatexadd --------------------
2089 (provide 'yatexadd)
2090 ; Local variables:
2091 ; fill-prefix: ";;; "
2092 ; paragraph-start: "^$\\| \\|;;;$"
2093 ; paragraph-separate: "^$\\| \\|;;;$"
2094 ; coding: sjis
2095 ; End: