emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Rasmus <rasmus@gmx.us>
To: emacs-orgmode@gnu.org
Subject: Re: Citations, continued
Date: Mon, 02 Feb 2015 23:47:34 +0100	[thread overview]
Message-ID: <87bnlcdj7d.fsf@gmx.us> (raw)
In-Reply-To: m28uggjdn5.fsf@andrew.cmu.edu

John Kitchin <jkitchin@andrew.cmu.edu> writes:

> #+BEGIN_SRC emacs-lisp :results silent
> (org-add-link-type
>  "slink" ...)
> #+END_SRC

Thanks John, this is great!

I managed to chop down my citation setup to the following:

[[cite:key :pre pre :post post :type type]]

with reasonable support for other backends.  I only use bibtex and I used
to separate pre/post with ";" so there's some legacy code in there.
Everything is hard-coded to my system/taste, written quickly and (very)
lightly tested, but maybe it will still be useful to somebody. . .

—Rasmus


(with-eval-after-load 'org
  (require 'reftex-cite)
  
  (defmacro rasmus/org-bib-add-type (type)
    ;; TODO: maybe this can be made more effective?
    ;; Seems to work OK...
    `(org-add-link-type
      ,type
      'rasmus/org-bib-follow
      ,(lambda (path description backend)
	 (funcall 'rasmus/org-bib-format path description backend
                  ;; cite defaults to textcite
		  (if (equal type "cite") "textcite" type)))))
  
  (mapc (lambda (type) (funcall 'rasmus/org-bib-add-type type))
        '("cite" "textcite" "parentcite" "citeyear" "citeauthor"))
  
  (defun rasmus/org-bib-follow (path)
    "Find the pdf version of citation."
    (let* ((stream (read (format "(%s)" path))))
      (rasmus/find-lit (car head))))

  (defun rasmus/find-lit (key)
    "Open pdf file associated with KEY from `reftex-default-bibliography'."
    (let* ((bib (file-name-directory (car reftex-default-bibliography)))
           (file (concat bib path (concat "/" key ".pdf"))))
      (when (file-exists-p file) (find-file file))))

  (defun rasmus/org-bib-format (path description backend &optional type*)
    "Format a org-link citation.

Support links of the type

[[type*:key :pre PRE :post POST :type TYPE**]]

Or

[[Key*:key][POST;PRE]]

Based on John K's great post here:
    http://permalink.gmane.org/gmane.emacs.orgmode/94575"
    (let* ((key
            ;; key is a single symbol by assumption
            (and (string-match "\\` *\\([^ ]+\\) *" path)
                 (prog1 (match-string 1 path)
                   (setq path (replace-match "" nil nil path)))))
           ;; generate plist
           (data (read (format "(%s)"
                               (replace-regexp-in-string
                                "\\(:\\w+\\) \\([^:]+\\) ?" "\\1 \"\\2\" "
                                path))))
           (type (or (plist-get data :type) type* "textcite"))
           (pre  (org-trim (or (plist-get data :pre)
			       ;; support my "old" syntax
			       (and description
				    (cadr (split-string description ";"))) "")))
	   (post (org-trim
		  (or (funcall (lambda (txt)
				 (and txt
				      (let ((res (string-to-number txt)))
					(if (zerop res) txt
					  (concat (if (> (length txt) 1)  "pp." "p.") " " txt)))))
			       (plist-get data :post))
		      (and description
			   (car (split-string description ";")))
		      "")))
	   (entry (or (save-window-excursion
                        (bibtex-search-entry key t 0)
                        (bibtex-parse-entry))
                      (error (format "unknown key: %s" key))))
           (author (or (reftex-format-citation entry "%2a") ""))
           (year (or  (reftex-format-citation entry "%y") "")))
      (if (org-export-derived-backend-p backend 'latex)
          (format "\\%s[%s][%s]{%s}" type pre post key)
        ;; TODO: This should probably be wrapped in <cite>.</cite> with html...
        (cl-case (intern type)
          (parencite
           (format "(%s %s %s %s)"
                   pre author
                   (or (and (org-string-nw-p year) (concat year ", ")) "")
                   post))
          (citeyear
           (format "%s %s %s" pre year post))
          (citeauthor
           (format "%s %s %s" pre author post))
          (fullcite
           (reftex-format-citation entry reftex-cite-view-format))
          (t ;; textcite
           (format "%s (%s%s%s)"
                   author
                   (and (org-string-nw-p pre) (concat pre " "))
                   year
                   (and (org-string-nw-p post) (concat ", " post)))))))))


-- 
Dung makes an excellent fertilizer

  reply	other threads:[~2015-02-02 22:47 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-31 18:26 Citations, continued Richard Lawrence
2015-01-31 18:42 ` Nicolas Goaziou
2015-02-01 22:07   ` Richard Lawrence
2015-02-02 13:52     ` Rasmus
2015-02-02 17:25       ` Richard Lawrence
2015-02-02 18:09         ` Rasmus
2015-02-02 15:45     ` Erik Hetzner
2015-02-01 22:06 ` John Kitchin
2015-02-02  1:41   ` Richard Lawrence
2015-02-02  4:43     ` Thomas S. Dye
2015-02-02 13:56       ` John Kitchin
2015-02-02 18:11         ` Thomas S. Dye
2015-02-02 19:38           ` John Kitchin
2015-02-02 19:51           ` John Kitchin
2015-02-02 22:47             ` Rasmus [this message]
2015-02-03  0:54             ` Thomas S. Dye
2015-02-03  1:36               ` John Kitchin
2015-02-02 14:17       ` Rasmus
2015-02-02 16:58       ` Richard Lawrence
2015-02-02 14:07   ` Rasmus
2015-02-02 13:51 ` Rasmus
2015-02-02 15:09 ` Matt Price
2015-02-02 18:02 ` Richard Lawrence
2015-02-02 19:55   ` Rasmus
2015-02-03  1:56     ` Richard Lawrence
2015-02-03  2:08       ` Vikas Rawal
2015-02-03 10:55         ` Rasmus
2015-02-04 10:35         ` Julian M. Burgos
2015-02-04 16:34           ` John Kitchin
2015-02-03 10:35       ` Rasmus
2015-02-03 12:00         ` Eric S Fraga
2015-02-03 16:27           ` Richard Lawrence
2015-02-03 17:25             ` Eric S Fraga
2015-02-03  3:58   ` Erik Hetzner
2015-02-03  4:41     ` Richard Lawrence
2015-02-03  7:30       ` Erik Hetzner
2015-02-03 16:11         ` Richard Lawrence
2015-02-04  6:30           ` Erik Hetzner
2015-02-04 12:06             ` Nicolas Goaziou
2015-02-04 16:45               ` Richard Lawrence
2015-02-06 10:27                 ` Nicolas Goaziou
2015-02-06 22:41                   ` Richard Lawrence
2015-02-07 22:43                     ` Nicolas Goaziou
2015-02-08  2:46                       ` Richard Lawrence
2015-02-08  9:46                         ` John Kitchin
2015-02-08 17:09                           ` Richard Lawrence
2015-02-08 22:23                             ` Thomas S. Dye
2015-02-09  8:46                               ` e.fraga
2015-02-09 10:50                               ` Rasmus
2015-02-09 11:20                                 ` Nicolas Goaziou
2015-02-09 11:37                                   ` Rasmus
2015-02-10  9:06                                     ` Nicolas Goaziou
2015-02-09 15:09                                 ` Thomas S. Dye
2015-02-10  8:55                                   ` Nicolas Goaziou
2015-02-10  9:22                                     ` Rasmus
2015-02-10  9:41                                       ` Nicolas Goaziou
2015-02-10 10:01                                         ` Rasmus
2015-02-10 15:32                                     ` Thomas S. Dye
2015-02-10  1:50                                 ` John Kitchin
2015-02-09 17:46                               ` Richard Lawrence
2015-02-09 20:13                                 ` Rasmus
2015-02-10  1:32                                 ` John Kitchin
2015-02-10  4:04                                   ` Richard Lawrence
2015-02-10  5:23                                     ` John Kitchin
2015-02-10  6:20                                       ` Thomas S. Dye
2015-02-08  9:58                         ` Nicolas Goaziou
2015-02-08 17:18                           ` Richard Lawrence
2015-02-08 18:18                             ` Nicolas Goaziou
2015-02-08  9:28                       ` Rasmus
2015-02-08 10:18                         ` Nicolas Goaziou
2015-02-08 10:50                           ` Rasmus
2015-02-08 12:36                             ` Nicolas Goaziou
2015-02-08 13:40                               ` Rasmus
2015-02-08 16:11                                 ` Nicolas Goaziou
2015-02-09 10:02                                   ` Rasmus
2015-02-08 17:02                                 ` Nicolas Goaziou
2015-02-08 17:29                                   ` Rasmus
2015-02-10  1:54                                   ` John Kitchin
2015-02-10  8:49                                     ` Nicolas Goaziou
2015-02-10  9:20                                       ` Rasmus
2015-02-10 10:05                                         ` Nicolas Goaziou
2015-02-10 10:36                                           ` Rasmus
2015-02-10 10:53                                           ` Andreas Leha
2015-02-10 15:03                                         ` John Kitchin
2015-02-10 15:54                                           ` Rasmus
2015-02-10 16:14                                             ` John Kitchin
2015-02-10 16:22                                         ` Richard Lawrence
2015-02-10 16:44                                           ` Stefan Nobis
2015-02-11  2:07                                             ` Richard Lawrence
2015-02-11 10:19                                               ` Stefan Nobis
2015-02-11 16:51                                                 ` Richard Lawrence
2015-02-13  2:31                                                   ` Matt Price
2015-02-11 10:47                                         ` Aaron Ecay
2015-02-11 11:32                                           ` Rasmus
2015-02-10 16:04                                       ` Richard Lawrence
2015-02-11  2:10                                         ` Thomas S. Dye
2015-02-11  2:48                                           ` Richard Lawrence
2015-02-11  3:53                                             ` Thomas S. Dye
2015-02-06 23:37                   ` Rasmus
2015-02-06 23:16                 ` Rasmus
2015-02-04 17:44               ` Erik Hetzner
2015-02-04 15:59             ` Richard Lawrence
2015-02-04 17:58               ` Erik Hetzner
2015-02-04 19:24                 ` Richard Lawrence

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87bnlcdj7d.fsf@gmx.us \
    --to=rasmus@gmx.us \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).