Synctex mit Emacs erweitern, um mehrere geöffnete PDFs zu unterstützen?

Synctex mit Emacs erweitern, um mehrere geöffnete PDFs zu unterstützen?

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 ttbder eigenen Lösung von . Der Code, der Emacs für das Dbus-Signal registriert, befindet sich in der Funktion TeX-source-correlate-modeund 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 0dem Ersatz durch ifür so viele iFenster ausführen, wie Sie Ihrer Meinung nach gleichzeitig geöffnet haben werden.

Insgesamt habe ich also Folgendes in meine .emacsDatei 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_sourcein ev-window.c nach und ändern Sie die Argumente des g_dbus_connection_emit_signalFunktionsaufrufs, der in dieser Funktion erscheint. Insbesondere genügt es, window->priv->dbus_object_pathdurch 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]

verwandte Informationen