Как я диплом в LaTeX писал с GitHub, Docker и TravisCI

в 9:25, , рубрики: docker, github, latex, open source, PDF, travisci

Еще со времен обучения в университете я использовал LaTeX для оформления лабораторных и курсовых работ. Познакомился впервые с LaTeX я на Coursera, на курсе "Документы и презентации в LaTeX".

В этой заметке я расскажу, как я писал диплом с помощью LaTeX, GitHub, Docker и TravisCI.

Но зачем?

Предисловие

Мой путь редактирования и создания документов начался с Microsoft Word, наверное как и у многих, когда я стал использовать Linux я без труда стал использовать сначала OpenOffice, а потом LibreOffice, который в моих задачах не уступал по функционалу первому. Немного больно было, когда написав какой-нибудь реферат в компьютерном зале библиотеки, несешь его на распечатку на админский компьютер с Microsoft Word, а у тебя слетает все форматирование и перед распечаткой нужно было пройтись по всему документу. В то школьное время мне никто не объяснил того, что можно сохранить документ в PDF и печатать где хочешь, это я уже сам узнал, когда учился в университете и нужно было печатать документы чуть ли не каждый день.

Вернемся к LaTeX, до его использования, все что я слышал о LaTeX, это то, что с его помощью пишут статьи в научные журналы из-за того, что он очень удобен для работы с формулами. Те кто думают так же, рекомендую посмотреть курс на Coursera, возможно он изменит ваше мнение, мне например он очень понравился.

Hello, World на LaTeX:

documentclass{article}
begin{document}
Hello, World!
end{document}

Кстати с помощью LaTeX можно делать и презентации. Вот тут можно посмотреть множество примеров как могут выглядеть эти презентации.

Бакалаврский диплом с LaTeX

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

Поначалу я использовал LaTeXila в качестве IDE, в котором сборка проекта осуществлялась одной кнопкой, можно было подключить спеллчекер, но он у меня иногда вылетал и я стал использовать Sublime Text вместе с Makefile.

Пример Makefile:

all: build run

build:
    latexmk -xelatex 
    -synctex=1 main.tex

run:
    # Я использую xreader для просмотра PDF
    xreader main.pdf &

clean:
    rm *.aux 
    *.fdb_latexmk 
    *.fls 
    *.log 
    *.out 
    *.synctex.gz 
    *.toc

Все исходники хранил в git, для удобства коллаборации с научным руководителем использовал GitHub. Структура проекта была очень простой, в файл main.tex подключались преамбула и остальные главы, которые хранились в отдельном каталоге.

main.tex:

documentclass[a4paper,14pt]{extarticle} % 14й шрифт
input{inc/preamble} % Подключаем преамбулу

begin{document}
tableofcontents % Содержание 
clearpage

input{inc/0-intro} % Введение
input{inc/1-pz} % Постановка задачи
...
input{inc/0-bibliography} % Библиографический список

input{inc/a-app} % Исходный код скрипта DDoS Deflate
input{inc/b-app} % Руководство пользователя
includepdf{act} % Акт внедрения
end{document}

Описание всех стилей и форматирование находится в файле preamble.tex, который подключается в самом начале документа.

Очень удобно было не заботиться о форматировании содержания, библиографического списка и прочих частей диплома.

Содержание
Содержание

Опишу свои плюсы при работе с LaTeX, по сравнению с WYSIWYG-редакторами на тот момент:

  • удобная версионируемость (вместо диплом.odt, диплом_01.01.2015.odt, диплом_исправл_печать.odt версионируемость в git и возможность откатиться на любой момент в истории)
  • при случайном нажатии чего-либо, верстка не слетает (у меня такое бывало в WYSIWYG)
  • гибкие настройки, которые не всегда доступны в WYSIWYG или они неочевидны
  • гомогенная среда для всего (исходники презентации лежат в том же репозитории, что и диплом)
  • возможность коллаборации, дипломный руководитель может смотреть в репозитории что изменилось со времен последней проверки
  • удобно использовать как шаблон для множества различных документов
  • удобно включать такие вставки как исходный код например или дополнительные PDF-файлы

Вот пример того, как легко можно подключить в документ файл с исходным кодом (его можно раскрашивать как угодно, включать номера строк и много других интересных вещей):

lstinputlisting[numbers=left]{inc/ddos-deflate/ddos.sh}

Подключенный исходный код в документ
Подключенный исходный код в документ

