С использованиемэтот ответ Мне удалось заставить emacs, syntex и evince работать вместе почти идеально, чтобы поддерживать прямой поиск (tex-файл -> pdf) и обратный поиск (pdf -> tex-файл). Единственное, чего мне не хватает, — это поддержки поиска из нескольких открытых копий pdf.
Если говорить более подробно, то при написании технических статей я привык открывать несколько копий pdf-файла (используя ctrl+n внутри evince для открытия копии), но когда я это делаю, открытая копия больше не ссылается на emacs. То есть ctrl+клик работает в исходном pdf-файле, открытом из emacs, тогда как ctrl+клик в открытой копии (созданной с помощью ctrl+n внутри evince) не имеет никакого эффекта.
Я предполагаю, что это скорее проблема evince, чем 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, которое еще предстоит найти.
Немного предыстории о том, как работает взаимодействие emacs <--> atril в отношении поиска pdf -> tex. В emacs мы слушаем сообщения на пути dbus "/org/mate/atril/Window/0", а atril отправляет сообщения на пути dbus "/org/mate/atril/Window/N", где N — это window_id документа (window_id увеличивается каждый раз, когда мы нажимаем Ctrl+N, чтобы открыть копию).
Следовательно, проблема в том, что копии отправляют сообщения по пути dbus, который emacs не слушает. Хакерский способ заставить это работать — просто заставить atril всегда отправлять команды synctex по пути "/org/mate/atril/Window/0", независимо от window_id.
Для этого: найдите ev_window_sync_source
в ev-window.c и измените аргументы g_dbus_connection_emit_signal
вызова функции, который появляется в этой функции. В частности, достаточно заменить window->priv->dbus_object_path
на g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0)
. (Это относится к коду atril 1.18.5, доступному на github)
решение3
Решение выше от Joj очень хорошее. Но оно работает в одну сторону, т. е. несколько окон evince указывают на несколько буферов emacs. Возможно ли расширить решение, чтобы оно работало и в обратную сторону, т. е. если я нажимаю на определенный буфер emacs, он переходит в определенное окно evince? Сейчас, когда я нажимаю на любой буфер emacs, он переходит только в исходное окно evince, а не в копию окна evince. [Извините: это вопрос/комментарий, а не ответ]