Изначально я хотел рассказать в данной статье про свой шаблон дипломной работы, но таких статей полно, зачем мне делать еще одну? За 3 года работы научным сотрудником в лаборатории МГТУ им. Баумана я много чему научился, в том числе и оформлению своих результатов, как графически, так и в Latex. Поэтому эта статья будет посвящена работе со своим шаблоном дипломной работы, а также будет содержать некоторые полезные советы по оформлению презентации и диплома. Я думаю, что смогу дать некоторые полезные советы, так как много раз представлял результаты своей научной работы на конференциях и имею несколько публикаций в иностранных научных журналах Q1.

Для кого эта статья?

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

Свой шаблон дипломной работы в LaTex

Где-то в феврале я начал задумываться о том, что пора бы уже начать писать диплом. За 3 года работы научным сотрудником у меня накопилось достаточно материала, но необходимо было это все красиво оформить. Так как на протяжении 6 лет обучения я все писал в Latex, вопрос, где же писать свою работу у меня не стоял. Однако такой способ имеет ряд своих сложностей, таких, как правильный шрифт, зачастую это Times New Roman, правильное оформление в соответствии с требованиями нормоконтроля, автоматическое составление списка использованных источников по ГОСТ и много мелких проблем. Естественно, я начал искать шаблоны в интернете, ведь кто-то наверняка все эти вопросы уже решал.

Требования к шаблону у меня были следующие:

  1. Шрифт Times New Roman. Такие требования к оформлению работы были раньше, когда я еще писал бакалаврский диплом.

  2. Автоматическое составление списка литературы по ГОСТ. Это ооочень удобно, при написании работы с большим количеством источников без этого не обойтись.

  3. Использование компилятора pdflatex. Это самый популярный компилятор, для которого уже есть куча работающих пакетов, для него легче всего найти примеры. В нем у меня уже была сделана бакалаврская работа.

  4. Простота в использовании шаблона. Без танцев с бубнами по установке и приведением к требованиям нормоконтроля. В идеале в нем не надо разбираться несколько дней и читать форумы, чтобы начать работать.

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

Собственно, вот на него ссылка.

Фишки моего LaTex шаблона диплома

К плюсам своего шаблона я мог бы отнести следующее:

  1. Шрифт Times New Roman

  2. Автоматическая библиография по ГОСТ (bibtex)

  3. Автоматизированная сборка в Linux и Windows

  4. Автоматическое создание релизов на GitHub

  5. Любое количество собираемых файлов (диплом, презентация и что-либо еще)

  6. Собираемые файлы .tex могут иметь любое имя без пробелов

  7. Автоматическая очистка временных файлов Latex до и после сборки

  8. На компьютере не нужен установленный Latex, вся сборка происходит в контейнере docker

  9. Работа проходит нормоконтроль в программе нормоконтроля TestVKR МГТУ им. Н.Э.Баумана

  10. Используется самый популярный компилятор - pdflatex

И все это без танцев с бубнами. Достаточно установить себе на компьютер docker, и нажать на одну кнопку (Windows) или ввести команду make (Linux). Даже LaTex устанавливать не надо!

Редактировать исходники диплома можно из Visual Studio Code. Рекомендую следующие плагины для него:

  1. streetsidesoftware.code-spell-checker-russian - проверка русского языка

  2. James-Yu.latex-workshop - поддержка LaTex

Все остальные плагины можно поставить на ваше усмотрение.

Подробную инструкцию по установке и структуру шаблона можно найти в README.

Разбор реализации и советы по использованию

Это основной раздел статьи, в котором я подробно разберу, как пользоваться шаблоном, расскажу про реализацию, про проблемы, с которыми мне пришлось столкнуться, а также попутно дам полезные советы по написанию дипломной работы и составлению презентации.

Расчетно-пояснительная записка

Главный файл расчетно-пояснительной записки имеет следующую структуру:

\documentclass[
candidate, % тип документа
subf, % подключить и настроить пакет subfig для вложенной нумерации рисунков
times % шрифт Times как основной
]{disser}

\renewcommand{\rmdefault}{ftm} % Основная строчка, которая позволяет получить шрифт Times New Roman

\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
.
.

\begin{document}

% Титульник (первая страница файла Title.pdf)
\includepdf[pages={1-1}]{additional/Title.pdf}

% Аннотация, Содержание, Введение
\input{chapters/introduction.tex}

% Главы
\input{chapters/chapter_1.tex}
\input{chapters/chapter_2.tex}
.
.

% Библиография
\input{chapters/biblio.tex}

% Приложение (у меня пустое)
\input{chapters/appendix.tex}

