Estender o syntex com o emacs para suportar vários PDFs abertos?

Estender o syntex com o emacs para suportar vários PDFs abertos?

Usandoesta resposta Consegui fazer com que o emacs, o syntex e o evince funcionassem juntos quase perfeitamente para oferecer suporte à pesquisa direta (arquivo tex -> pdf) e pesquisa reversa (pdf -> arquivo tex). A única coisa que falta para mim é o suporte para pesquisa em várias cópias abertas do PDF.

Mais detalhadamente, é meu hábito, ao escrever artigos técnicos, ter várias cópias do pdf abertas (usando ctrl+n dentro do evince para abrir uma cópia), mas quando faço isso, a cópia aberta não está mais vinculada ao emacs. Ou seja, ctrl+clique funciona no pdf original aberto no emacs, enquanto ctrl+clique na cópia aberta (criada fazendo ctrl+n dentro do evince) não tem efeito.

Meu palpite é que isso pode ser mais um problema de evidência do que do emacs, mas minha pergunta é como posso fazer com que a pesquisa reversa do segundo pdf funcione?

Responder1

Isso é inspirado na ttbprópria solução. O código que registra o emacs no sinal dbus está na função TeX-source-correlate-modee se parece com isto:

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

Então (como uma solução hacky), você pode simplesmente executar o mesmo código 0substituído ipor por quantas ivocê achar que terá janelas abertas ao mesmo tempo.

Então, ao todo, coloquei o seguinte em meu .emacsarquivo:

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

Responder2

Resolvi isso editando o código do atril. Observe que também pode existir uma solução baseada em emacs ainda a ser encontrada.

Um pouco de conhecimento sobre como a interação emacs <--> atril funciona com relação a pesquisas em pdf -> tex. No emacs, ouvimos mensagens no caminho dbus "/org/mate/atril/Window/0", e atril envia mensagens no caminho dbus "/org/mate/atril/Window/N" onde N é o window_id de o documento (o window_id é incrementado cada vez que fazemos Ctrl+N para abrir uma cópia).

Portanto, o problema é que as cópias estão enviando mensagens em um caminho dbus que o emacs não está escutando. Uma maneira hackeada de fazer isso funcionar é fazer com que o atril sempre envie os comandos syntex no caminho "/org/mate/atril/Window/0", independentemente do window_id.

Para fazer isso: localize ev_window_sync_sourceem ev-window.c e modifique os argumentos para a g_dbus_connection_emit_signalchamada de função que aparece nessa função. Especificamente, basta substituir window->priv->dbus_object_pathpor g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0). (Isso se aplica ao código atril 1.18.5 disponível no github)

Responder3

A solução acima de Joj é muito boa. Mas isso acontece em um sentido, ou seja, múltiplas janelas de evidência apontam para vários buffers do emacs. É possível estender a solução para também seguir o caminho inverso, ou seja, se eu clicar em um buffer específico do emacs, ele vai para uma janela específica do evince. No momento, quando clico em qualquer buffer do emacs, ele vai apenas para a janela do evince original e não para a cópia da janela do evince. [Desculpe: esta é uma pergunta/comentário, não uma resposta]

informação relacionada