複数の開いている PDF をサポートするために、emacs で synctex を拡張しますか?

複数の開いている PDF をサポートするために、emacs で synctex を拡張しますか?

使用この答え 私は emacs、syntex、evince をほぼ完璧に連携させて、前方検索 (tex ファイル -> pdf) と後方検索 (pdf -> tex ファイル) をサポートすることができました。私にとって欠けているのは、複数の開いている pdf のコピーからの検索のサポートです。

より詳細に言うと、技術論文を書くときに、pdf のコピーを複数開いておくのが私の習慣です (evince 内で ctrl+n を使ってコピーを開きます)。しかし、これを行うと、開いたコピーは emacs にリンクされなくなります。つまり、emacs から開いた元の pdf では ctrl+クリックが機能しますが、開いたコピー (evince 内で ctrl+n を実行して作成) 内では ctrl+クリックは機能しません。

これは emacs の問題というよりは evince の問題であると思われますが、私の質問は、2 番目の PDF からの逆検索が機能するようにするにはどうすればよいかということです。

答え1

これは の独自のソリューションに触発されたものですttb。emacs を dbus 信号に登録するコードは 関数内にありTeX-source-correlate-mode、次のようになります。

(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)))

したがって (ハッキーな解決策として)、同時に開くと思われるウィンドウの数だけ、0を に置き換えて同じコードを実行することができます。ii

したがって、全体として、次の内容を.emacsファイルに追加しました。

(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)

答え2

私は atril のコードを編集することでこの問題を解決しました。まだ見つかっていない emacs ベースのソリューションも存在する可能性があることに注意してください。

pdf -> tex 検索に関して、emacs <--> atril の相互作用がどのように機能するかについての背景を少し説明します。emacs では、dbus パス「/org/mate/atril/Window/0」でメッセージをリッスンし、atril は dbus パス「/org/mate/atril/Window/N」でメッセージを送信します。ここで、N はドキュメントの window_id です (window_id は、Ctrl+N を押してコピーを開くたびに増加します)。

したがって、問題は、コピーが emacs がリッスンしていない dbus パスでメッセージを送信していることです。これを機能させるためのハック的な方法は、window_id に関係なく、atril が常にパス "/org/mate/atril/Window/0" で synctex コマンドを送信するようにすることです。

これを行うには、ev_window_sync_sourceev-window.c で を見つけて、その関数内に表示される関数呼び出しの引数を変更します。具体的には、を にg_dbus_connection_emit_signal置き換えるだけで十分です。(これは、github で入手可能な atril 1.18.5 コードに適用されます)window->priv->dbus_object_pathg_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0)

答え3

Joj による上記のソリューションは非常に優れています。ただし、これは一方向です。つまり、複数の evince ウィンドウが複数の emacs バッファを指します。ソリューションを拡張して逆方向にも移動することは可能ですか。つまり、特定の emacs バッファをクリックすると、特定の evince ウィンドウに移動します。現在、どちらかの emacs バッファをクリックすると、元の evince ウィンドウにのみ移動し、evince ウィンドウのコピーには移動しません。[申し訳ありませんが、これは質問/コメントであり、回答ではありません]

関連情報