\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}
