;;; refbib.el --- convert refer-style references to ones usable by Latex bib
-;; Maintainer: FSF
-;; Last-Modified: 16 Mar 1992
-;; Keywords: bib
-
;; Copyright (C) 1989 Free Software Foundation, Inc.
+;; Author: Henry Kautz <kautz@research.att.com>
+;; Keywords: bib, tex
+
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
;;; Commentary:
;;; Change Log:
-; HISTORY
-; 9/88, created
-; modified 1/19/89, allow books with editor but no author;
-; added %O ordering field;
-; appended illegal multiple fields, instead of
-; discarding;
-; added rule, a tech report whose %R number
-; contains "ISBN" is really a book
-; added rule, anything with an editor is a book
-; or a proceedings
-; added 'manual type, for items with institution
-; but no author or editor
-; fixed bug so trailing blanks are trimmed
-; added 'proceedings type
-; used "organization" field for proceedings
-; modified 2/16/89, updated help messages
-; modified 2/23/89, include capitalize stop words in r2b stop words,
-; fixed problems with contractions (e.g. it's),
-; caught multiple stop words in a row
-; modified 3/1/89, fixed capitialize-title for first words all caps
-; modified 3/15/89, allow use of " to delimit fields
-; modified 4/18/89, properly "quote" special characters on output
+;; HISTORY
+;; 9/88, created H.Kautz
+;; modified 1/19/89, allow books with editor but no author;
+;; added %O ordering field;
+;; appended illegal multiple fields, instead of
+;; discarding;
+;; added rule, a tech report whose %R number
+;; contains "ISBN" is really a book
+;; added rule, anything with an editor is a book
+;; or a proceedings
+;; added 'manual type, for items with institution
+;; but no author or editor
+;; fixed bug so trailing blanks are trimmed
+;; added 'proceedings type
+;; used "organization" field for proceedings
+;; modified 2/16/89, updated help messages
+;; modified 2/23/89, include capitalize stop words in r2b stop words,
+;; fixed problems with contractions (e.g. it's),
+;; caught multiple stop words in a row
+;; modified 3/1/89, fixed capitalize-title for first words all caps
+;; modified 3/15/89, allow use of " to delimit fields
+;; modified 4/18/89, properly "quote" special characters on output
;;; Code:
;**********************************************************
; User Parameters
-(defvar r2b-trace-on nil "*trace conversion")
+(defgroup refbib nil
+ "Convert refer-style references to ones usable by Latex bib."
+ :prefix "r2b-"
+ :group 'wp)
-(defvar r2b-journal-abbrevs
- '(
- )
- " Abbreviation list for journal names.
+(defcustom r2b-trace-on nil
+ "*Non-nil means trace conversion."
+ :type 'boolean
+ :group 'refbib)
+
+(defcustom r2b-journal-abbrevs
+ '(
+ )
+ "Abbreviation list for journal names.
If the car of an element matches a journal name exactly, it is replaced by
the cadr when output. Braces must be included if replacement is a
{string}, but not if replacement is a bibtex abbreviation. The cadr
-may be eliminated if is exactly the same as the car.
+may be eliminated if is exactly the same as the car.
Because titles are capitalized before matching, the abbreviation
-for the journal name should be listed as beginning with a capital
+for the journal name should be listed as beginning with a capital
letter, even if it really doesn't.
For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
-(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
-\"Artificial Intelligence\", but would replace Ijcai81 with the
-BibTeX macro \"ijcai7\".")
-
-(defvar r2b-booktitle-abbrevs
- '(
- )
- " Abbreviation list for book and proceedings names. If the car of
-an element matches a title or booktitle exactly, it is replaced by
-the cadr when output. Braces must be included if replacement is
-a {string}, but not if replacement is a bibtex abbreviation. The cadr
-may be eliminated if is exactly the same as the car.
+\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
+\"Artificial Intelligence\", but would replace Ijcai81 with the
+BibTeX macro \"ijcai7\"."
+ :type '(repeat (list string string))
+ :group 'refbib)
+
+(defcustom r2b-booktitle-abbrevs
+ '(
+ )
+ "Abbreviation list for book and proceedings names.
+If the car of an element matches a title or booktitle exactly, it is
+replaced by the cadr when output. Braces must be included if
+replacement is a {string}, but not if replacement is a bibtex
+abbreviation. The cadr may be eliminated if is exactly the same as
+the car.
Because titles are capitalized before matching, the abbreviated title
should be listed as beginning with a capital letter, even if it doesn't.
For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
-(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
-\"Artificial Intelligence\", but would replace Ijcai81 with the
-BibTeX macro \"ijcai7\".")
-
-(defvar r2b-proceedings-list
- '()
- " Assoc list of books or journals which are really conference proceedings,
+\(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
+\"Artificial Intelligence\", but would replace Ijcai81 with the
+BibTeX macro \"ijcai7\"."
+ :type '(repeat (list string string))
+ :group 'refbib)
+
+(defcustom r2b-proceedings-list
+ '()
+ "Assoc list of books or journals which are really conference proceedings,
but whose name and whose abbrev expansion (as defined in `r2b-journal-abbrevs'
and `r2b-booktitle-abbrevs') does not contain the words \"conference\" or
\"proceedings\". (Those cases are handled automatically.)
The entry must match the given data exactly.
- Because titles are capitalized before matching, the items in this list
+ Because titles are capitalized before matching, the items in this list
should begin with a capital letter.
For example, suppose the title \"Ijcai81\" is used for the proceedings of
-a conference, and it's expansion is the BibTeX macro \"ijcai7\". Then
+a conference, and its expansion is the BibTeX macro \"ijcai7\". Then
`r2b-proceedings-list' should be '((\"Ijcai81\") ...). If instead its
expansion were \"Proceedings of the Seventh International Conference
on Artificial Intelligence\", then you would NOT need to include Ijcai81
-in `r2b-proceedings-list' (although it wouldn't cause an error).")
+in `r2b-proceedings-list' (although it wouldn't cause an error)."
+ :type '(repeat (list string string))
+ :group 'refbib)
(defvar r2b-additional-stop-words
- "Some\\|What"
- "Words other than the `capitialize-title-stop-words'
-which are not to be used to build the citation key")
+ "Some\\|What"
+ "Words not to be used to build the citation key.
+This is in addition to the `r2b-capitalize-title-stop-words'.")
-
-(defvar r2b-delimit-with-quote
- t
- "*If true, then use \" to delimit fields, otherwise use braces")
+(defcustom r2b-delimit-with-quote t
+ "*If true, then use \" to delimit fields, otherwise use braces."
+ :type 'boolean
+ :group 'refbib)
;**********************************************************
; Utility Functions
-(defvar capitalize-title-stop-words
+(defvar r2b-capitalize-title-stop-words
(concat
"the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
"by\\|with\\|that\\|its")
- "Words not to be capitialized in a title (unless they are the first
-word in the title)")
+ "Words not to be capitalized in a title (unless the first word).")
-(defvar capitalize-title-stop-regexp
- (concat "\\(" capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
+(defvar r2b-capitalize-title-stop-regexp
+ (concat "\\(" r2b-capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
-(defun capitalize-title-region (begin end)
+(defun r2b-capitalize-title-region (begin end)
"Like `capitalize-region', but don't capitalize stop words, except the first."
(interactive "r")
(let ((case-fold-search nil) (orig-syntax-table (syntax-table)))
(if (looking-at "[A-Z][a-z]*[A-Z]")
(forward-word 1)
(if (let ((case-fold-search t))
- (looking-at capitalize-title-stop-regexp))
+ (looking-at r2b-capitalize-title-stop-regexp))
(downcase-word 1)
(capitalize-word 1)))
))
(set-syntax-table orig-syntax-table))))
-(defun capitalize-title (s)
- "Like capitalize, but don't capitalize stop words, except the first."
+(defun r2b-capitalize-title (s)
+ "Like `capitalize', but don't capitalize stop words, except the first."
(save-excursion
(set-buffer (get-buffer-create "$$$Scratch$$$"))
(erase-buffer)
(insert s)
- (capitalize-title-region (point-min) (point-max))
+ (r2b-capitalize-title-region (point-min) (point-max))
(buffer-string)))
;*********************************************************
(makunbound 'r2b-journal-abbrevs)
(makunbound 'r2b-booktitle-abbrevs)
(makunbound 'r2b-proceedings-list)
- (makunbound 'capitalize-title-stop-words)
- (makunbound 'capitalize-title-stop-regexp)
+ (makunbound 'r2b-capitalize-title-stop-words)
+ (makunbound 'r2b-capitalize-title-stop-regexp)
(makunbound 'r2b-additional-stop-words)
(makunbound 'r2b-stop-regexp))
(defvar r2b-stop-regexp
- (concat "\\`\\(\\("
- r2b-additional-stop-words "\\|" capitalize-title-stop-words
+ (concat "\\`\\(\\("
+ r2b-additional-stop-words "\\|" r2b-capitalize-title-stop-words
"\\)\\('\\w*\\)?\\W+\\)*\\([A-Z0-9]+\\)"))
"Returns string matched in current buffer."
(buffer-substring (match-beginning exp) (match-end exp)))
-(defvar r2b-out-buf-name "*Out*" "*output from refer-to-bibtex" )
-(defvar r2b-log-name "*Log*" "*logs errors from refer-to-bibtex" )
+(defcustom r2b-out-buf-name "*Out*"
+ "*Name of buffer for output from refer-to-bibtex."
+ :type 'string
+ :group 'refbib)
+
+(defcustom r2b-log-name "*Log*"
+ "*Name of buffer for logs errors from refer-to-bibtex."
+ :type 'string
+ :group 'refbib)
+
(defvar r2b-in-buf nil)
(defvar r2b-out-buf nil)
(defvar r2b-log nil)
(r2b-trace "snarfing %s" field)
(goto-char (point-min))
(while (and not-past-end
- (re-search-forward
+ (re-search-forward
(concat "^" field "\\b[ \t]*\\(.*[^ \t\n]\\)[ \t]*") nil t))
(setq item (r2b-match 1))
(while (and (setq not-past-end (zerop (forward-line 1)))
)
)
(if (and val capitalize)
- (setq val (capitalize-title val)))
+ (setq val (r2b-capitalize-title val)))
(set var val)
(if (and (null val) required)
(r2b-require var))
(let ((months r2b-month-abbrevs))
(if (string-match "[^0-9]" r2bv-month)
(progn
- (while (and months (not (string-match (car (car months))
+ (while (and months (not (string-match (car (car months))
r2bv-month)))
(setq months (cdr months)))
(if months
(r2b-set-match 'r2bv-title-first-word 4
r2b-stop-regexp
r2bv-title)
-
+
(r2b-get-field 'r2bv-annote "%X" t )
(r2b-get-field 'r2bv-tr "%R" t)
(r2b-get-field 'r2bv-address "%C" t)
(princ ", \n ")
(princ field)
(princ " =\t")
- (if (not nodelim)
+ (if (not nodelim)
(if r2b-delimit-with-quote
(princ "\"")
(princ "{")))
(if (> (match-end 0) 59)
(princ "\n"))
(princ data)
- (if (not nodelim)
+ (if (not nodelim)
(if r2b-delimit-with-quote
(princ "\"")
(princ "}")))
(defun r2b-require (vars)
"If any of VARS is null, set to empty string and log error."
- (cond
+ (cond
((null vars))
((listp vars) (r2b-require (car vars)) (r2b-require (cdr vars)))
(t
(defun r2b-isa-university (name)
"Return t if NAME is a university or similar organization,
but not a publisher."
- (and
+ (and
name
(string-match "university" name)
(not (string-match "press" name))
(setq r2bv-kn (concat r2bv-primary-author r2bv-decade
r2bv-title-first-word))
-
+
(setq r2bv-entry-kind
- (cond
+ (cond
((r2b-isa-proceedings r2bv-journal)
(r2b-moveq r2bv-booktitle r2bv-journal)
(if (r2b-isa-university r2bv-institution)
'proceedings)
((or r2bv-editor
(and r2bv-author
- (or
+ (or
(null r2bv-tr)
(string-match "\\bisbn\\b" r2bv-tr))))
(r2b-moveq r2bv-publisher r2bv-institution)
'book)
(r2bv-tr
(r2b-require 'r2bv-institution)
- (if (string-match
- "\\`\\(\\(.\\|\n\\)+\\)[ \t\n]+\\([^ \t\n]\\)+\\'"
+ (if (string-match
+ "\\`\\(\\(.\\|\n\\)+\\)[ \t\n]+\\([^ \t\n]\\)+\\'"
r2bv-tr)
(progn
(setq r2bv-type (substring r2bv-tr 0 (match-end 1)))
- (setq r2bv-number (substring r2bv-tr
+ (setq r2bv-number (substring r2bv-tr
(match-beginning 3)))
(setq r2bv-tr nil))
(r2b-moveq r2bv-number r2bv-tr))
(defun r2b-convert-record (output-name)
"Transform current bib entry and append to buffer OUTPUT;
do \"M-x r2b-help\" for more info."
- (interactive
+ (interactive
(list (read-string "Output to buffer: " r2b-out-buf-name)))
(let (rec-end rec-begin not-done)
(setq r2b-out-buf-name output-name)
nil
)
))
-
-
+
+
(defun r2b-convert-buffer (output-name)
- "Transform current buffer and append to buffer OUTPUT;
-do \"M-x r2b-help\" for more info."
- (interactive
+ "Transform current buffer and append to buffer OUTPUT.
+Do `M-x r2b-help' for more info."
+ (interactive
(list (read-string "Output to buffer: " r2b-out-buf-name)))
(save-excursion
(setq r2b-log (get-buffer-create r2b-log-name))
(message "Working, please be patient...")
(sit-for 0)
(while (r2b-convert-record output-name) t)
- (message "Done, results in %s, errors in %s"
+ (message "Done, results in %s, errors in %s"
r2b-out-buf-name r2b-log-name)
)
-(defvar r2b-load-quietly nil "*Don't print help message when loaded")
-
(defvar r2b-help-message
" Refer to Bibtex Bibliography Conversion
1. Visit the file containing the refer-style database.
2. The command
M-x r2b-convert-buffer
- converts the entire buffer, appending it's output by default in a
+ converts the entire buffer, appending its output by default in a
buffer named *Out*, and logging progress and errors in a buffer
named *Log*. The original file is never modified.
Note that results are appended to *Out*, so if that buffer
r2b-proceedings-list
for information on these features.
-If you don't want to see this help message when you load this utility,
-then include the following line in your .emacs file:
- (setq r2b-load-quietly t)
-To see this message again, perform
- M-x r2b-help")
+Please send bug reports and suggestions to
+ Henry Kautz
+ kautz@research.att.com
+ allegra!kautz")
(defun r2b-help ()
- "Print help message."
+ "Print help describing the `refbib' package."
(interactive)
(with-output-to-temp-buffer "*Help*"
- (princ r2b-help-message)))
-
-(if (not r2b-load-quietly)
- (r2b-help))
-
-(message "r2b loaded")
+ (princ r2b-help-message)
+ (save-excursion
+ (set-buffer standard-output)
+ (help-mode))))
+(provide 'refbib)
(provide 'refer-to-bibtex)
;;; refbib.el ends here