Сборка без Docker
Рекомендуемый способ сборки LaTeX-документа без Docker - latexmk. Он сам запускает lualatex и biber нужное количество раз по правилам из .latexmkrc.
Важно
В этом проекте latexmk заметно сокращает время повторной компиляции. Первый запуск через latexmk занимает около 74 секунд, повторный - около 18 секунд. Режим --no-latexmk с ручной цепочкой каждый раз занимает примерно 53-54 секунды.
Первый запуск latexmk может быть дольше ручной сборки, потому что он строит свое служебное состояние, анализирует зависимости, создает .fdb_latexmk и выполняет полный цикл сборки.1 На следующих запусках latexmk использует эту информацию и пересобирает только то, что действительно изменилось.
Что нужно подготовить отдельно
Внешние артефакты
latexmk собирает только LaTeX-документ. Перед сборкой без Docker нужно отдельно подготовить все внешние артефакты, которые подключаются в .tex:
титульник.pdfизадание.pdfдолжны лежать в корне проекта. Их можно получить изdocx/*.docxвручную через Microsoft Word или LibreOffice, см. Титульники.- Mermaid-диаграммы из
mermaid/*.mmdнужно заранее сгенерировать вfigures/, см. Диаграммы. - Python-диаграммы нужно заранее сгенерировать командой
task diagramsили вручнуюuv run python scripts/compile_python_diagrams.py. - Если в приложениях подключается код, он должен лежать по ожидаемому пути, см. Код в приложениях.
Если эти файлы не подготовлены, latexmk может завершиться ошибкой из-за отсутствующих PDF, изображений или листингов.
Подготовка
- Установите дистрибутив LaTeX. Под Windows рекомендуется TeX Live.
latexmkобычно поставляется вместе с установкой TeX Live, поэтому отдельно его ставить не нужно. Компилятор проекта: LuaLaTeX. - Установите Python и убедитесь, что команда
pythonдоступна вPATH. Она нужна не только вспомогательным скриптам: документ использует PyLuaTeX во время компиляции LaTeX. - Убедитесь, что доступны команды
latexmk,lualatexиbiber. - Клонируйте репозиторий.
- Установите Python-зависимости для вспомогательных скриптов:
task deps
uv sync
- Создайте в корне проекта файл
.envи укажите основной.texфайл:
TARGET="Куприянов_И221_диплом.tex"
Сборка через latexmk
Соберите основной документ:
task latex:local
latexmk "Куприянов_И221_диплом.tex"
Для другого .tex файла:
task latex:local -- --target "<файл>.tex"
latexmk "<файл>.tex"
Конфигурация находится в .latexmkrc: используется LuaLaTeX с --shell-escape, biber, вспомогательные файлы складываются в .aux_files, а готовый PDF остается в корне проекта. --shell-escape нужен PyLuaTeX, чтобы запустить Python во время компиляции.
Сборка через Python-скрипт
Если удобнее читать TARGET из .env, можно использовать скрипт. По умолчанию он тоже собирает документ через latexmk:
task latex:local
uv run python scripts/build_latex_manual.py
Если нужно собрать другой файл без изменения .env, передайте его явно:
task latex:local -- --target "<файл>.tex"
uv run python scripts/build_latex_manual.py --target "<файл>.tex"
Если нужно отключить latexmk и запустить старую ручную цепочку lualatex, biber, lualatex, lualatex, передайте флаг:
task latex:manual_chain
uv run python scripts/build_latex_manual.py --no-latexmk
Когда нужен ручной режим
Этот режим медленнее на повторных сборках: в текущем проекте около 53-54 секунд каждый раз против примерно 18 секунд при повторном запуске через latexmk.
Полностью ручная компиляция
Этот способ нужен только для диагностики или если latexmk недоступен. В обычной сборке без Docker используйте latexmk: первый запуск в этом проекте может занимать около 74 секунд, зато повторные сборки сокращаются примерно до 18 секунд. Ручная цепочка через --no-latexmk каждый раз занимает около 53-54 секунд. В скрипте scripts/build_latex_manual.py этот режим включается флагом --no-latexmk.
Создайте папку для вспомогательных файлов:
mkdir .aux_files
Так как проект использует biblatex с backend biber и PyLuaTeX, одного запуска lualatex недостаточно, а каждый запуск lualatex должен идти с --shell-escape:
Ручная цепочка для произвольного .tex файла
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"
biber ".aux_files/<файл>.bcf"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"
Для основного файла проекта:
Ручная цепочка для основного файла проекта
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"
biber ".aux_files/Куприянов_И221_диплом.bcf"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"
После сборки итоговый PDF окажется в .aux_files. Его нужно перенести в корень проекта:
mv ".aux_files/<файл>.pdf" .
В Windows cmd для основного файла:
move ".aux_files\Куприянов_И221_диплом.pdf" .
-
Служебные файлы
latexmkпомогают понять, какие зависимости документа изменились: библиография, подключенные.tex-файлы, изображения и вспомогательные LaTeX-артефакты. Поэтому повторная сборка обычно короче полной ручной цепочки. ↩