ROCKTAKEY / lsp-latex

Emacs lsp-mode client for LaTeX, on texlab.
GNU General Public License v3.0
66 stars 4 forks source link
emacs emacs-lisp lsp texlab

[[https://github.com/ROCKTAKEY/lsp-latex][https://img.shields.io/github/tag/ROCKTAKEY/lsp-latex.svg?style=flat-square]] [[file:LICENSE][https://img.shields.io/github/license/ROCKTAKEY/lsp-latex.svg?style=flat-square]] [[https://github.com/ROCKTAKEY/lsp-latex/actions][https://img.shields.io/github/actions/workflow/status/ROCKTAKEY/lsp-latex/CI.yml.svg?style=flat-square]] [[https://melpa.org/#/lsp-latex][file:https://melpa.org/packages/lsp-latex-badge.svg]]

+BEGIN_SRC emacs-lisp -n

(add-to-list 'load-path "/path/to/lsp-latex") (require 'lsp-latex) ;; "texlab" executable must be located at a directory contained in `exec-path'. ;; If you want to put "texlab" somewhere else, ;; you can specify the path to "texlab" as follows: ;; (setq lsp-latex-texlab-executable "/path/to/texlab")

(with-eval-after-load "tex-mode" (add-hook 'tex-mode-hook 'lsp) (add-hook 'latex-mode-hook 'lsp))

;; For YaTeX (with-eval-after-load "yatex" (add-hook 'yatex-mode-hook 'lsp))

;; For bibtex (with-eval-after-load "bibtex" (add-hook 'bibtex-mode-hook 'lsp))

+END_SRC

| Custom variable in Emacs | Configuration provided by Texlab | |---------------------------------+----------------------------------| | lsp-latex-clean-auxiliary | texlab.cleanAuxiliary | | lsp-latex-clean-artifacts | texlab.cleanArtifacts | | lsp-latex-change-environment | texlab.changeEnvironment | | lsp-latex-find-environments | texlab.findEnvironments | | lsp-latex-show-dependency-graph | texlab.showDependencyGraph | | lsp-latex-cancel-build | texlab.cancelBuild |

** =lsp-latex-clean-auxiliary= This command removes LaTeX auxiliary files. It will run =latexmk -c= in the project.

** =lsp-latex-clean-artifacts= This command removes LaTeX auxiliary files and artifacts It will run =latexmk -C= in the project.

** =lsp-latex-change-environment= This command replaces enviroment name to NEW-NAME in current position. This edits most-inner environment containing the current position.

** =lsp-latex-find-environments= This function get list of environments containing the current point. Each element of the list is =lsp-latex-environment-location= instance. See the docstring of =lsp-latex-environment-location=.

*** =lsp-latex-complete-environment= This function reads environment name from minibuffer and returns =lsp-latex-environment-location= instance.

It takes three arguments, =BUFFER=, =POINT=, =PROMPT=. =PROMPT= is used as prompt for =consult--read=, which is wrapper of =completing-read=. =BUFFER= and =POINT= specify basis to find environments.

=lsp-latex-show-dependency-graph= Show dependency graph written by DOT format. [[https://ppareit.github.io/graphviz-dot-mode/][=graphviz-dot-mode=]] is needed if you needs syntax highlights or a graphical image. =lsp-latex-cancel-build= This command request Texlab to cancel the proceeding build.

** =lsp-latex-goto-environment= Go to selected environment containing the current point.

** =lsp-latex-select-and-change-environment= Change name of selected environment to NEW-NAME.

** Forward search You can move from Emacs to current position on pdf viewer by the function ~lsp-latex-forward-search~. To use, you should set ~lsp-latex-forward-search-executable~ and ~lsp-latex-forward-search-args~ according to your pdf viewer.

You can see [[https://github.com/latex-lsp/texlab/wiki/Previewing][Texlab official wiki]], but you should replace some VSCode words with Emacs words. ~latex.forwardSearch.executable~ should be replaced with ~lsp-latex-forward-search-executable~, and ~latex.forwardSearch.args~ with ~lsp-latex-forward-search-args~. You should setq each variable instead of writing like json, and vector in json is replaced to list in Emacs Lisp. So the json:

+BEGIN_SRC json :tangle yes

 {
        "texlab.forwardSearch.executable": "FavoriteViewer",
        "texlab.forwardSearch.args": [ "%p", "%f", "%l" ]
 }

+END_SRC

should be replaced with the Emacs Lisp code:

+begin_src emacs-lisp :tangle yes

 (setq lsp-latex-forward-search-executable "FavoriteViewer")
 (setq lsp-latex-forward-search-args '("%p" "%f" "%l"))

+end_src

In ~lsp-latex-forward-search-args~, the string "%f" is replaced with "The path of the current TeX file", "%p" with "The path of the current PDF file", "%l" with "The current line number", by Texlab (see [[https://github.com/latex-lsp/texlab/wiki/Configuration#texlabforwardsearchargs][Forward search arg section in Texlab official wiki]]).

For example of SumatraPDF, write in init.el:

+begin_src emacs-lisp :tangle yes

 (setq lsp-latex-forward-search-executable "C:/Users/{User}/AppData/Local/SumatraPDF/SumatraPDF.exe")
 (setq lsp-latex-forward-search-args '("-reuse-instance" "%p" "-forward-search" "%f" "%l"))

+end_src

while VSCode config with json (see [[https://github.com/latex-lsp/texlab/wiki/Previewing#forward-search][Texlab official wiki]]) is:

+BEGIN_SRC json :tangle yes

 {
   "texlab.forwardSearch.executable": "C:/Users/{User}/AppData/Local/SumatraPDF/SumatraPDF.exe",
   "texlab.forwardSearch.args": [
     "-reuse-instance",
     "%p",
     "-forward-search",
     "%f",
     "%l"
   ]
 }

+END_SRC

Then, you can jump to the current position on pdf viewer by command ~lsp-latex-forward-search~.

** Inverse search You can go to the current position on Emacs from pdf viewer. Whatever pdf viewer you use, you should start Emacs server by writing in init.el:

+begin_src emacs-lisp :tangle yes

 (server-start)

+end_src

Then, you can jump to line {{LINE-NUMBER}} in file named {{FILENAME}} with the command:

+BEGIN_SRC shell -n

 emacsclient +{{LINE-NUMBER}} {{FILENAME}}

+END_SRC

{{LINE-NUMBER}} and {{FILENAME}} should be replaced with line number and filename you want to jump to. Each pdf viewer can provide some syntax to replace.

For example of SmatraPDF (see [[https://github.com/latex-lsp/texlab/wiki/Previewing#inverse-search][Texlab official wiki]]), "Add the following line to your SumatraPDF settings file (Menu -> Settings -> Advanced Options):"

+BEGIN_SRC ini -n

InverseSearchCmdLine = C:\path\to\emacsclient.exe +%l %f

+END_SRC

Then, "You can execute the search by pressing Alt+DoubleClick in the PDF document".

** Examples These examples are according to [[https://github.com/latex-lsp/texlab/wiki/Previewing][Texlab official wiki]]. Especially, quoted or double-quoted sentences are citation from [[https://github.com/latex-lsp/texlab/wiki/Previewing][Texlab official wiki]]. *** SumatraPDF

+BEGIN_QUOTE

    We highly recommend SumatraPDF on Windows
    because Adobe Reader locks the opened PDF file and will therefore prevent further builds.
#+END_QUOTE

**** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "C:/Users/{User}/AppData/Local/SumatraPDF/SumatraPDF.exe")
   (setq lsp-latex-forward-search-args '("-reuse-instance" "%p" "-forward-search" "%f" "%l"))
 #+end_src

**** Inverse Search

+BEGIN_QUOTE

 Add the following line to your [[https://www.sumatrapdfreader.org/][SumatraPDF]] settings file (Menu -> Settings -> Advanced Options):
 #+END_QUOTE
 #+BEGIN_SRC ini -n
   InverseSearchCmdLine = C:\path\to\emacsclient.exe +%l "%f"
 #+END_SRC
 #+BEGIN_QUOTE
 You can execute the search by pressing =Alt+DoubleClick= in the PDF document.
 #+END_QUOTE

*** Evince

+BEGIN_QUOTE

The SyncTeX feature of [[https://wiki.gnome.org/Apps/Evince][Evince]] requires communication via D-Bus.
In order to use it from the command line, install the [[https://github.com/latex-lsp/evince-synctex][evince-synctex]] script.
#+END_QUOTE

**** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "evince-synctex")
   (setq lsp-latex-forward-search-args '("-f" "%l" "%p" "\"emacsclient +%l %f\""))
 #+end_src

**** Inverse search

+BEGIN_QUOTE

 The inverse search feature is already configured if you use =evince-synctex=.
 You can execute the search by pressing =Ctrl+Click= in the PDF document.
 #+END_QUOTE

* Okular ** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "okular")
   (setq lsp-latex-forward-search-args '("--unique" "file:%p#src:%l%f"))
 #+end_src

**** Inverse search

+BEGIN_QUOTE

 Change the editor of Okular (Settings -> Configure Okular... -> Editor)
 to "Custom Text Editor" and set the following command:
 #+END_QUOTE
 #+begin_src shell :tangle yes
   emacsclient +%l "%f"
 #+end_src
 You can execute the search by pressing =Shift+Click= in the PDF document.

* Zathura ** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "zathura")
   (setq lsp-latex-forward-search-args '("--synctex-forward" "%l:1:%f" "%p"))
 #+end_src

**** Inverse search

+BEGIN_QUOTE

 Add the following lines to your =~/.config/zathura/zathurarc= file:
 #+END_QUOTE
 #+BEGIN_SRC shell -n
   set synctex true
   set synctex-editor-command "emacsclient +%{line} %{input}"
 #+END_SRC
 #+BEGIN_QUOTE
 You can execute the search by pressing =Alt+Click= in the PDF document.
 #+END_QUOTE

* qpdfview ** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "qpdfview")
   (setq lsp-latex-forward-search-args '("--unique" "%p#src:%f:%l:1"))
 #+end_src

**** Inverse search

+BEGIN_QUOTE

 Change the source editor setting (Edit -> Settings... -> Behavior -> Source editor) to:
 #+END_QUOTE
 #+BEGIN_SRC shell -n
   emacsclient +%2 "%1"
 #+END_SRC
 #+BEGIN_QUOTE
 and select a mouse button modifier (Edit -> Settings... -> Behavior -> Modifiers ->
 Mouse button modifiers -> Open in Source Editor)of choice.
 You can execute the search by pressing Modifier+Click in the PDF document.
 #+END_QUOTE

*** Skim

+BEGIN_QUOTE

We recommend [[https://skim-app.sourceforge.io/][Skim]] on macOS since it is the only native viewer that supports SyncTeX.
Additionally, enable the "Reload automatically" setting in the Skim preferences
(Skim -> Preferences -> Sync -> Check for file changes).
#+END_QUOTE

**** Forward search Write to init.el:

+begin_src emacs-lisp :tangle yes

   (setq lsp-latex-forward-search-executable "/Applications/Skim.app/Contents/SharedSupport/displayline")
   (setq lsp-latex-forward-search-args '("%l" "%p" "%f"))
 #+end_src
 "If you want Skim to stay in the background after executing the forward search,
 you can add the =-g= option to" =lsp-latex-forward-search-args=.

* Inverse search Select Emacs preset "in the Skim preferences (Skim -> Preferences -> Sync -> PDF-TeX Sync support). You can execute the search by pressing =Shift+⌘+Click= in the PDF document." ~pdf-tools~ integration If you want to use forward search with ~pdf-tools~, follow the setting:

+begin_src emacs-lisp :tangle yes

  ;; Start Emacs server
  (server-start)
  ;; Turn on SyncTeX on the build.
  ;; If you use `lsp-latex-build', it is on by default.
  ;; If not (for example, YaTeX or LaTeX-mode building system),
  ;; put to init.el like this:
  (setq tex-command "platex --synctex=1")

  ;; Setting for pdf-tools
  (setq lsp-latex-forward-search-executable "emacsclient")
  (setq lsp-latex-forward-search-args
        '("--eval"
          "(lsp-latex-forward-search-with-pdf-tools \"%f\" \"%p\" \"%l\")"))
#+end_src
Inverse research is not provided by Texlab,
so please use ~pdf-sync-backward-search-mouse~.