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