К содержанию
Написать
latex/

LaTeX

С первого курса я пишу в LaTeX: конспекты лекций в Neovim, диплом как репозиторий с релизами и документы своего продукта, где числа берутся из данных.

Что это
Три работы одного инструмента: конспекты 2022–2025 годов, диплом 2026 года и документы «Пора на пару» с сентября 2026-го.
Как сделано
Конспекты и их настройку я собирал руками: агентов тогда не было. Диплом и документы продукта сделаны в 2026 году вместе с Claude Code: устройство и правила задавал я, набирал инструмент.
Что открыто
Исходники и релизы диплома лежат на GitHub. Репозиторий документов закрыт: здесь только его устройство и страницы выдуманного примера.
Период
с 2022
Стек
Neovim, vimtex, LuaSnip, Inkscape, LuaLaTeX
  • 630страниц конспектов
  • 139сниппетов
  • 130страниц диплома
  • 10релизов диплома
  • 6типов документов
  • 11проверок сборки

На 03.11.2026, по репозиториям

Конспекты

Формулы со скоростью лекции

На первом курсе я начал конспектировать математику на ноутбуке: от руки выходило медленно, в Word формулы не набрать, а конспектов в Notion мне было мало. Первые попытки не сохранились, в репозитории конспекты со второго курса.

Конспект пишется в Neovim. vimtex собирает PDF, а LuaSnip раскрывает сокращения прямо при наборе: ff становится дробью, ;e эпсилоном, а <= знаком ⩽, как принято в русских текстах. В конфиге 139 сниппетов, 132 раскрываются сами, 44 работают только внутри формул.

Ниже строка 259 из лекции 17 по матанализу от 19.11.2023, набранная заново теми же сниппетами. PDF обновляется, когда я выхожу из режима вставки и нажимаю ␣c: файл сохраняется и собирается один раз.

les-17.tex

Если $E \subset \R^{n} $ и $\forall \epsilon > 0 \ \exists B = B_{\epsilon } : \ E \subset B$ и $m(B) < \epsilon \implies m(E) = 0$.

NORMALнажато Esc ␣ cклавиш 99 · символов 132

master.pdf

Страницы

630 страниц за два года

С сентября 2023 по июнь 2025 года в репозитории 8 конспектов лекций на 263 страницы и 14 сборников к экзаменам и контрольным на 367 страниц. 64 рисунка нарисованы в Inkscape и вставлены в PDF с подписями, которые набирает сам LaTeX.

По этим конспектам и сборникам готовилась моя группа, а потом и младшие курсы, когда доходили до тех же предметов.

В тёмной теме страницы перекрашены так, как их показывала Zathura с моим конфигом Catppuccin.

  • Страница конспекта: производная по вектору, примечание и определение в цветных рамках.Страница конспекта: производная по вектору, примечание и определение в цветных рамках.
    Математический анализЛекция 1, 01.09.2023
  • Страница с формулой Тейлора для функции двух переменных.Страница с формулой Тейлора для функции двух переменных.
    Математический анализЛекция 2: формула Тейлора
  • Страница со схемами графов, нарисованными в Inkscape.Страница со схемами графов, нарисованными в Inkscape.
    Теория графовВопросы к экзамену
  • Рисунок сферы Римана и формулы стереографической проекции.Рисунок сферы Римана и формулы стереографической проекции.
    Комплексный анализЛекция 1: сфера Римана
  • Страница с контуром интегрирования и оценкой интеграла.Страница с контуром интегрирования и оценкой интеграла.
    Комплексный анализЛекция 5: интеграл по треугольнику
  • Титульный лист и оглавление сборника доказательств к экзамену.Титульный лист и оглавление сборника доказательств к экзамену.
    Доказательства к экзаменуМатанализ, 85 страниц

Откуда

Способ придумал не я

Так конспектировал Gilles Castel: в 2019 году он описал, как набирает лекции по математике в Vim и рисует к ним рисунки в Inkscape. Elijan Mastnak превратил это в подробное руководство по настройке. По их текстам я несколько месяцев собирал свой конфиг, а ответы искал на Reddit: агентов, которые сделали бы это за меня, тогда не было.

От них в конфиге связка vimtex и LuaSnip, раскладка файлов, правила триггеров и преамбула первых конспектов. Моё: цвета рамок у определений и теорем, русские названия и сниппеты к ним, дата лекции по команде lesson, ⩽ и ⩾ вместо ≤ и ≥, русский словарь. Ради этой связки я перешёл с Windows на macOS, а на домашний компьютер поставил Arch Linux.

На четвёртом курсе я написал автору руководства, показал снимки своей настройки и поблагодарил. Он ответил.

Диплом

Под страницей лежит её исходник

