Глава 1. Вступление

В жизни каждого студента наступает момент, когда необходимо написать выпускную квалификационную работу (ВКР). Бывшие выпускники говорят, что успех ВКР в значительной степени зависит от правильного оформления документации, в то время как основное содержание работы остается на втором плане. Но почему бы не внедрить автоматизированный процесс оформления, который соответствовал бы ГОСТам и внутренним стандартам университета, был бы удобен для проверки научному руководителю и позволял бы студенту сконцентрироваться на сути своего проекта ВКР? Вкратце, в процессе чтения вы узнаете, зачем и как внедрить LaTeX в ВКР, настроить отправку документов на Google Drive через Github Actions для отзыва научного руководителя и пользоваться контекстными подсказками для ChatGPT.

Глава 2. (Xe)LaTeX

Все преимущества использования TeX можно найти здесь https://www.ctan.org/tex. При написании ВКР важно:

  • TeX has the best output. В вашем документе будут математические формулы, множество перекрестных ссылок и размещение плавающих окружений (картинки, листинги, таблицы).

  • TeX knows about typesetting. Вся верстка будет находиться в классе документа, а макрокоманды объявлены в преамбуле.

  • TeX is fast. Время компиляции и создания документа составляет менее 1 секунды. Вы можете использовать texstudio в качестве среды разработки, которая автоматически определит команду компиляции с помощью магических комментариев.

  • TeX is stable, but not rigid. Для удобства использования пользовательского шрифта с кириллицей можно использовать XeLaTeX.

  • The input is plain text. Вы можете создавать документы с использованием функций git, GitHub и GitHub Actions.

  • The output can be anything. Документ может быть скомпилирован в формате PDF.

  • TeX is free. Распространение дистрибутивов системы TeX осуществляется свободно и бесплатно.

  • TeX runs anywhere. Моя ВКР и все примеры из статьи были скомпилированы на Apple M1, дистрибутивы найдутся под Windows и популярные дистрибутивы Linux.

  • TeX is the standard. Существует множество пакетов, отвечающих вашим требованиям, а также множество ответов на вопросы на 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}[2023/09/01]


\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} % Возможна опция 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.

Уравнение и формула

См. формулу~(\ref{eq:example}).
\begin{equation}\label{eq:example}
    \text{минус}\,a\times b=c ,
\end{equation}
где $a$~--- первая переменная; \\
$b$~--- вторая переменная; \\
$c$~--- третья переменная.

Глава 3. GitHub

Добавим файл .gitignore для TeX, чтобы исключить промежуточные файлы компиляции из коммитов в GitHub:

curl https://raw.githubusercontent.com/finds-su/lost-and-found/main/course-work/.gitignore \
 --output .gitignore

Глава 4. 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. Чтобы найти последнюю версию на диске, можно отсортировать документы по имени.

Остается мониторить комментарии к документам и удалять старые документы.

Глава 5. ChatGPT

Для использования OpenAI API необходимо иметь действующий ключ. Чтобы создать пользовательский чат, можно воспользоваться графическим интерфейсом, предоставленным в репозитории https://github.com/Yidadaa/ChatGPT‑Next‑Web. Перейдите в репозиторий, нажмите на синюю кнопку «Deploy», заполните переменные среды и получите доступ к своему чату. В настройках на сайте заполните поля «Код доступа» и «API ключ».

Чтобы избежать необходимости вводить контекст в каждом новом диалоге с ChatGPT, можно использовать контекстные подсказки. Для этого нужно нажать на кнопку «Маски» в интерфейсе и выбрать «Найти еще». Затем создать контекстную подсказку, которую можно будет использовать в дальнейших диалогах.

Подсказки:

  • system: Ты помощник ИИ, который помогает написать курсовую работу в институт на тему "Моя тема".

  • user: Курсовая работа состоит из разделов ВВЕДЕНИЕ, АНАЛИТИЧЕСКИЙ РАЗДЕЛ, СПЕЦИАЛЬНЫЙ РАЗДЕЛ, ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ, ЭКОНОМИЧЕСКИЙ РАЗДЕЛ, ЗАКЛЮЧЕНИЕ, СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ. Необходимо создать подразделы и наполнить их содержимым.

Прочие настройки
Прочие настройки

