사용이 답변 저는 emacs, syntex, evince가 거의 완벽하게 함께 작동하여 정방향 검색(tex 파일 -> pdf)과 역방향 검색(pdf -> tex 파일)을 지원하도록 할 수 있었습니다. 나에게 누락된 한 가지는 여러 개의 열려 있는 PDF 사본에서 검색을 지원하는 것입니다.
더 자세히 설명하면 기술 문서를 작성할 때 PDF의 여러 복사본을 열어 두는 것이 내 습관이지만(evince 내부에서 ctrl+n을 사용하여 복사본 열기) 이렇게 하면 열린 복사본이 더 이상 emacs로 다시 연결되지 않습니다. 즉, ctrl+클릭은 emacs에서 열린 원본 PDF에서 작동하는 반면, 열린 복사본(evince 내에서 ctrl+n을 수행하여 생성됨) 내에서 ctrl+클릭은 효과가 없습니다.
내 생각엔 이것이 emacs 문제보다 더 명백한 문제일 수 있지만 내 질문은 두 번째 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
로 대체하여 실행할 수 있습니다.i
i
그래서 저는 다음과 같은 내용을 .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입니다. 문서(사본을 열 때마다 Ctrl+N을 실행할 때마다 window_id가 증가합니다).
따라서 문제는 복사본이 emacs가 수신하지 않는 dbus 경로에서 메시지를 보내고 있다는 것입니다. 이를 작동시키는 해킹 방법은 atril이 window_id에 관계없이 항상 "/org/mate/atril/Window/0" 경로에서 synctex 명령을 보내도록 하는 것입니다.
이렇게 하려면 ev-window.c에서 해당 함수에 나타나는 함수 호출 ev_window_sync_source
에 대한 인수를 수정합니다 . 구체적으로는 로 g_dbus_connection_emit_signal
대체하면 충분합니다 . (이는 github에서 사용 가능한 atril 1.18.5 코드에 적용됩니다.)window->priv->dbus_object_path
g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0)
답변3
Joj의 위 솔루션은 매우 훌륭합니다. 그러나 이는 한 방향으로 진행됩니다. 즉, 여러 개의 evince 창이 여러 개의 emacs 버퍼를 가리킵니다. 반대 방향으로도 이동하도록 솔루션을 확장할 수 있습니까? 즉, 특정 emacs 버퍼를 클릭하면 특정 evince 창으로 이동합니다. 지금은 Emacs 버퍼 중 하나를 클릭하면 원본 evince 창으로만 이동하고 evince 창의 복사본은 이동하지 않습니다. [죄송합니다: 이것은 답변이 아닌 질문/의견입니다.]