Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Пакеты для LaTeX

Оглавление

Привет, коллеги! У меня был материал про работу с ТеХ в Вим, про таблицы, и про сам ТеХ тоже, и я планировал сделать обзор расширений для более удобной работы с техом в Вим. Нашелся материал, который я без зазрения и использую, переведя. Кое-что дополню, конечно. Спасибо, коллега Jackson Woodruff. Здесь и далее мой текст - курсивом.

https://tn.fishki.net/26/upload/post/2019/08/04/3049660/gallery/4426sc2.jpg
https://tn.fishki.net/26/upload/post/2019/08/04/3049660/gallery/4426sc2.jpg

LaTeX - это язык разметки: в текст документа внедрены команды для символов, сложного форматирования вроде дробей, описания структуры документа и всего прочего. Базовые возможности форматирования дополнены многочисленными пакетами. Latex стал стандартом в издательском деле во многих областях, но его применение этим отнюдь не ограничивается.

Есть множество редакторов специально для Latex: TexStudio, TexWorks, Lyx и многие другие. Идеально подходит и Вим, если вы им владеете: ведь исходник ТеХ - это текстовый файл, а при работе с ними Вим оптимален.

Сначала кратко обсудим возможности чистого (в оригинале "ванильного"))) Вим.

Latex в чистом Vim

В общем-то, вам не нужны никакие плагины. Я (автор канала) работаю в ТеХе без них. Смотрим: подсветка синтаксиса у нас и так есть. Проверка орфографии - тоже есть, можно ее включать автокомандой при открытии Tex-файла. Есть также автодополнение и интеграция с make.

Автодополнение по <C-N> очень удобно: вы начинаете набирать слово, нажимаете эту комбинацию, и Вим ищет подходящее слово в этом же файле, в других буферах и кое-где ещё, что как раз то, что вам надо (как правило). Большинство команд используются более одного раза (например, \Leftrightarrow), большинство длинных терминов (синхрофазотрон) или сложных фамилий (Леви-Чивита) - тоже.

Если держать .bib-файл открытым в другом буфере, то <C-N> будет искать дополнение и там, и вот у нас автодополнение по библиографии! Если у вас идентификаторы построены по общей схеме, например Einstein1915, то ссылаться очень удобно: \cite{Ein<C-N> и выбирайте нужный идентификатор.

Что касается сборки проекта, то можно и выйти из Вим ненадолго. Команда :sh позволит сделать это. Можно запустить сборку из командной строки Вим через восклицательный знак:

!pdflatex %

Можно открыть окошко терминала и компилировать там.

А можно воспользоваться командой :make. Для этого нужно приготовить makefile, но это несложно. Вот мой (автора канала) пример:

MAIN = main.tex
SOURCE = $(MAIN)
all: paper
echo "Good luck, bro"
paper: $(SOURCE)
pdflatex $(MAIN)
-mv *.bbl trash
-bibtex8 -H -c cp1251.csf paper.aux
pdflatex $(MAIN)
pdflatex $(MAIN)

Просто make выполнит цель all, которая зависит от цели paper. Можно и отдельно выполнить цель: make paper. Это полезно, если целей несколько: автореферат, диссертация, диссертация без пересборки литературы, презентация доклада. Цель all собирает всё, но чаще вам надо по-отдельности. Цель all ничего не делает, только выводит сообщение; ее задача лишь выполнить цель paper. А она зависит от исходных файлов. На самом деле, тут можно перечислить все файлы, картинки и библиографию. Если что-то изменилось, цель будет пересобрана. Это полезно, например, если у вас отдельно собирается автореферат: если исходник не менялся, то можно и не собирать и сэкономить время. Выполнение цели paper сводится к сборке статьи, обновлению библиографии и опять сборке статьи, уже с новой библиографией. Собирать надо дважды, чтобы при втором прогоне обновить ссылки на страницы: они могут измениться.

Команда :make из Вим хороша еще и тем, что при ошибке вы попадете на то место, которое укажет Тех. Хотя он часто ошибается в локализации ошибок.

Теперь плагины.

Плагины

Есть несколько моментов, Вимом "из коробки" не охваченных. По сути, только подсветка работает как хотелось бы. Автодополнение неплохое, но в TexStudio или TexWorks лучше. Делать makefile для каждого небольшого проекта Latex - это уже перебор. И есть несколько проблем с интеграцией команд Vim в экосистему Latex.

Я (автор оригинала) широко использовал два плагина. Первый - это Vim-LaTeX, который обеспечивает широкую функциональность, но не совсем хорошо вписывается в экосистему Vim. Я отказался от него из-за неуклюжей интеграции с современными менеджерами пакетов и разочаровывающих авторасширений. Но тем не менее Vim-LaTeX - это очень хороший плагин для Latex.

Потом я (автор оригинала) перешел на
vimtex. Он предоставляет специфические для Latex текстовые объекты, например, окружения Latex, и реализует большую часть функциональности Vim-LaTeX.

Оба плагина отлично документированы. Ставьте и пользуйтесь. Мне (автору канала) хватает "ванильного" Вим со своими настройками.

Эта статья не является сравнением плагинов. Но я расскажу о возможностях, которые они предоставляют; в основном с точки зрения пользователя vimtex.

Первая команда, которую мы рассмотрим - это
компиляция. Я назначил ее на <localleader>ll. При компиляции появляется окно QuickFix, в котором можно перейти к неисправной строке исходного текста (ну, если вы доверяете компилятору Latex, что он выдаст ошибку в нужной строке, но это уже другая тема). Я настроил открытие и закрытие этого окошка на localleader>le ("Latex errors"). Открытие PDF-просмотрщика для просмотра результатов должно быть не сложнее; оно на команде <localleader>lv ("Latex view").

Помимо экономии на makefile'ах, пакеты расширения дают еще много чего. Например, это разумное
автодополнение. Чистый Вим идеален для Латеха, но только если вы прекрасно владеете и тем, и другим. Но пакет может использовать omnicompletion для более изощренного автодополнения.

В общем-то, вы тоже можете.

Вписывание Latex в Vim

Плагины Latex предоставляют множество других возможностей. Так, команда K ссылается на документацию Latex, когда находится в документе Latex. Подсветка синтаксиса лучше, чем во встроенной документации. Есть команды навигации, такие как [[ и ]] для перехода между разделами или ]m [m для перехода между окружениями.

Vimtex вводит несколько хороших команд: cse изменяет окружающее окружение, например, если вы хотите перейти от itemize к enumerate. В режиме вставки ]] автоматически закрывает незакрытое окружение (т.е. вставляет соответствующую команду \end{X}).

