(tex-font-lock-append-prop, tex-font-lock-suscript, tex-insert-quote)
[bpt/emacs.git] / lisp / textmodes / refbib.el
CommitLineData
6594deb0
ER
1;;; refbib.el --- convert refer-style references to ones usable by Latex bib
2
3731a850 3;; Copyright (C) 1989, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
9750e079 4
56c586a8 5;; Author: Henry Kautz <kautz@research.att.com>
e3854e65 6;; Maintainer: FSF
56c586a8 7;; Keywords: bib, tex
e5167999 8
a2535589
JA
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
e5167999 13;; the Free Software Foundation; either version 2, or (at your option)
a2535589
JA
14;; any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
b578f267 22;; along with GNU Emacs; see the file COPYING. If not, write to the
4fc5845f
LK
23;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24;; Boston, MA 02110-1301, USA.
a2535589 25
e5167999
ER
26;;; Commentary:
27
a2535589
JA
28;; Use: from a buffer containing the refer-style bibliography,
29;; M-x r2b-convert-buffer
30;; Program will prompt for an output buffer name, and will log
31;; warnings during the conversion process in the buffer *Log*.
32
e5167999
ER
33;;; Change Log:
34
b578f267
EN
35;; HISTORY
36;; 9/88, created H.Kautz
37;; modified 1/19/89, allow books with editor but no author;
38;; added %O ordering field;
5181ff9f 39;; appended invalid multiple fields, instead of
b578f267
EN
40;; discarding;
41;; added rule, a tech report whose %R number
42;; contains "ISBN" is really a book
43;; added rule, anything with an editor is a book
44;; or a proceedings
45;; added 'manual type, for items with institution
46;; but no author or editor
47;; fixed bug so trailing blanks are trimmed
48;; added 'proceedings type
49;; used "organization" field for proceedings
50;; modified 2/16/89, updated help messages
51;; modified 2/23/89, include capitalize stop words in r2b stop words,
52;; fixed problems with contractions (e.g. it's),
53;; caught multiple stop words in a row
54;; modified 3/1/89, fixed capitalize-title for first words all caps
55;; modified 3/15/89, allow use of " to delimit fields
56;; modified 4/18/89, properly "quote" special characters on output
e5167999
ER
57
58;;; Code:
59
a2535589
JA
60;**********************************************************
61; User Parameters
62
d1ebc62e
SE
63(defgroup refbib nil
64 "Convert refer-style references to ones usable by Latex bib."
65 :prefix "r2b-"
66 :group 'wp)
67
68(defcustom r2b-trace-on nil
69 "*Non-nil means trace conversion."
70 :type 'boolean
71 :group 'refbib)
72
73(defcustom r2b-journal-abbrevs
db95369b 74 '(
d1ebc62e 75 )
db95369b 76 "Abbreviation list for journal names.
a2535589
JA
77If the car of an element matches a journal name exactly, it is replaced by
78the cadr when output. Braces must be included if replacement is a
79{string}, but not if replacement is a bibtex abbreviation. The cadr
db95369b 80may be eliminated if is exactly the same as the car.
a2535589 81 Because titles are capitalized before matching, the abbreviation
db95369b 82for the journal name should be listed as beginning with a capital
a2535589
JA
83letter, even if it really doesn't.
84 For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
a4e104bf 85\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
db95369b 86\"Artificial Intelligence\", but would replace Ijcai81 with the
d1ebc62e
SE
87BibTeX macro \"ijcai7\"."
88 :type '(repeat (list string string))
89 :group 'refbib)
90
db95369b
JB
91(defcustom r2b-booktitle-abbrevs
92 '(
d1ebc62e
SE
93 )
94 "Abbreviation list for book and proceedings names.
95If the car of an element matches a title or booktitle exactly, it is
96replaced by the cadr when output. Braces must be included if
97replacement is a {string}, but not if replacement is a bibtex
98abbreviation. The cadr may be eliminated if is exactly the same as
99the car.
a2535589
JA
100 Because titles are capitalized before matching, the abbreviated title
101should be listed as beginning with a capital letter, even if it doesn't.
102 For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
a4e104bf 103\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
db95369b 104\"Artificial Intelligence\", but would replace Ijcai81 with the
d1ebc62e
SE
105BibTeX macro \"ijcai7\"."
106 :type '(repeat (list string string))
107 :group 'refbib)
a2535589 108
d1ebc62e
SE
109(defcustom r2b-proceedings-list
110 '()
111 "Assoc list of books or journals which are really conference proceedings,
14c5b721
JB
112but whose name and whose abbrev expansion (as defined in `r2b-journal-abbrevs'
113and `r2b-booktitle-abbrevs') does not contain the words \"conference\" or
114\"proceedings\". (Those cases are handled automatically.)
a2535589 115The entry must match the given data exactly.
db95369b 116 Because titles are capitalized before matching, the items in this list
a2535589
JA
117should begin with a capital letter.
118 For example, suppose the title \"Ijcai81\" is used for the proceedings of
7635fc7c 119a conference, and its expansion is the BibTeX macro \"ijcai7\". Then
14c5b721 120`r2b-proceedings-list' should be '((\"Ijcai81\") ...). If instead its
a2535589 121expansion were \"Proceedings of the Seventh International Conference
14c5b721 122on Artificial Intelligence\", then you would NOT need to include Ijcai81
d1ebc62e
SE
123in `r2b-proceedings-list' (although it wouldn't cause an error)."
124 :type '(repeat (list string string))
125 :group 'refbib)
a2535589
JA
126
127(defvar r2b-additional-stop-words
d1ebc62e
SE
128 "Some\\|What"
129 "Words not to be used to build the citation key.
e9dac1e1 130This is in addition to the `r2b-capitalize-title-stop-words'.")
a2535589 131
d1ebc62e
SE
132(defcustom r2b-delimit-with-quote t
133 "*If true, then use \" to delimit fields, otherwise use braces."
134 :type 'boolean
135 :group 'refbib)
a2535589
JA
136
137;**********************************************************
138; Utility Functions
139
e9dac1e1 140(defvar r2b-capitalize-title-stop-words
a2535589
JA
141 (concat
142 "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
143 "by\\|with\\|that\\|its")
e9dac1e1 144 "Words not to be capitalized in a title (unless the first word).")
a2535589 145
e9dac1e1
RS
146(defvar r2b-capitalize-title-stop-regexp
147 (concat "\\(" r2b-capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
a2535589 148
e9dac1e1 149(defun r2b-capitalize-title-region (begin end)
14c5b721 150 "Like `capitalize-region', but don't capitalize stop words, except the first."
a2535589
JA
151 (interactive "r")
152 (let ((case-fold-search nil) (orig-syntax-table (syntax-table)))
153 (unwind-protect
154 (save-restriction
155 (set-syntax-table text-mode-syntax-table)
156 (narrow-to-region begin end)
157 (goto-char (point-min))
158 (if (looking-at "[A-Z][a-z]*[A-Z]")
159 (forward-word 1)
160 (capitalize-word 1))
161 (while (re-search-forward "\\<" nil t)
162 (if (looking-at "[A-Z][a-z]*[A-Z]")
163 (forward-word 1)
164 (if (let ((case-fold-search t))
e9dac1e1 165 (looking-at r2b-capitalize-title-stop-regexp))
a2535589
JA
166 (downcase-word 1)
167 (capitalize-word 1)))
168 ))
169 (set-syntax-table orig-syntax-table))))
170
171
e9dac1e1
RS
172(defun r2b-capitalize-title (s)
173 "Like `capitalize', but don't capitalize stop words, except the first."
a2535589
JA
174 (save-excursion
175 (set-buffer (get-buffer-create "$$$Scratch$$$"))
176 (erase-buffer)
177 (insert s)
e9dac1e1 178 (r2b-capitalize-title-region (point-min) (point-max))
a2535589
JA
179 (buffer-string)))
180
181;*********************************************************
182(defun r2b-reset ()
14c5b721 183 "Unbind defvars, for debugging."
a2535589
JA
184 (interactive)
185 (makunbound 'r2b-journal-abbrevs)
186 (makunbound 'r2b-booktitle-abbrevs)
187 (makunbound 'r2b-proceedings-list)
e9dac1e1
RS
188 (makunbound 'r2b-capitalize-title-stop-words)
189 (makunbound 'r2b-capitalize-title-stop-regexp)
a2535589 190 (makunbound 'r2b-additional-stop-words)
14c5b721 191 (makunbound 'r2b-stop-regexp))
a2535589
JA
192
193(defvar r2b-stop-regexp
db95369b 194 (concat "\\`\\(\\("
e9dac1e1 195 r2b-additional-stop-words "\\|" r2b-capitalize-title-stop-words
a2535589
JA
196 "\\)\\('\\w*\\)?\\W+\\)*\\([A-Z0-9]+\\)"))
197
198
199(defun r2b-trace (&rest args)
200 (if r2b-trace-on
201 (progn
202 (apply (function message) args)
14c5b721 203 (sit-for 0))))
a2535589
JA
204
205(defun r2b-match (exp)
14c5b721 206 "Returns string matched in current buffer."
a2535589
JA
207 (buffer-substring (match-beginning exp) (match-end exp)))
208
d1ebc62e
SE
209(defcustom r2b-out-buf-name "*Out*"
210 "*Name of buffer for output from refer-to-bibtex."
211 :type 'string
212 :group 'refbib)
213
214(defcustom r2b-log-name "*Log*"
215 "*Name of buffer for logs errors from refer-to-bibtex."
216 :type 'string
217 :group 'refbib)
218
a2535589
JA
219(defvar r2b-in-buf nil)
220(defvar r2b-out-buf nil)
221(defvar r2b-log nil)
222
223(defvar r2b-error-found nil)
224
177a0809
JB
225(eval-when-compile
226 (defvar r2b-variables) (defvar r2bv-address) (defvar r2bv-annote)
227 (defvar r2bv-author) (defvar r2bv-booktitle) (defvar r2bv-date)
228 (defvar r2bv-decade) (defvar r2bv-editor) (defvar r2bv-entry-kind)
229 (defvar r2bv-institution) (defvar r2bv-journal) (defvar r2bv-keywords)
230 (defvar r2bv-kn) (defvar r2bv-month) (defvar r2bv-note)
231 (defvar r2bv-number) (defvar r2bv-ordering) (defvar r2bv-organization)
232 (defvar r2bv-pages) (defvar r2bv-primary-author) (defvar r2bv-publisher)
233 (defvar r2bv-school) (defvar r2bv-title) (defvar r2bv-title-first-word)
234 (defvar r2bv-tr) (defvar r2bv-type) (defvar r2bv-volume)
235 (defvar r2bv-where) (defvar r2bv-year))
236
a2535589 237(setq r2b-variables '(
177a0809
JB
238 r2b-error-found
239 r2bv-author
240 r2bv-primary-author
241 r2bv-date
242 r2bv-year
243 r2bv-decade
244 r2bv-month
245 r2bv-title
246 r2bv-title-first-word
247 r2bv-editor
248 r2bv-annote
249 r2bv-tr
250 r2bv-address
251 r2bv-institution
252 r2bv-keywords
253 r2bv-booktitle
254 r2bv-journal
255 r2bv-volume
256 r2bv-number
257 r2bv-pages
258 r2bv-booktitle
259 r2bv-kn
260 r2bv-publisher
261 r2bv-organization
262 r2bv-school
263 r2bv-type
264 r2bv-where
265 r2bv-note
266 r2bv-ordering
267 ))
a2535589
JA
268
269(defun r2b-clear-variables ()
14c5b721 270 "Set all global vars used by r2b to nil."
a2535589
JA
271 (let ((vars r2b-variables))
272 (while vars
273 (set (car vars) nil)
14c5b721 274 (setq vars (cdr vars)))))
a2535589
JA
275
276(defun r2b-warning (&rest args)
277 (setq r2b-error-found t)
278 (princ (apply (function format) args) r2b-log)
279 (princ "\n" r2b-log)
280 (princ "\n" r2b-out-buf)
281 (princ "% " r2b-out-buf)
14c5b721 282 (princ (apply (function format) args) r2b-out-buf))
a2535589
JA
283
284(defun r2b-get-field (var field &optional unique required capitalize)
285 "Set VAR to string value of FIELD, if any. If none, VAR is set to
286nil. If multiple fields appear, then separate values with the
287'\\nand\\t\\t', unless UNIQUE is non-nil, in which case log a warning
288and just concatenate the values. Trim off leading blanks and tabs on
289first line, and trailing blanks and tabs of every line. Log a warning
290and set VAR to the empty string if REQUIRED is true. Capitalize as a
291title if CAPITALIZE is true. Returns value of VAR."
292 (let (item val (not-past-end t))
293 (r2b-trace "snarfing %s" field)
294 (goto-char (point-min))
295 (while (and not-past-end
db95369b 296 (re-search-forward
a2535589
JA
297 (concat "^" field "\\b[ \t]*\\(.*[^ \t\n]\\)[ \t]*") nil t))
298 (setq item (r2b-match 1))
299 (while (and (setq not-past-end (zerop (forward-line 1)))
300 (not (looking-at "[ \t]*$\\|%")))
301 (looking-at "\\(.*[^ \t\n]\\)[ \t]*$")
302 (setq item (concat item "\n" (r2b-match 1)))
303 )
304 (if (null val)
305 (setq val item)
306 (if unique
307 (progn
5181ff9f 308 (r2b-warning "*Invalid multiple field %s %s" field item)
a2535589
JA
309 (setq val (concat val "\n" item))
310 )
311 (setq val (concat val "\n\t\tand " item))
312 )
313 )
314 )
315 (if (and val capitalize)
e9dac1e1 316 (setq val (r2b-capitalize-title val)))
a2535589
JA
317 (set var val)
318 (if (and (null val) required)
319 (r2b-require var))
320 ))
321
322(defun r2b-set-match (var n regexp string )
14c5b721 323 "Set VAR to the Nth subpattern in REGEXP matched by STRING, or nil if none."
a2535589
JA
324 (set var
325 (if (and (stringp string) (string-match regexp string))
326 (substring string (match-beginning n) (match-end n))
327 nil)
328 )
329 )
330
331(defvar r2b-month-abbrevs
332 '(("jan") ("feb") ("mar") ("apr") ("may") ("jun") ("jul") ("aug")
333 ("sep") ("oct") ("nov") ("dec")))
334
335(defun r2b-convert-month ()
14c5b721 336 "Try to convert `r2bv-month' to a standard 3 letter name."
a2535589
JA
337 (if r2bv-month
338 (let ((months r2b-month-abbrevs))
339 (if (string-match "[^0-9]" r2bv-month)
340 (progn
db95369b 341 (while (and months (not (string-match (car (car months))
a2535589
JA
342 r2bv-month)))
343 (setq months (cdr months)))
344 (if months
345 (setq r2bv-month (car (car months)))))
346 (progn
347 (setq months (car (read-from-string r2bv-month)))
348 (if (and (numberp months)
349 (> months 0)
350 (< months 13))
351 (setq r2bv-month (car (nth months r2b-month-abbrevs)))
352 (progn
353 (r2b-warning "* Ridiculous month")
354 (setq r2bv-month nil))
355 ))
356 ))
357 )
358 )
359
360(defun r2b-snarf-input ()
14c5b721 361 "Parse buffer into global variables."
a2535589
JA
362 (let ((case-fold-search t))
363 (r2b-trace "snarfing...")
364 (sit-for 0)
365 (set-buffer r2b-in-buf)
366 (goto-char (point-min))
367 (princ " " r2b-log)
368 (princ (buffer-substring (point) (progn (end-of-line) (point))) r2b-log)
369 (terpri r2b-log)
370
371 (r2b-get-field 'r2bv-author "%A")
372 (r2b-get-field 'r2bv-editor "%E")
373 (cond
374 (r2bv-author
375 (r2b-set-match 'r2bv-primary-author 1
376 "\\b\\(\\w+\\)[ \t]*\\($\\|,\\)" r2bv-author)
377 )
378 (r2bv-editor
379 (r2b-set-match 'r2bv-primary-author 1
380 "\\b\\(\\w+\\)[ \t]*\\($\\|,\\)" r2bv-editor)
381 )
382 (t
383 (setq r2bv-primary-author "")
384 )
385 )
386
387 (r2b-get-field 'r2bv-date "%D" t t)
388 (r2b-set-match 'r2bv-year 0 "[12][0-9][0-9][0-9]" r2bv-date)
389 (and (null r2bv-year)
390 (r2b-set-match 'r2bv-year 1 "[^0-9]\\([0-9][0-9]\\)$" r2bv-date)
391 (setq r2bv-year (concat "19" r2bv-year)))
392 (r2b-set-match 'r2bv-decade 1 "..\\(..\\)" r2bv-year)
393 (r2b-set-match 'r2bv-month 0
394 "[0-9]+/\\|[a-zA-Z]+" r2bv-date)
395 (if (and (stringp r2bv-month) (string-match "\\(.*\\)/$" r2bv-month))
396 (setq r2bv-month (substring r2bv-month 0 (match-end 1))))
397 (r2b-convert-month)
398
399 (r2b-get-field 'r2bv-title "%T" t t t)
400 (r2b-set-match 'r2bv-title-first-word 4
401 r2b-stop-regexp
402 r2bv-title)
db95369b 403
a2535589
JA
404 (r2b-get-field 'r2bv-annote "%X" t )
405 (r2b-get-field 'r2bv-tr "%R" t)
406 (r2b-get-field 'r2bv-address "%C" t)
407 (r2b-get-field 'r2bv-institution "%I" t)
408 (r2b-get-field 'r2bv-keywords "%K")
409 (r2b-get-field 'r2bv-booktitle "%B" t nil t)
410 (r2b-get-field 'r2bv-journal "%J" t nil t)
411 (r2b-get-field 'r2bv-volume "%V" t)
412 (r2b-get-field 'r2bv-number "%N" t)
413 (r2b-get-field 'r2bv-pages "%P" t)
414 (r2b-get-field 'r2bv-where "%W" t)
415 (r2b-get-field 'r2bv-ordering "%O" t)
416 )
417 )
418
419
420(defun r2b-put-field (field data &optional abbrevs)
14c5b721 421 "Print bibtex FIELD = {DATA} if DATA not null; precede
a2535589 422with a comma and newline; if ABBREVS list is given, then
14c5b721 423try to replace the {DATA} with an abbreviation."
a2535589
JA
424 (if data
425 (let (match nodelim multi-line index)
426 (cond
427 ((and abbrevs (setq match (assoc data abbrevs)))
428 (if (null (cdr match))
429 (setq data (car match))
430 (setq data (car (cdr match))))
431 (setq nodelim t))
432 ((and (not (equal data ""))
433 (not (string-match "[^0-9]" data)))
434 (setq nodelim t))
435 (t
436 (setq index 0)
437 (while (string-match "[\\~^]" data index)
438 (setq data (concat (substring data 0 (match-beginning 0))
439 "\\verb+"
440 (substring data (match-beginning 0) (match-end 0))
441 "+"
442 (substring data (match-end 0))))
443 (setq index (+ (match-end 0) 7)))
444 (setq index 0)
445 (while (string-match "[$&%#_{}]" data index)
446 (setq data (concat (substring data 0 (match-beginning 0))
447 "\\"
448 (substring data (match-beginning 0))))
449 (setq index (+ (match-end 0) 1)))
450 (setq index 0)
451 (if r2b-delimit-with-quote
452 (while (string-match "\"" data index)
453 (setq data (concat (substring data 0 (match-beginning 0))
454 "{\"}"
455 (substring data (match-end 0))))
456 (setq index (+ (match-end 0) 2))))
457 ))
458 (princ ", \n ")
459 (princ field)
460 (princ " =\t")
db95369b 461 (if (not nodelim)
a2535589
JA
462 (if r2b-delimit-with-quote
463 (princ "\"")
464 (princ "{")))
465 (string-match ".*" data)
466 (if (> (match-end 0) 59)
467 (princ "\n"))
468 (princ data)
db95369b 469 (if (not nodelim)
a2535589
JA
470 (if r2b-delimit-with-quote
471 (princ "\"")
472 (princ "}")))
473 )
474 ))
475
476
477(defun r2b-require (vars)
14c5b721 478 "If any of VARS is null, set to empty string and log error."
db95369b 479 (cond
a2535589
JA
480 ((null vars))
481 ((listp vars) (r2b-require (car vars)) (r2b-require (cdr vars)))
482 (t
483 (if (null (symbol-value vars))
484 (progn
485 (r2b-warning "*Missing value for field %s" vars)
486 (set vars "")
487 )))
488 )
489 )
490
491
492(defmacro r2b-moveq (new old)
14c5b721 493 "Set NEW to OLD and set OLD to nil."
a2535589
JA
494 (list 'progn (list 'setq new old) (list 'setq old 'nil)))
495
496(defun r2b-isa-proceedings (name)
14c5b721 497 "Return t if NAME is the name of proceedings."
a2535589
JA
498 (and
499 name
500 (or
501 (string-match "proceedings\\|conference" name)
502 (assoc name r2b-proceedings-list)
503 (let ((match (assoc name r2b-booktitle-abbrevs)))
504 (and match
505 (string-match "proceedings\\|conference" (car (cdr match)))))
506 )))
507
508(defun r2b-isa-university (name)
14c5b721
JB
509 "Return t if NAME is a university or similar organization,
510but not a publisher."
db95369b 511 (and
a2535589
JA
512 name
513 (string-match "university" name)
514 (not (string-match "press" name))
515
516 ))
517
518(defun r2b-barf-output ()
14c5b721 519 "Generate bibtex based on global variables."
a2535589
JA
520 (let ((standard-output r2b-out-buf) (case-fold-search t) match)
521
522 (r2b-trace "...barfing")
523 (sit-for 0)
524 (set-buffer r2b-out-buf)
525
526 (setq r2bv-kn (concat r2bv-primary-author r2bv-decade
527 r2bv-title-first-word))
db95369b 528
a2535589 529 (setq r2bv-entry-kind
db95369b 530 (cond
a2535589
JA
531 ((r2b-isa-proceedings r2bv-journal)
532 (r2b-moveq r2bv-booktitle r2bv-journal)
533 (if (r2b-isa-university r2bv-institution)
534 (r2b-moveq r2bv-organization r2bv-institution)
535 (r2b-moveq r2bv-publisher r2bv-institution))
536 (r2b-moveq r2bv-note r2bv-tr)
537 (r2b-require 'r2bv-author)
538 'inproceedings)
539 ((r2b-isa-proceedings r2bv-booktitle)
540 (if (r2b-isa-university r2bv-institution)
541 (r2b-moveq r2bv-organization r2bv-institution)
542 (r2b-moveq r2bv-publisher r2bv-institution))
543 (r2b-moveq r2bv-note r2bv-tr)
544 (r2b-require 'r2bv-author)
545 'inproceedings)
546 ((and r2bv-tr (string-match "phd" r2bv-tr))
547 (r2b-moveq r2bv-school r2bv-institution)
548 (r2b-require 'r2bv-school )
549 (r2b-require 'r2bv-author)
550 'phdthesis)
551 ((and r2bv-tr (string-match "master" r2bv-tr))
552 (r2b-moveq r2bv-school r2bv-institution)
553 (r2b-require 'r2bv-school )
554 (r2b-require 'r2bv-author)
555 'mastersthesis)
556 ((and r2bv-tr (string-match "draft\\|unpublish" r2bv-tr))
557 (r2b-moveq r2bv-note r2bv-institution)
558 (r2b-require 'r2bv-author)
559 'unpublished)
560 (r2bv-journal
561 (r2b-require 'r2bv-author)
562 'article)
563 (r2bv-booktitle
564 (r2b-moveq r2bv-publisher r2bv-institution)
565 (r2b-moveq r2bv-note r2bv-tr)
566 (r2b-require 'r2bv-publisher)
567 (r2b-require 'r2bv-author)
568 'incollection)
569 ((and r2bv-author
570 (null r2bv-editor)
571 (string-match "\\`personal communication\\'" r2bv-title))
572 'misc)
573 ((r2b-isa-proceedings r2bv-title)
574 (if (r2b-isa-university r2bv-institution)
575 (r2b-moveq r2bv-organization r2bv-institution)
576 (r2b-moveq r2bv-publisher r2bv-institution))
577 (r2b-moveq r2bv-note r2bv-tr)
578 'proceedings)
579 ((or r2bv-editor
580 (and r2bv-author
db95369b 581 (or
a2535589
JA
582 (null r2bv-tr)
583 (string-match "\\bisbn\\b" r2bv-tr))))
584 (r2b-moveq r2bv-publisher r2bv-institution)
585 (r2b-moveq r2bv-note r2bv-tr)
586 (r2b-require 'r2bv-publisher)
587 (if (null r2bv-editor)
588 (r2b-require 'r2bv-author))
589 'book)
590 (r2bv-tr
591 (r2b-require 'r2bv-institution)
db95369b
JB
592 (if (string-match
593 "\\`\\(\\(.\\|\n\\)+\\)[ \t\n]+\\([^ \t\n]\\)+\\'"
a2535589
JA
594 r2bv-tr)
595 (progn
596 (setq r2bv-type (substring r2bv-tr 0 (match-end 1)))
db95369b 597 (setq r2bv-number (substring r2bv-tr
a2535589
JA
598 (match-beginning 3)))
599 (setq r2bv-tr nil))
600 (r2b-moveq r2bv-number r2bv-tr))
601 (r2b-require 'r2bv-author)
602 'techreport)
603 (r2bv-institution
604 (r2b-moveq r2bv-organization r2bv-institution)
605 'manual)
606 (t
607 'misc)
608 ))
609
610 (r2b-require '( r2bv-year))
611
612 (if r2b-error-found
613 (princ "\n% Warning -- Errors During Conversion Next Entry\n"))
614
615 (princ "\n@")
616 (princ r2bv-entry-kind)
617 (princ "( ")
618 (princ r2bv-kn)
619
620 (r2b-put-field "author" r2bv-author )
621 (r2b-put-field "title" r2bv-title r2b-booktitle-abbrevs)
622 (r2b-put-field "year" r2bv-year )
623
624 (r2b-put-field "month" r2bv-month r2b-month-abbrevs)
625 (r2b-put-field "journal" r2bv-journal r2b-journal-abbrevs)
626 (r2b-put-field "volume" r2bv-volume)
627 (r2b-put-field "type" r2bv-type)
628 (r2b-put-field "number" r2bv-number)
629 (r2b-put-field "booktitle" r2bv-booktitle r2b-booktitle-abbrevs)
630 (r2b-put-field "editor" r2bv-editor)
631 (r2b-put-field "publisher" r2bv-publisher)
632 (r2b-put-field "institution" r2bv-institution)
633 (r2b-put-field "organization" r2bv-organization)
634 (r2b-put-field "school" r2bv-school)
635 (r2b-put-field "pages" r2bv-pages)
636 (r2b-put-field "address" r2bv-address)
637 (r2b-put-field "note" r2bv-note)
638 (r2b-put-field "keywords" r2bv-keywords)
639 (r2b-put-field "where" r2bv-where)
640 (r2b-put-field "ordering" r2bv-ordering)
641 (r2b-put-field "annote" r2bv-annote)
642
643 (princ " )\n")
644 )
645 )
646
647
177a0809
JB
648(defun r2b-convert-record (output)
649 "Transform current bib entry and append to buffer OUTPUT.
650Do `\\[r2b-help]' for more info."
db95369b 651 (interactive
a2535589
JA
652 (list (read-string "Output to buffer: " r2b-out-buf-name)))
653 (let (rec-end rec-begin not-done)
177a0809
JB
654 (setq r2b-out-buf-name output)
655 (setq r2b-out-buf (get-buffer-create output))
a2535589
JA
656 (setq r2b-in-buf (current-buffer))
657 (set-buffer r2b-out-buf)
658 (goto-char (point-max))
659 (setq r2b-log (get-buffer-create r2b-log-name))
660 (set-buffer r2b-log)
661 (goto-char (point-max))
662 (set-buffer r2b-in-buf)
663 (setq not-done (re-search-forward "[^ \t\n]" nil t))
664 (if not-done
665 (progn
666 (re-search-backward "^[ \t]*$" nil 2)
667 (re-search-forward "^%")
668 (beginning-of-line nil)
669 (setq rec-begin (point))
670 (re-search-forward "^[ \t]*$" nil 2)
671 (setq rec-end (point))
672 (narrow-to-region rec-begin rec-end)
673 (r2b-clear-variables)
674 (r2b-snarf-input)
675 (r2b-barf-output)
676 (set-buffer r2b-in-buf)
677 (widen)
678 (goto-char rec-end)
679 t)
680 nil
681 )
682 ))
db95369b
JB
683
684
177a0809 685(defun r2b-convert-buffer (output)
1fc4747e 686 "Transform current buffer and append to buffer OUTPUT.
177a0809 687Do `\\[r2b-help]' for more info."
db95369b 688 (interactive
a2535589
JA
689 (list (read-string "Output to buffer: " r2b-out-buf-name)))
690 (save-excursion
691 (setq r2b-log (get-buffer-create r2b-log-name))
692 (set-buffer r2b-log)
693 (erase-buffer))
694 (widen)
695 (goto-char (point-min))
696 (message "Working, please be patient...")
697 (sit-for 0)
177a0809 698 (while (r2b-convert-record output) t)
db95369b 699 (message "Done, results in %s, errors in %s"
a2535589
JA
700 r2b-out-buf-name r2b-log-name)
701 )
702
a2535589
JA
703(defvar r2b-help-message
704" Refer to Bibtex Bibliography Conversion
705
706A refer-style database is of the form:
707
708%A Joe Blow
709%T Great Thoughts I've Thought
710%D 1977
711etc.
712
713This utility converts these kind of databases to bibtex form, for
714users of TeX and LaTex. Instructions:
7151. Visit the file containing the refer-style database.
7162. The command
717 M-x r2b-convert-buffer
7635fc7c 718 converts the entire buffer, appending its output by default in a
a2535589
JA
719 buffer named *Out*, and logging progress and errors in a buffer
720 named *Log*. The original file is never modified.
721 Note that results are appended to *Out*, so if that buffer
722 buffer already exists and contains material you don't want to
723 save, you should kill it first.
7243. Switch to the buffer *Out* and save it as a named file.
7254. To convert a single refer-style entry, simply position the cursor
726 at the entry and enter
727 M-x r2b-convert-record
728 Again output is appended to *Out* and errors are logged in *Log*.
729
730This utility is very robust and pretty smart about determining the
731type of the entry. It includes facilities for expanding refer macros
732to text, or substituting bibtex macros. Do M-x describe-variable on
733 r2b-journal-abbrevs
734 r2b-booktitle-abbrevs
735 r2b-proceedings-list
736for information on these features.
737
56c586a8
ER
738Please send bug reports and suggestions to
739 Henry Kautz
740 kautz@research.att.com
741 allegra!kautz")
a2535589
JA
742
743
744(defun r2b-help ()
1fc4747e 745 "Print help describing the `refbib' package."
a2535589
JA
746 (interactive)
747 (with-output-to-temp-buffer "*Help*"
6d94c1b4
KH
748 (princ r2b-help-message)
749 (save-excursion
750 (set-buffer standard-output)
751 (help-mode))))
a2535589 752
1fc4747e 753(provide 'refbib)
49116ac0 754(provide 'refer-to-bibtex)
6594deb0 755
ab5796a9 756;;; arch-tag: 664afee2-6e76-4408-ba56-981d8a179586
6594deb0 757;;; refbib.el ends here