Guest User

matmex-diploma-custom.cls

a guest
May 12th, 2020
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 13.29 KB | None | 0 0
  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesClass{matmex-diploma-custom}[2015/05/28 MatMex LaTeX diploma class]
  3. \def\my@fontsize{12pt}\def\my@baseclass{article}\def\my@title12pt{}\def\my@body14pt{}
  4.  
  5. % Если используется опция 14pt то нужно несколько хаков
  6. \DeclareOption{14pt}{
  7.  \def\ignore#1{}
  8.   % во-первых, класс наследуется от extarticle
  9.   \def\my@fontsize{14pt}
  10.  \def\my@baseclass{extarticle}
  11.  
  12.   % во-вторых, титульный лист должен набираться так, как будто
  13.   % используется шрифт 12pt - иначе он выглядит совсем конским
  14.   % Для этого мы явно загружаем size12.clo, но так как он на такое не рассчитан,
  15.   % и использует \newcommand для определения всяких \small и \Large
  16.   % то у нас \newcommand временно превращается в \renewcommand
  17.   \let\orignewcommand\newcommand
  18.   \let\origNeedsTeXFormat\NeedsTeXFormat
  19.   \def\my@title12pt{
  20.    \let\newcommand\renewcommand
  21.    \makeatletter
  22.    \input{size12.clo}%
  23.     \makeatother  
  24.     \let\newcommand\orignewcommand
  25.   }
  26.   % в-третьих, после того как титульный лист сгенерирован, нужно снова вернуться
  27.   % к базовому шрифту 14pt. Применяется такой же хак: загрузи size14.clo
  28.   % временно переопределив \newcommand => \renewcommand
  29.   \def\my@body14pt{
  30.     % отдельное внимание подавлению команды \NeedsTeXFormat, которая требует
  31.     % чтобы код size14.clo выполнялся в преамбуле (а тут он уже внутри документа)
  32.     \let\NeedsTeXFormat\ignore
  33.     \let\newcommand\renewcommand
  34.     \makeatletter
  35.     \input{size14.clo}%
  36.     \makeatother  
  37.     \let\newcommand\orignewcommand
  38.     \let\NeedsTeXFormat\origNeedsTeXFormat
  39.   }
  40. }
  41. \ProcessOptions\relax
  42. \LoadClass[a4paper,\my@fontsize]{\my@baseclass}
  43.  
  44. % Поля настраиваются командами \newgeometry во время и после генерации титульных
  45. % страниц и
  46. \usepackage[a4paper]{geometry}
  47.  
  48. \usepackage{fancyhdr}
  49. \usepackage{ifthen}
  50. %% Мы используем компилятор XeLaTex, который дружит с Unicode и True Type/Open Type
  51. %% шрифтами. Для русификации достаточно подключить пакет fontspec и
  52. %% выбрать Unicode шрифт в котором есть кириллические глифы. Ниже
  53. %% основным шрифтом выбирается Unicode версия шрифта Computer Modern с заcечками
  54. \usepackage{fontspec}
  55. \setmainfont[Mapping=tex-text]{CMU Serif}
  56. \setmonofont[Mapping=tex-text]{CMU Typewriter Text}
  57.  
  58. %% В XeLaTex заменой известного пакета babel является пакет polyglossia.
  59. %% Теперь у нас будут переносы слов
  60. \usepackage{polyglossia}
  61. \setdefaultlanguage{russian}
  62.  
  63.  
  64. %% Отступ в первом абзаце
  65. \usepackage{indentfirst}
  66. %% Гиперссылки
  67. \usepackage[colorlinks=true,urlcolor=black,linkcolor=black,filecolor=black,citecolor=black]{hyperref}
  68.  
  69. %% Включение графических файлов
  70. %% we don't need to load graphicx since it will be loaded by xunicode (which is loaded by fontspec)
  71. \usepackage[titletoc]{appendix}
  72.  
  73. %% Эта команда добавляет отчеркнутое место для подписи после имени
  74. %% Аргументы: имя и пояснение под чертой (например, слово "подпись")
  75. \def\sigspace{\\[3em]}
  76. \newcommand\sigplace[2]{
  77. #1\\[1.2em]
  78. \underline{\hspace{3cm}}\\[-0.2em]
  79. {\footnotesize #2}
  80. \def\sigspace{\\[1em]%
  81. \def\sigspace{\\[3em]}}
  82. }
  83.  
  84. %% Параметры заполнения титульного листа
  85. \usepackage{xkeyval}
  86.  
  87. %% Русскоязычный вариант
  88. \define@key[ru]{mytitle}{university}{\def\my@title@university@ru{#1}}
  89. \define@key[ru]{mytitle}{faculty}{\def\my@title@faculty@ru{#1}}
  90. \define@key[ru]{mytitle}{chair}{\def\my@title@chair@ru{#1}}
  91. \define@key[ru]{mytitle}{title}{\def\my@title@title@ru{#1}}
  92. \define@key[ru]{mytitle}{position}{\def\my@title@position@ru{#1}}
  93. \define@key[ru]{mytitle}{group}{\def\my@title@group@ru{#1}}
  94. \define@key[ru]{mytitle}{author}{\def\my@title@author@ru{#1}}
  95. \define@key[ru]{mytitle}{supervisor}{\def\my@title@supervisor@ru{#1}}
  96. \define@key[ru]{mytitle}{supervisorPosition}{\def\my@title@supervisorPosition@ru{#1}}
  97. \define@key[ru]{mytitle}{reviewer}{\def\my@title@reviewer@ru{#1}}
  98. \define@key[ru]{mytitle}{reviewerPosition}{\def\my@title@reviewerPosition@ru{#1}}
  99. \define@key[ru]{mytitle}{chairHead}{\def\my@title@chairHead@ru{#1}}
  100. \define@key[ru]{mytitle}{chairHeadPosition}{\def\my@title@chairHeadPosition@ru{#1}}
  101. \define@key[ru]{mytitle}{year}{\def\my@title@year@ru{#1}}
  102. \define@key[ru]{mytitle}{city}{\def\my@title@city@ru{#1}}
  103. \define@choicekey*[ru]{mytitle}{type}{diploma,report,coursework,master,bachelor}{\def\my@title@type@ru{#1}}
  104.  
  105. %% Англоязычный вариант
  106. \define@key[en]{mytitle}{university}{\def\my@title@university@en{#1}}
  107. \define@key[en]{mytitle}{faculty}{\def\my@title@faculty@en{#1}}
  108. \define@key[en]{mytitle}{chair}{\def\my@title@chair@en{#1}}
  109. \define@key[en]{mytitle}{title}{\def\my@title@title@en{#1}}
  110. \define@key[en]{mytitle}{position}{\def\my@title@position@en{#1}}
  111. \define@key[en]{mytitle}{group}{\def\my@title@group@en{#1}}
  112. \define@key[en]{mytitle}{author}{\def\my@title@author@en{#1}}
  113. \define@key[en]{mytitle}{supervisor}{\def\my@title@supervisor@en{#1}}
  114. \define@key[en]{mytitle}{supervisorPosition}{\def\my@title@supervisorPosition@en{#1}}
  115. \define@key[en]{mytitle}{reviewer}{\def\my@title@reviewer@en{#1}}
  116. \define@key[en]{mytitle}{reviewerPosition}{\def\my@title@reviewerPosition@en{#1}}
  117. \define@key[en]{mytitle}{chairHead}{\def\my@title@chairHead@en{#1}}
  118. \define@key[en]{mytitle}{chairHeadPosition}{\def\my@title@chairHeadPosition@en{#1}}
  119. \define@key[en]{mytitle}{year}{\def\my@title@year@en{#1}}
  120. \define@key[en]{mytitle}{city}{\def\my@title@city@en{#1}}
  121. \define@choicekey*[en]{mytitle}{type}{diploma,report,coursework,master,bachelor}{\def\my@title@type@en{#1}}
  122.  
  123. \newcommand\filltitle[2]{
  124. %% Значения по умолчанию для обоих языков
  125.     \ifthenelse{\equal{#1}{ru}}
  126.        {
  127.        \presetkeys[#1]{mytitle}{
  128.          university = {Санкт-Петербургский государственный университет},
  129.          faculty = {},
  130.          city = {Санкт-Петербург},
  131.          year = {\the\year},
  132.          type = {diploma}
  133.        }{}
  134.        }
  135.        {}
  136.    \ifthenelse{\equal{#1}{en}}
  137.        {
  138.        \presetkeys[#1]{mytitle}{
  139.          university = {SAINT-PETERSBURG STATE UNIVERSITY},
  140.          faculty = {},
  141.          city = {Saint-Petersburg},
  142.          year = {\the\year},
  143.          type = {diploma}
  144.        }{}
  145.        }
  146.        {}
  147.    \setkeys[#1]{mytitle}{#2}
  148. }
  149.  
  150. %% Титульная страница на русском языке
  151. \newcommand\maketitleru{
  152. \fancypagestyle{titleru}{
  153.    \fancyhf{}  % clear all header and footer fields
  154.     \renewcommand{\headrulewidth}{0pt}  % remove head ruler
  155.     %% В верхнем колонтитуле будет университет и кафедра
  156.     \chead{\large
  157.      \my@title@university@ru \\
  158.      \ifthenelse{\equal{\my@title@faculty@ru}{}}{}{\my@title@faculty@ru \\}  
  159.      \vskip 1em
  160.      {\large \my@title@chair@ru \\}
  161.    }
  162.     %% В нижнем колонтитуле город и год
  163.     \cfoot{\large\parbox[b]{\textwidth}{\centering \my@title@city@ru\\ \my@title@year@ru}}
  164. }
  165.  
  166. \title{\my@title@title@ru}
  167. \begin{titlepage}
  168. \newgeometry{top=20mm,bottom=20mm,left=20mm,right=15mm,nohead,includeheadfoot}
  169. \thispagestyle{titleru}
  170. \begin{center}
  171.    \vspace*{0.25\textheight}
  172.    {\Large\my@title@author@ru}
  173.    
  174.    \vskip 2em
  175.    {\Huge \@title\\}
  176.    
  177.    \vskip 1em
  178.    {\large
  179.    \ifthenelse{\equal{\my@title@type@ru}{coursework}}
  180.    {Курсовая работа}
  181.    {\ifthenelse{\equal{\my@title@type@ru}{diploma}}
  182.    {Дипломная работа}
  183.    {\ifthenelse{\equal{\my@title@type@ru}{report}}
  184.    {Отчёт по учебной практике}
  185.    {\ifthenelse{\equal{\my@title@type@ru}{master}}
  186.    {Магистерская диссертация}
  187.    {\ifthenelse{\equal{\my@title@type@ru}{bachelor}}
  188.    {Бакалаврская работа}
  189.    }}}}
  190.    \\}
  191.    \vskip 2em
  192.    \ifthenelse{\equal{\my@title@type@ru}{coursework}}
  193.    {\normalsize \raggedleft
  194.    Научный руководитель:\\
  195.    \my@title@supervisorPosition@ru\ \my@title@supervisor@ru
  196.    }
  197.     {\normalsize \raggedleft
  198.     \vskip 5em
  199.     Научный руководитель:\\
  200.     \my@title@supervisorPosition@ru\ \my@title@supervisor@ru\sigspace
  201.     % Рецензент:\\
  202.     % \my@title@reviewerPosition@ru\ \my@title@reviewer@ru
  203.     }
  204. \end{center}
  205. \end{titlepage}
  206. }
  207.  
  208. %% Титульная страница на английском языке
  209. \newcommand\maketitleen{
  210. \fancypagestyle{titleen}{
  211.    \fancyhf{}  % clear all header and footer fields
  212.     \renewcommand{\headrulewidth}{0pt}  % remove head ruler
  213.     %% В верхнем колонтитуле будет университет и кафедра
  214.     \chead{\large
  215.        \my@title@university@en \\
  216.        \ifthenelse{\equal{\my@title@faculty@en}{}}{}{\my@title@faculty@en \\}  
  217.        \vskip 1em
  218.        {\large \my@title@chair@en \\}
  219.    }
  220.     %% В нижнем колонтитуле город и год
  221.     \cfoot{\large\parbox[b]{\textwidth}{\centering \my@title@city@en\\ \my@title@year@en}}
  222. }
  223. \title{\my@title@title@en}
  224. \begin{titlepage}%
  225. \newgeometry{top=20mm,bottom=20mm,left=20mm,right=15mm,nohead,includeheadfoot}
  226. \thispagestyle{titleen}
  227.  \begin{center}
  228.    \vspace*{0.25\textheight}
  229.    {\Large\my@title@author@en\\}
  230.    
  231.    \vskip 2em
  232.    {\Huge \@title \\}
  233.    
  234.    \vskip 1em
  235.    {\large
  236.    \ifthenelse{\equal{\my@title@type@en}{coursework}}
  237.    {Course Work}
  238.    {\ifthenelse{\equal{\my@title@type@en}{diploma}}
  239.    {Graduation Thesis}
  240.    {\ifthenelse{\equal{\my@title@type@en}{report}}
  241.    {Educational Practice Report}
  242.    {\ifthenelse{\equal{\my@title@type@en}{master}}
  243.    {Master's Thesis}
  244.    {\ifthenelse{\equal{\my@title@type@en}{bachelor}}
  245.    {Bachelor's Thesis}
  246.    }}}}
  247.    \\}
  248.    \vskip 2em
  249.    \ifthenelse{\equal{\my@title@type@en}{coursework}}
  250.    {\normalsize \raggedleft
  251.    Scientific supervisor:\\
  252.    \my@title@supervisorPosition@en\ \my@title@supervisor@en
  253.    }
  254.    {\normalsize \raggedleft
  255.    \vskip 5em
  256.    Scientific supervisor:\\
  257.    \my@title@supervisorPosition@en\ \my@title@supervisor@en\sigspace
  258.  
  259.    Reviewer:\\
  260.    \my@title@reviewerPosition@en\ \my@title@reviewer@en
  261.    }
  262.  \end{center}
  263. \end{titlepage}
  264. }
  265.  
  266. %% Титульный лист генерируется, если для соответствующего языка
  267. %% определен аргумент title
  268. %% Счетчик страниц автоматически увеличивается при генерации титульнго листа
  269. \renewcommand\maketitle{
  270. %% На титульной странице все кроме полей соответствует \documentclass[12pt]{article}
  271. \my@title12pt
  272.  
  273. \newcounter{titlepages}
  274. \setcounter{titlepages}{1}
  275. \begin{spacing}{1.0}
  276. \ifthenelse{\isundefined{\my@title@title@ru}}{}{
  277.   % fancyhdr set height of the top/bottom headers automatically
  278.   % so set them to zero to be sure that he does it
  279.   \setlength{\headheight}{0pt}
  280.  \setlength{\footskip}{0pt}
  281.  \maketitleru\addtocounter{titlepages}{1}
  282. }
  283. \ifthenelse{\isundefined{\my@title@title@en}}{}{
  284.   % fancyhdr already set height of the top/bottom headers on the previous page (titleru)
  285.   % but on this page the headers' height might be different
  286.   % so set them to zero again in order to make fancyhdr to do it
  287.   \setlength{\headheight}{0pt}
  288.  \setlength{\footskip}{0pt}
  289.  \maketitleen\addtocounter{titlepages}{1}
  290. }
  291. \end{spacing}
  292. \setcounter{page}{\value{titlepages}}
  293. % restore preamble's geometry
  294. \my@body14pt
  295. \newgeometry{a4paper,top=20mm,bottom=20mm,left=30mm,right=15mm,nohead,includeheadfoot}
  296. }
  297.  
  298. %% Каждая глава начинается с новой страницы, введение и заключение не
  299. %% нумеруются, но в оглавление входят. А само оглавление в оглавление не входит
  300. \let\old@section\section
  301. \def\section{\@ifstar\@section\@@section}
  302. \def\@section#1{\newpage\old@section*{#1}%
  303.         \ifthenelse{\equal{#1}{\contentsname}}%
  304.            {}%
  305.            {\addcontentsline{toc}{section}{#1}}%
  306. }
  307. \def\@@section#1{\newpage\old@section{#1}}
  308.  
  309. %% Полуторный интервал
  310. \usepackage[nodisplayskipstretch]{setspace}
  311. \onehalfspacing
  312.  
  313. %% Переименование "содержания" в "оглавление"
  314. \gappto\captionsrussian{\renewcommand{\contentsname}{Оглавление}}
  315.  
  316. \let\savenumberline\numberline
  317. \def\numberline#1{\savenumberline{#1.}}
Advertisement
Add Comment
Please, Sign In to add comment