From 75005684ef2a7bab31a7546caa8506ed83e7aeab Mon Sep 17 00:00:00 2001
From: Andrew Guschin <guschin@altlinux.org>
Date: Mon, 30 Sep 2024 14:41:58 +0400
Subject: init

---
 ptk20main.tex | 568 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 568 insertions(+)
 create mode 100644 ptk20main.tex

(limited to 'ptk20main.tex')

diff --git a/ptk20main.tex b/ptk20main.tex
new file mode 100644
index 0000000..8db1e1e
--- /dev/null
+++ b/ptk20main.tex
@@ -0,0 +1,568 @@
+\documentclass[14pt,twoside,a4paper]{extreport}
+
+% = Шрифты и языки =
+\usepackage[T1,T2A]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage[english,russian]{babel}
+% = Пакеты для общих настроек сборника =
+\usepackage[%
+  a4paper,%
+  includehead,%
+  left=2cm,%
+  top=2cm,%
+  right=2cm,%
+  bottom=2cm,%
+  headheight=0.7cm,%
+  headsep=0.3cm,%
+  footskip=1.6cm%
+  ]{geometry}
+\usepackage{import}
+\usepackage{fancyhdr}
+\usepackage{enumitem}
+% \usepackage{setspace}
+\usepackage{etoolbox}
+\usepackage{titlesec}
+\usepackage{caption}
+\usepackage{iflang}
+
+% = Пакеты для удобства написания статей =
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{amscd}
+\usepackage{amsthm}
+\usepackage{mathtools}
+\usepackage{bm}
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage[all]{xy}
+\usepackage{url}
+\usepackage{array}
+\usepackage{tabularx}
+\usepackage{booktabs}
+\usepackage{xstring}
+\makeatletter
+% = Отступ первой строки абзаца - 15 пунктов =
+\setlength{\parindent}{15pt}
+% = Интервалы возле пунктуации - такие же, как между словами =
+\frenchspacing
+% = Страницы не растягиваются вертикально для подгона высоты, завершаются как есть =
+\raggedbottom
+% = Внешний вид колонтитулов =
+\pagestyle{fancy}%
+\fancyhead{}%
+\fancyfoot{}%
+\fancyhead[LE,RO]{\normalsize \thepage}%
+\fancyhead[RE,LO]{\leftmark}
+\def\mylib@d@header{}
+\fancypagestyle{plain}{%
+\fancyhead{}%
+\fancyfoot{}%
+\fancyhead[LE,RO]{\normalsize \thepage}%
+\fancyhead[RE,LO]{\leftmark}
+}
+% = Формат заголовков =
+% - Секции и параграфы - жирное выделение.
+% - Подсекции и подпараграфы запрещены.
+% - Отступы вокруг заголовка параграфа: слева как в начале абзаца, сверху 0, справа 4 пункта
+\titleformat{\section}{\bfseries}{}{0pt}{}
+\titleformat{\paragraph}[runin]{\bfseries}{}{0pt}{}
+\undef{\subsection}
+\undef{\subsubsection}
+\undef{\subparagraph}
+\titlespacing*{\paragraph}{\parindent}{0pt}{4pt}
+% = Настройки нумерации списков =
+\setlist[enumerate]{%
+    leftmargin=*,%
+    topsep=4pt plus 2pt minus 2pt,%
+    partopsep=2pt plus 1pt minus 1pt,%
+    parsep=2pt plus 1pt,%
+    itemsep=2pt plus 1pt%
+}
+\setlist[itemize]{%
+    label={---},%
+    leftmargin=*,%
+    topsep=4pt plus 2pt minus 2pt,%
+    partopsep=2pt plus 1pt minus 1pt,%
+    parsep=2pt plus 1pt,%
+    itemsep=2pt plus 1pt%
+}
+% = Большие штрафы - практически запреты - на разрывы =
+% Строк у математических операторов и отношений, одной строки абзаца от остальных =
+\binoppenalty=10000
+\relpenalty=10000
+\@clubpenalty=10000
+\clubpenalty=10000
+\widowpenalty=10000
+% = Вертикальные отступы вокруг equation и align =
+\AtBeginDocument{%
+  \abovedisplayskip=6pt plus 4pt minus 3pt
+  \belowdisplayskip=6pt plus 4pt minus 3pt
+  \abovedisplayshortskip=3pt plus 6pt minus 1pt
+  \belowdisplayshortskip=3pt plus 6pt minus 1pt
+}
+% = Сноски "нумеруются" особыми символами =
+\renewcommand{\thefootnote}{\fnsymbol{footnote}}
+% = Указатель в массовой версии =
+
+% = Распложение текста в содержании =
+
+% = Математические окружения: теорема, лемма, определение, утверждение, замечание, следствие =
+\newtheorem{definition}{\protect\mylib@name@definition}
+\newtheorem*{definition*}{\protect\mylib@name@definition}
+\newtheorem{theorem}{\protect\mylib@name@theorem}
+\newtheorem*{theorem*}{\protect\mylib@name@theorem}
+\newtheorem{lemma}{\protect\mylib@name@lemma}
+\newtheorem*{lemma*}{\protect\mylib@name@lemma}
+\newtheorem{statement}{\protect\mylib@name@statement}
+\newtheorem*{statement*}{\protect\mylib@name@statement}
+\newtheorem{remark}{\protect\mylib@name@remark}
+\newtheorem*{remark*}{\protect\mylib@name@remark}
+\newtheorem{corollary}{\protect\mylib@name@corollary}
+\newtheorem*{corollary*}{\protect\mylib@name@corollary}
+%\setlocalecaption - вроде не нужно, см. доки "babel"
+\newcommand{\mylib@name@definition}{}
+\newcommand{\mylib@name@theorem}{}
+\newcommand{\mylib@name@lemma}{}
+\newcommand{\mylib@name@statement}{}
+\newcommand{\mylib@name@remark}{}
+\newcommand{\mylib@name@corollary}{}
+\newcommand{\mylib@name@references}{}
+\newcommand{\mylib@name@toc}{}
+\addto\captionsenglish{%
+  \renewcommand{\mylib@name@definition}{Definition}%
+  \renewcommand{\mylib@name@theorem}{Theorem}%
+  \renewcommand{\mylib@name@lemma}{Lemma}%
+  \renewcommand{\mylib@name@statement}{Statement}%
+  \renewcommand{\mylib@name@remark}{Remark}%
+  \renewcommand{\mylib@name@corollary}{Corollary}%
+  \renewcommand{\mylib@name@references}{References}%
+  \renewcommand{\mylib@name@toc}{Contents}
+}
+\addto\captionsrussian{%
+  \renewcommand{\mylib@name@definition}{Определение}%
+  \renewcommand{\mylib@name@theorem}{Теорема}%
+  \renewcommand{\mylib@name@lemma}{Лемма}%
+  \renewcommand{\mylib@name@statement}{Утверждение}%
+  \renewcommand{\mylib@name@remark}{Замечание}%
+  \renewcommand{\mylib@name@corollary}{Следствие}%
+  \renewcommand{\mylib@name@references}{Список литературы}%
+  \renewcommand{\mylib@name@toc}{Содержание}
+}
+% = Поправка к форме нескольких математических символов =
+\let\le\leqslant
+\let\leq\leqslant
+\let\ge\geqslant
+\let\geq\geqslant
+\let\emptyset\varnothing
+% = Знак № в команде \No =
+\providecommand\No{№}
+
+% = Данные =
+
+% = Команды для окружений секции и статьи =
+
+\newcommand{\mylib@papers@section@start}{%
+  \mylib@general@reset%
+  \mylib@papers@reset%
+}
+
+\newcommand{\mylib@papers@section@end}{}
+
+\newcommand{\mylib@papers@article@start}{%
+  \pagebreak[2]%
+  \mylib@lang@start%
+  \begin{mylib@env@unique@labref}%
+  \noindent%
+  \mylib@papers@title@place%
+  \nopagebreak%
+  \vskip 6pt\relax%
+  \@afterheading% TODO так ли это надо?
+  \mylib@papers@author@place%
+  \nopagebreak%
+  \@afterheading% TODO так ли это надо?
+  \mylib@papers@author@info@place%
+  \mylib@papers@shauthor@set@header%
+  \mylib@papers@shauthor@add@to@index%
+  \mylib@papers@add@to@toc%
+  \mylib@toc@suppress%
+  \nopagebreak%
+  \medskip%
+  \@afterheading% TODO так ли это надо?
+}
+
+\newcommand{\mylib@papers@article@end}{%
+  \mylib@toc@section%
+  \end{mylib@env@unique@labref}%
+  \mylib@lang@end%
+  \mylib@general@reset%
+  \mylib@papers@reset%
+}
+
+% = Остальные команды =
+
+% * Добавить статью в содержание согласно текущим названию и списку авторов из колонтитула
+\newcommand{\mylib@papers@add@to@toc}{%
+  \addcontentsline{toc}{section}{%
+    \textit{\mylib@d@shauthors}\newline%
+    {\protect\def\\{\relax}\protect\def\'{\relax} \mylib@d@title}%
+  }%
+}
+
+% * Добавить сокращённые записи авторов в индекс (авторский указатель)
+\newcommand{\mylib@papers@shauthor@add@to@index}{%
+  \mylib@u@count@and@do{mylib@c@author}{}{%
+    \index{\csuse{mylib@d@shauthor@\arabic{mylib@c@u@cad}}}%
+  }%
+}
+
+% Нарисовать информацию об авторах
+\newcommand{\mylib@papers@author@info@place}{%
+  {\footnotesize%
+    \ifnumgreater{\value{mylib@c@author@info}}{1}{%
+      \noindent%
+      \begin{tabularx}{\textwidth}{lX}%
+        \mylib@u@count@and@do{mylib@c@author@info}{}{%
+          \arabic{mylib@c@u@cad}&%
+          \csuse{mylib@d@author@affiliation@\arabic{mylib@c@u@cad}}; %
+          \csuse{mylib@d@author@contacts@\arabic{mylib@c@u@cad}}\\%
+        }%
+      \end{tabularx}%
+    }{%
+      \noindent%
+      \csuse{mylib@d@author@affiliation@1}; %
+      \csuse{mylib@d@author@contacts@1}%
+    }%
+  \par}%
+}
+
+% * Нарисовать полные ФИО авторов статьи
+\newcommand{\mylib@papers@author@place}{%
+  \ifnumequal{\value{mylib@c@author}}{0}{%
+    \GenericError{}{Авторы статьи не заданы!}{}{Задайте хотя бы одного автора статьи с помощью команды \detokenize{\ptkAuthors}}%
+  }{}%
+  {\centering\bf%
+    \mylib@u@count@and@do{mylib@c@author}{, }{%
+      \mbox{\csuse{mylib@d@author@\arabic{mylib@c@u@cad}}}%
+      \ifnumgreater{\value{mylib@c@author@info}}{1}{%
+        \textsuperscript{\csuse{mylib@d@author@footmark@\arabic{mylib@c@u@cad}}}%
+      }{}%
+    }%
+  \par}%
+}
+
+% * Нарисовать название статьи
+\newcommand{\mylib@papers@title@place}{%
+  \vskip 12pt plus 6pt minus 3pt\relax%
+  \vglue 4pt plus 2pt minus 2pt\relax%
+  {\leftskip=1.5\parindent\relax%
+   \rightskip=1.5\parindent\relax%
+   \vbox{\centering\sffamily\bfseries\boldmath\Large \mylib@d@title}%
+  }%
+}
+
+% * Сбросить информацию о статье: титул, авторы, язык, нумерация и т.д.
+\newcommand{\mylib@papers@reset}{%
+  \def\mylib@d@shauthors{}%
+  \def\mylib@d@shauthors@short{}%
+  \setcounter{figure}{0}%
+  \setcounter{equation}{0}%
+  \setcounter{definition}{0}%
+  \setcounter{theorem}{0}%
+  \setcounter{lemma}{0}%
+  \setcounter{statement}{0}%
+  \setcounter{remark}{0}%
+  \setcounter{corollary}{0}%
+}
+
+% * Обновить запись авторов в верхнем колонтитуле
+\newcommand{\mylib@papers@shauthor@set@header}{%
+  \mylib@u@ea{\mylib@header@set}{\mylib@d@shauthors@short}%
+}
+
+% = Команды непосредственно для окружения =
+
+\newcommand{\mylib@plenary@section@start}{%
+  \newpage%
+  \addcontentsline{toc}{section}{Информация о прочитанных пленарных докладах}%
+  \mylib@header@set{Пленарные доклады}%
+  {\bfseries\Huge\noindent%
+    Информация о прочитанных пленарных докладах%
+  \par}%
+}
+
+\newcommand{\mylib@plenary@section@end}{}
+
+\newcommand{\mylib@plenary@article@start}{%
+  \mylib@lang@start%
+  \bigskip%
+  \mylib@plenary@authorandinfo@place%
+  \par%
+  \nopagebreak%
+  \@afterheading%
+  \mylib@plenary@title@place%
+  \par%
+  \nopagebreak%
+  \@afterheading%
+}
+
+\newcommand{\mylib@plenary@article@end}{%
+  \mylib@lang@end%
+  \mylib@general@reset%
+}
+
+
+% = Остальные команды =
+
+% * Нарисовать авторов и информацию о них (города)
+\newcommand{\mylib@plenary@authorandinfo@place}{%
+  \noindent%
+  \mylib@u@count@and@do{mylib@c@author}{, }{%
+    \textbf{\csuse{mylib@d@author@\arabic{mylib@c@u@cad}}}%
+  }%
+  \ (%
+  \mylib@u@count@and@do{mylib@c@author@info}{, }{%
+    \csuse{mylib@d@author@affiliation@\arabic{mylib@c@u@cad}}%
+  }%
+  ).%
+}
+
+% * Нарисовать название доклада
+\newcommand{\mylib@plenary@title@place}{%
+  \noindent%
+  \textit{\mylib@d@title}.%
+}
+
+
+% = Название статьи =
+
+% * Установить название статьи #1
+\newcommand{\mylib@title@set}[1]{%
+  \gdef\mylib@d@title{#1}%
+}
+
+% * Сбросить название статьи
+\newcommand{\mylib@title@reset}{%
+  \mylib@title@set{\GenericError{}{Название статьи не задано!}{}{Задайте название с помощью команды \detokenize{\ptkTitle}.}}%
+}
+
+
+% = Авторы =
+
+% * Служебные счётчики
+\newcounter{mylib@c@author}
+\newcounter{mylib@c@author@info}
+
+% * Добавить полные ФИО автора с привязкой к последней добавленной информации об авторе
+\newcommand{\mylib@author@add}[1]{%
+  \stepcounter{mylib@c@author}%
+  \csdef{mylib@d@author@\arabic{mylib@c@author}}{#1}%
+  \csedef{mylib@d@author@footmark@\arabic{mylib@c@author}}{\arabic{mylib@c@author@info}}%
+}
+
+% * Добавить информацию об авторе: #1 - аффилиация, #2 - почта (контакты)
+\newcommand{\mylib@author@info@add}[2]{%
+  \stepcounter{mylib@c@author@info}%
+  \csdef{mylib@d@author@affiliation@\arabic{mylib@c@author@info}}{#1}%
+  \csdef{mylib@d@author@contacts@\arabic{mylib@c@author@info}}{#2}%
+}
+
+% * Сбросить информацию об авторах
+\newcommand{\mylib@author@reset}{%
+  \setcounter{mylib@c@author}{0}%
+  \setcounter{mylib@c@author@info}{0}%
+}
+
+
+% = Содержание =
+
+% * Дальше не добавлять ничего в содержание
+\newcommand{\mylib@toc@suppress}{%
+  \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}%
+}
+
+% * Дальше добавлять всё в содержание как обычно (только секции)
+\newcommand{\mylib@toc@section}{%
+  \addtocontents{toc}{\protect\setcounter{tocdepth}{1}}%
+}
+
+
+% = Язык =
+
+% * Язык сборника по умолчанию - русский (последний среди перечисленного в пакете babel)
+\def\mylib@d@lang@default{russian}
+
+% * Установить язык статьи
+\newcommand{\mylib@lang@set}[1]{%
+  \gdef\mylib@d@lang{#1}%
+  \ifdefequal{\mylib@d@lang}{\mylib@d@lang@default}{%
+    \gdef\mylib@lang@start{}%
+    \gdef\mylib@lang@end{}%
+  }{%
+    \gdef\mylib@lang@start{\begin{otherlanguage}{#1}}%
+    \gdef\mylib@lang@end{\end{otherlanguage}}%
+  }%
+}
+
+% * Сбросить язык статьи
+\newcommand{\mylib@lang@reset}{%
+  \mylib@u@ea{\mylib@lang@set}{\mylib@d@lang@default}%
+}
+
+
+% = Колонтитулы =
+
+% * Установить #1 в верхний колонтитул
+\newcommand{\mylib@header@set}[1]{%
+  \markboth{#1}{}%
+}
+
+% * Сбросить верхний колонтитул
+\newcommand{\mylib@header@reset}{%
+  \mylib@header@set{}%
+}
+
+
+% = Метки и ссылки =
+
+% * Счётчик окружений ..article для уникализации меток
+\newcounter{mylib@c@article@number}
+\setcounter{mylib@c@article@number}{0}
+
+% * Окружение, внутри которого ссылки уникализируются
+\newenvironment{mylib@env@unique@labref}{%
+  \let\mylib@label@old\label%
+  \let\mylib@ltx@label@old\ltx@label%
+  \let\mylib@ref@old\ref%
+  \def\label##1{\mylib@label@old{\arabic{mylib@c@article@number}@##1}}%
+  \def\ltx@label##1{\mylib@ltx@label@old{\arabic{mylib@c@article@number}@##1}}%
+  \def\ref##1{\mylib@ref@old{\arabic{mylib@c@article@number}@##1}}%
+}{%
+}
+
+
+% = Сброс всего =
+
+% * Сброс названия статьи, авторов, информации об авторах, языка
+\newcommand{\mylib@general@reset}{
+  \mylib@title@reset%
+  \mylib@author@reset%
+  \mylib@lang@reset%
+}
+
+
+% = Вспомогательные технические макросы =
+
+% * \mylib@u@count@and@do{couname}{sep}{body} - посчитать в счётчике mylib@c@u@cad от 1 до значения счётчика couname включительно, для каждого отсчитываемого значения выполнить body, и между каждой парой соседних body выполнить sep
+\newcounter{mylib@c@u@cad}
+\newcommand{\mylib@u@count@and@do}[3]{%
+  \setcounter{mylib@c@u@cad}{0}%
+  \mylib@u@count@and@do@single{#3}%
+  \mylib@u@count@and@do@rest{#1}{#2}{#3}%
+}
+\newcommand{\mylib@u@count@and@do@single}[1]{%
+  \stepcounter{mylib@c@u@cad}%
+  #1%
+}
+\newcommand{\mylib@u@count@and@do@rest}[3]{%
+  \ifnumgreater{\value{#1}}{\value{mylib@c@u@cad}}{%
+    #2%
+    \mylib@u@count@and@do@single{#3}%
+    \mylib@u@count@and@do@rest{#1}{#2}{#3}%
+  }{%
+  }%
+}
+
+% * \mylib@u@ea{arg1}{arg2} -> arg1A2, где A2 - результат одного раскрытия arg2
+\newcommand{\mylib@u@ea}[2]{%
+  \expandafter \mylib@u@ea@swap%
+  \expandafter{%
+    #2%
+  }{%
+    #1%
+  }%
+}
+\newcommand{\mylib@u@ea@swap}[2]{%
+  #2{#1}%
+}
+
+% * Главное окружение
+\newenvironment{ptkarticle}{%
+  \stepcounter{mylib@c@article@number}%
+  \mylib@article@start%
+}{%
+  \mylib@article@end%
+}
+% * Указать, что статья английская
+%   Если не указано, то она русская
+\newcommand{\ptkEnglishPaper}{%
+  \mylib@lang@set{english}%
+}
+% * Указать название статьи
+%   \ptkTitle{О ловле кабанов в тундре}
+\newcommand{\ptkTitle}[1]{%
+  \mylib@title@set{#1}%
+}
+% * Указать очередных авторов с аффилиацией и контактами
+%   \ptkAuthors[Иванов~И.\,И., Петров~П.\,П.]{Иванов Иван Иванович, Петров Пётр Петрович}{МГУ}{ivanov@cs.msu.ru, petrov@cs.msu.ru}
+%   Если необязательного аргумента нет, то сокращение создаётся из полного имени
+\newcommand{\ptkAuthors}[4][]{%
+  % Аргумент #1 обрабатывается отдельно в Python с установкой макросов mylib@d@shauthor@N.
+  \mylib@author@info@add{#3}{#4}%
+  \forcsvlist{\mylib@author@add}{#2}%
+}
+% * Окружение списка литературы
+\newenvironment{ptkreferences}{%
+  \pagebreak[1]%
+  \medskip%
+  \noindent%
+  {\scshape\large \mylib@name@references}%
+  \par\nopagebreak%
+  \smallskip%
+  \@afterheading%
+  \begin{enumerate}[label={[\arabic*]},leftmargin=*]%
+  \sloppy%
+}{%
+  \end{enumerate}%
+}
+
+% = Данные =
+
+% * Счётчик уровня вложенности секций
+\newcounter{mylib@c@section@level}
+\setcounter{mylib@c@section@level}{0}
+
+% = Окружения =
+
+% * Окружение секции
+\newenvironment{mylib@section}[1][papers]{%
+  \stepcounter{mylib@c@section@level}%
+  \csdef{mylib@d@section@tmp@\arabic{mylib@c@section@level}}{#1}
+  \csuse{mylib@#1@section@start}%
+  \letcs\mylib@article@start{mylib@#1@article@start}%
+  \letcs\mylib@article@end{mylib@#1@article@end}%
+}{%
+  \csuse{mylib@\csuse{mylib@d@section@tmp@\arabic{mylib@c@section@level}}@section@end}%
+  \addtocounter{mylib@c@section@level}{-1}%
+}
+
+% = Код на исполнение =
+
+% * По умолчанию, если нет секций, окружение ..article отвечает тому, что написано в сниппете sec/paper (т.е. это по умолчанию статья)
+\let\mylib@article@start\mylib@papers@article@start
+\let\mylib@article@end\mylib@papers@article@end
+
+% * Сбросить всё для первой статьи
+\mylib@papers@section@start
+
+
+\makeatother
+
+
+\begin{document}
+
+\begin{mylib@section}[papers]
+  \import{}{article.tex}
+\end{mylib@section}
+
+
+\end{document}
-- 
cgit v1.2.3