P.S. При возникновении трудностей с регистрацией в OpenAI по номеру телефона, есть вариант воспользоваться ботом активации SMS (например, https://t.me/getPhoneNumberRoBot) или купить зарегистрированный аккаунт.

Глава 6. Заключение

Я поделился своим опытом создания документа для ВКР. Важно отметить, что требования к верстке могут различаться в разных университетах, а также зависеть от выбранной темы и предпочтений преподавателя. Однако, я постараюсь описать общие шаги, которые могут помочь вам в создании качественного документа.

Глава 7. Благодарности

Спасибо А. А. Мерсову, А. М. Русакову, В. В. Филатову за составление методических рекомендаций, по которым был сделан класс LaTeX.

Комментарии (8)


  1. Arastas
    08.08.2023 17:07
    +2

    И что chatGPT дал в написании ВКР?


    1. ValeryV Автор
      08.08.2023 17:07

      Наполнение уникальным текстом. Для бакалавров ВКР должна быть на ~50 страниц, для магистров, специалистов больше.


      1. Arastas
        08.08.2023 17:07
        +3

        Хотите сказать, что ВКР частично написана chatGPT? И какова доля генерированного текста? В какой области знаний?


      1. PereslavlFoto
        08.08.2023 17:07

        50 страниц это довольно-таки мало. Куда уж тут GPT, свои бы мысли рассказать.


  1. PereslavlFoto
    08.08.2023 17:07
    +2

    TeX is fast.

    Это на двух гигабайтах памяти и на одном ядре процессора, да?

    The input is plain text.

    Если plain text, тогда без разметки. А вы дальше пишете про разметку. Тут какая-то путаница.

    TeX is free. Распространение дистрибутивов системы TeX осуществляется бесплатно.

    Free это не бесплатно, а свободно.

    скомпилированы на Apple M1

    То есть ажно 8 ГБ или 16 ГБ? Это ведь очень много.

    \FloatBarrier

    Ой, а вы вот этим действительно пользуетесь? Но зачем?

    исключены ё, з, щ, ч, ъ, ы, ь

    А здесь вы убрали буквы из алфавита нумерации. Но зачем? Вы действительно выступаете против русских букв ё, з, щ и ч? Или нормоконтроль выступает против русских букв?

    \makeatother

    Выше эта команда уже действовала, зачем же её повторять?

    Преамбула документа

    А зачем вы в преамбуле подключаете пакеты, которые уже подключены в классе?

    supersection

    Это чтобы не менять глубину нумерации через secnumdepth? И как, стоило того?

    использовать комментарии к документу на Google Drive

    На любой подвиг идут люди, только бы не связываться с электронной почтой.

    Спасибо за ответ.


    1. ValeryV Автор
      08.08.2023 17:07
      +1

      Нашел бенчмарк Латеха https://www.complang.tuwien.ac.at/franz/latex-bench. Даже с очень слабыми конфигурациями достойные результаты.

      \FloatBarrier между разделов, исключенные буквы из нумерации списков и приложений обусловленны внутренними требованиями.

      Повторное подключаю пакеты, потому что texstudio не видит импортов из класса и подсвечивает ошибку, на компиляцию не сказывается.

      Объявление supersection показывает, как и где создавать новые команды. Не понимаю, как можно с помощью secnumdepth создать раздел без нумерации с указанием в содержании.

      В Google Disk можно выделить текст и прокомментировать конкретное место. Предполагаю, что переписка по почте будет выглядеть примерно так http://www.kremlin.ru/acts/bank/49628.

      С остальным согласен. Спасибо


      1. PereslavlFoto
        08.08.2023 17:07

        \FloatBarrier между разделов

        Вместо \clearpage, то есть?

        исключенные буквы из нумерации списков и приложений обусловленны внутренними требованиями.

        Ого! Не патриотичные какие-то требования!

        Повторное подключаю пакеты, потому что texstudio не видит импортов из класса.

        Так не надо пользоваться таким классом, переставьте всё в стилевик. :-)

        как можно с помощью secnumdepth создать раздел без нумерации с указанием в содержании.


        {\setcounter{secnumdepth}{-1}\section{Текст в заголовке}}

        В Google Disk можно выделить текст и прокомментировать конкретное место.

        О, научный руководитель занимается пиксель-хантингом и микроменеджментом. Это круто. У него много свободного времени.


        1. Arastas
          08.08.2023 17:07

          Последнее кажется уже придиркой. Руководитель ВКР должен хотя бы раз прочитать ВКР. Естественно, что у него может возникнуть желание что-то выделить в тексте.