Vim 또는 Neovim에서 LaTeX를 작성하는 경우 사실상 표준은 Karl Yngve Lervåg의 vimtex 플러그인입니다. 편집, 목차와 레이블 사이의 탐색, 환경과 명령에서 작동하는 모션과 텍스트 개체, 완성, PDF 뷰어를 통한 양방향 점프 기능을 모두 편집기를 떠나지 않고도 제공합니다. 이 페이지에서는 vimtex 설치 및 구성, 완성, SyncTeX를 통한 역검색을 안내합니다.
vimtex가 무엇인가요?
Vim도 Neovim도 TeX 자체를 조판하지 않습니다. 실제 컴파일은 설치한 배포판 — TeX Live (또는 MiKTeX / MacTeX)에 의해 수행됩니다. vimtex는 브리지입니다: .tex용 파일 형식 및 구문 플러그인입니다. tex 파일 유형을 감지하면 빌드 명령, 구문 강조 표시, 완성 기능(omnifunc), 목차 보기, \ref/\cite에 대한 정의로 이동 및 환경, 구분 기호 및 명령에 대한 텍스트 개체를 자동으로 활성화합니다. 핵심은 외부 종속성 없이 작동합니다. 완성 및 조각은 선택한 플러그인과 쌍을 이룹니다.
세 가지 전제 조건이 있습니다. 첫째, TeX 명령은 PATH에서 접근 가능해야 합니다 — vimtex는 latexmk와 친구들을 하위 프로세스로 생성하므로 latexmk --version가 터미널에서 실행되면 거의 문제가 없습니다. 둘째, 현재 vimtex에서 요구하는 대로 Vim 9.1 이상 또는 Neovim 0.10 이상을 사용하세요. 셋째, Vim에는 파일 형식 감지 및 구문이 활성화되어 있어야 합니다. vimrc/init.vim에는 다음 두 줄이 필요합니다(대부분의 구성에는 이미 해당 줄이 있습니다).
filetype plugin indent on
syntax enable설정
일반적으로 Vim의 경우 vim-plug, Neovim의 경우 lazy.nvim과 같은 플러그인 관리자를 사용하여 vimtex를 설치하는 것이 일반적인 선택입니다. 한 가지 중요한 주의 사항: vimtex를 지연 로드하지 마십시오. 프로젝트 문서에서 명시적으로 파일 형식이 감지된 후 이를 로드하면 아래 설명된 역검색이 중단됩니다. 경험에 따르면,lazy.nvim의 lazy = false, packer의 명시적 로드, vim-plug의 for 기반 지연 사양은 없습니다.
최소 Vim(vim-plug) 설정은 다음과 같습니다. 플러그인을 선언하고, 파일 형식/구문을 활성화하고, g:vimtex_view_method로 PDF 뷰어를 선택하면 작동이 시작됩니다. maplocalleader(로컬 리더)는 vimtex 명령의 진입점이므로 명시적으로 설정하는 것이 안전합니다(기본값은 백슬래시 \).
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'Neovim(lazy.nvim)에서는 Lua에도 같은 내용을 작성합니다. init 내부에 변수를 설정하면 플러그인 본문이 로드되기 전에 해당 변수가 적용됩니다. lazy = false를 잊지 마세요:
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,
}.tex 파일을 열면 <localleader>l 키로 묶인 명령을 사용할 수 있게 됩니다. 먼저 기억할 가치가 있는 네 가지는 다음과 같습니다.
| 액션 | 기본 매핑 | 기능 |
|---|---|---|
compile | \ll | latexmk를 통한 연속 컴파일 시작/중지; 저장할 때마다 자동으로 다시 빌드됨 |
view | \lv | PDF를 열고 커서에 대한 정방향 검색(소스 → PDF) |
clean | \lc | 보조 파일 정리(.aux, .log, …) |
stop | \lk | 실행 중인 컴파일을 중지합니다(\lK가 모두 중지됨). |
실제로: \ll를 한 번 누르면 latexmk가 상주 상태를 유지하고 이후 저장할 때마다 PDF를 새로 고칩니다. \lv를 사용하여 PDF의 현재 지점을 표시하고 \le를 사용하여 빠른 수정 목록에 오류를 넣고 문제가 있는 줄로 이동합니다. 입력하는 방법은 다음과 같습니다. 로컬 리더가 여전히 \인 경우 \ll를 누릅니다. Space로 전환한 경우 <Space>ll를 누르는 식입니다.
기본 컴파일러는 latexmk이고 vimtex는 -verbose -file-line-error -synctex=1 -interaction=nonstopmode와 같은 옵션을 전달합니다. 특히 -synctex=1는 기본적으로 On 되어 있으므로 별도의 설정 없이 아래의 정방향, 역방향 검색에 필요한 동기화 데이터를 내보내게 됩니다. 대신 Tectonic을 사용하려면 g:vimtex_compiler_method = "tectonic"를 설정하세요. latexrun 및 arara도 사용할 수 있습니다.
일본어의 경우 가장 깔끔한 접근 방식은 .latexmkrc가 엔진을 선택하도록 하는 것입니다. vimtex의 latexmk 백엔드는 .latexmkrc에서 $pdf_mode를 읽어 처리 경로를 결정합니다(1 = pdfLaTeX 직접, 3 = DVI를 빌드한 다음 dvipdfmx로 변환, 4 = LuaLaTeX). -pdf/-lualatex와 같은 엔진 플래그를 vimtex의 options에 추가하면 안 됩니다. .latexmkrc 또는 g:vimtex_compiler_latexmk_engines를 통해 지정하십시오. 다음은 과학 분야 일본 논문의 고전적인 조합인 upLaTeX + dvipdfmx 설정입니다.
$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;핵심 사항: uplatex를 $latex에 할당하고 dvipdfmx를 $dvipdf에 할당한 다음 $pdf_mode = 3를 설정하여 "DVI를 빌드한 다음 dvipdfmx를 사용하여 PDF로 변환" 경로를 선택합니다. -synctex=1를 $latex에 전달하면 DVI를 통해서도 SyncTeX 데이터가 PDF로 전달됩니다. LuaLaTeX로 일본어를 조판하는 경우 .latexmkrc가 전혀 필요하지 않습니다. g:vimtex_compiler_latexmk_engines가 lualatex를 선택하도록 하거나 $pdf_mode = 4를 작성하십시오(luatexja/ltjsclasses로 가정).
완료
vimtex는 Vim의 표준 완성 기능(omnifunc)을 통해 상황 인식 후보를 제공합니다. tex 버퍼에서는 omnifunc=vimtex#complete#omnifunc를 자동으로 설정하므로 g:vimtex_complete_enabled(기본값 1)가 켜져 있으면 사용할 준비가 되어 있습니다. 완료되는 주요 내용은 다음과 같습니다.
\cite{...}—.bib파일과\bibitems를 읽어 인용 키를 완성합니다.\ref{...}/\eqref{...}— 참조를 완료하기 위해 문서의\labels를 수집합니다.- 명령 및 환경 — 로드하는 패키지에 따른
\commands 및\begin{...}환경 이름입니다. - 파일 이름 — 그림의 경로,
\input/\include,\includepdf등. - 용어집 및 패키지 이름 —
glossaries항목 및 사용 가능한.sty/.cls파일을 기반으로 하는 패키지 이름입니다.
일반 Vim의 경우 삽입 모드에서 Ctrl-X Ctrl-O(전방향 완성 트리거)를 누르면 후보가 나타납니다. 예를 들어 \cite{를 입력한 다음 Ctrl-X Ctrl-O를 입력하면 인용 키가 나열됩니다. 하지만 매번 누르는 것이 지루하기 때문에 실제로 사람들은 입력할 때 자동으로 제안 사항을 표시하는 완성 엔진에 omnifunc를 연결합니다.
최신 Neovim 설정의 경우 nvim-cmp가 일반적인 선택입니다. omni 소스와 vimtex의 omnifunc 흐름의 후보를 바로 추가하세요.
local cmp = require("cmp")
cmp.setup({
sources = cmp.config.sources({
{ name = "omni" }, -- pulls vimtex completion via omnifunc
}),
})coc.nvim(Vim 및 Neovim 모두에서 작동)을 선호하는 경우 coc-omni 확장을 설치하고 옴니 소스에 tex 파일 유형을 포함하십시오. 이전 deoplete 설정에서는 deoplete-vimtex와 페어링하세요. 모든 경우에 노동 분업은 동일합니다. vimtex는 후보자를 생성하고 완성 엔진은 이를 제시할 시기와 방법을 결정합니다.
역검색(PDF → 소스)
SyncTeX는 PDF의 소스 행과 위치 간의 대응을 기록합니다. 편집 위치에서 PDF로 이동하는 정방향 검색과 PDF의 한 위치에서 다시 소스 라인으로 이동하는 역방향 검색이 가능합니다. vimtex가 전방 검색을 처리하므로 \lv를 누르기만 하면 됩니다. 역검색은 까다로운 부분입니다. Vim를 다시 호출하려면 PDF 뷰어가 필요합니다. 핵심은 vimtex가 제공하는 :VimtexInverseSearch 명령입니다.
메커니즘은 다음과 같습니다. 뷰어는 SyncTeX를 사용하여 클릭이 해당하는 소스 라인과 파일을 알아낸 다음 쉘 명령을 실행하여 해당 라인 번호와 파일을 인수로 사용하여 편집기를 호출합니다. 해당 명령 내에서 VimtexInverseSearch <line> <file>를 호출하면 vimtex#view#inverse_search는 실행 중인 Vim/Neovim을 찾아 해당 지점을 엽니다. vimtex는 여러 인스턴스와 서버 이름을 처리하므로 일반적으로 --servername를 직접 전달할 필요는 없습니다. 자리 표시자 이름은 뷰어마다 다릅니다. 줄과 파일은 zathura에서 %{line}/%{input}, Skim에서 %line/%file, SumatraPDF에서 %l/%f입니다.
Linux — zathura. vimtex와의 가장 많은 전투 테스트를 거친 페어링입니다. g:vimtex_view_method = "zathura"를 사용하면 \lv를 통해 정방향 검색이 가능하며 대부분의 경우 기본적으로 구성이 필요 없는 역검색이 가능합니다. vimtex는 -x로 zathura를 시작하고 VimtexInverseSearch를 호출하는 편집기 명령을 전달합니다(xdotool가 없는 시스템에서는 zathura_simple 사용). zathura에서 Ctrl-click은 일치하는 소스 라인으로 이동합니다.
직접 구성하거나 열도 동기화하려면 zathurarc에 직접 넣으십시오. zathura의 자리 표시자는 %{line} 및 %{input}입니다(참고: %l/%f 아님). 열 인식 빌드를 사용하면 %{column}도 사용할 수 있습니다.
set synctex true
set synctex-editor-command "nvim --headless -c 'VimtexInverseSearch %{line} %{input}'"macOS — Skim. g:vimtex_view_method = "skim"를 설정합니다. Skim 측에서 Preferences → Sync를 열고 프리셋을 “Custom”으로 설정하고 명령어와 인수를 등록합니다. %line 및 %file는 줄 번호와 파일을 사용하여 Skim로 대체됩니다.
Command: nvim
Arguments: --headless -c "VimtexInverseSearch %line '%file'"이제 Skim의 Cmd-Shift-click은 역검색을 수행합니다. Skim는 백그라운드에서 Neovim을 시작하고 VimtexInverseSearch는 해당 지점을 기존 인스턴스에 전달합니다.
Windows — SumatraPDF. g:vimtex_view_method = "sumatrapdf"를 설정합니다. SumatraPDF에서 Settings → 옵션 → “역검색 명령줄 설정”에 다음과 같은 명령어를 등록합니다. (%l, %f는 줄번호와 파일입니다.)
cmd /c start /min "" nvim --headless -c "VimtexInverseSearch %l '%f'"SumatraPDF에서는 더블클릭이 역검색을 실행합니다. 일반 gVim의 경우 nvim --headless 부분을 vim -v --not-a-term -T dumb로 교체합니다(Windows의 gVim 및 Vim는 자동으로 서버를 시작합니다).
마지막 주의사항. 터미널(Linux/macOS)에서 실행되는 Vim는 기본적으로 서버를 시작하지 않습니다. 따라서 Vim 사용자는 역검색 콜백으로 접근할 수 있도록 vimrc에 다음을 추가해야 합니다(Neovim에서는 이 중 아무것도 필요하지 않습니다):
if empty(v:servername) && exists('*remote_startserver')
call remote_startserver('VIM')
endif모든 OS 및 뷰어에서 전제 조건은 문서가 -synctex=1로 컴파일되었다는 것입니다. 그러나 앞서 언급했듯이 이는 이미 vimtex의 기본 latexmk 옵션의 일부이므로 그것에 대해 생각할 필요가 거의 없습니다.
vimtex 편집 루프
vimtex는 글을 쓰기 전에 마스터해야 하는 도구가 아닙니다. 네 가지 이동으로 첫 번째 잠금: \ll로 연속 컴파일을 시작하고, 저장하고, \lv로 PDF로 점프하고, \le로 오류만 검사합니다. 수식이나 그림을 추가할 때 라벨 완성을 통해 \ref{...}를 삽입하고, 장을 나누기 전에 루트 파일 감지 방법을 결정하세요. 이 vimtex 편집 루프가 먼저 해결되면 작성의 주요 라인을 방해하지 않고 나중에 완성 엔진과 조각을 추가할 수 있습니다.
다중 파일 문서로 이동하기 전에 \documentclass가 있는 파일을 프로젝트의 중심으로 만들고 하위 파일에서 컴파일해도 여전히 동일한 PDF가 빌드되는지 확인합니다. 한 장의 \ll가 다른 대상을 생성하는 경우 더 많은 스니펫이나 완성 레이어를 추가하기 전에 루트 감지 및 .latexmkrc를 수정하세요.