emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] Specify page number in hyperlink [to pdf]


From: Nick Dokos
Subject: Re: [Orgmode] Specify page number in hyperlink [to pdf]
Date: Fri, 30 Apr 2010 04:10:34 -0400

Joe Riel <address@hidden> wrote:

> Jan Böcker wrote:
> > On 28.04.2010 20:30, Joe Riel wrote:
> >   
> >> The hyperlink syntax allows specifying a line number, however,
> >> that doesn't do anything (other than force the document to
> >> be opened inside of emacs) with a non-text file (say a pdf).
> >>
> >> Is therea an extension to allow specifying a page number
> >> so that a link to a pdf is opened at the specified page?
> >>     
> >
> > There is in the current git version, its not yet documented though.
> >
> >
> > Add an entry to the variable org-file-apps like this:
> > ("\\.pdf::\\([0-9]+\\)\\'" . "evince \"%s\" -p %1")
> >
> > Or as seen in the customize interface:
> > Extension: \.pdf::\([0-9]+\)\'
> > Command:   evince "%s" -p %1
> >
> > The subexpression \([0-9]+\) in the regex captures the page number,
> > which replaces the %1 in the command string. (This example assumes you
> > want to open your PDFs with evince, which accepts a page number after
> > the -p option.)
> >
> > You can then reference a specific page of a PDF like this:
> > [[file:/path/to/document.pdf::42]]
> >
> > I had planned to document this yesterday, but unfortunately spent the
> > better part of the day recovering from a cold. I will send a patch
> > describing how this works, when exactly the new behaviour kicks in and
> > the implications for backwards compatibility as soon as I find time to
> > describe it compactly enough to fit into the docstring.
> >
> > HTH, Jan
> >   
> A related question; can this extension be used with link abbreviations?
> 
> I tried
> 
> #+LINK: sample file:/home/joe/sample.pdf
> 
> with
> 
> [[sample::3]]
> 
> but that does not work.
> 


This happens in org-link-expand-abbrev: it splits sample::3 into
"sample" and "3", looks up "sample" in org-link-abbrev-alist and
performs the replacement, then returns the concatenation of that with
the "3" part, thereby eliminating the "::" marker that would trigger the
further processing necessary to open the pdf file at the given page.

You could try

#+LINK: sample file:/home/joe/sample.pdf::%s

This will work with the [[sample::3]] link, but not with [[sample]].

Alternatively, you could modify the function to keep the "::" marker
(at least conditionally: leave it there if it's already there). That
would make both of the above work and I think all the examples of
section 4.6 would work as well. Here is a very lighly tested patch:

diff --git a/lisp/org.el b/lisp/org.el
index 9920504..3ede9c4 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -7703,6 +7703,7 @@ call CMD."
       (let* ((key (match-string 1 link))
             (as (or (assoc key org-link-abbrev-alist-local)
                     (assoc key org-link-abbrev-alist)))
+            (colontype (and (match-end 1) (match-beginning 3) (substring 
(match-string 2 link) 0 (- (match-beginning 3) (match-end 1)))))
             (tag (and (match-end 2) (match-string 3 link)))
             rpl)
        (if (not as)
@@ -7713,6 +7714,7 @@ call CMD."
           ((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
           ((string-match "%h" rpl)
            (replace-match (url-hexify-string (or tag "")) t t rpl))
+          ((string-equal colontype "::") (concat rpl colontype tag))
           (t (concat rpl tag)))))
     link))

HTH,
Nick






reply via email to

[Prev in Thread] Current Thread [Next in Thread]