В Vim-LaTeX есть несколько хороших (и несколько очень плохих!) авторасширений: при вводе __ получается _{<курсор здесь>}<++>, что означает, что вы можете ввести нужный вам подстрочный индекс, а затем нажать <C-J> для перехода за пределы скобок. Мне так понравились некоторые из этих функций, что я сохранил их при переходе на vimtex. Также, вдохновленный latex-suite, я использую mma (используя iabbrev чтобы слова вроде "comma" не раскрывались) в режиме вставки, чтобы получить:

\begin{align}
<курсор здесь>
\end{align}<++>

И у меня есть несколько подобных привязок для других окружений, которые я регулярно использую. Это означает, что я могу набрать mma<Пробел>, ввести нужный текст и нажать <C-J>, чтобы перейти к символу <++> (и удалить его).

Обычно я делю экран по вертикали на две части. Слева Вим, а справа программа просмотра PDF с документом, который я пишу.

Vim - это редактор, который хорошо работает со строками. Команды вроде j, k, d работают построчно. Учитывая это, я настоятельно рекомендую вам вручную разрывать каждую строку (т.е. не использовать перевод строки, а вручную нажимать <Enter> в конце каждой строки).

(Автор канала присоединяется к совету и сам применяет принцип "на строке не более одного предложения").

Почему? Потому что это означает, что все эти команды действительно хорошо работают, и вы обнаружите, что редактируете текст более "вимовским" способом. Если каждый абзац - это одна строка текста, то эти команды серьезно ограничены. Кроме того, если вы набираете по абзацу в строке и используете отмену, вы заметите, что ваши вспомогательные файлы (которые все отмены хранят) становятся огромными. По сути, Vim сохраняет информацию об отмене построчно: и каждый раз сохраняет всю строку. Если у вас есть строки длиной в тысячи символов, вы обнаружите , что ваши вспомогательные файлы съели все место на жестком диске!

Конечно, многие документы используются совместно, и, по моему опыту, люди предпочитают использовать одну строку на абзац, так что тут может быть проблема. Автор канала замечает, что она решаема, так как собрать абзацы в строку и разделить по концам предложений - это две простые привязки. Да и с документами совместно лучше работать в облаке, а не в Вим.

Конфигурации плагинов

Я не буду вдаваться в подробности, просто некоторые личные предпочтения, ориентированные на vimtex. Мне нравится устанавливать:

let g:vimtex_fold_enabled = 1

Это включает сворачивание кода для Tex-файлов.

Используя:

let g:tex_flavor = 'latex'

вы гарантируете, что пустой .tex-файл будет распознан как latex, а не plaintex. Это удобно.

Если вы используете ALE (или другую среду линтинга, поддерживающую Latex), я советую вам отключить это для Latex. Многие из этих сред линтинга не могут эффективно обрабатывать сотни предупреждений, и я обнаружил, что наборы предупреждений Latex выдают много ложных предупреждений.

Удачи, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Наука
7 млн интересуются