yatex

view yatexpkg.el @ 449:c2c547e147c7

YaTeX-math-other-env-alist-* for additional math-environments
author HIROSE Yuuji <yuuji@gentei.org>
date Tue, 17 Jan 2017 22:38:37 +0900
parents 7a9d30752353
children 7bf780961390
line source
1 ;;; yatexpkg.el --- YaTeX package manager -*- coding: sjis -*-
2 ;;;
3 ;;; (c)2003-2017 by HIROSE, Yuuji [yuuji@yatex.org]
4 ;;; Last modified Tue Jan 17 17:42:47 2017 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 ("verbatim" (section "verbatiminput"))
31 ("eclbkbox" (env "breakbox"))
32 ("supertabular" (env "supertabular"))
33 ("amsmath" (env . YaTeX-package-ams-envs)
34 (section "tag" "tag*"))
35 ("amssymb" (maketitle "leqq" "geqq" "mathbb" "mathfrak"
36 "fallingdotseq" "therefore" "because"
37 "lll" "ggg")) ;very few. Please tell us!
38 ("graphicx" (section "includegraphics"
39 "rotatebox" "scalebox" "resizebox" "reflectbox")
40 (option . YaTeX-package-graphics-driver-alist))
41 ("color" (section "textcolor" "colorbox" "pagecolor" "color")
42 (option . YaTeX-package-graphics-driver-alist)
43 (default-option . "usenames,dvipsnames"))
44 ("xcolor" (same-as . "color"))
45 ("ulem" (section "uline" "uuline" "uwave")
46 (option ("normalem")))
47 ("multicol" (env "multicols"))
48 ("cref" (section "cleveref"))
49 ("crefrange" (same-as . "cref"))
50 ("cpageref" (same-as . "cref"))
51 ("labelcref" (same-as . "cref"))
52 ("labelcpageref" (same-as . "cref"))
53 ("wrapfig" (env "wrapfigure" "wraptable"))
54 ("setspace" (env "spacing") (section "setstretch"))
55 ("cases" (env "numcases" "subnumcases"))
56 )
57 "Default package vs. macro list.
58 Alists contains '(PACKAGENAME . MACROLIST)
59 PACKAGENAME Basename of package(String).
60 MACROLIST List of '(TYPE . MACROS)
61 TYPE One of 'env, 'section or 'maketitle according to completion-type
62 MACROS List of macros
64 If TYPE is 'option, its cdr is alist of completion candidates for that
65 package. Its cdr can be a symbol whose value is alist.
67 An good example is the value of YaTeX-package-alist-default.")
69 (defvar YaTeX-package-graphics-driver-alist
70 '(("dvips") ("dvipsnames") ("usenames")
71 ("xdvi") ("dvipdfmx") ("pdftex") ("dvipsone") ("dviwindo")
72 ("emtex") ("dviwin") ("oztex") ("textures") ("pctexps") ("pctexwin")
73 ("pctexhp") ("pctex32") ("truetex") ("tcidvi") ("vtex"))
74 "Drivers alist of graphics/color stylefile's supporting deveces.
75 This list is taken from
76 %% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
77 %% Copyright (C) 1995 1996 1997 1998 David Carlisle
78 as of 2004/1/19. Thanks.")
80 (defvar YaTeX-package-alist-private nil
81 "*User defined package vs. macro list. See also YaTeX-package-alist-default")
83 (defun YaTeX-package-lookup (macro &optional type)
84 "Look up a package which contains a definition of MACRO.
85 Optional second argument TYPE limits the macro type.
86 TYPE is a symbol, one of 'env, 'section, 'maketitle."
87 (let ((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
88 origlist element x sameas val pkg pkglist r)
89 (setq origlist list)
90 (while list
91 (setq element (car list)
92 pkg (car element)
93 element (cdr element))
94 (if (setq sameas (assq 'same-as element)) ;non-recursive retrieval
95 (setq element (cdr (assoc (cdr sameas) origlist))))
96 (if (setq r (catch 'found
97 (while element
98 (setq x (car element)
99 val (cdr x))
100 (if (symbolp val) (setq val (symbol-value val)))
101 (and (or (null type)
102 (eq type (car x)))
103 (YaTeX-member macro val)
104 (throw 'found (car x))) ;car x is type
105 (setq element (cdr element)))))
106 (setq pkglist (cons (cons pkg r) pkglist)))
107 (setq list (cdr list)))
108 pkglist))
110 (defun YaTeX-package-option-lookup (pkg &optional key)
111 "Look up options for specified pkg and returne them in alist form.
112 Just only associng against the alist of YaTeX-package-alist-*"
113 (let*((list (append YaTeX-package-alist-private YaTeX-package-alist-default))
114 (l (cdr (assq (or key 'option) (assoc pkg list))))
115 (recur (cdr (assq 'same-as (assoc pkg list)))))
116 (cond
117 (recur (YaTeX-package-option-lookup recur key))
118 ((symbolp l) (symbol-value l))
119 (t l))))
121 (defvar YaTeX-package-resolved-list nil
122 "List of macros whose package is confirmed to be loaded.")
124 (defun YaTeX-package-auto-usepackage (macro type &optional autopkg autoopt)
125 "(Semi)Automatically add the \\usepackage line to main-file.
126 Search the usepackage for MACRO of the TYPE.
127 Optional second and third argument AUTOPKG, AUTOOPT are selected
128 without query. Thus those two argument (Full)automatically add
129 a \\usepackage line."
130 (let ((cb (current-buffer))
131 (wc (current-window-configuration))
132 (usepackage (concat YaTeX-ec "usepackage"))
133 (pkglist (YaTeX-package-lookup macro type))
134 (usepkgrx (concat
135 YaTeX-ec-regexp
136 "\\(usepackage\\|include\\)\\b"))
137 (register (function
138 (lambda () (set-buffer cb)
139 (set (make-local-variable 'YaTeX-package-resolved-list)
140 (cons macro YaTeX-package-resolved-list)))))
141 (begdoc (concat YaTeX-ec "begin{document}"))
142 pb pkg optlist (option "") mb0 uspkgargs)
143 (if (or (YaTeX-member macro YaTeX-package-resolved-list)
144 (null pkglist))
145 nil ;nothing to do
146 ;; Search `usepackage' into main-file
147 (YaTeX-visit-main t) ;set buffer to parent file
148 (setq pb (current-buffer))
149 (save-excursion
150 (save-restriction
151 (if (catch 'found
152 (goto-char (point-min))
153 (YaTeX-search-active-forward ;if search fails, goto eob
154 begdoc YaTeX-comment-prefix nil 1)
155 (while ;(YaTeX-re-search-active-backward
156 ;usepkgrx YaTeX-comment-prefix nil t)
157 ;;allow commented out \usepackages 2004/3/16
158 (re-search-backward usepkgrx nil t)
159 (setq mb0 (match-beginning 0))
160 (skip-chars-forward "^{")
161 (setq uspkgargs (YaTeX-buffer-substring
162 (point)
163 (progn
164 ;;(forward-list 1) is more precise,
165 ;; but higher risk.
166 (skip-chars-forward "^}\n")(point))))
167 (let ((pl pkglist))
168 (while pl ;(car pl)'s car is package, cdr is type
169 (if (string-match
170 (concat "[{,]\\s *"
171 (regexp-quote (car (car pl)))
172 "\\>")
173 uspkgargs)
174 (throw 'found t))
175 (setq pl (cdr pl)))
176 (goto-char mb0))))
177 ;;corresponding \usepackage found
178 (funcall register)
179 ;; not found, insert it.
180 (if (or
181 autopkg
182 (y-or-n-p
183 (format "`%s' requires package. Put \\usepackage now?"
184 macro)))
185 (progn
186 (require 'yatexadd)
187 (setq pkg
188 (or autopkg
189 (completing-read
190 "Load which package?(TAB for list): "
191 pkglist nil nil
192 ;;initial input
193 (if (= (length pkglist) 1)
194 (let ((w (car (car pkglist))))
195 (if YaTeX-emacs-19 (cons w 0) w)))))
196 optlist
197 (YaTeX-package-option-lookup pkg))
198 (if optlist
199 (let ((minibuffer-completion-table optlist)
200 (delim ",") (w (car (car optlist)))
201 (dflt (YaTeX-package-option-lookup
202 pkg 'default-option)))
203 (setq option
204 (or
205 autoopt
206 (read-from-minibuffer
207 (format "Any option for {%s}?: " pkg)
208 (let ((v (or dflt
209 (and (= (length optlist) 1) w))))
210 (and v (if YaTeX-emacs-19 (cons v 0) v)))
211 YaTeX-minibuffer-completion-map))
212 option (if (string< "" option)
213 (concat "[" option "]")
214 ""))))
215 (set-buffer pb)
216 (goto-char (point-min))
217 (if (YaTeX-re-search-active-forward
218 (concat YaTeX-ec-regexp
219 "document\\(style\\|class\\){")
220 YaTeX-comment-prefix nil t)
221 (forward-line 1))
222 (if (YaTeX-search-active-forward
223 begdoc YaTeX-comment-prefix nil t)
224 (goto-char (match-beginning 0)))
225 (insert
226 usepackage
227 (format "%s{%s}\t%% required for `\\%s' (yatex added)\n"
228 option pkg macro))
229 (funcall register))
230 (funcall register)
231 (message "Don't forget to put \\usepackage{%s} yourself later"
232 (car (car pkglist)))) ;doing car car is negligence...
233 ))))))