Минус использования LaTeX для меня только один — нужно потратить время для того, чтобы отполировать это все до нужного результата. Я даже на мгновение захотел заморочиться, чтобы перерисовать все диаграммы и картинки нативным способом с помощью TikZ, но это требовало очень много времени, поэтому я спокойно рисовал свои картинки в Google Drawings и draw.io.

Успешно защитив бакалаврский диплом и получив некоторые знания по работе с git, GitHub, Makefile, гуглению по LaTeXStackExchange на английском, я забыл про диплом на пару лет, для того чтобы использовать свой шаблон для написания уже магистерского диплома.

Магистерский диплом

В то время когда я обучался в магистратуре, я уже стал увлекаться инструментами инженера, такими как Docker, стал практиковаться с инструментами Continuous Integration, изучать практики DevOps. Также мне было интересно красиво оформлять свои пет-опенсорс-проекты с красивыми README и прочими бейджами.

В целом, когда я приступил к написанию магистерского диплома, требования к оформлению не особо изменились, поэтому по факту я взял шаблон своего бакалаврского диплома и допилил по мелочи, например такие пункты как список иллюстративного материала, перечень сокращений и прочее. При защите бакалаврского диплома мы использовали плакаты размером A1, а в магистерском нам уже разрешили использовать презентации в виде слайдов, поэтому слайды я также верстал с помощью LaTeX и beamer.

Презентация сверстанная с помощью LaTeX и beamer
Презентация сверстанная с помощью LaTeX и beamer

Я подумал, а почему бы не собирать при каждом коммите в репозиторий новый PDF с помощью CI, подключение GitHub к TravisCI заняло 10 минут. TravisCI не умеет напрямую работать с LaTeX, но зато прекрасно работает с Docker. Круто, подумал я, убью сразу несколько зайцев:

  • попрактикуюсь с написанием Dockerfile
  • смигрирую все латеховские пакеты в Docker (а их там немало и они довольно тяжелые)
  • попрактикуюсь с использованием TravisCI
  • помогу тем, кто вдруг когда-то захочет воспользоваться моим шаблоном на отличной от Linux ОС

Написание файла конфигурации для TravisCI, Dockerfile и редактирование Makefile заняло не очень много времени и получилось вполне себе удобно:

Часть Makefile для запуска сборки проекта в Docker:

...
docker:
    docker build -t docker-latex .
    docker run -ti -v ${PWD}:/master-thesis:Z docker-latex bash -c "make build && make clean"
    docker run -ti -v ${PWD}:/master-thesis:Z docker-latex bash -c "make -C presentation && make -C presentation clean"

Теперь дипломный руководитель мог не просто посмотреть мои изменения в коде, но и как оно выглядит в сверстанном виде.

Релизы
Релизы

Оформив диплом в приемлимом для себя виде, я решил поделиться шаблоном с сообществом, по аналогии со своим бакалаврским. Решено было красиво оформить README-файл репозитория, ведь это лицо проекта. Человек который нашел твой проект в интернете должен по файлу README сразу же без труда разобраться как собрать проект и что с ним делать.

Файл README.md
Файл README.md

Скоро мне предстоит писать третий диплом и я думаю, что мой подход к его написанию ничуть не изменится и на его оформление я потрачу совсем мизерное количество времени.

Итоги

Обычная заинтересованность LaTeX'ом позволила мне немного больше погрузиться в эту сферу:

  • набить руку при работе с LaTeX, что в дальнейшем помогло сэкономить время при создании документов и презентаций
  • набрался опыта при работе с git и GitHub, пока работал с этими пет-проектами
  • использовал на практике такие вещи как Docker и TravisCI, что дало мне хороший толчок при погружении в DevOps
  • научился аккуратно оформлять свои пет-проекты

Ответы на потенциальные вопросы

Зачем хранишь в репозитории PDF-файлы?

Исключительно для того, чтобы человек, который зашел в репозиторий, мог не только посмотреть исходники, но и увидеть результат всего этого.

Не до конца автоматизированы многие вещи, например библиография

Согласен, по тем или иным причинам я не стал более глубоко докапываться до этого, возможно те, у кого сотни источников использованной литературы будет больно.

Соответствует ли шаблон ГОСТ/ДСТУ?

Я руководствовался исключительно требованиями нормоконтроллера, скорее всего у каждого была/будет такая ситуация.

Автор: Amet13

Источник

* - обязательные к заполнению поля