Выпускную работу я оформил как репозиторий: текст в файлах .tex, сборка LuaLaTeX через latexmk, требования вуза в отдельном файле, по которому сверяется преамбула. Тема: «Разработка клиентских приложений SaaS-платформы управления учебным расписанием „ВКурсе“».

Требования заданы один раз: A4, поля 2, 2, 3 и 1 см, 14 пунктов, интервал 1,5, абзац 1,25 см. Это пять строк, и все 130 страниц берут оформление из них. Список литературы по ГОСТ 7.0.5 собран без BibTeX, а титульный лист из файла с данными.

Страница 69 диплома: раздел о веб-приложении.Страница 69 диплома: раздел о веб-приложении.

Проведите лупой по странице: под ней её исходник, абзац в абзац.

\documentclass[14pt,a4paper,oneside]{extarticle}\setmainfont{CMU Serif}\usepackage[a4paper, top=2cm, bottom=2cm, left=3cm, right=1cm]{geometry}\onehalfspacing\setlength{\parindent}{1.25cm}

Релизы

Десять релизов, от 3 страниц до 130

make release проверяет, что всё закоммичено, собирает PDF и ставит тег с датой. Тег запускает GitHub Actions: PDF собирается в контейнере с полным TeX Live и прикладывается к релизу, а ссылка на последний не меняется.

Каждый релиз ниже это настоящий PDF с GitHub. 22 мая в работу вошли снимки приложений: файл вырос с 391 КБ до 21,2 МБ за один релиз.

Все страницы релиза v2026.06.10Все страницы релиза v2026.06.10

v2026.06.10

130страниц

Дата
10.06.2026
Слов
23 049
Файл
21,2 МБ
  1. make releaseпроверяет, что всё закоммичено, и собирает PDF
  2. git tag vYYYY.MM.DDтег с датой уходит на GitHub
  3. build-pdf.ymlтег запускает сборку
  4. texlive/texlive:latestполный TeX Live с CMU Serif, команда make build
  5. bachelor-thesis.pdfPDF прикладывается к релизу

Документы

Документы продукта собираются из данных

У «Пора на пару» много документов, которые живут дольше недели: реестры учебных заведений, обзоры, регламенты. Вести их в Word или в редакторе трекера я отказался, и с 30 сентября 2026 года это репозиторий LaTeX.

Один класс задаёт вид всем документам, а тип читается по подписи, а не по цвету: обзор, отчёт о статусе, регламент, реестр, справка, соглашение. Таблицы и числа не набираются руками: документ просит их у данных в document.json, и под каждой таблицей сборка печатает, на какой день сверены данные и откуда они.

У каждого документа есть уровень доступа, и сборка не даст взять в документ столбец или источник закрытого уровня. Выданная версия записывается в журнал с хэшем PDF: выпустить под тем же номером другое содержание нельзя.

document.json

"by-city": {
  "dataset": "example",
  "table": "organizations",
  "caption": "По городам",
  "pivot": {
    "by": "city",
    "total": true,
    "values": [
      { "key": "organizations", "count": true },
      { "key": "universities", "count": true,
        "filter": { "kind": "university" } },
      { "key": "students", "sum": "students" },
      { "key": "per-organization",
        "ratio": ["students", "organizations"] }
    ]
  },
  "sort": ["-students", "by"]
}
Страница реестра: график по городам и начало таблицы.Страница реестра: график по городам и начало таблицы.Страница реестра: конец таблицы, дата сверки данных и номера источников.Страница реестра: конец таблицы, дата сверки данных и номера источников.
Выдуманная компания «Северный маяк» из примеров репозитория: запрос таблицы и страницы, собранные по нему.

Проверки

Агенты собирают, сборка не верит

Реестры собирают агенты Claude Code: обходят официальные сайты и на каждый факт приносят адрес страницы и дословную цитату. Сам репозиторий тоже написан вместе с Claude Code, это все 433 коммита.

Агенту на слово не верят. Скрипт сам скачивает каждую страницу и ищет на ней цитату и значение, спорное решает человек, и только импорт пишет в данные.

LaTeX заканчивает без ошибки и тогда, когда PDF уже испорчен. Поэтому сборку держат 11 проверок и 465 тестов: она падает на букве, которой нет в шрифте, на строке шире колонки больше чем на 2 pt, на неопределённой ссылке и на шрифте, не встроенном в PDF.

collect_verify.py

ok цитата и значение на странице

values-on-page цитата не дословная, но значения на странице

quote-not-on-page цитаты на странице нет

value-not-on-page значения на странице нет

page-empty страница пустая или не пришла

tls сертификату сайта машина не доверяет, проверку не отключают

no-url нет адреса страницы

no-quote нет цитаты

quality.py

буква, которой нет в шрифте

строка шире колонки больше чем на 2 pt

неопределённая ссылка или цитата

шрифт не найден или подменён

LaTeX просит ещё один проход

шрифт не встроен в PDF