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

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/753350/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *