yatex

view yatexpkg.el @ 510:7a64b7761d6b

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