yatex

view yatexpkg.el @ 564:71697ec66240

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