diff options
Diffstat (limited to 'ptk20main.tex')
| -rw-r--r-- | ptk20main.tex | 568 |
1 files changed, 568 insertions, 0 deletions
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} |