[Okular-devel] [PATCH] Re: how to invoke okular with inverse search with pdf?

Albert Astals Cid aacid at kde.org
Mon Dec 28 21:15:34 CET 2009


A Dilluns 28 Desembre 2009 09:26:39, Jochen Trumpf va escriure:
> On Saturday 26 December 2009 06:03:19 Albert Astals Cid wrote:
> > Yes i could and want to commit it, just that i would like to ask you for
> > a way to setup things so i can test the problem on my system and
> > understand better what the patch does. Could you give me through a way to
> > setup the files/programs needed to reproduce this behaviour?
> 
> OK. I am not sure how familiar you are with tex/latex, so I will start with
> the basics. My apologies if this is wasting your time.
> 
> The macro package latex sits on top of the tex typesetting engine and
>  provides in essence a markup language to describe the structure and
>  appearance of documents. In a sense it is similar to html just without the
>  focus on hyperlinks. A document written in latex gets compiled into a page
>  description format so it can be viewed or printed. The most common formats
>  for that are dvi (somewhat superseded I dare say) and pdf (the more modern
>  choice).
> 
> Since the description of the document (in a pure text document with latex
> syntax) and the viewable/printable version (in dvi or pdf) are typically
> handled by different programs, there is a need to "synchronise" between the
> two formats to enable "forward search" (= click on a source line in the
>  text editor will jump to the corresponding area of the page in the dvi/pdf
>  viewer) and "inverse search" (= click somewhere into the page in the
>  dvi/pdf viewer will locate the corresponding source code in the editor).
> 
> There are several combinations of editors/viewers that will handle this to
> varying degrees. My favourite combination is emacs plus okular. You can
>  also use kile, etc. More about this later.
> 
> The synchronization mechanism is provided by metadata, the format of which
>  has evolved somewhat over time.
> The current way for latex<->dvi are so called "source specials". They are
> particular byte sequences embedded into dvi files that carry information
>  about line numbers and source file names corresponding to symbols
>  ("glyphs") on the page.
> The current way for latex<->pdf is synctex. Here the metadata (in form of
> "nodes" linking pdf page coordinates and line/column numbers plus source
>  file names) is compressed and stored in a separate file (.synctex.gz).
> The tex compiler ("latex" for producing dvi resp. "pdflatex" for producing
> pdf) needs to be told to generate the metadata with a command line switch:
> "latex -src-specials test.tex" will produce test.dvi with embedded source
> specials, resp. "pdflatex -synctex=1 test.tex" will produce test.pdf and
> test.synctex.gz.
> 
> So the first thing you need is a modern tex distribution. I recommend
> texlive-2008 (or 2009 if it is available for your OS). You won't need the
> whole lot (it includes zillions of macro packages for all sorts of document
> types) but only a basic install that gives you the latex and pdflatex
> commands, basic fonts and basic macros. See http://www.tug.org/texlive/ for
> instructions. Most up-to date linux distributions ship texlive packages.
>  And please don't hesitate to ask if in doubt about anything.
> 
> Inverse search is usually implemented as follows. Upon receiving a click on
> the page the viewer determines the closest source reference from the
>  metadata and then calls the editor with a command line switch containing
>  source file name and line number. Upon receiving this the editor places
>  the cursor into that line. This creates the illusion that the page area in
>  the viewer is "linked" to the source code in the editor. If you then
>  change something in the source, you need to save the source file, run the
>  tex compiler and then your viewer should update automatically and show the
>  changes.
> 
> Using emacs this is very simple: just install the emacs macro package
>  auctex. It contains all the necessary commands for interaction with the
>  tex compiler and the dvi/pdf viewer. If you want to go down that route
>  please let me know and I will send you an excerpt of my init file for
>  emacs that works well in conjunction with okular. Otherwise just use your
>  favourite editor and invoke the tex compiler from a command line.
> 
> As far as I can tell inverse search in okular now works very well for both
>  dvi (using source specials) and pdf (using synctex). You just need to
>  configure your editor and use shift plus left mouse click to invoke
>  inverse search.
> 
> Now to the actual topic of this thread: forward search. Here the editor
>  calls the viewer either with a command line switch or via dbus (or any
>  other IPC mechanism). Typically, the editor provides the viewer with a
>  line number and a source file name and it is up to the viewer to locate a
>  corresponding source special or synctex link and set the viewport
>  accordingly.
> 
> While this has been working quite well since quite some time for
>  latex<->dvi (using source specials) in okular, the corresponding code for
>  latex<->pdf (using synctex) was missing. This is what my patch provides.
> 
> Forward search can be invoked with the command line syntax
> okular test.(dvi|pdf)#src:<line no.>test.tex
> Note that there are no blanks between the file names and the other stuff
>  and that the dvi/pdf file and the source (.tex) file need to be in the
>  same folder for this syntax to work. You can use paths if you need to.
>  This will cause okular to jump to a part of the document that corresponds
>  to the given line no. in the source document.
> 
> Now, even if you use my patch that provides the basic metadata lookup for
>  the latex<->pdf using synctex case, there are still a couple of bugs that
>  hinder productive use of forward search. I'll explain that next.
> 
> The real power of inverse and forward search comes if you configure your
> editor and your viewer in a way that no new program instance gets started
>  if the requested source or dvi/pdf file is already open. Then it really
>  feels like the viewer and the editor are magically linked and you get as
>  close to wysiwyg as you can with this sort of setup.
> 
> For emacs, this is done by using emacs server. The default editor
> configuration for emacs that is shipped with okular already does this. You
> just need to start the server from your emacs init file.
> 
> For okular, this is provided by the command line switch --unique that
> relegates the file open command to a dbus call on an existing instance.
>  This is where the bugs are. Bug #205076 concerns the handling of the
>  "#src:" syntax in the case of a dbus call. I have commented in detail in
>  the bug report including a possible fix. Bug #205084 concerns a bug in the
>  viewport update where the document has been reloaded via dbus. Again, I
>  have left detailed comments in the bug report including a possible fix.
>  This one requires somebody with a deeper understanding of viewport
>  handling to have a closer look.
> 
> So, summing up:
> 
> - get texlive-2008 (or 2009)
> - use a good editor such as emacs plus auctex plus my init macros for
> communication with okular (email me for the latter)
> - patch okular
> - test with a latex file
> 
> The easiest way to get a nontrivial latex file is to use one of the latex
> documentation files that come with texlive. They are written in latex ("eat
> your own dog food") ...
> 
> Puh, this was rather lengthy. Hope you didn't fall asleep in the meantime.
> Please ask if any of this is still unclear.

Thanks for the very detailed description, i've now commited the first of your 
patches with some modifications like fixing indentation, changing a indexOf with 
startsWith and not using m_ for not class variables.

Thanks a lot for the patch and sorry for taking so long.

I'll have a look at the two other patches now.

Albert

> 
> Cheers,
> Jochen
> _______________________________________________
> Okular-devel mailing list
> Okular-devel at kde.org
> https://mail.kde.org/mailman/listinfo/okular-devel
> 


More information about the Okular-devel mailing list