|
@@ -221,6 +221,24 @@ For example setting to 'BIB_' would allow interoperability with fireforg."
|
|
|
:group 'org-bibtex
|
|
|
:type 'string)
|
|
|
|
|
|
+(defcustom org-bibtex-export-arbitrary-fields nil
|
|
|
+ "When converting to bibtex allow fields not defined in `org-bibtex-fields'.
|
|
|
+This only has effect if org-bibtex-prefix is defined, so as to
|
|
|
+ensure that other org-properties, such as CATEGORY or LOGGING are
|
|
|
+not placed in the exported bibtex entry."
|
|
|
+ :group 'org-bibtex
|
|
|
+ :type 'boolean)
|
|
|
+
|
|
|
+;; TODO if ID, test to make sure ID is unique
|
|
|
+(defcustom org-bibtex-key-property "CUSTOM_ID"
|
|
|
+ "Property that holds the bibtex key.
|
|
|
+By default, this is CUSTOM_ID, which enables easy linking to
|
|
|
+bibtex headlines from within an org file. This can be set to ID
|
|
|
+to enable global links, but only with great caution, as global
|
|
|
+IDs must be unique."
|
|
|
+ :group 'org-bibtex
|
|
|
+ :type 'string)
|
|
|
+
|
|
|
|
|
|
;;; Utility functions
|
|
|
(defun org-bibtex-get (property)
|
|
@@ -232,21 +250,22 @@ For example setting to 'BIB_' would allow interoperability with fireforg."
|
|
|
(substring (symbol-name property) 1)
|
|
|
property))))
|
|
|
(org-set-property
|
|
|
- (concat (unless (string= "CUSTOM_ID" prop) org-bibtex-prefix) prop)
|
|
|
+ (concat (unless (string= org-bibtex-key-property prop) org-bibtex-prefix)
|
|
|
+ prop)
|
|
|
value)))
|
|
|
|
|
|
(defun org-bibtex-headline ()
|
|
|
"Return a bibtex entry of the given headline as a string."
|
|
|
(flet ((get (key lst) (cdr (assoc key lst)))
|
|
|
- (to-k (string) (intern (concat ":" string)))
|
|
|
- (from-k (key) (substring (symbol-name key) 1))
|
|
|
+ (to (string) (intern (concat ":" string)))
|
|
|
+ (from (key) (substring (symbol-name key) 1))
|
|
|
(flatten (&rest lsts)
|
|
|
(apply #'append (mapcar
|
|
|
(lambda (e)
|
|
|
(if (listp e) (apply #'flatten e) (list e)))
|
|
|
lsts))))
|
|
|
(let ((notes (buffer-string))
|
|
|
- (id (org-bibtex-get "custom_id"))
|
|
|
+ (id (org-bibtex-get org-bibtex-key-property))
|
|
|
(type (org-bibtex-get "type")))
|
|
|
(when type
|
|
|
(let ((entry (format
|
|
@@ -254,15 +273,25 @@ For example setting to 'BIB_' would allow interoperability with fireforg."
|
|
|
(mapconcat
|
|
|
(lambda (pair) (format " %s={%s}" (car pair) (cdr pair)))
|
|
|
(remove nil
|
|
|
- (mapcar
|
|
|
- (lambda (field)
|
|
|
- (let ((value (or (org-bibtex-get (from-k field))
|
|
|
- (and (equal :title field)
|
|
|
- (org-get-heading)))))
|
|
|
- (when value (cons (from-k field) value))))
|
|
|
- (flatten
|
|
|
- (get :required (get (to-k type) org-bibtex-types))
|
|
|
- (get :optional (get (to-k type) org-bibtex-types)))))
|
|
|
+ (if (and org-bibtex-export-arbitrary-fields
|
|
|
+ org-bibtex-prefix)
|
|
|
+ (mapcar
|
|
|
+ (lambda (kv)
|
|
|
+ (when (string-match org-bibtex-prefix (car kv))
|
|
|
+ (cons (downcase (replace-regexp-in-string
|
|
|
+ org-bibtex-prefix ""
|
|
|
+ (car kv)))
|
|
|
+ (cdr kv))))
|
|
|
+ (org-entry-properties nil 'standard))
|
|
|
+ (mapcar
|
|
|
+ (lambda (field)
|
|
|
+ (let ((value (or (org-bibtex-get (from field))
|
|
|
+ (and (equal :title field)
|
|
|
+ (org-get-heading)))))
|
|
|
+ (when value (cons (from field) value))))
|
|
|
+ (flatten
|
|
|
+ (get :required (get (to type) org-bibtex-types))
|
|
|
+ (get :optional (get (to type) org-bibtex-types))))))
|
|
|
",\n"))))
|
|
|
(with-temp-buffer
|
|
|
(insert entry)
|
|
@@ -283,7 +312,7 @@ For example setting to 'BIB_' would allow interoperability with fireforg."
|
|
|
|
|
|
(defun org-bibtex-autokey ()
|
|
|
"Generate an autokey for the current headline"
|
|
|
- (org-bibtex-put "CUSTOM_ID"
|
|
|
+ (org-bibtex-put org-bibtex-key-property
|
|
|
(if org-bibtex-autogen-keys
|
|
|
(let ((entry (org-bibtex-headline)))
|
|
|
(with-temp-buffer
|
|
@@ -312,7 +341,7 @@ With optional argument OPTIONAL, also prompt for optional fields."
|
|
|
(let ((prop (org-bibtex-ask field)))
|
|
|
(when prop (org-bibtex-put name prop)))))))
|
|
|
(when (and type (assoc type org-bibtex-types)
|
|
|
- (not (org-bibtex-get "CUSTOM_ID")))
|
|
|
+ (not (org-bibtex-get org-bibtex-key-property)))
|
|
|
(org-bibtex-autokey)))
|
|
|
|
|
|
|
|
@@ -489,7 +518,7 @@ This uses `bibtex-parse-entry'."
|
|
|
(case (car pair)
|
|
|
(:title nil)
|
|
|
(:type nil)
|
|
|
- (:key (org-bibtex-put "CUSTOM_ID" (cdr pair)))
|
|
|
+ (:key (org-bibtex-put org-bibtex-key-property (cdr pair)))
|
|
|
(otherwise (org-bibtex-put (car pair) (cdr pair))))))))
|
|
|
|
|
|
(defun org-bibtex-yank ()
|