# HG changeset patch # User yuuji # Date 1051874639 0 # Node ID 5b19f901fa1605309fa50608abc5a1b5627b1a47 # Parent 1b172d26b55eefe67eaffe8e4d1eda13e6677d52 Initial revision diff -r 1b172d26b55e -r 5b19f901fa16 yatexpkg.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/yatexpkg.el Fri May 02 11:23:59 2003 +0000 @@ -0,0 +1,121 @@ +;;; -*- Emacs-Lisp -*- +;;; YaTeX package manager +;;; yatexpkg.el +;;; (c )2003 by HIROSE, Yuuji [yuuji@yatex.org] +;;; Last modified Fri May 2 20:13:49 2003 on firestorm +;;; $Id$ + +(defvar YaTeX-package-alist-default + '(("version" (env "comment")) ;by tsuchiya@pine.kuee.kyoto-u.ac.jp + + ("plext" (section "bou")) ;by yas.axis@ma.mni.ne.jp + + ("url" (section "url")) ;by fujieda@jaist.ac.jp + + ("fancybox" (section "shadowbox" "doublebox" "ovalbox" "Ovalbox")) + ("pifont" (section "ding")) + ("longtable" (env "longtable")) + ("ascmac" (env "screen" "boxnote" "shadebox" "itembox") + (maketitle "return" "Return" "yen") + (section "keytop")) + ("bm" (section "bm")) ;by aoyama@le.chiba-u.ac.jp + + ("graphicx" (section "includegraphics")) + ("alltt" (env "alltt")) + ("misc" (section "verbfile" "listing")) + ("eclbkbox" (env "breakbox"))) + "Default package vs. macro list") + +(defvar YaTeX-package-alist-private nil + "*User defined package vs. macro list. See also YaTeX-package-alist-default") + +(defun YaTeX-package-lookup (macro &optional type) + "Look up a package which contains a definition of MACRO. +Optional second argument TYPE limits the macro type. +TYPE is a symbol, one of 'env, 'section, 'maketitle." + (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default)) + element x pkg pkglist r) + (while list + (setq element (car list) + pkg (car element) + element (cdr element)) + (if (setq r (catch 'found + (while element + (setq x (car element)) + (and (YaTeX-member macro (cdr x)) + (or (null type) + (eq type (car x))) + (throw 'found (car x))) ;car x is type + (setq element (cdr element))))) + (setq pkglist (cons (cons pkg r) pkglist))) + (setq list (cdr list))) + pkglist)) + +(defvar YaTeX-package-resolved-list nil + "List of macros whose package is confirmed to be loaded.") + +(defun YaTeX-package-auto-usepackage (macro type) + "(Semi)Automatically add the \\usepackage line to main-file. +Search the usepackage for MACRO of the TYPE." + (let ((cb (current-buffer)) + (wc (current-window-configuration)) + (usepackage (concat YaTeX-ec "usepackage")) + (pkglist (YaTeX-package-lookup macro)) + (usepkgrx (concat + YaTeX-ec-regexp + "\\(usepackage\\|include\\)\\b")) + (register '(lambda () (set-buffer cb) + (set (make-local-variable 'YaTeX-package-resolved-list) + (cons macro YaTeX-package-resolved-list)))) + (begdoc (concat YaTeX-ec "begin{document}")) + pb pkg mb0) + (if (or (YaTeX-member macro YaTeX-package-resolved-list) + (null pkglist)) + nil ;nothing to do + ;; Search `usepackage' into main-file + (YaTeX-visit-main t) ;set buffer to parent file + (setq pb (current-buffer)) + (save-excursion + (save-restriction + (if (catch 'found + (goto-char (point-min)) + (YaTeX-search-active-forward ;if search fails, goto eob + begdoc YaTeX-comment-prefix nil 1) + (while (YaTeX-re-search-active-backward + usepkgrx YaTeX-comment-prefix nil t) + (setq mb0 (match-beginning 0)) + (skip-chars-forward "^{") + (let ((pl pkglist)) + (while pl ;(car pl)'s car is package, cdr is type + (if (looking-at (regexp-quote (car (car pl)))) + (throw 'found t)) + (setq pl (cdr pl))) + (goto-char mb0)))) + ;;corresponding \usepackage found + (funcall register) + ;; not found, insert it. + (if (y-or-n-p + (format "`%s' requires package. Put \\usepackage now?" macro)) + (progn + (setq pkg + (completing-read + "Load which package?(TAB for list): " + pkglist)) + (set-buffer pb) + (goto-char (point-min)) + (if (YaTeX-re-search-active-forward + (concat YaTeX-ec-regexp + "document\\(style\\|class\\){") + YaTeX-comment-prefix nil t) + (forward-line 1)) + (if (YaTeX-search-active-forward + begdoc YaTeX-comment-prefix nil t) + (goto-char (match-beginning 0))) + (insert + usepackage + (format "{%s}\t%% required for `\\%s' (yatex added)\n" + pkg macro)) + (funcall register)) + (message "Don't forget to put \\usepackage{%s} yourself later" + (car (car pkglist)))) ;doing car car is negligence... + ))))))