\end{document}

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

Я использую documentclass{disser}, потому что он является одним из самых популярных для такого типа работ, по нему легко найти документацию, и он поддерживается pdflatex.

Следующая строка непосредственно отвечает за то, чтобы после компиляции появился шрифт Times New Roman.

\renewcommand{\rmdefault}{ftm}

Однако это не будет работать без docker контейнера, в котором установлены шрифты.

Далее, после подключения пакетов, следует подключение глав в проект.

\input{chapters/chapter_1.tex}
\input{chapters/chapter_2.tex}

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

Внутри главы я использую следующие команды:

\newpage
\begin{center} % центрирование посередине страницы
    \textbf{\large 1. РОЛЬ ДАЛЬНОДЕЙСТВИЯ ПРИТЯЖЕНИЯ В ПРОСТЫХ ЖИДКОСТЯХ} % Название главы, какое оно будет в тексте
\end{center}
\refstepcounter{chapter}
\addcontentsline{toc}{chapter}{1. РОЛЬ ДАЛЬНОДЕЙСТВИЯ ПРИТЯЖЕНИЯ В ПРОСТЫХ ЖИДКОСТЯХ} % Название главы, какое оно будет в содержании

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

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

...
Для решения поставленной задачи методом молекулярной динамики были смоделированы системы.
Пост обработка проводилась с использованием MATLAB и python.
...

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

Подключение литературы в проект выглядит следующим образом (\input{chapters/biblio.tex}):

\addcontentsline{toc}{chapter}{СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ} % это будет отображаться в содержании
\renewcommand{\bibsection}{\centering\textbf{\large СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}} % смена названия библиографии по умолчанию
\bibliographystyle{biblio/gost2008n} % файл, задающий формат ссылок по ГОСТ
\bibliography{biblio/biblio} % файл с библиографией

Самой полезной строчкой тут является следующая:

renewcommand{\bibsection}{\centering\textbf{\large СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}}

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

Что касается добавления нового источника литературы и его использования в тексте, тут можно дать несколько хороших советов:

Алгоритм добавления нового источника литературы следующий:

  1. Ищем DOI статьи, которую хотим добавить в список литературы. Это удобно сделать через сайт Google Scholar. Зачастую DOI является частью URL ссылки на работу.

  2. Вставляем DOI на сайте doi2bib.

  3. Полученное содержимое вставляем в файл biblio.bib, заменяя автоматически сгенерированное название на DOI статьи!

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

В тексте работы сослаться на данный источник можно будет так:

... в работе~\cite{DOI} % ~ нужна для того, чтобы номер источника не переносился на следующую строку

Если у работы нет DOI, то все необходимые поля придется заполнить самостоятельно. Тогда вам стоит задуматься, достойна ли эта статья оказаться в вашем списке литературы. Как правило, если у работы нет DOI, она опубликована в журнале "не очень". Если же вы уверены, что ваш источник из хорошего журнала, то вы либо ошибаетесь, либо плохо искали DOI, третьего не дано. Желательно использовать в качестве источников только статьи из англоязычных журналов с рейтингом Q1, Q2, все остальное, как правило, не цитируется в качественных научных работах.

Презентация

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

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

Первый совет состоит в следующем: сделать как можно больше красивых и содержательных картинок на каждом слайде вашей презентации. Если вы не знаете какую картинку на данный слайд можно поставить, будьте уверены: он вам не нужен. Лучше мало слайдов, но отточенных до идеала, чем много "сырых".

И самое главное: никогда, НИКОГДА, не вставлять на слайд текст. Единственные слайды, где у вас может быть текст - это постановка задачи и заключение. Исключение - краткие, буквально пару слов, комментарии к формулам или важный небольшой список. Я участвовал на нескольких научных конференциях и замечал, когда на слайде появляется текст, все мгновенно засыпают и перестают слушать. Такую же проблему я наблюдал у множества своих одногруппников на защите.

Помимо этого, хорошим тоном является указание ссылки на источник на слайде, откуда взята информация или картинка. Это будет высоко оценено комиссией.

Вот пример хорошего слайда в презентации:

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

Сборка

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

Для сборки диплома и презентации я написал следующий Makefile:

LATEX_COMPILER = pdflatex
LATEX_COMPILER_FLAGS = -interaction=nonstopmode
BIBLIO_COMPILER = bibtex
BIBLIO_COMPILER_FLAGS = 

RM = rm -f
TEMPORARY_FILES = *.out *.aux *.blg *.bbl *.toc *.nav *.snm
LOG_FILES = *.log

