Перейти к содержанию

Сборка без 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, изображений или листингов.

Подготовка

  1. Установите дистрибутив LaTeX. Под Windows рекомендуется TeX Live. latexmk обычно поставляется вместе с установкой TeX Live, поэтому отдельно его ставить не нужно. Компилятор проекта: LuaLaTeX.
  2. Установите Python и убедитесь, что команда python доступна в PATH. Она нужна не только вспомогательным скриптам: документ использует PyLuaTeX во время компиляции LaTeX.
  3. Убедитесь, что доступны команды latexmk, lualatex и biber.
  4. Клонируйте репозиторий.
  5. Установите Python-зависимости для вспомогательных скриптов:
task deps
uv sync
  1. Создайте в корне проекта файл .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" .

  1. Служебные файлы latexmk помогают понять, какие зависимости документа изменились: библиография, подключенные .tex-файлы, изображения и вспомогательные LaTeX-артефакты. Поэтому повторная сборка обычно короче полной ручной цепочки.