Глава 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.