Как стать автором
Обновить

Автоматизация написания ВКР: LaTeX, GitHub, Google Drive и ChatGPT в действии

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров5.3K

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

Теги:
Хабы:
Всего голосов 6: ↑5 и ↓1+4
Комментарии12

Публикации

Истории

Ближайшие события