yatex

annotate yatexpkg.el @ 78:5b19f901fa16

Initial revision
author yuuji
date Fri, 02 May 2003 11:23:59 +0000
parents
children 0734be649cb8
rev   line source
yuuji@78 1 ;;; -*- Emacs-Lisp -*-
yuuji@78 2 ;;; YaTeX package manager
yuuji@78 3 ;;; yatexpkg.el
yuuji@78 4 ;;; (c )2003 by HIROSE, Yuuji [yuuji@yatex.org]
yuuji@78 5 ;;; Last modified Fri May 2 20:13:49 2003 on firestorm
yuuji@78 6 ;;; $Id$
yuuji@78 7
yuuji@78 8 (defvar YaTeX-package-alist-default
yuuji@78 9 '(("version" (env "comment")) ;by tsuchiya@pine.kuee.kyoto-u.ac.jp
yuuji@78 10
yuuji@78 11 ("plext" (section "bou")) ;by yas.axis@ma.mni.ne.jp
yuuji@78 12
yuuji@78 13 ("url" (section "url")) ;by fujieda@jaist.ac.jp
yuuji@78 14
yuuji@78 15 ("fancybox" (section "shadowbox" "doublebox" "ovalbox" "Ovalbox"))
yuuji@78 16 ("pifont" (section "ding"))
yuuji@78 17 ("longtable" (env "longtable"))
yuuji@78 18 ("ascmac" (env "screen" "boxnote" "shadebox" "itembox")
yuuji@78 19 (maketitle "return" "Return" "yen")
yuuji@78 20 (section "keytop"))
yuuji@78 21 ("bm" (section "bm")) ;by aoyama@le.chiba-u.ac.jp
yuuji@78 22
yuuji@78 23 ("graphicx" (section "includegraphics"))
yuuji@78 24 ("alltt" (env "alltt"))
yuuji@78 25 ("misc" (section "verbfile" "listing"))
yuuji@78 26 ("eclbkbox" (env "breakbox")))
yuuji@78 27 "Default package vs. macro list")
yuuji@78 28
yuuji@78 29 (defvar YaTeX-package-alist-private nil
yuuji@78 30 "*User defined package vs. macro list. See also YaTeX-package-alist-default")
yuuji@78 31
yuuji@78 32 (defun YaTeX-package-lookup (macro &optional type)
yuuji@78 33 "Look up a package which contains a definition of MACRO.
yuuji@78 34 Optional second argument TYPE limits the macro type.
yuuji@78 35 TYPE is a symbol, one of 'env, 'section, 'maketitle."
yuuji@78 36 (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
yuuji@78 37 element x pkg pkglist r)
yuuji@78 38 (while list
yuuji@78 39 (setq element (car list)
yuuji@78 40 pkg (car element)
yuuji@78 41 element (cdr element))
yuuji@78 42 (if (setq r (catch 'found
yuuji@78 43 (while element
yuuji@78 44 (setq x (car element))
yuuji@78 45 (and (YaTeX-member macro (cdr x))
yuuji@78 46 (or (null type)
yuuji@78 47 (eq type (car x)))
yuuji@78 48 (throw 'found (car x))) ;car x is type
yuuji@78 49 (setq element (cdr element)))))
yuuji@78 50 (setq pkglist (cons (cons pkg r) pkglist)))
yuuji@78 51 (setq list (cdr list)))
yuuji@78 52 pkglist))
yuuji@78 53
yuuji@78 54 (defvar YaTeX-package-resolved-list nil
yuuji@78 55 "List of macros whose package is confirmed to be loaded.")
yuuji@78 56
yuuji@78 57 (defun YaTeX-package-auto-usepackage (macro type)
yuuji@78 58 "(Semi)Automatically add the \\usepackage line to main-file.
yuuji@78 59 Search the usepackage for MACRO of the TYPE."
yuuji@78 60 (let ((cb (current-buffer))
yuuji@78 61 (wc (current-window-configuration))
yuuji@78 62 (usepackage (concat YaTeX-ec "usepackage"))
yuuji@78 63 (pkglist (YaTeX-package-lookup macro))
yuuji@78 64 (usepkgrx (concat
yuuji@78 65 YaTeX-ec-regexp
yuuji@78 66 "\\(usepackage\\|include\\)\\b"))
yuuji@78 67 (register '(lambda () (set-buffer cb)
yuuji@78 68 (set (make-local-variable 'YaTeX-package-resolved-list)
yuuji@78 69 (cons macro YaTeX-package-resolved-list))))
yuuji@78 70 (begdoc (concat YaTeX-ec "begin{document}"))
yuuji@78 71 pb pkg mb0)
yuuji@78 72 (if (or (YaTeX-member macro YaTeX-package-resolved-list)
yuuji@78 73 (null pkglist))
yuuji@78 74 nil ;nothing to do
yuuji@78 75 ;; Search `usepackage' into main-file
yuuji@78 76 (YaTeX-visit-main t) ;set buffer to parent file
yuuji@78 77 (setq pb (current-buffer))
yuuji@78 78 (save-excursion
yuuji@78 79 (save-restriction
yuuji@78 80 (if (catch 'found
yuuji@78 81 (goto-char (point-min))
yuuji@78 82 (YaTeX-search-active-forward ;if search fails, goto eob
yuuji@78 83 begdoc YaTeX-comment-prefix nil 1)
yuuji@78 84 (while (YaTeX-re-search-active-backward
yuuji@78 85 usepkgrx YaTeX-comment-prefix nil t)
yuuji@78 86 (setq mb0 (match-beginning 0))
yuuji@78 87 (skip-chars-forward "^{")
yuuji@78 88 (let ((pl pkglist))
yuuji@78 89 (while pl ;(car pl)'s car is package, cdr is type
yuuji@78 90 (if (looking-at (regexp-quote (car (car pl))))
yuuji@78 91 (throw 'found t))
yuuji@78 92 (setq pl (cdr pl)))
yuuji@78 93 (goto-char mb0))))
yuuji@78 94 ;;corresponding \usepackage found
yuuji@78 95 (funcall register)
yuuji@78 96 ;; not found, insert it.
yuuji@78 97 (if (y-or-n-p
yuuji@78 98 (format "`%s' requires package. Put \\usepackage now?" macro))
yuuji@78 99 (progn
yuuji@78 100 (setq pkg
yuuji@78 101 (completing-read
yuuji@78 102 "Load which package?(TAB for list): "
yuuji@78 103 pkglist))
yuuji@78 104 (set-buffer pb)
yuuji@78 105 (goto-char (point-min))
yuuji@78 106 (if (YaTeX-re-search-active-forward
yuuji@78 107 (concat YaTeX-ec-regexp
yuuji@78 108 "document\\(style\\|class\\){")
yuuji@78 109 YaTeX-comment-prefix nil t)
yuuji@78 110 (forward-line 1))
yuuji@78 111 (if (YaTeX-search-active-forward
yuuji@78 112 begdoc YaTeX-comment-prefix nil t)
yuuji@78 113 (goto-char (match-beginning 0)))
yuuji@78 114 (insert
yuuji@78 115 usepackage
yuuji@78 116 (format "{%s}\t%% required for `\\%s' (yatex added)\n"
yuuji@78 117 pkg macro))
yuuji@78 118 (funcall register))
yuuji@78 119 (message "Don't forget to put \\usepackage{%s} yourself later"
yuuji@78 120 (car (car pkglist)))) ;doing car car is negligence...
yuuji@78 121 ))))))