Verwenden vondiese Antwort Ich konnte Emacs, Syntex und Evince nahezu perfekt zusammenarbeiten lassen, um die Vorwärtssuche (Tex-Datei -> PDF) und die Rückwärtssuche (PDF -> Tex-Datei) zu unterstützen. Was mir fehlt, ist die Unterstützung für die Suche in mehreren offenen Kopien des PDF.
Genauer gesagt ist es meine Gewohnheit, beim Schreiben technischer Dokumente mehrere Kopien der PDF-Datei geöffnet zu haben (indem ich Strg+N in Evince verwende, um eine Kopie zu öffnen), aber wenn ich das mache, wird die geöffnete Kopie nicht mehr auf Emacs zurückverlinkt. Das heißt, Strg+Klick funktioniert in der ursprünglichen PDF-Datei, die von Emacs geöffnet wurde, während Strg+Klick in der geöffneten Kopie (erstellt durch Strg+N in Evince) keine Wirkung hat.
Ich vermute, dass es sich hier eher um ein Evince- als um ein Emacs-Problem handelt, aber meine Frage ist nun, wie ich es hinbekomme, dass die Rückwärtssuche aus der zweiten PDF-Datei funktioniert?
Antwort1
Dies ist inspiriert von ttb
der eigenen Lösung von . Der Code, der Emacs für das Dbus-Signal registriert, befindet sich in der Funktion TeX-source-correlate-mode
und sieht folgendermaßen aus:
(dolist (de-app '(("gnome" "evince") ("mate" "atril") ("x" "reader")))
(when (TeX-evince-dbus-p (car de-app) (cadr de-app))
(dbus-register-signal
:session nil (format "/org/%s/%s/Window/0" (car de-app) (cadr de-app))
(format "org.%s.%s.Window" (car de-app) (cadr de-app))
"SyncSource"
'TeX-source-correlate-sync-source)))
Sie können also (als Hack-Lösung) einfach denselben Code mit 0
dem Ersatz durch i
für so viele i
Fenster ausführen, wie Sie Ihrer Meinung nach gleichzeitig geöffnet haben werden.
Insgesamt habe ich also Folgendes in meine .emacs
Datei eingetragen:
(defun my/add-ten-more-synctex-windows ()
(dotimes (i 10)
(dolist (de-app '(("gnome" "evince") ("mate" "atril") ("x" "reader")))
(when (TeX-evince-dbus-p (car de-app) (cadr de-app))
(dbus-register-signal
:session nil (format "/org/%s/%s/Window/%d" (car de-app) (cadr de-app) (1+ i))
(format "org.%s.%s.Window" (car de-app) (cadr de-app))
"SyncSource"
'TeX-source-correlate-sync-source)))))
(add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
(add-hook 'LaTeX-mode-hook 'my/add-ten-more-synctex-windows)
Antwort2
Ich habe das Problem gelöst, indem ich den Code für atril bearbeitet habe. Beachten Sie, dass es möglicherweise auch eine noch zu findende Emacs-basierte Lösung gibt.
Ein wenig Hintergrundwissen darüber, wie die Interaktion zwischen Emacs und Atril in Bezug auf PDF -> Tex-Suchen funktioniert. In Emacs lauschen wir auf Nachrichten auf dem Dbus-Pfad „/org/mate/atril/Window/0“, und Atril sendet Nachrichten auf dem Dbus-Pfad „/org/mate/atril/Window/N“, wobei N die Fenster-ID des Dokuments ist (die Fenster-ID wird jedes Mal erhöht, wenn wir Strg+N drücken, um eine Kopie zu öffnen).
Das Problem besteht also darin, dass die Kopien Nachrichten über einen Dbus-Pfad senden, den Emacs nicht abhört. Eine Möglichkeit, dies zu erreichen, besteht darin, atril die Synctex-Befehle immer über den Pfad „/org/mate/atril/Window/0“ senden zu lassen, unabhängig von der Fenster-ID.
Gehen Sie dazu folgendermaßen vor: Suchen Sie ev_window_sync_source
in ev-window.c nach und ändern Sie die Argumente des g_dbus_connection_emit_signal
Funktionsaufrufs, der in dieser Funktion erscheint. Insbesondere genügt es, window->priv->dbus_object_path
durch zu ersetzen g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0)
. (Dies gilt für den atril 1.18.5-Code, der auf GitHub verfügbar ist.)
Antwort3
Die obige Lösung von Joj ist sehr gut. Aber sie funktioniert nur in eine Richtung, d. h. mehrere Evince-Fenster verweisen auf mehrere Emacs-Puffer. Ist es möglich, die Lösung so zu erweitern, dass sie auch in die entgegengesetzte Richtung funktioniert, d. h. wenn ich auf einen bestimmten Emacs-Puffer klicke, wird ein bestimmtes Evince-Fenster angezeigt. Wenn ich jetzt auf einen der Emacs-Puffer klicke, wird nur das ursprüngliche Evince-Fenster angezeigt und nicht die Kopie des Evince-Fensters. [Entschuldigung: Dies ist eine Frage/ein Kommentar, keine Antwort]