189 lines
8.0 KiB
Python
189 lines
8.0 KiB
Python
PREAMBLE = r"""\documentclass[a4paper, 14pt]{extarticle}
|
|
\usepackage{geometry}
|
|
\geometry{a4paper,tmargin=2cm,bmargin=2cm,lmargin=3cm,rmargin=1.5cm}
|
|
\usepackage{fontspec}
|
|
\setmainfont{Times New Roman}
|
|
\setsansfont{Liberation Sans}
|
|
\setmonofont{Liberation Mono}
|
|
\usepackage[english, main=russian]{babel}
|
|
\usepackage{textcomp}
|
|
\usepackage{indentfirst}
|
|
\setlength{\parindent}{1.25cm}
|
|
\usepackage{setspace}
|
|
\onehalfspacing
|
|
\usepackage{graphicx}
|
|
\graphicspath{ {./} {./images/} }
|
|
\usepackage{float}
|
|
\usepackage[section]{placeins}
|
|
\usepackage{wrapfig}
|
|
\sloppy
|
|
\setlength{\emergencystretch}{2em}
|
|
\clubpenalty=10000
|
|
\widowpenalty=10000
|
|
\usepackage{enumitem}
|
|
\setlist[enumerate,1]{label=\arabic*., leftmargin=1.25cm, itemsep=0pt, parsep=0pt}
|
|
\setlist[itemize]{label={---}, leftmargin=1.25cm, itemsep=0pt, parsep=0pt}
|
|
\usepackage{caption}
|
|
\usepackage{hyperref}
|
|
\hypersetup {unicode=true}
|
|
\DeclareCaptionLabelSeparator*{emdash}{~--- }
|
|
\captionsetup[figure]{labelsep=emdash,font=onehalfspacing,position=bottom,name=Рисунок}
|
|
\captionsetup[table]{labelsep=emdash,font=onehalfspacing,position=top,name=Таблица,singlelinecheck=false,justification=raggedright}
|
|
\usepackage{listings}
|
|
\usepackage{xcolor}
|
|
|
|
% Палитра подсветки. Тона различаются не только цветом, но и светлотой,
|
|
% поэтому листинг остаётся читаемым и на чёрно-белой печати.
|
|
\definecolor{lstkeyword}{RGB}{0,0,139}
|
|
\definecolor{lstcomment}{RGB}{110,110,110}
|
|
\definecolor{lststring}{RGB}{139,0,0}
|
|
\definecolor{lstlineno}{RGB}{130,130,130}
|
|
|
|
% Встроенный диалект C++ в listings старше стандарта: auto, nullptr, override
|
|
% и прочее он не знает. Расширяем его, а не подменяем, чтобы сохранить разбор
|
|
% строк, комментариев и препроцессора.
|
|
\lstdefinelanguage[modern]{C++}[ISO]{C++}{%
|
|
morekeywords={%
|
|
auto,nullptr,constexpr,consteval,constinit,noexcept,override,final,%
|
|
decltype,static_assert,thread_local,alignas,alignof,concept,requires,%
|
|
co_await,co_yield,co_return,import,module,%
|
|
Q_OBJECT,Q_SLOTS,Q_SIGNALS,Q_PROPERTY,signals,slots,emit%
|
|
}%
|
|
}
|
|
|
|
\lstset{
|
|
basicstyle=\ttfamily\small\setstretch{1.0},
|
|
keywordstyle=\bfseries\color{lstkeyword},
|
|
% Начертание прямое: курсива кириллицы в моноширинном шрифте нет, и
|
|
% комментарий распадался бы на прямые русские и курсивные латинские слова.
|
|
commentstyle=\color{lstcomment},
|
|
stringstyle=\color{lststring},
|
|
numberstyle=\scriptsize\color{lstlineno},
|
|
identifierstyle=,
|
|
breakatwhitespace=false,
|
|
breaklines=true,
|
|
captionpos=t,
|
|
inputencoding=utf8,
|
|
frame=single,
|
|
keepspaces=true,
|
|
numbers=left,
|
|
numbersep=7pt,
|
|
aboveskip=0.7\baselineskip,
|
|
belowskip=0.4\baselineskip,
|
|
postbreak=\mbox{\textcolor{lstlineno}{$\hookrightarrow$}\space},
|
|
xleftmargin=25pt,
|
|
xrightmargin=25pt,
|
|
showspaces=false,
|
|
showstringspaces=false,
|
|
showtabs=false,
|
|
stepnumber=1,
|
|
tabsize=2,
|
|
}
|
|
\renewcommand{\lstlistingname}{Листинг}
|
|
\captionsetup[lstlisting]{labelsep=emdash,font=onehalfspacing,position=top,singlelinecheck=false,justification=raggedright}
|
|
\usepackage{amsthm,amsfonts,amsmath,amssymb,amscd}
|
|
\usepackage{mathtools}
|
|
\usepackage{unicode-math}
|
|
\setmathfont{TeX Gyre Termes Math}
|
|
\usepackage[perpage]{footmisc}
|
|
\usepackage{tabularx}
|
|
\usepackage{titlesec}
|
|
\renewcommand{\thesection}{\arabic{section}}
|
|
\renewcommand{\thesubsection}{\thesection.\arabic{subsection}}
|
|
\renewcommand{\thesubsubsection}{\thesubsection.\arabic{subsubsection}}
|
|
\titleformat{\section}{\fontsize{14pt}{18pt}\selectfont\bfseries}{}{0em}{\thesection. }
|
|
\titleformat{\subsection}{\fontsize{14pt}{18pt}\selectfont\bfseries}{}{0em}{\thesubsection. }
|
|
\titleformat{\subsubsection}{\fontsize{14pt}{18pt}\selectfont\bfseries}{}{0em}{\thesubsubsection. }
|
|
\titlespacing*{\section}{1.25cm}{1ex plus 0.3ex minus 0.2ex}{0.6ex plus 0.2ex minus 0.1ex}
|
|
\titlespacing*{\subsection}{1.25cm}{1ex plus 0.3ex minus 0.2ex}{0.6ex plus 0.2ex minus 0.1ex}
|
|
\titlespacing*{\subsubsection}{1.25cm}{1ex plus 0.3ex minus 0.2ex}{0.6ex plus 0.2ex minus 0.1ex}
|
|
\usepackage{tocloft}
|
|
\addto\captionsrussian{%
|
|
\renewcommand{\contentsname}{СОДЕРЖАНИЕ}%
|
|
}
|
|
\renewcommand{\cfttoctitlefont}{\hfill\fontsize{14pt}{18pt}\selectfont\bfseries}
|
|
\renewcommand{\cftaftertoctitle}{\hfill\null}
|
|
\setlength{\cftbeforesecskip}{0pt}
|
|
\renewcommand{\cftsecaftersnum}{.}
|
|
\renewcommand{\cftsubsecaftersnum}{.}
|
|
\renewcommand{\cftsubsubsecaftersnum}{.}
|
|
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}
|
|
\renewcommand{\cftdotsep}{1}
|
|
\cftsetpnumwidth{0.7em}
|
|
\cftsetrmarg{1em}
|
|
\renewcommand{\cftsecfont}{\mdseries}
|
|
\renewcommand{\cftsecpagefont}{\mdseries}
|
|
\renewcommand{\cftsubsecfont}{\mdseries}
|
|
\renewcommand{\cftsubsubsecfont}{\mdseries}
|
|
% Ширина поля номера в оглавлении измеряется по шрифту, а не задаётся
|
|
% константой: при фиксированных 1.5em номер 2.10. не помещается и печатается
|
|
% поверх названия главы, а у остальных пропадает пробел после точки.
|
|
\setlength{\cftsecindent}{0em}
|
|
\setlength{\cftsubsecindent}{0em}
|
|
\setlength{\cftsubsubsecindent}{0em}
|
|
\settowidth{\cftsecnumwidth}{\cftsecfont 9.\enspace}
|
|
\settowidth{\cftsubsecnumwidth}{\cftsubsecfont 9.99.\enspace}
|
|
\settowidth{\cftsubsubsecnumwidth}{\cftsubsubsecfont 9.99.99.\enspace}
|
|
|
|
\newcommand{\sigline}[3][4cm]{%
|
|
\begin{tabular}[t]{@{}c@{}}%
|
|
\makebox[#1][c]{\strut #2} \\[-1em]%
|
|
\rule{#1}{0.4pt} \\[-1em]%
|
|
{\scriptsize #3}%
|
|
\end{tabular}%
|
|
}
|
|
|
|
% Ширины шапки титульного листа. Колонка эмблемы задаётся явно, ширина
|
|
% текстовой части — остаток от текстового поля за вычетом рамки и отбивок,
|
|
% поэтому шапка не может вылезти за рамку при смене полей страницы.
|
|
\newlength{\ptpemblemwidth}
|
|
\newlength{\ptpheadwidth}
|
|
\newlength{\ptpheadpad}
|
|
\setlength{\ptpemblemwidth}{0.14\textwidth}
|
|
\setlength{\ptpheadpad}{4pt}
|
|
\setlength{\ptpheadwidth}{%
|
|
\dimexpr\textwidth-\ptpemblemwidth-4\ptpheadpad-3\arrayrulewidth\relax}
|
|
|
|
\newcommand{\ptpfieldw}[4][4.5cm]{%
|
|
\par\noindent
|
|
\makebox[#1][l]{#2}%
|
|
\begin{tabular}[t]{@{}c@{}}%
|
|
\makebox[#4][c]{#3} \\[-1.05em]%
|
|
\rule{#4}{0.4pt}%
|
|
\end{tabular}\par}
|
|
|
|
\newcommand{\ptpfield}[3][4.5cm]{%
|
|
\ptpfieldw[#1]{#2}{#3}{\dimexpr\textwidth-#1\relax}}
|
|
|
|
\newcommand{\ptpfieldnote}[4][4.5cm]{%
|
|
\ptpfield[#1]{#2}{#3}%
|
|
\par\vspace{-0.45em}%
|
|
% \noindent обязателен: иначе к строке подписи прибавляется абзацный отступ,
|
|
% и она ровно на \parindent выходит за правое поле.
|
|
\noindent\hspace*{#1}%
|
|
\makebox[\dimexpr\textwidth-#1\relax][c]{\footnotesize\itshape #4}\par}
|
|
|
|
\newcommand{\ptpfieldpar}[3][4.5cm]{%
|
|
\par\noindent
|
|
\makebox[#1][l]{#2}%
|
|
\begin{tabular}[t]{@{}c@{}}%
|
|
\parbox{\dimexpr\textwidth-#1\relax}{\centering #3} \\[-0.55em]%
|
|
\rule{\dimexpr\textwidth-#1\relax}{0.4pt}%
|
|
\end{tabular}\par}
|
|
|
|
% Блок подписи: метка слева, две подписи прижаты к правому полю.
|
|
% Через tabularx с колонкой X это не работало — при длинной метке
|
|
% («Руководитель практики от кафедры») колонка схлопывалась, и подписи
|
|
% уезжали за правое поле. Здесь ширина подписей фиксирована, а \hfill
|
|
% забирает остаток, поэтому правые края блоков всегда совпадают.
|
|
\newcommand{\ptpsig}[3]{%
|
|
\par\noindent
|
|
#1\hfill
|
|
\sigline[3.8cm]{}{\itshape подпись, дата}%
|
|
\hspace{0.5cm}%
|
|
\sigline[3.8cm]{#2}{\itshape #3}\par}
|
|
|
|
\begin{document}"""
|
|
|
|
END_DOCUMENT = r"\end{document}" + "\n"
|