DOCKER_RUN = docker run
DOCKER_FLAGS = --rm -i -v "${PWD}":/diplom:Z
DOCKER_IMAGE = 2109199812/docker-latex
DOCKER_COMMAND = bash -c "make release"

FILES_TO_BUILD := $(shell find "${PWD}" -maxdepth 1 -name '*.tex' -printf "%f\n" | sed -r "s/(.*).tex/\1.pdf/g")

.PHONY: all release clean_before_build clean_after_build

all:
	$(DOCKER_RUN) $(DOCKER_FLAGS) $(DOCKER_IMAGE) $(DOCKER_COMMAND)

release: clean_before_build $(FILES_TO_BUILD) clean_after_build

%.pdf: %.tex
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	@if grep -r "citation{.*}" $*.aux; then \
		$(BIBLIO_COMPILER) $(BIBLIO_COMPILER_FLAGS) $*; \
	fi
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*

clean_before_build:
	$(RM) $(FILES_TO_BUILD) $(LOG_FILES) $(TEMPORARY_FILES)

clean_after_build:
	$(RM) $(TEMPORARY_FILES)

Давайте разберемся, что он делает. С объявлением переменных все понятно, начнем со следующих строк:

all:
	$(DOCKER_RUN) $(DOCKER_FLAGS) $(DOCKER_IMAGE) $(DOCKER_COMMAND)

Аналогичная точка входа на Windows в файле makewin.bat выглядит так:

@echo off
SETLOCAL
docker run --rm -i -v "%cd%":/diplom:Z 2109199812/docker-latex bash -c "make release"
pause
ENDLOCAL

Это точка входа в мою сборку диплома и презентации, тут запускается docker контейнер, в котором происходит вся компиляция проекта.

Зачем мне вообще был нужен docker? Не является ли это лишним? Все дело в том, что в нем и происходит выбор шрифта Times New Roman. Получить этот шрифт с помощью компилятора pdflatex в своем дипломе было самой большой проблемой, решение которой заняло у меня около месяца. Он довольно тяжело устанавливается, даже если знать, что для этого нужно делать. Например на Windows у меня вообще не получилось это сделать (без docker). Поэтому я считаю, что было просто необходимо сделать из этого контейнер, чтобы зафиксировать рабочую настройку системы. Кроме этого, у такого подхода есть множество других плюсов: вам не нужно ничего настраивать, чтобы у вас появился этот шрифт, как на Linux, так и на Windows (кроме установки docker, но это не сравнится с теми танцами с бубнами, через которые я прошел, когда делал шрифт).

Следующие строки Makefile выполняются уже непосредственно в docker:

release: clean_before_build $(FILES_TO_BUILD) clean_after_build

Тут выполняется 3 этапа:

  1. Очистка до сборки. Из основной директории удаляются файлы pdf (а также их log файлы), которые имеют такое же название как файлы .tex. На случай, если вы допустили ошибку, и у вас не скомпилировались до конца ваши файлы, но остались временные, предусмотрена и их очистка тоже, потому что зачастую бывает так, что в новой итерации сборки используются старые сгенерированные файлы, в которых есть ошибка, и пока вы их не удалите, вы будете получать ошибки компиляции совершенно правильного документа!

  2. Далее происходит сборка самих файлов, о ней я подробнее расскажу далее.

  3. Еще раз очистка временных файлов.

Как происходит, собственно, сама сборка документов:

%.pdf: %.tex
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	@if grep -r "citation{.*}" $*.aux; then \
		$(BIBLIO_COMPILER) $(BIBLIO_COMPILER_FLAGS) $*; \
	fi
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*

Над этой частью тоже пришлось немного помучиться. Вся сложность в условной компиляции списка литературы. Дело в том, что я хотел сделать универсальный Makefile, который будет компилировать файлы с любым именем .tex в основной директории. Однако сложность возникает, если в одном из файлов есть список литературы, а в другом нет. Если вызывать компилятор bibtex для файла, в котором нет цитирований, то он будет выдавать ошибки, и, к сожалению, у него даже нет ключа, который позволил бы этого избежать. Поэтому пришлось провести некоторую исследовательскую работу по поиску отличий временных файлов для диплома и презентации (в которой нет цитирований), и мне удалось найти, что в aux файлах для документа с цитированием присутствуют записи в таком формате "\citation{DOI}". Использование grep идеально подходит для решения данной проблемы с условной компиляцией.

Создание релизов

