Files
md2gost/md2gost/latex/preamble.py
T

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"