yatex

changeset 78:5b19f901fa16

Initial revision
author yuuji
date Fri, 02 May 2003 11:23:59 +0000
parents 1b172d26b55e
children 0734be649cb8
files yatexpkg.el
diffstat 1 files changed, 121 insertions(+), 0 deletions(-) [+]
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/yatexpkg.el	Fri May 02 11:23:59 2003 +0000
     1.3 @@ -0,0 +1,121 @@
     1.4 +;;; -*- Emacs-Lisp -*-
     1.5 +;;; YaTeX package manager
     1.6 +;;; yatexpkg.el
     1.7 +;;; (c )2003 by HIROSE, Yuuji [yuuji@yatex.org]
     1.8 +;;; Last modified Fri May  2 20:13:49 2003 on firestorm
     1.9 +;;; $Id$
    1.10 +
    1.11 +(defvar YaTeX-package-alist-default
    1.12 +  '(("version"	(env "comment"))	;by tsuchiya@pine.kuee.kyoto-u.ac.jp
    1.13 +
    1.14 +    ("plext"	(section "bou"))	;by yas.axis@ma.mni.ne.jp
    1.15 +
    1.16 +    ("url"	(section "url"))	;by fujieda@jaist.ac.jp
    1.17 +
    1.18 +    ("fancybox"	(section "shadowbox" "doublebox" "ovalbox" "Ovalbox"))
    1.19 +    ("pifont"	(section "ding"))
    1.20 +    ("longtable" (env "longtable"))
    1.21 +    ("ascmac"	(env "screen" "boxnote" "shadebox" "itembox")
    1.22 +		(maketitle "return" "Return" "yen")
    1.23 +     		(section "keytop"))
    1.24 +    ("bm"	(section "bm"))		;by aoyama@le.chiba-u.ac.jp
    1.25 +
    1.26 +    ("graphicx"	(section "includegraphics"))
    1.27 +    ("alltt"	(env "alltt"))
    1.28 +    ("misc"	(section "verbfile" "listing"))
    1.29 +    ("eclbkbox"	(env "breakbox")))
    1.30 +  "Default package vs. macro list")
    1.31 +
    1.32 +(defvar YaTeX-package-alist-private nil
    1.33 +  "*User defined package vs. macro list. See also YaTeX-package-alist-default")
    1.34 +
    1.35 +(defun YaTeX-package-lookup (macro &optional type)
    1.36 +  "Look up a package which contains a definition of MACRO.
    1.37 +Optional second argument TYPE limits the macro type.
    1.38 +TYPE is a symbol, one of 'env, 'section, 'maketitle."
    1.39 +  (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
    1.40 +	element x pkg pkglist r)
    1.41 +    (while list
    1.42 +      (setq element (car list)
    1.43 +	    pkg (car element)
    1.44 +	    element (cdr element))
    1.45 +      (if (setq r (catch 'found
    1.46 +		    (while element
    1.47 +		      (setq x (car element))
    1.48 +		      (and (YaTeX-member macro (cdr x))
    1.49 +			   (or (null type)
    1.50 +			       (eq type (car x)))
    1.51 +			   (throw 'found (car x)))	;car x is type
    1.52 +		      (setq element (cdr element)))))
    1.53 +	  (setq pkglist (cons (cons pkg r) pkglist)))
    1.54 +      (setq list (cdr list)))
    1.55 +    pkglist))
    1.56 +
    1.57 +(defvar YaTeX-package-resolved-list nil
    1.58 +  "List of macros whose package is confirmed to be loaded.")
    1.59 +
    1.60 +(defun YaTeX-package-auto-usepackage (macro type)
    1.61 +  "(Semi)Automatically add the \\usepackage line to main-file.
    1.62 +Search the usepackage for MACRO of the TYPE."
    1.63 +  (let ((cb (current-buffer))
    1.64 +	(wc (current-window-configuration))
    1.65 +	(usepackage (concat YaTeX-ec "usepackage"))
    1.66 +	(pkglist (YaTeX-package-lookup macro))
    1.67 +	(usepkgrx (concat
    1.68 +		   YaTeX-ec-regexp
    1.69 +		   "\\(usepackage\\|include\\)\\b"))
    1.70 +	(register '(lambda () (set-buffer cb)
    1.71 +		     (set (make-local-variable 'YaTeX-package-resolved-list)
    1.72 +			  (cons macro YaTeX-package-resolved-list))))
    1.73 +	(begdoc (concat YaTeX-ec "begin{document}"))
    1.74 +	pb pkg mb0)
    1.75 +    (if (or (YaTeX-member macro YaTeX-package-resolved-list)
    1.76 +	    (null pkglist))
    1.77 +	nil				;nothing to do
    1.78 +      ;; Search `usepackage' into main-file
    1.79 +      (YaTeX-visit-main t)		;set buffer to parent file
    1.80 +      (setq pb (current-buffer))
    1.81 +      (save-excursion
    1.82 +	(save-restriction
    1.83 +	  (if (catch 'found
    1.84 +		(goto-char (point-min))
    1.85 +		(YaTeX-search-active-forward	;if search fails, goto eob
    1.86 +		 begdoc YaTeX-comment-prefix nil 1)
    1.87 +		(while (YaTeX-re-search-active-backward
    1.88 +			usepkgrx YaTeX-comment-prefix nil t)
    1.89 +		  (setq mb0 (match-beginning 0))
    1.90 +		  (skip-chars-forward "^{")
    1.91 +		  (let ((pl pkglist))
    1.92 +		    (while pl		;(car pl)'s car is package, cdr is type
    1.93 +		      (if (looking-at (regexp-quote (car (car pl))))
    1.94 +			  (throw 'found t))
    1.95 +		      (setq pl (cdr pl)))
    1.96 +		    (goto-char mb0))))
    1.97 +	      ;;corresponding \usepackage found
    1.98 +	      (funcall register)
    1.99 +	    ;; not found, insert it.
   1.100 +	    (if (y-or-n-p
   1.101 +		 (format "`%s' requires package. Put \\usepackage now?" macro))
   1.102 +		(progn
   1.103 +		  (setq pkg
   1.104 +			(completing-read
   1.105 +			 "Load which package?(TAB for list): "
   1.106 +			 pkglist))
   1.107 +		  (set-buffer pb)
   1.108 +		  (goto-char (point-min))
   1.109 +		  (if (YaTeX-re-search-active-forward
   1.110 +		       (concat YaTeX-ec-regexp
   1.111 +			       "document\\(style\\|class\\){")
   1.112 +		       YaTeX-comment-prefix nil t)
   1.113 +		      (forward-line 1))
   1.114 +		  (if (YaTeX-search-active-forward
   1.115 +		       begdoc YaTeX-comment-prefix nil t)
   1.116 +		      (goto-char (match-beginning 0)))
   1.117 +		  (insert
   1.118 +		   usepackage
   1.119 +		   (format "{%s}\t%% required for `\\%s' (yatex added)\n"
   1.120 +			   pkg macro))
   1.121 +		  (funcall register))
   1.122 +	      (message "Don't forget to put \\usepackage{%s} yourself later"
   1.123 +		       (car (car pkglist)))) ;doing car car is negligence...
   1.124 +    ))))))