yatex

view yatexpkg.el @ 311:f1d2753cb4f1

Completing read in optional argument reader for `includegraphcis'
author HIROSE Yuuji <yuuji@gentei.org>
date Tue, 24 Dec 2013 09:03:55 +0900
parents a57f4c74179a
children 0d42b3d7f958
line source
1 ;;; yatexpkg.el --- YaTeX package manager
2 ;;;
3 ;;; (c)2003-2013 by HIROSE, Yuuji [yuuji@yatex.org]
4 ;;; Last modified Fri Jul 5 23:30:48 2013 on firestorm
5 ;;; $Id$
7 ;;; Code:
8 (defvar YaTeX-package-ams-envs
9 (mapcar 'car YaTeX-ams-env-table))
11 (defvar YaTeX-package-alist-default
12 '(("version" (env "comment") ;by tsuchiya<at>pine.kuee.kyoto-u.ac.jp
13 (section "includeversion" "excludeversion"))
15 ("plext" (section "bou")) ;by yas.axis<at>ma.mni.ne.jp
17 ("url" (section "url")) ;by fujieda<at>jaist.ac.jp
19 ("fancybox" (section "shadowbox" "doublebox" "ovalbox" "Ovalbox"))
20 ("slashbox" (section "slashbox" "backslashbox"))
21 ("pifont" (section "ding"))
22 ("longtable" (env "longtable"))
23 ("ascmac" (env "screen" "boxnote" "shadebox" "itembox")
24 (maketitle "return" "Return" "yen")
25 (section "keytop") ("mask") ("maskbox"))
26 ("bm" (section "bm")) ;by aoyama<at>le.chiba-u.ac.jp
28 ("alltt" (env "alltt"))
29 ("misc" (section "verbfile" "listing"))
30 ("eclbkbox" (env "breakbox"))
31 ("supertabular" (env "supertabular"))
32 ("amsmath" (env . YaTeX-package-ams-envs)
33 (section "tag" "tag*"))
34 ("amssymb" (maketitle "leqq" "geqq" "mathbb" "mathfrak"
35 "fallingdotseq" "therefore" "because"
36 "lll" "ggg")) ;very few. Please tell us!
37 ("graphicx" (section "includegraphics"
38 "rotatebox" "scalebox" "resizebox" "reflectbox")
39 (option . YaTeX-package-graphics-driver-alist))
40 ("color" (section "textcolor" "colorbox" "pagecolor" "color")
41 (option . YaTeX-package-graphics-driver-alist)
42 (default-option . "usenames,dvipsnames"))
43 ("xcolor" (same-as . "color"))
44 ("ulem" (section "uline" "uuline" "uwave")
45 (option ("normalem")))
46 ("multicol" (env "multicols")))
47 "Default package vs. macro list.
48 Alists contains '(PACKAGENAME . MACROLIST)
49 PACKAGENAME Basename of package(String).
50 MACROLIST List of '(TYPE . MACROS)
51 TYPE One of 'env, 'section or 'maketitle according to completion-type
52 MACROS List of macros
54 If TYPE is 'option, its cdr is alist of completion candidates for that
55 package. Its cdr can be a symbol whose value is alist.
57 An good example is the value of YaTeX-package-alist-default.")
59 (defvar YaTeX-package-graphics-driver-alist
60 '(("dvips") ("dvipsnames") ("usenames")
61 ("xdvi") ("dvipdf") ("pdftex") ("dvipsone") ("dviwindo")
62 ("emtex") ("dviwin") ("oztex") ("textures") ("pctexps") ("pctexwin")
63 ("pctexhp") ("pctex32") ("truetex") ("tcidvi") ("vtex"))
64 "Drivers alist of graphics/color stylefile's supporting deveces.
65 This list is taken from
66 %% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
67 %% Copyright (C) 1995 1996 1997 1998 David Carlisle
68 as of 2004/1/19. Thanks.")
70 (defvar YaTeX-package-alist-private nil
71 "*User defined package vs. macro list. See also YaTeX-package-alist-default")
73 (defun YaTeX-package-lookup (macro &optional type)
74 "Look up a package which contains a definition of MACRO.
75 Optional second argument TYPE limits the macro type.
76 TYPE is a symbol, one of 'env, 'section, 'maketitle."
77 (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
78 origlist element x sameas val pkg pkglist r)
79 (setq origlist list)
80 (while list
81 (setq element (car list)
82 pkg (car element)
83 element (cdr element))
84 (if (setq sameas (assq 'same-as element)) ;non-recursive retrieval
85 (setq element (cdr (assoc (cdr sameas) origlist))))
86 (if (setq r (catch 'found
87 (while element
88 (setq x (car element)
89 val (cdr x))
90 (if (symbolp val) (setq val (symbol-value val)))
91 (and (or (null type)
92 (eq type (car x)))
93 (YaTeX-member macro val)
94 (throw 'found (car x))) ;car x is type
95 (setq element (cdr element)))))
96 (setq pkglist (cons (cons pkg r) pkglist)))
97 (setq list (cdr list)))
98 pkglist))
100 (defun YaTeX-package-option-lookup (pkg &optional key)
101 "Look up options for specified pkg and returne them in alist form.
102 Just only associng against the alist of YaTeX-package-alist-*"
103 (let*((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
104 (l (cdr (assq (or key 'option) (assoc pkg list))))
105 (recur (cdr (assq 'same-as (assoc pkg list)))))
106 (cond
107 (recur (YaTeX-package-option-lookup recur key))
108 ((symbolp l) (symbol-value l))
109 (t l))))
111 (defvar YaTeX-package-resolved-list nil
112 "List of macros whose package is confirmed to be loaded.")
114 (defun YaTeX-package-auto-usepackage (macro type)
115 "(Semi)Automatically add the \\usepackage line to main-file.
116 Search the usepackage for MACRO of the TYPE."
117 (let ((cb (current-buffer))
118 (wc (current-window-configuration))
119 (usepackage (concat YaTeX-ec "usepackage"))
120 (pkglist (YaTeX-package-lookup macro type))
121 (usepkgrx (concat
122 YaTeX-ec-regexp
123 "\\(usepackage\\|include\\)\\b"))
124 (register '(lambda () (set-buffer cb)
125 (set (make-local-variable 'YaTeX-package-resolved-list)
126 (cons macro YaTeX-package-resolved-list))))
127 (begdoc (concat YaTeX-ec "begin{document}"))
128 pb pkg optlist (option "") mb0 uspkgargs)
129 (if (or (YaTeX-member macro YaTeX-package-resolved-list)
130 (null pkglist))
131 nil ;nothing to do
132 ;; Search `usepackage' into main-file
133 (YaTeX-visit-main t) ;set buffer to parent file
134 (setq pb (current-buffer))
135 (save-excursion
136 (save-restriction
137 (if (catch 'found
138 (goto-char (point-min))
139 (YaTeX-search-active-forward ;if search fails, goto eob
140 begdoc YaTeX-comment-prefix nil 1)
141 (while ;(YaTeX-re-search-active-backward
142 ;usepkgrx YaTeX-comment-prefix nil t)
143 ;;allow commented out \usepackages 2004/3/16
144 (re-search-backward usepkgrx nil t)
145 (setq mb0 (match-beginning 0))
146 (skip-chars-forward "^{")
147 (setq uspkgargs (YaTeX-buffer-substring
148 (point)
149 (progn
150 ;;(forward-list 1) is more precise,
151 ;; but higher risk.
152 (skip-chars-forward "^}\n")(point))))
153 (let ((pl pkglist))
154 (while pl ;(car pl)'s car is package, cdr is type
155 (if (string-match
156 (concat "[{,]\\s *"
157 (regexp-quote (car (car pl)))
158 "\\>")
159 uspkgargs)
160 (throw 'found t))
161 (setq pl (cdr pl)))
162 (goto-char mb0))))
163 ;;corresponding \usepackage found
164 (funcall register)
165 ;; not found, insert it.
166 (if (y-or-n-p
167 (format "`%s' requires package. Put \\usepackage now?" macro))
168 (progn
169 (require 'yatexadd)
170 (setq pkg
171 (completing-read
172 "Load which package?(TAB for list): "
173 pkglist nil nil
174 ;;initial input
175 (if (= (length pkglist) 1)
176 (let ((w (car (car pkglist))))
177 (if YaTeX-emacs-19 (cons w 0) w))))
178 optlist
179 (YaTeX-package-option-lookup pkg))
180 (if optlist
181 (let ((minibuffer-completion-table optlist)
182 (delim ",") (w (car (car optlist)))
183 (dflt (YaTeX-package-option-lookup
184 pkg 'default-option)))
185 (setq option
186 (read-from-minibuffer
187 (format "Any option for {%s}?: " pkg)
188 (let ((v (or dflt
189 (and (= (length optlist) 1) w))))
190 (and v (if YaTeX-emacs-19 (cons v 0) v)))
191 YaTeX-minibuffer-completion-map)
192 option (if (string< "" option)
193 (concat "[" option "]")
194 ""))))
195 (set-buffer pb)
196 (goto-char (point-min))
197 (if (YaTeX-re-search-active-forward
198 (concat YaTeX-ec-regexp
199 "document\\(style\\|class\\){")
200 YaTeX-comment-prefix nil t)
201 (forward-line 1))
202 (if (YaTeX-search-active-forward
203 begdoc YaTeX-comment-prefix nil t)
204 (goto-char (match-beginning 0)))
205 (insert
206 usepackage
207 (format "%s{%s}\t%% required for `\\%s' (yatex added)\n"
208 option pkg macro))
209 (funcall register))
210 (funcall register)
211 (message "Don't forget to put \\usepackage{%s} yourself later"
212 (car (car pkglist)))) ;doing car car is negligence...
213 ))))))