Это шаблон дипломной работы, оформленный в виде LaTeX-класса. Шаблон создавался специально для бакалаврской ВКР студентов ФКН ПИ НИУ ВШЭ, но может быть использован и при выполнении ВКР на других программах / факультетах / вузах, т.к. бОльшая часть легко настраиваема (см. опции ниже).
Главная особенность данного шаблона в том, что автоматически генерируется всё, что только возможно - от пользователя требуется лишь указать нужные данные и написать текст.
Что же генерируется автоматически?
- Стили, шрифты, внешний вид и т.п. (в соответствии с ГОСТ 7.32-2017);
- Титульный лист;
- Содержание;
- Правильный порядок листов (глав, содержания, аннотаций, терминологии, приложений и т.п.);
- Текст вида "Работа состоит из 52 листов, 5 глав, 2 таблиц, 1 листинга, 3 рисунков, 2 приложений. Использовано 15 источников." в аннотациях (за подробностями см. сюда);
- Алфавитный порядок в терминологии;
- Список источников по ГОСТу;
- Нумерация глав (числами) и приложений (кириллицей).
Шаблон поддерживает два вида работ - академические и проектные.
Для использования необходим всего один класс. Чтобы быстро начать, можно загрузить всё содержимое репозитория и изменить то, что нужно.
Для компиляции используйте pdflatex
. Другие компиляторы не поддерживаются (если есть желание добавить поддержку какого-либо компилятора - см. сюда).
Корректность работы проверена на следующих версиях:
pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017)
;pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian)
;pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)
.
Если вы используете ShareLaTeX или Overleaf, то ничего особенного делать не нужно - просто загрузите шаблон и выберите в качестве компилятора pdflatex
.
При использовании Overleaf есть небольшая проблема - по умолчанию используется TeX Live 2021
, который провоцирует ошибку компиляции (причину ошибки выяснить не удалось, так что если она вам известна, прошу сюда). Чтобы обойти ошибку, выберите TeX Live 2020
или более раннюю версию.
Во-первых, вам потребуется загрузить несколько пакетов. Сделать это можно следующей командой:
sudo apt-get install texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-formats-extra texlive-lang-cyrillic texlive-bibtex-extra biber
Во-вторых, нужно будет запустить компилятор несколько раз, а также biber
:
pdflatex --shell-escape --interaction=nonstopmode main
biber main
pdflatex --shell-escape --interaction=nonstopmode main
pdflatex --shell-escape --interaction=nonstopmode main
Либо используйте latexmk
:
latexmk main -pdf
Весь документ создаётся при помощи единственного окружения thesis
.
Параметрами окружения thesis
являются данные, используемые на титульном листе и в аннотациях.
Список параметров:
institute
- полное название вуза, написанное в шапке титульного листа. По умолчанию - "ПРАВИТЕЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИ ... НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ <<ВЫСШАЯ ШКОЛА ЭКОНОМИКИ>>";faculty
- факультет и департамент, в котором пишется работа. По умолчанию - "Факультет компьютерных наук Департамент программной инженерии";year
- год написания работы. По умолчанию - 2022;city
- город написания работы. По умолчанию - Москва;title
- название работы;authorGroup
- полное название учебной группы автора работы, например "БПИ182";authorName
- инициалы и фамилия автора работы, например "И. И. Иванов";isAuthorFemale
- является ли автор студенткой, а не студентом (используется в паре мест при написании окончаний). Можно использовать параметр как флаг (т.е. не указывать значение), либо передать значениеtrue
илиfalse
. По умолчанию - false;isAcademic
- является ли работа академической, а не проектной. Можно использовать параметр как флаг (т.е. не указывать значение), либо передать значениеtrue
илиfalse
. По умолчанию - false;UDC
- УДК (используется только для академических работ);educationalProgram
- полное наименование образовательной программы. По умолчанию - "09.03.04 <<Программная инженерия>>";academicTeacherTitle
- должность и прочие регалии научного руководителя;academicTeacherName
- инициалы и фамилия научного руководителя, например "И. И. Иванов";academicSupervisorTitle
- должность и прочие регалии академического руководителя образовательной программы. По умолчанию - данные В. В. Шилова, руководителя ОП ПИ;academicSupervisorName
- инициалы и фамилия академического руководителя образовательной программы. По умолчанию - "В. В. Шилов";hasAcademicCoteacher
- есть ли соруководитель. Можно использовать параметр как флаг (т.е. не указывать значение), либо передать значениеtrue
илиfalse
. По умолчанию - false;academicaCoteacherTitle
- должность и прочие регалии соруководителя;academicCoteacherName
- инициалы и фамилия соруководителя, например "И. И. Иванов";hasConsultant
- есть ли консультант. Можно использовать параметр как флаг (т.е. не указывать значение), либо передать значениеtrue
илиfalse
. По умолчанию - false;consultantTitle
- должность и прочие регалии консультанта;consultantName
- инициалы и фамилия консультанта, например "И. И. Иванов";keywordsRu
- ключевые слова для использования в русскоязычной аннотации. В качестве разделителей используйте точку с запятой;keywordsEn
- ключевые слова для использования в англоязычной аннотации. В качестве разделителей используйте точку с запятой;refsSorting
- схема сортировки источников. Используются опции изbiblatex
(см. в раздел Список источников для подробностей). По умолчанию -none
(сортировка в порядке использования).
Ни один из параметров не является обязательным для успешной компиляции, но данные, обязательные для указания в работе, при отсутствии заменяются красными надписями TODO. Сделано это для того, чтобы незаконченый документ можно было успешно скомпилировать, а места, требующие доработки, не были случайно пропущены в будущем.
Внутри окружения thesis
при помощи специальных команд нужно указать .tex
файлы, из которых нужно брать отдельные компоненты документа (главы, аннотации, введение и т.п.).
Список команд:
\setAbstractResource{path/to/abstract-ru}{path/to/abstract-en}
- русскоязычная и англоязычные аннотации;\setTerminologyResource{path/to/terminology}
- терминология;\setIntroResource{path/to/intro}
- введение;\addChapter{Название главы}{path/to/chapter}
- добавление новой главы с указанным названием;\setConclusionResource{path/to/conclusion}
- заключение;\addAppendix{Название приложения}{path/to/appendix}
- добавление нового приложения с указанным названием.
Порядок указания команд влияет на порядок листов только в случае с главами и приложениями, в остальных случаях порядок не имеет значения.
Список источников генерируется автоматически по ГОСТу. Для этого используются пакеты biblatex
и biblatex-gost
.
Как создать список источников:
- Создать файл с расширением
.bib
; - Заполнить файл источниками в формате
biblatex
; - Добавить в главном файле команду
\addbibresource{имя_файла.bib}
.
Если нужно сослаться на источник в тексте, используйте команду \cite{имя_источника}
(все ссылки кликабельны).
По умолчанию источники сортируются в порядке использования. Это можно изменить, используя опцию refsSorting
у глобального окружения thesis
, в котором ожидаются опции из biblatex
. Например, для сортировки по алфавиту можно использовать refsSorting=nyt
.
Внешний вид списка источников можно посмотреть здесь. Примеры использования команд можно поискать по шаблону.
Для удобства создания списка терминов имеется окружение terminologyList
, внутри которого можно указывать элементы при помощи команды \term[Определение]{описание}
. Термины автоматически сортируются по алфавиту (латиница идёт перед кириллицей).
Пример:
\begin{terminologyList}
\term[Java]{строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems}
\term[Kotlin]{статически типизированный, объектно-ориентированный язык программирования, работающий поверх Java Virtual Machine и разрабатываемый компанией JetBrains}
\end{terminologyList}
Внешний вид терминологии можно посмотреть здесь. Примеры использования команд можно посмотреть здесь.
Для удобства имеются три вида TODO меток, которыми можно пометить части документа, требующие доработки:
\todo{текст}
- добавляет выделенный текст с надписью TODO прямо в то место, где использована команда;\todoref{подпись}
- добавляет нижний колонтитул с соответствующей подписью, а в тексте добавляет пометку со ссылкой на этот колонтитул;\todoref[выделенный_текст]{подпись}
- аналог предыдущей команды, но позволяет дополнительно выделить текст, к которому добавляется пометка.
Внешний вид меток можно посмотреть здесь в аннотациях. Примеры использования команд можно посмотреть здесь.
Для листингов используйте пакет listings
(уже подключён в классе). Основной стиль уже установлен по умолчанию, так что вам нужно лишь выбрать язык, сделать подпись и добавить метку. Подпись у листинга обязательна! При её отсутствии она помечается красной надписью TODO.
Например, листинг на С может выглядеть так:
\begin{lstlisting}[language=C, caption={Какой-то пример кода на C}, label={code:1}]
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
\end{lstlisting}
Чтобы сослаться на листинг, установите у него метку и сошлитесь на неё через \ref{labelname}
.
Кроме всех поддерживаемых пакетом listings
языков, также можно использовать языки Kotlin (стиль взят отсюда) и Golang (стиль взят отсюда).
Присутствует отдельный стиль для написания псевдокода на алгоритмическом языке - algorithmic
. Такой листинг может выглядеть так:
\begin{lstlisting}[style=algorithmic, caption={Какой-то псевдокод}]
$i \gets 10$
if $i \geq 5$ then
$i \gets i-1$
else
if $i \leq 3$
$i \gets i+2$
end if
end if
\end{lstlisting}
Также присутствует возможность выделения конкретных фрагментов исходного кода. Для этого в листинге нужно добавить опцию moredelim={**[is][\btHL]{[@}{@]}}
, а фрагмент кода выделить при помощи [@
и @]
(разделители можно заменить на любые другие). По умолчанию фрагмент выделяется серым прямоугольником, но есть возможность это конфигурировать, передавая команде \btHL
опции стиля из пакета tikz
(например, чтобы выделить оранжевым прямоугольником, можно использовать moredelim={**[is][{\btHL[fill=orange!20]}]{[@}{@]}}
).
Примеры листингов можно посмотреть здесь в приложении А. Примеры использования команд можно посмотреть здесь.
Шаблон умеет автоматически считать и указывать в аннотациях количество:
- страниц;
- глав;
- рисунков;
- листингов;
- таблиц;
- приложений;
- источников.
Из-за этого имеется ряд ограничений:
- Для рисунков нужно использовать исключительно окружение
figure
; - Для листингов нужно использовать исключительно окружение
lstlisting
; - Для таблиц нужно использовать исключительно окружение
table
.
Если используется какое-то другое окружение вместо figure
/lstlisting
/table
, можно инкрементировать счётчик вручную при помощи \stepcounter{table}
/\stepcounter{lstlisting}
/\stepcounter{table}
.
Количеством страниц считается номер последней страницы списка источников (т.е. в количестве страниц учитывается всё, кроме приложений).
На приложения можно ссылаться при помощи \ref{appendix:N}
, где N
- номер приложения (нумерация с единицы). Пример можно посмотреть здесь.
Нет. Титульный лист создан на основе шаблона, взятого отсюда, в котором существует лишь два вида ВКР. Если есть какой-то другой вид ВКР, о котором я не знаю - создайте issue, и я постараюсь это доработать.
Заключите значение этого параметра в фигурные скобки.
Хочу использовать листинги для языка со специфичной нумерацией (например, для JVM байткода). Можно ли поменять нумерацию?
Есть два варианта.
Вариант 1. Отключаем нумерацию у листинга опцией numbers=none
и нумеруем каждую строку в исходном коде самостоятельно. Подход простой, но так себе, т.к. листинги будут отличаться по внешнему виду от других.
Вариант 2. Используем подход отсюда, перенумеруя каждую строку вручную. Подход трудоёмкий, но куда более элегантный.
Примеры использования обоих вариантов можно посмотреть здесь.
Можно включить подсветку аннотаций самостоятельно, используя подход отсюда.
Есть три варианта:
- С нумерацией:
\subsection{Выводы по главе}
- Без нумерации, но не включая в содержание:
\subsection*{Выводы по главе}
- Без нумерации и включая в содержание:
\subsection*{Выводы по главе}
\addcontentsline{toc}{subsection}{Выводы по главе}
Пример использования третьего варианта можно посмотреть здесь.
lstlisting плохо дружит с Unicode. Можно попробовать один из подходов отсюда, например, добавить параметр texcl=true
:
\begin{lstlisting}[language=java, texcl=true]
public void foo() {
System.out.println("Hello"); // Это комментарий на русском языке
}
\end{lstlisting}
- Если у источника не хватает записи
[Электронный ресурс]
, то это можно указать черезmedia={eresource}
; - Если не хватает даты обращения, то это можно указать через
urldate={yyyy-mm-dd}
; - Дату публикации можно указать через
date={yyyy-mm-dd}
; - Дату обновления можно указать через
update={yyyy-mm-dd}
; - Если смущает, что вместо
Режим доступа: http://..., свободный
написаноURL: http://...
, то такой формат тоже разрешён.
В случае чего можно ссылаться на ГОСТ 7.0.5-2008, где описан именно такой формат.
О всех проблемах и интересующих улучшениях можно сообщать в issue.
Если хочется доработать шаблон, то pull-request'ы также приветствуются.