Fix up comment convention on the arch-tag lines.
[bpt/emacs.git] / lisp / textmodes / refbib.el
CommitLineData
6594deb0
ER
1;;; refbib.el --- convert refer-style references to ones usable by Latex bib
2
f2e3589a 3;; Copyright (C) 1989, 2001, 2002, 2003, 2004, 2005,
12dc447f 4;; 2006, 2007, 2008 Free Software Foundation, Inc.
9750e079 5
56c586a8 6;; Author: Henry Kautz <kautz@research.att.com>
e3854e65 7;; Maintainer: FSF
56c586a8 8;; Keywords: bib, tex
e5167999 9
a2535589
JA
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software; you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
5a9dffec 14;; the Free Software Foundation; either version 3, or (at your option)
a2535589
JA
15;; any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
b578f267 23;; along with GNU Emacs; see the file COPYING. If not, write to the
4fc5845f
LK
24;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25;; Boston, MA 02110-1301, USA.
a2535589 26
e5167999
ER
27;;; Commentary:
28
a2535589
JA
29;; Use: from a buffer containing the refer-style bibliography,
30;; M-x r2b-convert-buffer
31;; Program will prompt for an output buffer name, and will log
32;; warnings during the conversion process in the buffer *Log*.
33
e5167999
ER
34;;; Change Log:
35
b578f267
EN
36;; HISTORY
37;; 9/88, created H.Kautz
38;; modified 1/19/89, allow books with editor but no author;
39;; added %O ordering field;
5181ff9f 40;; appended invalid multiple fields, instead of
b578f267
EN
41;; discarding;
42;; added rule, a tech report whose %R number
43;; contains "ISBN" is really a book
44;; added rule, anything with an editor is a book
45;; or a proceedings
46;; added 'manual type, for items with institution
47;; but no author or editor
48;; fixed bug so trailing blanks are trimmed
49;; added 'proceedings type
50;; used "organization" field for proceedings
51;; modified 2/16/89, updated help messages
52;; modified 2/23/89, include capitalize stop words in r2b stop words,
53;; fixed problems with contractions (e.g. it's),
54;; caught multiple stop words in a row
55;; modified 3/1/89, fixed capitalize-title for first words all caps
56;; modified 3/15/89, allow use of " to delimit fields
57;; modified 4/18/89, properly "quote" special characters on output
e5167999
ER
58
59;;; Code:
60
a2535589
JA
61;**********************************************************
62; User Parameters
63
d1ebc62e
SE
64(defgroup refbib nil
65 "Convert refer-style references to ones usable by Latex bib."
66 :prefix "r2b-"
67 :group 'wp)
68
69(defcustom r2b-trace-on nil
70 "*Non-nil means trace conversion."
71 :type 'boolean
72 :group 'refbib)
73
74(defcustom r2b-journal-abbrevs
db95369b 75 '(
d1ebc62e 76 )
db95369b 77 "Abbreviation list for journal names.
a2535589
JA
78If the car of an element matches a journal name exactly, it is replaced by
79the cadr when output. Braces must be included if replacement is a
80{string}, but not if replacement is a bibtex abbreviation. The cadr
db95369b 81may be eliminated if is exactly the same as the car.
a2535589 82 Because titles are capitalized before matching, the abbreviation
db95369b 83for the journal name should be listed as beginning with a capital
a2535589
JA
84letter, even if it really doesn't.
85 For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
a4e104bf 86\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
db95369b 87\"Artificial Intelligence\", but would replace Ijcai81 with the
d1ebc62e
SE
88BibTeX macro \"ijcai7\"."
89 :type '(repeat (list string string))
90 :group 'refbib)
91
db95369b
JB
92(defcustom r2b-booktitle-abbrevs
93 '(
d1ebc62e
SE
94 )
95 "Abbreviation list for book and proceedings names.
96If the car of an element matches a title or booktitle exactly, it is
97replaced by the cadr when output. Braces must be included if
98replacement is a {string}, but not if replacement is a bibtex
99abbreviation. The cadr may be eliminated if is exactly the same as
100the car.
a2535589
JA
101 Because titles are capitalized before matching, the abbreviated title
102should be listed as beginning with a capital letter, even if it doesn't.
103 For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
a4e104bf 104\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
db95369b 105\"Artificial Intelligence\", but would replace Ijcai81 with the
d1ebc62e
SE
106BibTeX macro \"ijcai7\"."
107 :type '(repeat (list string string))
108 :group 'refbib)
a2535589 109
d1ebc62e
SE
110(defcustom r2b-proceedings-list
111 '()
112 "Assoc list of books or journals which are really conference proceedings,
14c5b721
JB
113but whose name and whose abbrev expansion (as defined in `r2b-journal-abbrevs'
114and `r2b-booktitle-abbrevs') does not contain the words \"conference\" or
115\"proceedings\". (Those cases are handled automatically.)
a2535589 116The entry must match the given data exactly.
db95369b 117 Because titles are capitalized before matching, the items in this list
a2535589
JA
118should begin with a capital letter.
119 For example, suppose the title \"Ijcai81\" is used for the proceedings of
7635fc7c 120a conference, and its expansion is the BibTeX macro \"ijcai7\". Then
14c5b721 121`r2b-proceedings-list' should be '((\"Ijcai81\") ...). If instead its
a2535589 122expansion were \"Proceedings of the Seventh International Conference
14c5b721 123on Artificial Intelligence\", then you would NOT need to include Ijcai81
d1ebc62e
SE
124in `r2b-proceedings-list' (although it wouldn't cause an error)."
125 :type '(repeat (list string string))
126 :group 'refbib)
a2535589
JA
127
128(defvar r2b-additional-stop-words
d1ebc62e
SE
129 "Some\\|What"
130 "Words not to be used to build the citation key.
e9dac1e1 131This is in addition to the `r2b-capitalize-title-stop-words'.")
a2535589 132
d1ebc62e
SE
133(defcustom r2b-delimit-with-quote t
134 "*If true, then use \" to delimit fields, otherwise use braces."
135 :type 'boolean
136 :group 'refbib)
a2535589
JA
137
138;**********************************************************
139; Utility Functions
140
e9dac1e1 141(defvar r2b-capitalize-title-stop-words
a2535589
JA
142 (concat
143 "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
144 "by\\|with\\|that\\|its")
e9dac1e1 145 "Words not to be capitalized in a title (unless the first word).")
a2535589 146
e9dac1e1
RS
147(defvar r2b-capitalize-title-stop-regexp
148 (concat "\\(" r2b-capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
a2535589 149
e9dac1e1 150(defun r2b-capitalize-title-region (begin end)
14c5b721 151 "Like `capitalize-region', but don't capitalize stop words, except the first."
a2535589
JA
152 (interactive "r")
153 (let ((case-fold-search nil) (orig-syntax-table (syntax-table)))
154 (unwind-protect
155 (save-restriction
156 (set-syntax-table text-mode-syntax-table)
157 (narrow-to-region begin end)
158 (goto-char (point-min))
159 (if (looking-at "[A-Z][a-z]*[A-Z]")
160 (forward-word 1)
161 (capitalize-word 1))
162 (while (re-search-forward "\\<" nil t)
163 (if (looking-at "[A-Z][a-z]*[A-Z]")
164 (forward-word 1)
165 (if (let ((case-fold-search t))
e9dac1e1 166 (looking-at r2b-capitalize-title-stop-regexp))
a2535589
JA
167 (downcase-word 1)
168 (capitalize-word 1)))
169 ))
170 (set-syntax-table orig-syntax-table))))
171
172
e9dac1e1
RS
173(defun r2b-capitalize-title (s)
174 "Like `capitalize', but don't capitalize stop words, except the first."
a2535589
JA
175 (save-excursion
176 (set-buffer (get-buffer-create "$$$Scratch$$$"))
177 (erase-buffer)
178 (insert s)
e9dac1e1 179 (r2b-capitalize-title-region (point-min) (point-max))
a2535589
JA
180 (buffer-string)))
181
182;*********************************************************
183(defun r2b-reset ()
14c5b721 184 "Unbind defvars, for debugging."
a2535589
JA
185 (interactive)
186 (makunbound 'r2b-journal-abbrevs)
187 (makunbound 'r2b-booktitle-abbrevs)
188 (makunbound 'r2b-proceedings-list)
e9dac1e1
RS
189 (makunbound 'r2b-capitalize-title-stop-words)
190 (makunbound 'r2b-capitalize-title-stop-regexp)
a2535589 191 (makunbound 'r2b-additional-stop-words)
14c5b721 192 (makunbound 'r2b-stop-regexp))
a2535589
JA
193
194(defvar r2b-stop-regexp
db95369b 195 (concat "\\`\\(\\("
e9dac1e1 196 r2b-additional-stop-words "\\|" r2b-capitalize-title-stop-words
a2535589
JA
197 "\\)\\('\\w*\\)?\\W+\\)*\\([A-Z0-9]+\\)"))
198
199
200(defun r2b-trace (&rest args)
201 (if r2b-trace-on
202 (progn
203 (apply (function message) args)
14c5b721 204 (sit-for 0))))
a2535589
JA
205
206(defun r2b-match (exp)
14c5b721 207 "Returns string matched in current buffer."
a2535589
JA
208 (buffer-substring (match-beginning exp) (match-end exp)))
209
d1ebc62e
SE
210(defcustom r2b-out-buf-name "*Out*"
211 "*Name of buffer for output from refer-to-bibtex."
212 :type 'string
213 :group 'refbib)
214
215(defcustom r2b-log-name "*Log*"
216 "*Name of buffer for logs errors from refer-to-bibtex."
217 :type 'string
218 :group 'refbib)
219
a2535589
JA
220(defvar r2b-in-buf nil)
221(defvar r2b-out-buf nil)
222(defvar r2b-log nil)
223
224(defvar r2b-error-found nil)
225
0c86715d
DN
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)
177a0809 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
cbee283d 756;; arch-tag: 664afee2-6e76-4408-ba56-981d8a179586
6594deb0 757;;; refbib.el ends here