Zum Schreiben von LaTeX in Vim oder Neovim ist der De-facto-Standard das vimtex-Plugin von Karl Yngve Lervåg. Es bietet Kompilierung, Navigation zwischen Inhaltsverzeichnis und Beschriftungen, Bewegungen und Textobjekte, die auf Umgebungen und Befehle wirken, Vervollständigung und Zwei-Wege-Sprünge mit Ihrem PDF-Viewer – alles, ohne den Editor zu verlassen. Auf dieser Seite werden die Installation und Konfiguration von vimtex, die Vervollständigung und die inverse Suche über SyncTeX erläutert.
Was Vimtex ist
Weder Vim noch Neovim setzen TeX selbst; Das eigentliche Kompilieren erfolgt durch eine von Ihnen installierte Distribution – TeX Live (oder MiKTeX / MacTeX). vimtex ist die Brücke: ein Dateityp- und Syntax-Plugin für .tex. Wenn es den tex-Dateityp erkennt, aktiviert es automatisch Build-Befehle, Syntaxhervorhebung, eine Vervollständigungsfunktion (omnifunc), eine Inhaltsverzeichnisansicht, einen Sprung zur Definition für \ref/\cite sowie Textobjekte für Umgebungen, Trennzeichen und Befehle. Sein Kern funktioniert ohne externe Abhängigkeiten; Vervollständigung und Snippets werden mit Plugins Ihrer Wahl gepaart.
Es gibt drei Voraussetzungen. Erstens müssen die TeX-Befehle auf Ihrem PATH erreichbar sein – vimtex erzeugt latexmk und Freunde als untergeordnete Prozesse. Wenn latexmk --version also in einem Terminal ausgeführt wird, ist das mit ziemlicher Sicherheit in Ordnung. Zweitens verwenden Sie Vim 9.1 oder neuer oder Neovim 0.10 oder neuer, je nach aktuellem Vimtex. Drittens muss für Vim die Dateityperkennung und Syntax aktiviert sein. Ihr vimrc/init.vim benötigt diese beiden Zeilen (die meisten Konfigurationen haben sie bereits):
filetype plugin indent on
syntax enableEinrichtung
Normalerweise installieren Sie vimtex mit einem Plugin-Manager – vim-plug für Vim, lazy.nvim für Neovim sind die häufigsten Optionen. Ein wichtiger Vorbehalt: Vimtex nicht verzögert laden. Wie das Projekt explizit dokumentiert, unterbricht das Laden nach der Erkennung des Dateityps die unten beschriebene inverse Suche. Als Faustregel gilt lazy = false in lazy.nvim, ein explizites Laden in packer und keine for-basierte Lazy-Spezifikation in vim-plug.
Unten finden Sie ein minimales Vim-Setup (vim-plug). Deklarieren Sie das Plugin, aktivieren Sie Dateityp/Syntax und wählen Sie einen PDF-Viewer mit g:vimtex_view_method aus, und es beginnt zu funktionieren. Da maplocalleader (der lokale Leader) der Einstiegspunkt für die Befehle von vimtex ist, ist es beruhigend, ihn explizit festzulegen (der Standardwert ist Backslash \).
call plug#begin()
Plug 'lervag/vimtex'
call plug#end()
filetype plugin indent on
syntax enable
let maplocalleader = ' ' " use Space as <localleader>
let g:vimtex_view_method = 'zathura' " 'skim' on macOS, 'sumatrapdf' on Windows
let g:vimtex_compiler_method = 'latexmk'In Neovim (lazy.nvim) schreiben Sie dasselbe in Lua. Durch das Festlegen der Variablen in init werden diese wirksam, bevor der Plugin-Körper geladen wird. lazy = false nicht vergessen:
return {
"lervag/vimtex",
lazy = false, -- do NOT lazy-load: it breaks inverse search
init = function()
vim.g.vimtex_view_method = "zathura" -- "skim" / "sumatrapdf"
vim.g.vimtex_compiler_method = "latexmk"
end,
}Öffnen Sie eine .tex-Datei und die von <localleader>l eingegebenen Befehle werden verfügbar. Die vier, die es wert sind, sich zuerst zu merken, sind:
| Aktion | Standardzuordnung | Was es bewirkt |
|---|---|---|
compile | \ll | Kontinuierliche Kompilierung über latexmk starten/stoppen; wird bei jedem Speichern automatisch neu erstellt |
view | \lv | Öffnen Sie PDF und Vorwärtssuche (Quelle → PDF) bis zum Cursor |
clean | \lc | Hilfsdateien bereinigen (.aux, .log, …) |
stop | \lk | Stoppen Sie die laufende Kompilierung (\lK stoppt alle) |
In der Praxis: Drücken Sie einmal \ll und latexmk bleibt resident und aktualisiert PDF bei jedem weiteren Speichern. Verwenden Sie \lv, um die aktuelle Stelle im PDF anzuzeigen, und \le, um Fehler in die Quickfix-Liste einzutragen und zur fehlerhaften Zeile zu springen. Was die Eingabe betrifft: Wenn der lokale Anführer immer noch \ ist, drücken Sie \ll; Wenn Sie es auf Space umgestellt haben, drücken Sie <Space>ll und so weiter.
Der Standard-Compiler ist latexmk und vimtex übergibt Optionen wie -verbose -file-line-error -synctex=1 -interaction=nonstopmode für Sie. Insbesondere ist -synctex=1 standardmäßig aktiviert, sodass die für die Vorwärts- und Rückwärtssuche unten erforderlichen Synchronisierungsdaten ohne zusätzliche Einrichtung ausgegeben werden. Um stattdessen Tectonic zu verwenden, legen Sie g:vimtex_compiler_method = "tectonic"; latexrun und arara sind ebenfalls verfügbar.
Für Japanisch besteht der sauberste Ansatz darin, .latexmkrc die Engine auswählen zu lassen. Das latexmk-Backend von vimtex liest $pdf_mode aus .latexmkrc, um den Verarbeitungspfad zu bestimmen (1 = pdfLaTeX direkt, 3 = ein DVI erstellen und dann mit dvipdfmx, 4 = konvertieren). LuaLaTeX). Beachten Sie, dass Engine-Flags wie -pdf/-lualatex nicht zu options von vimtex hinzugefügt werden sollten; Geben Sie sie in .latexmkrc oder über g:vimtex_compiler_latexmk_engines an. Hier ist ein upLaTeX + dvipdfmx-Aufbau – die klassische Kombination für japanische Arbeiten in den Naturwissenschaften:
$latex = 'uplatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$bibtex = 'upbibtex %O %B';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
$makeindex = 'upmendex %O -o %D %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;
$max_repeat = 5;Die wichtigsten Punkte: Weisen Sie uplatex $latex und dvipdfmx $dvipdf zu und stellen Sie dann $pdf_mode = 3 so ein, dass der Pfad „Zxqph18xz erstellen, dann mit dvipdfmx in PDF konvertieren“ ausgewählt wird. Durch die Übergabe von -synctex=1 an $latex werden die SyncTeX-Daten auch über DVI an PDF weitergeleitet. Wenn Sie Japanisch mit LuaLaTeX setzen, benötigen Sie überhaupt kein .latexmkrc – lassen Sie einfach g:vimtex_compiler_latexmk_engines lualatex auswählen oder schreiben Sie $pdf_mode = 4 (vorausgesetzt, luatexja/ltjsclasses).
Fertigstellung
vimtex bietet kontextbewusste Kandidaten über die Standardvervollständigungsfunktion von Vim (omnifunc). In einem tex-Puffer setzt es omnifunc=vimtex#complete#omnifunc automatisch, sodass es einsatzbereit ist, solange g:vimtex_complete_enabled (Standard 1) aktiviert ist. Die wichtigsten Dinge, die es vervollständigt:
\cite{...}– liest.bib-Dateien und\bibitems, um Zitierschlüssel zu vervollständigen.\ref{...}/\eqref{...}– sammelt die\labels im Dokument, um Referenzen zu vervollständigen.- Befehle und Umgebungen –
\commands- und\begin{...}-Umgebungsnamen entsprechend den von Ihnen geladenen Paketen. - Dateinamen – Pfade für Abbildungen,
\input/\include,\includepdfund dergleichen. - Glossar und Paketnamen –
glossaries-Einträge und Paketnamen basierend auf den verfügbaren.sty/.cls-Dateien.
Drücken Sie im einfachen Vim-Modus Ctrl-X Ctrl-O (den Omni-Completion-Trigger) im Einfügemodus und die Kandidaten werden angezeigt. Geben Sie beispielsweise „\cite{“ und dann „Ctrl-X Ctrl-O“ ein, und Ihre Zitierschlüssel werden aufgelistet. Es ist jedoch mühsam, diese Taste jedes Mal zu drücken. In der Praxis verknüpfen die Leute daher die Omnifunktion mit einer Vervollständigungs-Engine, die automatisch Vorschläge anzeigt, während Sie tippen.
Für ein modernes Neovim-Setup ist nvim-cmp die übliche Wahl. Fügen Sie die omni-Quelle hinzu und die Kandidaten aus dem omnifunc von vimtex fließen direkt ein:
local cmp = require("cmp")
cmp.setup({
sources = cmp.config.sources({
{ name = "omni" }, -- pulls vimtex completion via omnifunc
}),
})Wenn Sie coc.nvim bevorzugen (das sowohl in Vim als auch in Neovim funktioniert), installieren Sie die Erweiterung coc-omni und schließen Sie den Dateityp tex in seine Omni-Quellen ein. Koppeln Sie es bei älteren deoplete-Setups mit deoplete-vimtex. In jedem Fall ist die Arbeitsteilung die gleiche: vimtex produziert die Kandidaten und die Completion Engine entscheidet, wann und wie sie präsentiert werden.
Inverse Suche (PDF → Quelle)
SyncTeX zeichnet die Entsprechung zwischen Quellzeilen und Positionen im PDF auf. Es ermöglicht die Vorwärtssuche – das Springen von Ihrer Bearbeitungsposition zum PDF – und die Rückwärtssuche – das Gehen von einer Stelle im PDF zurück zur Quellzeile. vimtex übernimmt die Vorwärtssuche für Sie, Sie drücken also einfach \lv. Die inverse Suche ist der knifflige Teil: Sie benötigt den PDF-Viewer, um Vim aufzurufen. Das Schlüsselelement ist der Befehl :VimtexInverseSearch, den vimtex bereitstellt.
Hier ist der Mechanismus. Mit SyncTeX ermittelt der Viewer, welcher Quellzeile und -datei ein Klick entspricht, und führt dann einen Shell-Befehl aus, um den Editor mit dieser Zeilennummer und Datei als Argumenten aufzurufen. Innerhalb dieses Befehls rufen Sie VimtexInverseSearch <line> <file> auf, und vimtex#view#inverse_search findet Ihr laufendes Vim/Neovim und öffnet den Spot. vimtex verwaltet mehrere Instanzen und Servernamen für Sie, sodass Sie im Allgemeinen kein --servername selbst übergeben müssen. Die Platzhalternamen unterscheiden sich je nach Viewer: Zeile und Datei sind %{line}/%{input} in zathura, %line/%file in Skim und %l/%f in SumatraPDF.
Linux — zathura. Die kampferprobteste Kombination mit Vimtex. Mit g:vimtex_view_method = "zathura" erhalten Sie eine Vorwärtssuche über \lv und in den meisten Fällen inverse Suche praktisch ohne Konfiguration: vimtex startet zathura mit -x und übergibt ihm den Editorbefehl, der VimtexInverseSearch für Sie aufruft (auf Systemen ohne xdotool verwenden Sie zathura_simple). In Zathura wechselt Ctrl-click zur entsprechenden Quellzeile.
Wenn Sie es selbst konfigurieren oder auch die Spalte synchronisieren möchten, fügen Sie sie direkt in zathurarc ein. Die Platzhalter von zathura sind %{line} und %{input} (Hinweis: nicht %l/%f); mit einem spaltenbewussten Build können Sie auch %{column} verwenden:
set synctex true
set synctex-editor-command "nvim --headless -c 'VimtexInverseSearch %{line} %{input}'"macOS — Skim. Legen Sie g:vimtex_view_method = "skim" fest. Öffnen Sie auf der Skim-Seite Einstellungen → Synchronisieren, setzen Sie die Voreinstellung auf „Benutzerdefiniert“ und registrieren Sie einen Befehl und Argumente. %line und %file werden durch Skim mit der Zeilennummer und der Datei ersetzt:
Command: nvim
Arguments: --headless -c "VimtexInverseSearch %line '%file'"Jetzt führt Cmd-Shift-click in Skim eine umgekehrte Suche durch: Skim startet Neovim im Hintergrund und VimtexInverseSearch leitet den Spot an Ihre vorhandene Instanz weiter.
Windows — SumatraPDF. Legen Sie g:vimtex_view_method = "sumatrapdf" fest. Registrieren Sie in SumatraPDF unter Settings → Optionen → „Befehlszeile für inverse Suche festlegen“ einen Befehl wie den folgenden (%l und %f sind die Zeilennummer und die Datei):
cmd /c start /min "" nvim --headless -c "VimtexInverseSearch %l '%f'"In SumatraPDF löst ein Doppelklick die umgekehrte Suche aus. Ersetzen Sie für einfaches gVim den nvim --headless-Teil durch vim -v --not-a-term -T dumb (gVim und Vim auf Windows starten automatisch einen Server).
Ein letzter Vorbehalt. Vim, das in einem Terminal (Linux/macOS) ausgeführt wird, startet standardmäßig keinen Server, daher sollten Vim-Benutzer Folgendes zu vimrc hinzufügen, um für den Rückruf der umgekehrten Suche erreichbar zu sein (Neovim benötigt nichts davon):
if empty(v:servername) && exists('*remote_startserver')
call remote_startserver('VIM')
endifBei jedem OS und Viewer ist die Voraussetzung, dass das Dokument mit -synctex=1 kompiliert wurde – aber wie bereits erwähnt, ist dies bereits Teil der standardmäßigen latexmk-Optionen von vimtex, sodass Sie selten darüber nachdenken müssen.
Die Vimtex-Bearbeitungsschleife
vimtex ist kein Werkzeug, das Sie vor dem Schreiben beherrschen müssen. Erste Sperre in vier Schritten: Kontinuierliche Kompilierung mit \ll starten, speichern, mit \lv zu PDF springen und mit \le nur die Fehler überprüfen. Wenn Sie Gleichungen oder Abbildungen hinzufügen, fügen Sie \ref{...} durch die Beschriftungsvervollständigung ein und entscheiden Sie, wie die Stammdatei erkannt wird, bevor Sie Kapitel aufteilen. Wenn diese Vimtex-Bearbeitungsschleife zuerst abgeschlossen ist, können Vervollständigungs-Engines und Snippets später hinzugefügt werden, ohne die Hauptzeile des Schreibens zu stören.
Bevor Sie zu einem Dokument mit mehreren Dateien wechseln, machen Sie die Datei mit \documentclass zum Mittelpunkt des Projekts und vergewissern Sie sich, dass beim Kompilieren aus einer untergeordneten Datei immer noch dasselbe PDF erstellt wird. Wenn \ll aus einem Kapitel ein anderes Ziel erzeugt, korrigieren Sie die Root-Erkennung und .latexmkrc, bevor Sie weitere Snippets oder Vervollständigungsebenen hinzufügen.