yatex

view yatexpkg.el @ 313:fcdb9189cd9c

\cref Update (c)-line
author HIROSE Yuuji <yuuji@gentei.org>
date Wed, 08 Jan 2014 07:52:12 +0900
parents 0d42b3d7f958
children fae84a98372c
line source
1 ;;; yatexpkg.el --- YaTeX package manager
2 ;;;
3 ;;; (c)2003-2014 by HIROSE, Yuuji [yuuji@yatex.org]
4 ;;; Last modified Wed Jan 8 07:50:29 2014 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 ("cref" (section "cleveref")))
48 "Default package vs. macro list.
49 Alists contains '(PACKAGENAME . MACROLIST)
50 PACKAGENAME Basename of package(String).
51 MACROLIST List of '(TYPE . MACROS)
52 TYPE One of 'env, 'section or 'maketitle according to completion-type
53 MACROS List of macros
55 If TYPE is 'option, its cdr is alist of completion candidates for that
56 package. Its cdr can be a symbol whose value is alist.
58 An good example is the value of YaTeX-package-alist-default.")
60 (defvar YaTeX-package-graphics-driver-alist
61 '(("dvips") ("dvipsnames") ("usenames")
62 ("xdvi") ("dvipdf") ("pdftex") ("dvipsone") ("dviwindo")
63 ("emtex") ("dviwin") ("oztex") ("textures") ("pctexps") ("pctexwin")
64 ("pctexhp") ("pctex32") ("truetex") ("tcidvi") ("vtex"))
65 "Drivers alist of graphics/color stylefile's supporting deveces.
66 This list is taken from
67 %% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
68 %% Copyright (C) 1995 1996 1997 1998 David Carlisle
69 as of 2004/1/19. Thanks.")
71 (defvar YaTeX-package-alist-private nil
72 "*User defined package vs. macro list. See also YaTeX-package-alist-default")
74 (defun YaTeX-package-lookup (macro &optional type)
75 "Look up a package which contains a definition of MACRO.
76 Optional second argument TYPE limits the macro type.
77 TYPE is a symbol, one of 'env, 'section, 'maketitle."
78 (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
79 origlist element x sameas val pkg pkglist r)
80 (setq origlist list)
81 (while list
82 (setq element (car list)
83 pkg (car element)
84 element (cdr element))
85 (if (setq sameas (assq 'same-as element)) ;non-recursive retrieval
86 (setq element (cdr (assoc (cdr sameas) origlist))))
87 (if (setq r (catch 'found
88 (while element
89 (setq x (car element)
90 val (cdr x))
91 (if (symbolp val) (setq val (symbol-value val)))
92 (and (or (null type)
93 (eq type (car x)))
94 (YaTeX-member macro val)
95 (throw 'found (car x))) ;car x is type
96 (setq element (cdr element)))))
97 (setq pkglist (cons (cons pkg r) pkglist)))
98 (setq list (cdr list)))
99 pkglist))
101 (defun YaTeX-package-option-lookup (pkg &optional key)
102 "Look up options for specified pkg and returne them in alist form.
103 Just only associng against the alist of YaTeX-package-alist-*"
104 (let*((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
105 (l (cdr (assq (or key 'option) (assoc pkg list))))
106 (recur (cdr (assq 'same-as (assoc pkg list)))))
107 (cond
108 (recur (YaTeX-package-option-lookup recur key))
109 ((symbolp l) (symbol-value l))
110 (t l))))
112 (defvar YaTeX-package-resolved-list nil
113 "List of macros whose package is confirmed to be loaded.")
115 (defun YaTeX-package-auto-usepackage (macro type)
116 "(Semi)Automatically add the \\usepackage line to main-file.
117 Search the usepackage for MACRO of the TYPE."
118 (let ((cb (current-buffer))
119 (wc (current-window-configuration))
120 (usepackage (concat YaTeX-ec "usepackage"))
121 (pkglist (YaTeX-package-lookup macro type))
122 (usepkgrx (concat
123 YaTeX-ec-regexp
124 "\\(usepackage\\|include\\)\\b"))
125 (register '(lambda () (set-buffer cb)
126 (set (make-local-variable 'YaTeX-package-resolved-list)
127 (cons macro YaTeX-package-resolved-list))))
128 (begdoc (concat YaTeX-ec "begin{document}"))
129 pb pkg optlist (option "") mb0 uspkgargs)
130 (if (or (YaTeX-member macro YaTeX-package-resolved-list)
131 (null pkglist))
132 nil ;nothing to do
133 ;; Search `usepackage' into main-file
134 (YaTeX-visit-main t) ;set buffer to parent file
135 (setq pb (current-buffer))
136 (save-excursion
137 (save-restriction
138 (if (catch 'found
139 (goto-char (point-min))
140 (YaTeX-search-active-forward ;if search fails, goto eob
141 begdoc YaTeX-comment-prefix nil 1)
142 (while ;(YaTeX-re-search-active-backward
143 ;usepkgrx YaTeX-comment-prefix nil t)
144 ;;allow commented out \usepackages 2004/3/16
145 (re-search-backward usepkgrx nil t)
146 (setq mb0 (match-beginning 0))
147 (skip-chars-forward "^{")
148 (setq uspkgargs (YaTeX-buffer-substring
149 (point)
150 (progn
151 ;;(forward-list 1) is more precise,
152 ;; but higher risk.
153 (skip-chars-forward "^}\n")(point))))
154 (let ((pl pkglist))
155 (while pl ;(car pl)'s car is package, cdr is type
156 (if (string-match
157 (concat "[{,]\\s *"
158 (regexp-quote (car (car pl)))
159 "\\>")
160 uspkgargs)
161 (throw 'found t))
162 (setq pl (cdr pl)))
163 (goto-char mb0))))
164 ;;corresponding \usepackage found
165 (funcall register)
166 ;; not found, insert it.
167 (if (y-or-n-p
168 (format "`%s' requires package. Put \\usepackage now?" macro))
169 (progn
170 (require 'yatexadd)
171 (setq pkg
172 (completing-read
173 "Load which package?(TAB for list): "
174 pkglist nil nil
175 ;;initial input
176 (if (= (length pkglist) 1)
177 (let ((w (car (car pkglist))))
178 (if YaTeX-emacs-19 (cons w 0) w))))
179 optlist
180 (YaTeX-package-option-lookup pkg))
181 (if optlist
182 (let ((minibuffer-completion-table optlist)
183 (delim ",") (w (car (car optlist)))
184 (dflt (YaTeX-package-option-lookup
185 pkg 'default-option)))
186 (setq option
187 (read-from-minibuffer
188 (format "Any option for {%s}?: " pkg)
189 (let ((v (or dflt
190 (and (= (length optlist) 1) w))))
191 (and v (if YaTeX-emacs-19 (cons v 0) v)))
192 YaTeX-minibuffer-completion-map)
193 option (if (string< "" option)
194 (concat "[" option "]")
195 ""))))
196 (set-buffer pb)
197 (goto-char (point-min))
198 (if (YaTeX-re-search-active-forward
199 (concat YaTeX-ec-regexp
200 "document\\(style\\|class\\){")
201 YaTeX-comment-prefix nil t)
202 (forward-line 1))
203 (if (YaTeX-search-active-forward
204 begdoc YaTeX-comment-prefix nil t)
205 (goto-char (match-beginning 0)))
206 (insert
207 usepackage
208 (format "%s{%s}\t%% required for `\\%s' (yatex added)\n"
209 option pkg macro))
210 (funcall register))
211 (funcall register)
212 (message "Don't forget to put \\usepackage{%s} yourself later"
213 (car (car pkglist)))) ;doing car car is negligence...
214 ))))))