При работе с данным шаблоном я рекомендую активно использовать git и GitHub (но это не является обязательным). Во-первых, вы можете эффективно отслеживать свои изменения и работать в команде со своим научным руководителем, которому можно отправлять на ревью свою работу, а во-вторых, в данном шаблоне предусмотрено создание релизов по пушу тега вида v*. Что это дает? Вы можете не индексировать свои скомпилированные файлы, а хранить их в релизах, это очень удобно, особенно, если они большие. По этой причине вы не найдете в моем репозитории скомпилированные файлы, они добавляются только в релиз, когда я считаю, что изменений в них достаточно, чтобы сделать новую версию.

Как этим пользоваться?

Оставлю тут краткую инструкцию для тех, кто не работал с git:

git add .
git commit -m "your comment"
git push
git tag -a v0.1 -m "your comment"
git push --tags

Вам не нужно ничего предварительно настраивать (разве что token GitHub, который должен иметь разрешение actions), необходимый скрипт уже лежит в скрытой папке github/workflows/main.yml.

Скрипт для GitHub Actions выглядит следующим образом:

name: Create_Thesis

on:
  push:
    tags:
      - 'v*'

jobs:
  build:
    runs-on: ubuntu-latest
    container:
        image: docker.io/2109199812/docker-latex:latest
    steps:
      - uses: actions/checkout@v3

      - name: Compile Thesis
        shell: bash
        run: make release

      - name: Rename release file
        shell: bash
        run: |
          for filename in $(find "$(pwd)" -maxdepth 1 -name '*.tex' -printf "%f\n" | sed -r "s/(.*).tex/\1/g"); do mv ${filename}.pdf ${filename}-${GITHUB_REF#refs/*/}.pdf; done
      
      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: |
            *-v*.pdf

Можно заметить, что он довольно простой. Здесь происходит скачивание моего docker контейнера, который опубликован на DockerHub, запуск make release, переименование сгенерированных pdf файлов, которые имеют такое же название как файлы .tex в основной директории (к ним добавляется номер версии), и добавление их в релиз.

Заключение

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

Он соотвествует требованиям моего вуза и программы TestVKR, которую используют в МГТУ им. Баумана для проверки правильности оформления работы. Однако, так как здесь используется самый популярный компилятор pdflatex, подключить нужные пакеты и настроить свой шаблон под ваши требования не составит труда.

Я надеюсь, что данный шаблон поможет большому количеству людей, кто решил писать свой диплом в Latex.

Комментарии (5)


  1. Kylin
    11.10.2022 16:44
    +1

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


  1. AKudinov
    11.10.2022 17:10
    +4

    Я бы завернул весь "пролог" главы с центрированием и шаганием счётчиком глав в одну команду. Чтобы не надо было копипастить много кода из главы в главу, рискуя что-нибудь потерять.

    И, наверное, название главы, всё , набирал по-человечески, с большой буквы, а в заглавные преобразовывал силами LaTEX.


  1. Jury_78
    11.10.2022 21:31

    Для библиографии могу порекомендовать программу Zotero - очень удобно.


  1. quartz64
    12.10.2022 17:52
    +1

    Не так часто встречаются хорошие статью о LaTeX, спасибо!
    Я недавно взялся верстать научный журнал, имея не очень большой опыт (собственные студенческие работы, набор/доработка отдельных чужих статей, документы по работе). Убил пару недель на доработку стилевого файла, так что поделюсь наблюдениями:

    1. В XeLaTeX и LuaLaTeX ничего страшного нет, кроме скорости. Зато бонусов масса: работать со шрифтами через fontspec удобнее, есть unicode-math (в нем удобно переключать стили начертания операторов и переменных).

    2. Сложные таблицы не вызывают адских страданий, если использовать современный tabularray, а всякие tabu и tabularx выкинуть на свалку.

    3. С соблюдением ГОСТ очень хорошо справляется biblatex-gost.

    4. Формат заголовков в тексте и в оглавлении лучше делать через titlesec/titletoc. Документация там скудная, но методом тыка разобраться можно. Тогда не нужны будут костыли в виде ручного добавления chapter. Если уж лень возиться, то хотя бы оберните эти костыли в макрос.

    5. Для регулярно создаваемых документов лучше использовать не подключение .tex-преамбулы, а стилевой файл (sty). Вместо комментирования строк оформить передачу параметров. Файл можно положить в доступное компилятору место (в TeXLive это ~/texmf/tex/latex, чтобы не делать кучу копий.

    6. Минимум ручного форматирования. Вот захочет от вас нормоконтроль подписи к рисункам обычным шрифтом вместо полужирного — придется все главы просматривать и убирать \textbf. Это пакетом caption стоит сделать.

    P.S. Спасибо за doi2bib!


    1. NikitaDmitryuk Автор
      12.10.2022 21:42

      Спасибо за такой развернутый и полезный комментарий!