4. Exportable links to LaTeX
5. Utility functions for dealing with bibtex files and org-files
+1. Get minibuffer messages for the cite/ref/label link under point
+
+With helm integration (default) you can:
+
+1. C-c ] to insert a citation link
+ in helm-bibtex
+ - Enter to insert or append citation(s)
+ - C-u Enter to insert an alternative cite link
+ - C-u C-u Enter to replace the citation at point
+2. C-u C-c ] to insert a ref link with helm completion
+3. C-u C-u C-c ] to insert a label with completion
+4. M-x org-ref to get a helm completion buffer with link checks, utilities and export options
+
** Header
#+BEGIN_SRC emacs-lisp :tangle org-ref.el
;;; org-ref.el --- setup bibliography, cite, ref and label org-mode links.
#+BEGIN_SRC emacs-lisp :tangle org-ref.el
(defun org-ref-count-labels (label)
"Counts number of matches for label in the document"
- (+ (count-matches (format "label:%s\\b[^-:]" label) (point-min) (point-max) t)
+ (+ (count-matches (format "label:%s\\b[^-:]" label) (point-min) (point-max))
;; for tblname, it is not enough to get word boundary
;; tab-little and tab-little-2 match then.
- (count-matches (format "^#\\+tblname:\\s-*%s\\b[^-:]" label) (point-min) (point-max) t)
- (count-matches (format "\\label{%s}\\b" label) (point-min) (point-max) t)
+ (count-matches (format "^#\\+tblname:\\s-*%s\\b[^-:]" label) (point-min) (point-max))
+ (count-matches (format "\\label{%s}\\b" label) (point-min) (point-max))
;; this is the org-format #+label:
- (count-matches (format "^#\\+label:\\s-*%s\\b[^-:]" label) (point-min) (point-max) t)
+ (count-matches (format "^#\\+label:\\s-*%s\\b[^-:]" label) (point-min) (point-max))
(let ((custom-id-count 0))
(org-map-entries
(lambda ()
- (when (string= label (org-entry-get (point) "CUSTOM_ID"))
+ (when (string= label (org-entry-get (point) "CUSTOM_ID"))
(setq custom-id-count (+ 1 custom-id-count)))))
custom-id-count)))
"label"
(lambda (label)
"on clicking count the number of label tags used in the buffer. A number greater than one means multiple labels!"
- (message (format "%s occurences" (org-ref-count-labels label))))
+ (let ((count (org-ref-count-labels label)))
+ (message (format "%s occurence%s"
+ count
+ (if (or (= count 0)
+ (> count 1))
+ "s"
+ ""))
+ (org-ref-count-labels label))))
(lambda (keyword desc format)
(cond
((eq format 'html) (format "(<label>%s</label>)" path))
(widen)
(goto-char (point-min))
(let ((matches '()))
- (while (re-search-forward "label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
+ ;; these are the label:stuff kinds
+ (while (re-search-forward "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
(add-to-list 'matches (match-string-no-properties 1) t))
- (append matches (org-ref-get-org-labels) (org-ref-get-latex-labels) (org-ref-get-tblnames) (org-ref-get-custom-ids))))))
+ (append matches
+ (org-ref-get-org-labels)
+ (org-ref-get-latex-labels)
+ (org-ref-get-tblnames)
+ (org-ref-get-custom-ids))))))
#+END_SRC
Let us make a helm function to insert a label link. This will help you enter unique labels.
"Helm menu to insert ref links to labels in the document.
If you are on link, replace with newly selected label.
Use C-u to insert a different kind of ref link.
+Use C-u C-u to insert a [[#custom-id]] link
"
(interactive)
(let* ((labels (org-ref-get-labels))
- (contexts (mapcar 'org-ref-get-label-context labels))
+ (bs (buffer-string))
+ (contexts (with-temp-buffer
+ (insert bs)
+ (mapcar 'org-ref-get-label-context labels)))
(cb (current-buffer)))
(helm :input (thing-at-point 'word)
(candidates . ("ref" "eqref" "pageref" "nameref"))
(action . (lambda (x) x))))
":" label)))
+ ;; two prefixes, insert section custom-id link
+ ((equal helm-current-prefix-arg '(16))
+ (insert
+ (format "[[#%s]]" label)))
))))))))
#+END_SRC
(progn
(forward-line 4)
(point)))))
-
- ;; maybe we have a CUSTOM-ID
- (org-map-entries
- (lambda () (when (string=
- label
- (org-entry-get (point) "CUSTOM_ID"))
- (throw 'result (org-get-heading)))))
- (beep)
(throw 'result "!!! NO CONTEXT FOUND !!!"))))
(let ((count (org-ref-count-labels
(org-element-property :path object))))
;; get plurality on occurrence correct
- (when (> count 1) (beep))
(message (concat
(number-to-string count)
" occurence"
(> count 1))
"s")))))
+ ((string= type "custom-id")
+ (save-excursion
+ (org-open-link-from-string
+ (format "[[#%s]]" (org-element-property :path object)))
+ (message "%s" (org-get-heading))))
+
;; check if the bibliography files exist.
((string= type "bibliography")
(let* ((bibfile)
(link-string (org-element-property :path object))
(link-string-beginning)
(link-string-end))
-
(save-excursion
(goto-char (org-element-property :begin object))
(search-forward link-string nil nil 1)
(setq link-string-beginning (match-beginning 0))
(setq link-string-end (match-end 0)))
+ ;; make sure we are in link and not before the :
+ (when (> link-string-beginning (point))
+ (goto-char link-string-beginning))
+
;; now if we have comma separated bibliographies
;; we find the one clicked on. we want to
;; search forward to next comma from point
(if (search-forward "," link-string-end 1 1)
(setq key-end (- (match-end 0) 1)) ; we found a match
(setq key-end (point)))) ; no comma found so take the point
+
;; and backward to previous comma from point
(save-excursion
(if (search-backward "," link-string-beginning 1 1)
(buffer-substring key-beginning key-end)))
(if (file-exists-p bibfile)
(message "%s exists." bibfile)
- (beep)
(message "!!! %s NOT FOUND !!!" bibfile))))
)))))
#+END_SRC
(insert-file-contents bibfile)
(bibtex-search-entry key)
(org-ref-bib-citation)))
- (beep)
"!!! No entry found !!!" )))
(defun org-ref-cite-candidates ()