Emacs code for fetching a bibliography in BibTeX form from CiteULike
I typically manage my references with CiteULike. My typical workflow is to add the articles that I’m interested in, and then while writing, keep a complete copy of the exported BibTeX next to the LaTeX files. This gets tedious to maintain by hand, so I wrote this little chunk of elisp to download the file and name it the way I do.
To use, simply place it in a file called citeulike.el on your load-path and add (require ‘citeulike) to your .emacs. Make sure to look at the customization options. Then, run M-x citeulike-download-bibtex in your LaTeX buffer.
|
;;;; citeulike.el --- Getting things from CiteULike while working in AUCTeX |
|
;; |
|
;;; Copyright (C) 2011 David Christiansen |
|
;; |
|
;;; Author: David Christiansen |
|
;; |
|
;; This program is free software: you can redistribute it and/or |
|
;; modify it under the terms of the GNU General Public License as |
|
;; published by the Free Software Foundation; either version 3 of the |
|
;; License, or (at your option) any later version. |
|
;; |
|
;; This program is distributed in the hope that it will be useful, |
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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, Inc., 59 Temple Place - Suite 330, |
|
;; Boston, MA 02111-1307, USA. |
|
;; |
|
;;; Commentary: |
|
;; Purpose: |
|
;; |
|
;; To make downloading an updated copy of references from CiteULike easier. |
|
;; |
|
;;; Code: |
|
|
|
(provide 'citeulike) |
|
|
|
(defgroup citeulike nil |
|
"Options for CiteULike support" |
|
:prefix 'citeulike) |
|
|
|
(defcustom citeulike-username "" |
|
"CiteULike username, used for downloading BibTeX exports." |
|
:type 'string |
|
:group 'citeulike) |
|
|
|
(defcustom citeulike-export-username-prefix nil |
|
"Whether to add a username prefix to keys" |
|
:type '(choice (const :tag "Yes" t) |
|
(const :tag "No" nil)) |
|
:group 'citeulike) |
|
|
|
(defcustom citeulike-export-key-type 0 |
|
"What kind of keys to put in the exported BibTeX" |
|
:type '(choice (const :tag "Prefer personal key; otherwise use numeric key" 0) |
|
(const :tag "Prefer personal key; otherwise use AuthorYearTitle key" 4) |
|
(const :tag "Prefer numeric keys" 1) |
|
(const :tag "Only export articles with a personal key" 2) |
|
(const :tag "Export both keys" 3)) |
|
:group 'citeulike) |
|
|
|
(defcustom citeulike-export-include-amazon-link nil |
|
"Include Amazon links for books in exported BibTeX" |
|
:type '(choice (const :tag "Yes" t) |
|
(const :tag "No" nil)) |
|
:group 'citeulike) |
|
|
|
(defcustom citeulike-export-clean-urls t |
|
"Escape URLs for BibTeX?" |
|
:type '(choice (const :tag "Escaped URLs" t) |
|
(const :tag "Don't escape URLs" nil)) |
|
:group 'citeulike) |
|
|
|
(defcustom citeulike-export-smart-wrap 0 |
|
"Work around BibTeX capitalization" |
|
:type '(choice (const :tag "Don't wrap" 0) |
|
(const :tag "Smart wrap whole field" 1) |
|
(const :tag "Smart wrap individual words" 2)) |
|
:group 'citeulike) |
|
|
|
(defun citeulike-export-url () |
|
(concat "http://www.citeulike.org/bibtex/user/" |
|
citeulike-username "?" |
|
"do_username_prefix=" (if citeulike-export-username-prefix "1" "0") "&" |
|
"key_type=" (number-to-string citeulike-export-key-type) "&" |
|
"incl_amazon=" (if citeulike-export-include-amazon-link "1" "0") "&" |
|
"clean-urls=" (if citeulike-export-clean-urls "1" "0") "&" |
|
"smart_wrap=" (number-to-string citeulike-export-smart-wrap))) |
|
|
|
(defun citeulike-download-bibtex () |
|
(interactive) |
|
(let* ((extension (file-name-extension buffer-file-name)) |
|
(rest (file-name-sans-extension buffer-file-name)) |
|
(target (if (equal extension "tex") |
|
(concat rest ".bib") |
|
(read-file-name "Filename to save: ")))) |
|
(if (or (equal citeulike-username "") (not (stringp citeulike-username))) |
|
(error "No valid CiteULike username is configured") |
|
(let* ((command (concat "wget \"" (citeulike-export-url) "\"" |
|
" -O " target)) |
|
(final-command (read-string "Command: " command))) |
|
(shell-command final-command))))) |
|
|