Глава 1. Вступление
В жизни каждого студента наступает момент, когда необходимо написать выпускную квалификационную работу (ВКР). Бывшие выпускники говорят, что успех ВКР в значительной степени зависит от правильного оформления документации, в то время как основное содержание работы остается на втором плане. Но почему бы не внедрить автоматизированный процесс оформления, который соответствовал бы ГОСТам и внутренним стандартам университета, был бы удобен для проверки научному руководителю и позволял бы студенту сконцентрироваться на сути своего проекта ВКР? Вкратце, в процессе чтения вы узнаете, зачем и как внедрить LaTeX в ВКР, настроить отправку документов на Google Drive через Github Actions для отзыва научного руководителя и пользоваться LLM.
XeLaTeX
Все преимущества использования TeX можно найти здесь https://www.ctan.org/tex. Основными являются:
В вашем документе будут математические формулы, множество перекрестных ссылок и размещение плавающих окружений (картинки, листинги, таблицы).
Вся верстка будет находиться в классе документа, а макрокоманды объявлены в преамбуле.
Время компиляции и создания документа составляет менее 1 секунды. Вы можете использовать texstudio в качестве среды разработки, которая автоматически определит команду компиляции с помощью магических комментариев.
Вы можете создавать документы с использованием функций git, GitHub и GitHub Actions, т.к. документ является текстом.
Документ может быть скомпилирован в формате PDF.
Распространение дистрибутивов системы TeX осуществляется свободно и бесплатно.
Латех билдится под Windows, Linux, OS X (в том числе и новых процессорах)
Существует множество пакетов, отвечающих вашим требованиям, а также множество ответов на вопросы на Stack Exchange, Stack Overflow, чате в Telegram.
Мой стек: дистрибутив системы TeXLive (а точнее его расширенная версия для MacOS —MacTeX) и texstudio.
Класс документа
Создаем класс будущего документа mirea.cls, который будет обеспечивать обратную совместимость с дефолтным классом article. В этом классе будут содержаться только изменения существующих конструкций, чтобы облегчить переход на новый формат.
mirea.cls
% !TeX program = xelatex % !TeX encoding = UTF-8 % !TeX root = course-work.tex \NeedsTeXFormat{LaTeX2e} \ProvidesClass{mirea-prog-lang}[2023/09/01 KB-14 course work] \DeclareOption*{\PassOptionsToClass{\CurrentOption}{extarticle}} \ProcessOptions\relax \LoadClass[14pt, a4paper, titlepage]{extarticle} \RequirePackage{hyperref} \hypersetup{colorlinks=false, pdfborder={0 0 0}} % Отключение подсветки ссылок \RequirePackage[english,main=russian]{babel} \RequirePackage{fontspec} \setmainfont{Times New Roman} % Если возникают проблемы при компиляции с данной строкой, необходимо на компьютер установить Times New Roman \RequirePackage{newtxmath} % Поменять гарнитуру в фомулах на Times New Roman \RequirePackage[left=30mm, right=15mm, top=20mm, bottom=20mm]{geometry} \RequirePackage{indentfirst} % Красная строка у первого абзаца раздела \RequirePackage{graphicx} \parindent=1.25cm % Размер красной строки \parskip=0pt % Отступ между абзацами \righthyphenmin=2 % Разрешить переносить слоги в 2 буквы (стандартное значение 3) \linespread{1.3} % полуторный межстрочный интервал %\RequirePackage{tocbibind} % Добавить раздел оглавление в оглавление % Настройка заголовка оглавления \addto\captionsrussian{\renewcommand{\contentsname}{Оглавление}} \RequirePackage[normalem]{ulem} % underline some lines \RequirePackage{tocloft} % Формат оглавления \renewcommand\cfttoctitlefont{\hfill\fontsize{16pt}{16pt}\selectfont\bfseries\MakeUppercase} \renewcommand\cftaftertoctitle{\hfill\hfill} %\setlength{\cftbeforesecskip}{0pt} % Addtional space between sections in toc %\setlength{\cftsecindent}{0pt} % Remove indent in toc for \section %\setlength{\cftsubsecindent}{0pt} % Remove indent in toc for \subsection %\setlength{\cftsubsubsecindent}{0pt} % Remove indent in toc for \subsubsection \renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % Добавить точки у разделов в оглавлении \RequirePackage{placeins} % Команда \FloatBarrier для размещения плавающего окружения в пределах раздела, подраздела, пункта % Настройка раздела, подраздела, подподраздела \RequirePackage{titlesec} \titleformat{\section}{\FloatBarrier\parskip=6pt\filcenter\fontsize{16pt}{16pt}\selectfont\bfseries\uppercase}{\thesection}{.5em}{} \titleformat{\subsection}{\FloatBarrier\filcenter\bfseries}{\thesubsection}{.5em}{} \titleformat{\subsubsection}{\FloatBarrier\filcenter\bfseries}{\thesubsubsection}{.5em}{} \AddToHook{cmd/section/before}{\clearpage} % Начинать раздел с новой страницы \renewenvironment{abstract}{\clearpage\section*{\MakeUppercase{\abstractname}}}{\clearpage} \labelwidth=1.25cm % Горизонтальный отступ у элемента списка % Ненумерованные списки разной вложенности \renewcommand\labelitemi{---} \renewcommand\labelitemii{---} \renewcommand\labelitemiii{---} \renewcommand\labelitemiv{---} % Нумерованные списки разной вложенности \renewcommand\labelenumi{\arabic{enumi})} \renewcommand\labelenumii{\asbuk{enumii})} \renewcommand\labelenumiii{\arabic{enumiii})} \renewcommand\labelenumiv{\asbuk{enumiv})} % Форматирование списков \RequirePackage{enumitem} \setlist{itemsep=0pt, parsep=0pt, topsep=0mm} % Возможна опция wide \makeatletter \AddEnumerateCounter*{\asbuk}{\c@asbuk} \makeatother \makeatletter % Буквы для нумерации списка (исключены ё, з, щ, ч, ъ, ы, ь) % Подробнее https://ctan.math.illinois.edu/macros/latex/required/babel/contrib/russian/russianb.pdf \def\russian@alph#1{\ifcase#1\or а\or б\or в\or г\or д\or е\or ж\or и\or к\or л\or м\or н\or о\or п\or р\or с\or т\or у\or ф\or х\or ц\or ш\or э\or ю\or я\else\@ctrerr\fi} \def\russian@Alph#1{\ifcase#1\or А\or Б\or В\or Г\or Д\or Е\or Ж\or И\or К\or Л\or М\or Н\or О\or П\or Р\or С\or Т\or У\or Ф\or Х\or Ц\or Ш\or Э\or Ю\or Я\else\@ctrerr\fi} \patchcmd{\l@section}{#1}{\textnormal{\uppercase{#1}}}{}{} % Разделы в оглавлении без выделения жирным, в верхнем регистре \patchcmd{\l@section}{#2}{\textnormal{#2}}{}{} % Страницы без выделения жирным \apptocmd{\appendix}{ \renewcommand{\thesection}{\Asbuk{section}} \titleformat{\section}{\filcenter\fontsize{16pt}{16pt}\selectfont\bfseries}{}{0pt}{\MakeUppercase{\appendixname}~\thesection \\}{}{} % Изменение формата раздела приложения \renewcommand\thefigure{\Asbuk{section}.\arabic{figure}} % Изменении формата нумерации иллюстрации \renewcommand\thetable{\Asbuk{section}.\arabic{table}} % Изменении формата нумерации таблицы \renewcommand\theequation{\Asbuk{section}.\arabic{equation}} % Изменении формата нумерации формулы \let\oldsec\section \renewcommand{\section}{ \clearpage \phantomsection \refstepcounter{section} \setcounter{figure}{0} % Счёт иллюстраций в пределах одного приложения \setcounter{table}{0} % Счёт таблиц в пределах одного приложения \setcounter{equation}{0} % Счёт иллюстраций в пределах одного приложения \addcontentsline{toc}{section}{\appendixname~\thesection} \oldsec*} % Нумерация раздела после названия } \makeatother \RequirePackage[labelsep=endash]{caption} % Настройка пунктуации \captionsetup[table]{justification=raggedright, singlelinecheck=false} % Выравнивание по левому краю надписи таблицы \addto\captionsrussian{\renewcommand{\figurename}{Рисунок}} % Переопределение caption из babel % Настройка заголовка списка использованных источников \addto\captionsrussian{\renewcommand{\refname}{СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}} \BeforeBeginEnvironment{thebibliography}{ \phantomsection % для корректной ссылки в оглавлении \makeatletter \renewcommand*{\@biblabel}[1]{#1.\hfill} % формат нумерации списка \makeatother} \setlength{\bibindent}{-1.25cm} % Убрать отступы у элементов списка использованных источников + \{thebibliography}{99\kern\bibindent}
Преамбула документа
Преамбула документа будет содержать и дополняться импортом необходимых пакетов, а также определением новых макрокоманд.
preambule.tex
% !TeX program = xelatex % !TeX encoding = UTF-8 % !TeX root = course-work.tex \usepackage{hyperref} \hypersetup{pdftitle={Курсовая работа}, pdfauthor={Автор не указан}} \usepackage{graphicx} % Создание введения или заключения \newcommand{\supersection}[1]{ \section*{#1} \phantomsection \addcontentsline{toc}{section}{#1} }
Основной документ
course-work.tex
% !TeX program = xelatex % !TeX encoding = UTF-8 % !TeX root = course-work.tex \documentclass{mirea} \include{preambule.tex} \begin{document} \addtocounter{page}{2} % Оглавление \tableofcontents \supersection{Введение} \section{Аналитический раздел} \subsection{Первый подраздел} TODO \subsubsection{Первый подподраздел} TODO \subsection*{Вывод по разделу} TODO \section{Специальный раздел} \section{Технологический раздел} \section{Экономический раздел} \BeforeBeginEnvironment{thebibliography}{\clearpage\phantomsection} \begin{thebibliography}{99\kern\bibindent} \bibitem{bib:mybook} Моя книга. \end{thebibliography} \appendix \section{Первое приложение} Первое приложение \end{document}
Пример компиляции:

Конструкции документа
Аннотация
\begin{abstract} ... \end{abstract}
Заголовки аннотации
Подраздел аннотации
\subsection*{...}
Подподраздел аннотации
\subsubsection*{...}
Оглавление
\tableofcontents
P.S. При необходимости изменить название на Содержание можно в классе документа
Введение, заключение, раздел без нумерации
\supersection{...}
Раздел
\section{...}
Подраздел
\subsection{...}
Подподраздел
\subsubsection{...}
Список использованных источников
\BeforeBeginEnvironment{thebibliography}{\clearpage\phantomsection} \begin{thebibliography}{99\kern\bibindent} \bibitem{bib:example} ... ... \end{thebibliography}
Cсылка на источник
\cite{bib:example}
Приложение
\appendix \section{...} \label{appendix:...} ... \section{...} ...
Ссылка на приложение
\ref{appendix:...}
Списки
Ненумерованный список
\begin{itemize} \item[] Пример списка с~тире: \item первый элемент, \item второй элемент. \end{itemize}

Нумерованный список
\begin{enumerate} \item[] Пример списка с~закрывающей скобкой и~числом: \item первый элемент, \item второй элемент. \end{enumerate}

Вложенной список
\begin{enumerate} \item[] Пример вложенного списка: \item первый уровень вложенности, \begin{enumerate} \item второй уровень вложенности; \begin{itemize} \item третий уровень вложенности; \item элемент; \item элемент. \end{itemize} \end{enumerate} \end{enumerate}

Иллюстрация
См. рисунок~\ref{fig:example} на~с.~\pageref{fig:example}. \begin{figure}[htb] \centering \includegraphics[width=.5\textwidth]{example.jpeg} \parskip=6pt \caption{Пример подписи} \label{fig:example} \end{figure}

Таблица
См. таблицу~\ref{tab:example} на~с.~\pageref{tab:example}. \begin{table}[htb] \caption{Пример подписи} \centering \begin{tabular}{ |c|c|c|c|c| } \hline 1 & 2 & 3 & 4 & 5 \\ \hline 6 & 7 & 8 & 9 & 10 \\ \hline \end{tabular} \label{tab:example} \end{table}

P. S. Плавающие окружения, согласно mirea.cls, могут плавать внутри раздела (переместиться из одного подраздела в другой). Чтобы так не происходило, необходимо установить опцию H из пакета float у окружения table.
Уравнение и формула
См. формулу~(\ref{eq:example}). \begin{equation}\label{eq:example} \text{минус}\,a\times b=c , \end{equation} где $a$~--- первая переменная; \\ $b$~--- вторая переменная; \\ $c$~--- третья переменная.

GitHub
Добавим файл .gitignore для TeX, чтобы исключить промежуточные файлы компиляции из коммитов в GitHub:
curl https://raw.githubusercontent.com/finds-su/lost-and-found/main/course-work/.gitignore \ --output .gitignore
GitHub Actions
Чтобы научный руководитель мог оставить комментарий, можно воспользоваться функционалом Github Issues (хотя это не всегда удобно), либо использовать комментарии к документу на Google Drive. Для выгрузки PDF документа, был создан файл .github/workflows/course-work-deploy.yml.
course-work-deploy.yml
name: Course Work Deploy on: push: branches: - main jobs: course-work-deploy: runs-on: ubuntu-latest steps: - name: Get current time uses: josStorer/get-current-time@v2 id: current-time with: format: YYYY-MM-DD-HH:mm utcOffset: "+03:00" timezone: "Europe/Moscow" - name: Checkout code uses: actions/checkout@v2 - name: Upload to gdrive uses: adityak74/google-drive-upload-git-action@main with: credentials: ${{ secrets.DRIVE_CREDENTIALS }} filename: course-work.pdf folderId: ${{ secrets.DRIVE_FOLDER_ID }} name: ${{ steps.current-time.outputs.formattedTime }}-sha-${{ github.sha }}.pdf overwrite: "true"
По инструкции получаем secrets.DRIVE_CREDENTIALS и secrets.DRIVE_FOLDER_ID, на Github добавляем их в Settings ==> Settings and variables ==> Actions ==> Repository secrets. Чтобы найти последнюю версию на диске, можно отсортировать документы по имени.
Остается мониторить комментарии к документам и удалять старые документы.
LLM
Для генерации описания на текущий момент существует много LLM. Самая продвинутая — ChatGPT, самая доступная в России — YandexGPT, селфхост — Llama через Ollama интерфейс. Наиболее эффективным использованием будут просьбы о перефразировании, суммаризации, либо использование генерации с расширенным поиском (RAG) с использованием релевантных научных статей.
P.S. При возникновении трудностей с регистрацией в OpenAI по номеру телефона, есть вариант воспользоваться ботом активации SMS (например, https://t.me/getPhoneNumberRoBot).
Заключение
Я поделился своим опытом создания документа для ВКР. Важно отметить, что требования к верстке могут различаться в разных университетах, а также зависеть от выбранной темы и предпочтений преподавателя.
Благодарности
Спасибо А. А. Мерсову, А. М. Русакову, В. В. Филатову за составление методических рекомендаций, по которым был сделан класс LaTeX.
