(setq org-ref-ref-re
- "ref:\\([a-zA-Z0-9-_:]*,?\\)*")
+ "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*")
(defface org-ref-cite-face
;; write out the latex bibliography command
(format "\\bibliographystyle{%s}" keyword)))))
+
+(defun org-bibliographystyle-complete-link (&optional arg)
+ "Completion function for bibliographystyle link.
+ARG does nothing."
+ (format "bibliographystyle:%s" (ido-completing-read
+ "style: "
+ '("unsrt" "plain" "alpha"
+ ;; natbib
+ ;; https://www.sharelatex.com/learn/Natbib_bibliography_styles
+ "dinat" "humannat" "plainnat"
+ "abbrnat" "unsrtnat" "rusnat"
+ "ksfhnat"))))
+
+
(defun org-bibliography-complete-link (&optional arg)
"Completion function for bibliography link.
ARG does nothing."
(format "bibliography:%s" (read-file-name "enter file: " nil nil t)))
+
(defun org-ref-insert-bibliography-link ()
"Insert a bibliography with completion."
(interactive)
((eq format 'latex)
(format "\\listoftables")))))
+
+;; ** label link
(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))
(setq custom-id-count (+ 1 custom-id-count)))))
custom-id-count)))
-;; ** label link
(org-add-link-type
"label"
(lambda (label)
:type "ref"
:link (concat "ref:" (org-element-property :name object))))
-;; it turns out this does not work. you can already store a link to a heading with a CUSTOM_ID
;; store link on heading with custom_id
-; (when (and (equal (org-element-type object) 'headline)
-; (org-entry-get (point) "CUSTOM_ID"))
-; (org-store-link-props
-; :type "ref"
-; :link (concat "ref:" (org-entry-get (point) "CUSTOM_ID"))))
+ ;; this is not a ref link, but it is still what you want
+ (when (and (equal (org-element-type object) 'headline)
+ (org-entry-get (point) "CUSTOM_ID"))
+ (org-store-link-props
+ :type "custom_id"
+ :link (format "[[#%s]]" (org-entry-get (point) "CUSTOM_ID"))))
;; and to #+label: lines
+
(when (and (equal (org-element-type object) 'paragraph)
(org-element-property :name object))
(org-store-link-props
:type "ref"
- :link (concat "ref:" (org-element-property :name object))))
-))
+ :link (concat "ref:" (org-element-property :name object))))))
(add-hook 'org-store-link-functions 'org-label-store-link)
(goto-char (point-min))
(re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
- ;; CUSTOM_ID
-; (progn
-; (goto-char (point-min))
-; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t))
- )
;; we did not find anything, so go back to where we came
(org-mark-ring-goto)
(error "%s not found" label))
((eq format 'latex)
(format "\\ref{%s}" keyword)))))
+
(defun org-ref-get-org-labels ()
"Return a list of #+LABEL: labels."
(save-excursion
(goto-char (point-min))
(let ((matches '()))
(while (re-search-forward "^#\\+label:\\s-+\\(.*\\)\\b" (point-max) t)
- (add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+ ;; do not do this for tables. We get those in `org-ref-get-tblnames'.
+ ;; who would have thought you have save match data here? Trust me. When
+ ;; I wrote this, you did.
+ (unless (save-match-data (equal (car (org-element-at-point)) 'table))
+ (add-to-list 'matches (match-string-no-properties 1) t)))
+ matches)))
+
(defun org-ref-get-custom-ids ()
"Return a list of custom_id properties in the buffer."
(let ((custom_id (org-entry-get (point) "CUSTOM_ID")))
(when (not (null custom_id))
(setq results (append results (list custom_id)))))))
-results))
+ results))
+
(defun org-ref-get-latex-labels ()
"Return list of matchin LaTeX defined labels in buffer."
(let ((matches '()))
(while (re-search-forward "\\\\label{\\([a-zA-z0-9:-]*\\)}" (point-max) t)
(add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+ matches)))
+
(defun org-ref-get-tblnames ()
"Return list of table names in the buffer."
(lambda (table)
(org-element-property :name table))))
+
(defun org-ref-get-labels ()
"Return a list of labels in the buffer that you can make a ref link to.
This is used to complete ref links and in helm menus."
(widen)
(goto-char (point-min))
(let ((matches '()))
- ;; these are the label:stuff kinds
- (while (re-search-forward "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
+ ;; these are the org-ref 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))
+ ;; now add all the other kinds of labels.
(append matches
+ ;; #+label:
(org-ref-get-org-labels)
+ ;; \label{}
(org-ref-get-latex-labels)
+ ;; #+tblname: and actually #+label
(org-ref-get-tblnames)
+ ;; CUSTOM_IDs
(org-ref-get-custom-ids))))))
+
(defun org-ref-helm-insert-label-link ()
"Insert a label link. helm just shows you what labels already exist.
If you are on a label link, replace it."
;; default action is to open to the label
(action . (lambda (label)
;; unfortunately I do not have markers here
- (org-open-link-from-string (format "ref:%s" label))))
+ (org-open-link-from-string
+ (format "ref:%s" label))))
;; if you select a label, replace current one
(action . (lambda (label)
(switch-to-buffer ,cb)
(or label
helm-pattern))))))))))))
+
(defun org-ref-complete-link (&optional arg)
"Completion function for ref links.
Optional argument ARG Does nothing."
(setq label (completing-read "label: " (org-ref-get-labels)))
(format "ref:%s" label)))
+
(defun org-ref-insert-ref-link ()
"Completion function for a ref link."
(interactive)
(insert (org-ref-complete-link)))
+
(defun org-ref-helm-insert-ref-link ()
"Helm menu to insert ref links to labels in the document.
If you are on link, replace with newly selected label.
;; #+label: name org-definition
(progn
(goto-char (point-min))
- (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
+ (re-search-forward
+ (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
;; org tblname
(progn
(goto-char (point-min))
- (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))
-
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
- ;; CUSTOM_ID
-; (progn
-; (goto-char (point-min))
-; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t))
- )
+ (re-search-forward
+ (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)))
;; we did not find anything, so go back to where we came
(org-mark-ring-goto)
(error "%s not found" label))
((eq format 'latex)
(format "\\pageref{%s}" keyword)))))
+
(defun org-pageref-complete-link (&optional arg)
"Completion function for ref links.
Optional argument ARG Does nothing."
(setq label (completing-read "label: " (org-ref-get-labels)))
(format "ref:%s" label)))
+
(defun org-pageref-insert-ref-link ()
"Insert a pageref link with completion."
(interactive)
(insert (org-pageref-complete-link)))
+
;; *** nameref link
(org-add-link-type
"nameref"
(setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
(setq key-beginning link-string-beginning))) ; no match found
;; save the key we clicked on.
- (setq bibtex-key (org-ref-strip-string (buffer-substring key-beginning key-end)))
+ (setq bibtex-key
+ (org-ref-strip-string
+ (buffer-substring key-beginning key-end)))
(set-text-properties 0 (length bibtex-key) nil bibtex-key)
bibtex-key)
;; link with description. assume only one key
choice
2))))))
-;; ** Generation of the cite links
+;; *** Generation of the cite links
(defmacro org-ref-make-completion-function (type)
"Macro to make a link completion function for a link of TYPE."
`(defun ,(intern (format "org-%s-complete-link" type)) (&optional arg)
(while (re-search-forward
(format "[^#+]label:%s\\s-" label) nil t)
(push (cons label (point-marker)) multiple-labels))
-
(goto-char (point-min))
(while (re-search-forward
(format "\\label{%s}\\s-?" label) nil t)
(org-ref-open-citation-at-point)
(email-bibtex-entry)) nil)))
+;; * org-ref-help
+(defun org-ref-help ()
+ "Open the org-ref manual."
+ (interactive)
+ (find-file (expand-file-name
+ "org-ref.org"
+ (file-name-directory
+ (find-library-name "org-ref")))))
+
+;; * org-ref menu
+(defun org-ref-org-menu ()
+ "Add org-ref menu to the Org menu."
+
+ (easy-menu-change
+ '("Org") "org-ref"
+ '( ["Insert citation" org-ref-helm-insert-cite-link]
+ ["Insert ref" org-ref-helm-insert-ref-link]
+ ["Insert label" org-ref-helm-insert-label-link]
+ "--"
+ ["List of figures" org-ref-list-of-figures]
+ ["List of tables" org-ref-list-of-tables]
+ ["Extract bibtex entries" org-ref-extract-bibtex-entries]
+ ["Check org-file" org-ref]
+ "--"
+ ["Help" org-ref-help]
+ ["Customize org-ref" (customize-group 'org-ref)])
+ "Show/Hide")
+
+ (easy-menu-change '("Org") "--" nil "Show/Hide"))
+
+(add-hook 'org-mode-hook 'org-ref-org-menu)
+
;; * The end
(provide 'org-ref)