naren@cs.UAlberta.CA (Narendra Ravi) (10/05/90)
Hi, Are there tools for creating and managing BiBTeX style bibliography databases? I refer to the tools similar to those provided for the refer format in most UNIX systems (addbib, lookbib, indxbib, ... ). I remember such a discussion took place in this newsgroup a few weeks ago. But our site doesn't have those articles anymore. Please email or post. Naren. ======================================================================= * Narendra Ravi * 615, General Services Building, * * Email : naren@cs.ualberta.ca * Department of Computing Science * * Tel : (403) 492-3520 (Off) * University of Alberta * * (403) 439-6301 (Res) * Edmonton, Alberta, CANADA T6G 2H1 * =======================================================================
skdutta@cs.tamu.edu (Saumen K Dutta) (10/05/90)
In article <naren.655095507@menaik> naren@cs.UAlberta.CA (Narendra Ravi) writes:
->Hi,
->
-> Are there tools for creating and managing BiBTeX style
-> bibliography databases?
->
-> I refer to the tools similar to those provided for the
-> refer format in most UNIX systems (addbib, lookbib,
-> indxbib, ... ).
->
-> I remember such a discussion took place in this newsgroup
-> a few weeks ago. But our site doesn't have those articles
-> anymore.
->
->Please email or post.
->
->Naren.
->=======================================================================
Sometime back I wrote and posted a program which works in unix
environment and written in shell script. This does not deal with
styles however. It is a like addbib for TeX/LaTeX. I am not posting
it again to increase the load. If anybody is interested to evaluate it
send me a request.
Thanks
--
_ ||Internet: skdutta@cssun.tamu.edu
( /_ _ / --/-/- _ ||Bitnet : skd8107@tamvenus.bitnet
__)_/(_____(_/_(_/_(_(__(_/_______ ||Uucp : uunet!cssun.tamu.edu!skdutta
.. ||Yellnet: (409) 846-8803kolb@itksu5kub.nl (Hans-Peter Kolb) (10/05/90)
In article <naren.655095507@menaik>, naren@cs.UAlberta.CA (Narendra Ravi) writes: |> Are there tools for creating and managing BiBTeX style |> bibliography databases? |> |> I refer to the tools similar to those provided for the |> refer format in most UNIX systems (addbib, lookbib, |> indxbib, ... ). Have you ever looked at Tib - "a TeX bibliographic preprocessor" by J.C.Alexander (last known email address: jca@lakisis.umd.edu)? It uses a refer-style database rather than bibTeX, so you can just use addbib (with a prompt-file if you want to have all the nifty niceties Tib allows you to have). The tib-package itself consists of tib the preprocessor tibdex the indexmaker tiblist lists the complete database(s) tiblook locate entries It is at least as powerful, and, IMHO, more flexible and "user-friendly" than BibTeX. Best..., hap P.S.: No connection, "just a satisfied user". ------------------------------------------------------------------------ - hans-peter kolb kolb@kub.nl Computational Linguistics kolb@htikub5.bitnet Tilburg University (KUB) P.O.Box 90 153 The Netherlands NL-5000 LE Tilburg ------------------------------------------------------------------------ -
panos@db.toronto.edu (Panos Economopoulos) (10/05/90)
naren@cs.UAlberta.CA (Narendra Ravi) writes: >Hi, > Are there tools for creating and managing BiBTeX style > bibliography databases? > > I refer to the tools similar to those provided for the > refer format in most UNIX systems (addbib, lookbib, > indxbib, ... ). >Naren. ---------------------------------------- Kannan Varadhan has written a nice package called ``bibtools'' which allows you to insert/delete/select (using regular expressions) entries to/from .bib bibliographic databases. `bibtools' is v09i046 in any comp.sources.misc archive. The only other thing you need in order to install it is a regular expression package like the one written by Henry Spencer. You can find it in comp.sources.unix in the following volumes: comp.sources.unix/volume3/regexp comp.sources.unix/volume3/regexp2 comp.sources.unix/volume4/regexp3 comp.sources.unix/volume4/regexp4 comp.sources.unix/volume10/regexp.pch Kannan's address is (was last spring, as far as I know): Kannan Varadhan, Internet Engineer, OARNet Ohio Supercomputer Center, Columbus, OH 43212 +1 (614) 292-4137 email: kannan@oar.net | osu-cis!malgudi.oar.net!kannan ---------------------------- Panos Economopoulos -- panos@csri.toronto.edu (ARPA/CSNet) University of Toronto {uunet, ...}!utcsri!panos (UUCP) panos@csri.utoronto (Bitnet) panos@csri.toronto.cdn (CDNnet/EAN/X.400)
usenet@nlm.nih.gov (usenet news poster) (10/06/90)
I've written some Gnu Emacs lisp code that parses .BIB files and could be used to manage them in various ways. Drop me a line to get a copy. pkarp@ncbi.nlm.nih.gov
usenet@nlm.nih.gov (usenet news poster) (10/09/90)
The Gnu Emacs code that I sent many of you by email was missing the
function "next-word". Here is the complete version:
;;;;
;;;; GnuEmacs functions for manipulating Scribe and BibTeX bibliography
;;;; (.BIB) files. This package contains functions that:
;;;;
;;;; Convert a bibliography (.BIB) file in Scribe format to BibTeX format.
;;;;
;;;; Convert a .BIB file in BibTeX format to a more readable text form.
;;;;
;;;; Peter Karp -- karp@sumex-aim.stanford.edu
;;;; Nov 1988: Created
;;;; June 1990: Revised by pkarp@ncbi.nlm.nih.gov to convert .BIB
;;;; files to text form.
;;;;
;;;; This software may be redistributed freely as long as this leading
;;;; text is not removed. Use this software at your own risk.
;;;;
;;;; Please send bugs, suggestions, improvements to the above address.
;;;;
;;;; To use:
;;;;
;;;; m-X load-file cnvtbib.el
;;;; m-X eval-expression (cvbib "file.bib") ; Scribe .BIB --> BibTeX .BIB
;;;; m-X eval-expression (bib2txt "file.bib") ; BibTeX .BIB --> text form
;;;;
;;;; BUGS:
;;;; (Scribe --> BibTeX conversion)
;;;; BibTex will complain if author names are not separated by
;;;; "and"; this converter does not add necessary "and"s. However,
;;;; the command "^X," will do a query-replace of "," to " and",
;;;; which you may find helpful. Note that BibTex will also complain
;;;; if names are separated by ", and". This converter does remove
;;;; these commas.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cvbib
; Convert a Scribe-format .bib file to Latex format.
(defun cvbib (filename)
(let (dpos)
(find-file-other-window filename)
(beginning-of-buffer)
; First modify all entries so that the delimiters used for the entry
; are "{}". So we'd convert @book< ... > to @book{ ... }
(while (search-forward "@" nil t)
(progn
(forward-word 1)
(setq dpos (point))
(goto-matching-delimiter)
(backward-delete-char 1)
(insert-string "}")
(goto-char dpos)
(delete-char 1)
(insert-string "{")
))
(beginning-of-buffer)
; Now convert all key fields from, e.g., AUTHOR=<PKARP> to AUTHOR="PKARP"
; Note that some key fields aren't delimited by anything, which is ok but
; requires a special check in the code below.
(while (search-forward "=" nil t)
(progn
(while (search-forward " " (+ 1 (point)) t)
nil)
(if (assoc (point-char) all_delims)
(progn
(setq dpos (point))
(goto-matching-delimiter)
(backward-delete-char 1)
(insert-string "\"")
(goto-char dpos)
(delete-char 1)
(insert-string "\"")
))
))
(beginning-of-buffer)
;;;; Change all ", AND" within AUTHOR and EDITOR strings to " AND"
;;;; because BibTex complains about the former.
(while (re-search-forward "AUTHOR\\s-*=\\s-*" nil t)
(setq dpos (point))
(goto-matching-delimiter)
(while (re-search-backward ",\\s-*AND" dpos t)
(delete-char 1))
)
(beginning-of-buffer)
(while (re-search-forward "EDITORS\\s-*=\\s-*" nil t)
(setq dpos (point))
(goto-matching-delimiter)
(while (re-search-backward ",\\s-*AND" dpos t)
(delete-char 1))
)
(beginning-of-buffer)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; and-replace
(defun and-replace ()
"Does query-replace conversion of `,' to ` and' for bibliography conversion"
(interactive)
(query-replace "," " and")
)
(global-set-key "," 'and-replace)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; bib2txt
; Convert a Latex .BIB file to a more readable text form. See
; function (entry2txt) for details on how this is done.
(defun bib2txt (filename &optional quiet_flg)
(let (x)
(find-file-other-window filename)
; Process @string definitions; for @string{AI="AI"} create a lisp variable
; called AI whose value is "AI".
(while (search-forward "@string" nil t)
(progn
(next-word)
(setq start (dot))
(search-forward "=" nil t)
(backward-word 1)
(forward-word 1)
(setq variable (intern (buffer-substring start (dot))))
(search-forward "\"" nil t)
(setq start (dot))
(search-forward "\"" nil t)
(backward-char 1)
(setq value (buffer-substring start (dot)))
(set variable value)
))
(search-forward "@" nil t)
(backward-char 1)
(kill-region 1 (point)) ; Kill the @string definitions
; Convert each entry to text form.
(while (search-forward "@" nil t)
(entry2txt))
(newline)
(beginning-of-buffer)
; Some entries may still contain extra tabs and spaces at the beginning
; of lines. Remove this crap and reformat the entries.
(while (re-search-forward "^[ ]+" nil t)
(progn
(setq x (point))
(beginning-of-line)
(kill-region x (point))
(fill-paragraph nil)
))
; Some entries may be separated by multiple newlines; change double newlines
; to single newlines.
(beginning-of-buffer)
(while (and (not (end-of-buffer-p))
(re-search-forward "^$" nil t))
(progn
(setq x (point))
(skip-chars " " t)
(kill-region x (point))
(newline)
))
(message "Conversion complete; save buffer to a text file.")
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; entry2txt
; Convert the current bibliography entry from Latex to text format
; For an entry such as:
;
; @PhDThesis{ Altman89,
; Key="Altman",
; Author="Altman, R.B.",
; School="Stanford University Medical Information Sciences",
; Title="Exclusion Methods for the Determination of Protein Structure from Experimental Data",
; Year=1989, }
;
; We delete the first and second lines, we make sure that the Author
; and Title fields come first, and we strip off the keyword names in
; each field, as well as unquoting each field (except for the title).
; For some fields we insert leading strings, e.g., for the Pages field
; we insert the leading string "pp".
;
; Assumes we are called with (dot) after the @ of @BOOK
(defun entry2txt (&optional quiet_flg)
(let (at-pos next-pos x variable sstart)
(backward-char 1)
(setq at-pos (dot)) ; at-pos <-- start of @BOOK
(forward-word 1)
(goto-matching-delimiter)
(backward-delete-char 1) ; delete closing delimiter
(goto-char at-pos)
(next-word)
(next-word)
(kill-region (point) at-pos) ; delete @book{
(setq x (point))
(forward-word 1)
; If entry is @BOOK{JONES80, display JONES80
(if (not quiet_flg)
(message (buffer-substring x (point))))
(next-word)
(kill-region (point) x) ;;;; delete the citation name
(setq next-pos (dot))
; Delete the Key= field.
(if (setq b (field-boundary "key" (end-of-entry)))
(kill-region (car b) (cdr b)))
(goto-char next-pos)
; Move the Author field to the front of the entry and strip off the
; Author keyword and quotes.
(if (setq b (field-boundary "author" (end-of-entry)))
(progn
(kill-region (car b) (cdr b))
(goto-char next-pos)
(yank)
(goto-char next-pos)
(strip-field t)
(insert-string " ")
(setq next-pos (dot))))
; Make sure the Title field comes next; strip off the keyword.
(if (setq b (field-boundary "title" (end-of-entry)))
(progn
(kill-region (car b) (cdr b))
(goto-char next-pos)
(yank)
(goto-char next-pos)
(strip-field nil)
(insert-string " ")
(setq next-pos (dot))))
; Now, for each remaining field of the form Keyword=Value , if Value
; is not a quoted string then attempt to replace Value with the value
; of a GnuEmacs lisp variable called Value, was was set during
; processing of @string specifications in the function (bib2txt).
; Then strip off Keyword= and strip off the quotes around the value.
(while (re-search-forward "[a-z]" (end-of-entry) t)
(progn
(re-search-forward "[ = ]" nil t)
(skip-chars " = ")
(setq sstart (point))
(if (not (char-equal 34 (char-after (point))))
(progn
; Value is not a quoted string; try to insert the value of this variable.
(re-search-forward "[ ,]" nil t)
(backward-word 1)
(forward-word 1)
(setq variable (intern (buffer-substring sstart (point))))
(if (boundp variable)
(progn
(kill-region sstart (point))
(insert-string (eval variable))))
))
; Strip off keyword and quotes.
(goto-char sstart)
(backward-word 1)
(kill-region next-pos (point))
(strip-field t)
(insert-string " ")
(setq next-pos (point))))
(backward-word 1)
(forward-word 1)
(skip-chars "\"")
(kill-region (point) (skip-chars " ,"))
(insert-string ".")
; Format this entry nicely.
(fill-paragraph nil)
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; end-of-entry
; Return the buffer position at the end of the current entry, which we
; define to be either the position of the "@" at the start of the next
; entry, or if we can't find that, then (end-of-buffer).
(defun end-of-entry ()
(let (pos)
(save-excursion
(if (setq pos (search-forward "@" nil t))
(point)
(progn
(end-of-buffer)
(point))))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; field-boundary
; If the current bib entry (whose end is at position Eoe) contains a
; field named Field-Name (such as: author="Jones",) we return a list
; whose car and cdr are the starting and ending buffer positions of
; this field; else we return NIL.
(defun field-boundary (field-name eoe)
(let (start (end nil))
(if (re-search-forward (concat field-name " *=?") eoe t)
(progn
(backward-word 1)
(setq start (dot))
(if (search-forward "\"" eoe t)
(if (re-search-forward "\"" eoe t)
(progn
(skip-chars " , " t)
(setq end (min (dot) eoe))
)))))
(if end
(cons start end)
nil)
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; strip-field
; Given a line such as:
;
; author="jim jones",
;
; we strip off the "author=" part , plus the surrounding quotes if
; Delete-Quotes is True. Also, if the keyword (here author) is in
; the alist word-subs, we insert the associated string.
;
; We leave point at the end of the expression (after the comma (which
; may or may not be present)).
(setq word-subs '(("volume" . "v")
("number" . "#")
("pages" . "pp")))
(defun strip-field (delete-quotes)
(let ((wordstart (point))
word)
; Kill keyword and make substitution if appropriate.
(forward-word 1)
(setq word (buffer-substring wordstart (point)))
(backward-kill-word 1)
(if (assoc (downcase word) word-subs)
(insert-string (cdr (assoc (downcase word) word-subs))))
(kill-region (point) (skip-chars " ="))
; Delete surrounding quotes if requested.
(if delete-quotes
(if (char-equal 34 (char-after (dot))) ; double quote
(progn
(delete-char 1)
(search-forward "\"" nil t)
(backward-delete-char 1)
(skip-chars " , "))
(re-search-forward "[,}]" nil t))
(if (char-equal 34 (char-after (dot))) ; double quote
(progn
(forward-char 1)
(re-search-forward "\" *,?" nil t))
(re-search-forward "[,}]")))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; goto-matching-delimiter
; Goes to the character in the buffer which closes the Scribe delimiter
; where (point) is when this function is called. I.e., if the buffer is
; "@book< foo >bar" and we're called with point at "<", we'll leave
; point at the "b" of "bar".
;
(setq all_delims '(("<" . ">")
("[" . "]")
("\"" . "\"")
("(" . ")")
("{" . "}")))
(defun goto-matching-delimiter ()
(let (delim match-char mdelim redelims
(nomatch t)
(start (point)))
(setq delim (point-char))
(setq mdelim (cdr (assoc delim all_delims))) ; Look up matching delim
(if (null mdelim)
(error "Point is not a valid delimiter"))
(setq redelims (concat "[" mdelim delim "]" ))
(forward-char)
; Assuming the open-delim was "{", repeatedley search for either "{"
; or "}". If we find "{", recurse to find its matching delimiter. If
; we find "}", we're done.
(while nomatch
(progn
(if (not (re-search-forward redelims nil t))
(progn
(error "No closing delimiter found to match that at point")
(goto-char start))
(setq match-char (buffer-substring (- (point) 1) (point)))
(if (and (not (equal "\"" delim))
(equal match-char delim))
(progn
(backward-char)
(goto-matching-delimiter))
(setq nomatch nil)) ; Done!
)
))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; point-char
; Return the character at the cursor
(defun point-char ()
(buffer-substring (point) (+ 1 (point)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; skip-chars
; Scans through the buffer starting at (point) as long as the buffer
; contains chars within String (newline is added to string if Add_Newline
; is T.
; Returns (point)
(defun skip-chars (string &optional add_newline)
(let (ch i)
(if add_newline
(setq string (concat string (char-to-string 10))))
(while (and (setq ch (char-after (dot))) ; False if at end of buffer
(char-in-string ch string))
(forward-char 1))
(point)
))
(defun char-in-string (char string)
(let ((i (length string))
(found nil))
(while (and (> i 0)
(not (setq found (char-equal char
(string-to-char string)))))
(setq string (substring string 1))
(setq i (1- i)))
found
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; end-of-bufffer-p
(defun end-of-buffer-p ()
(not (char-after (dot)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; next-word
(defun next-word ()
"Move to the start of the next word in the buffer"
(interactive)
(let (pos)
(setq pos (point))
(forward-word 1)
(backward-word 1)
(if (>= pos (point))
(progn
(forward-word 2)
(backward-word 1)
))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mark-and-hold
; Debugging routine
(defun mark-and-hold (mark-char-string)
(insert-string mark-char-string)
(read-string "holding...")
(backward-delete-char 1)
)