Если вы работаете в крупной компании, где утвержден корпоративный шаблон презентаций, скорее всего, он выполнен в PowerPoint или Keynote. Цвета, шрифты, логотипы, фоновые изображения описаны в брендбуке. Но многие инженерные доклады, лекции, отчеты по научным работам удобнее верстать в LaTeX.

Работая в YADRO, я много выступаю как на внешних конференциях, так и на собственных мероприятиях компании. В какой-то момент я поняла, что мне удобнее делать презентации в LaTex и взяла все в свои руки: разработала стилевой файл для LaTeX на базе корпоративного брендбука и pptx-шаблона. Шаблон оказался очень востребованным, и я решила поделиться опытом и наработками с сообществом.

Главная цель статьи — не дать готовый «черный ящик», а объяснить, по какому принципу устроен файл YourPres.cls, чтобы вы могли адаптировать его под корпоративный стиль или настроить его на свой вкус для личного использования. Весь описанный шаблон с демонстрацией целиком выложен на GitHub, поэтому его можно сразу попробовать в деле.

Предполагается, что у читателя есть базовое представление о LaTeX и Beamer. Если это не так, нестрашно: вы все равно можете клонировать готовый репозиторий и адаптировать его под свои цвета и шрифты по инструкции в тексте с помощью стилевого файла YourPres.cls. В конце текста я также привела список литературы для дальнейшего погружения в тему.


LaTeX — это язык верстки и система подготовки документов на основе набора макросов TeX. Вы пишете текст своей статьи или презентации в plain-файле с разметкой, а затем компилируете его в PDF. В отличие от Word и PowerPoint верстка — шрифты, отступы, цвета, расположение элементов — задается отдельно либо встроенными командами, либо подключаемыми классами и стилями.

LaTex сильно упрощает набор сложных «многоэтажных» формул с выделением важных частей цветами, рамками, подчеркиваниями (кстати, в статьях на Хабре тоже можно вставлять LaTeX-формулы!), подгрузку листингов кода с подсветкой синтаксиса, вставку псевдокода алгоритмов. Таблицы и рисунки нумеруются автоматически, как и оглавление. А чтобы преобразовать статью в презентацию и обратно, достаточно просто заменить стилевой файл. Одним словом — праздник. Еще и версионировать удобно, потому что стиль и презентация — текстовые файлы. Вы можете работать с презентацией как с кодом: фиксировать изменения, откатывать неудачные правки и т.д.

При таком подходе текст презентации и стиль — это два разных файла, что позволяет вам набирать только текст (tex-файл), а корпоративный стиль применять автоматически при компиляции. Нет шансов случайно использовать не тот шрифт, не тот цвет, не те отступы, не тот стиль таблицы или нечаянно изменить макет страницы — ее поля, положение заголовков, отступы. Стиль может обновляться, но вам достаточно просто подтянуть из репозитория обновленный стилевой файл и один раз нажать на кнопку компиляции — перекомпилированный PDF будет соответствовать обновленному стилю. Вам не нужно ничего править в тексте презентации! Если у вас уже есть презентация или статья в LaTeX, то достаточно перекомпилировать ее с корпоративным стилевым файлом — и вуаля!

Как обычно, дьявол кроется в мелочах: в том, чтобы из корпоративного брендбука и pptx-шаблона сделать этот самый стилевой файл для LaTeX. По собственному опыту могу сказать, что это требует времени, очень тонкой настройки шаблона и даже замеров отступов в pptx линеечкой. Три года назад я сделала такой файл для себя, скопировав корпоративный стиль нашей компании в LaTeX-класс. Потом поделилась с коллегами — и даже забыла об этом.

Недавно я узнала, что мой шаблон активно используют для докладов и целых образовательных курсов, дописывают в него свои ветки, читают лекции. В общем, он явно живет свою лучшую жизнь! «Класс, что же вы молчали, я бы раньше восхитилась!» — сказала я активистам, на что коллеги резонно заметили: «Ну ты же не пишешь Линусу Торвальдсу, что используешь Linux» (с). И правда! Хотя, наверное, стоило бы, прости нас, Линус, если что не так.

Даже не ожидала, что, решая свою проблему, я сделала такую востребованную вещицу, перерыв много документации. Поэтому решила поделиться историей и показать на примере реально работающего шаблона и файла YourPres.cls в репозитории, как, опираясь на мои наработки, с минимальными модификациями сделать стилевик для презентаций на свой вкус или корпоративный дизайн, не погружаясь при этом в нюансы настроек Beamer-стилей и переопределения LaTeX-команд.

Конкретные цвета, шрифты и логотипы в моем примере заменены на generic-значения в фиолетовых тонах, потому что я их люблю (простим мне это), но архитектура и приемы полностью рабочие. Вы сможете легко модифицировать шаблон для своего дизайна, просто подставив свои шрифты, палитры, иконки, логотипы, значения отступов и многое другое.

Структура LaTeX-шаблона

Репозиторий с примером имеет следующую структуру:

project/
  YourPres.cls                // сам класс (774 строки с комментариями)
  YourStyle/                  // визуальные ресурсы:
    logo.png                  // * логотип; 
    titlepage.png             // * фон титульного слайда;
    finalslide.png            // * фон финального слайда;
    icons/                    // * 33 иконки Material Design Icons (512×512, белый контур)
  fonts/                      // папка с TTF-шрифтами (Inter, JetBrains Mono, Open Sans)
  img/                        // изображения для демо-презентации
  code/                       // примеры кода для демо-презентации
  video/                      // PNG-кадры для анимаций в демо-презентации
  Example.tex                 // текст демо-презентации
  Example.pdf                 // скомпилированная демо-презентация

Весь LaTeX-стиль для Beamer реализован в файле YourPres.cls. Это LaTeX-класс: в tex-файле с презентацией достаточно указать \documentclass{YourPres} — и стиль подтянется. Не нужно устанавливать файлы в TeX-дистрибутив или править texmf. Можно добавить шаблон как подмодуль в любой проект и получать обновления стиля автоматически.

Давайте разберемся, из чего состоит YourPres.cls и, главное, что в нем нужно поменять, чтобы переделать файл под свой дизайн.

Инструментарий: XeLaTeX и пакеты

Первый шаг при создании любого LaTeX-класса — сообщить системе, что это .cls, а не пакет, и зарегистрировать его имя и версию:

\NeedsTeXFormat{LaTeX2e} % если LaTeX слишком старый, компиляция остановится с ошибкой
\ProvidesClass{YourPres}[08/08/2026 V.2.0.0]

\ProvidesClass{YourPres}[...] задает имя класса, дату и номер версии. Дата позволяет LaTeX проверять, не устарела ли версия класса относительно подключенных пакетов.

Класс загружается поверх Beamer и требует XeLaTeX:

\LoadClass[hyperref=xetex, final,8pt, width=33.867,height=19.05,scale=1,aspectratio=169]{beamer}
\setbeamersize{text margin left=0.75cm, text margin right=0.75cm}

Параметры \LoadClass:

  • hyperref=xetex — гиперссылки через драйвер XeTeX (без этого параметра ссылки могут не работать);

  • final — финальный режим (не draft — здесь присутствуют все рисунки и элементы);

  • 8pt — базовый размер шрифта (Beamer по умолчанию использует более крупные шрифты, 8pt для слайдов 16:9 дает комфортное соотношение);

  • width/height — ширина и высота слайда в мм (33.867×19.05 мм соответствует пропорции 16:9, 13"×7.5", при scale=1);

  • aspectratio=169 — явно указывает Beamer, что слайд широкоформатный (классический widescreen);

  • scale=1 — масштаб 1:1 (можно было бы 0.5 для «сжатого» просмотра, но не нужно).

Почему не pdfLaTeX? XeLaTeX умеет напрямую загружать .otf/.ttf-шрифты из указанной папки (Path=fonts/) без системной установки. Единственное ограничение: ваш файл презентации должен быть строго в кодировке UTF-8, иначе шрифты не подтянутся.

Далее задаем горизонтальные отступы текста от краев слайда:

\setbeamersize{text margin left=0.75cm, text margin right=0.75cm}

Меняйте эти значения, если нужно сдвинуть текст к краям или от краев.

Далее подключаются все необходимые пакеты:

Пакет

Назначение

fontspec, xltxtra

Подключение TTF/OTF-шрифтов по пути Path=fonts/

cmap

Для копирования кириллицы из PDF

polyglossia

Русский/английский язык (замена babel для XeLaTeX)

xunicode

Unicode-подстановки для XeTeX

xcolor

Цветовая палитра

tikz

Круглые фото авторов (path picture)

listings

Подсветка кода

animate

Анимация из последовательности PNG-кадров (method=ocg)

colortbl, array

Стилизация таблиц с автораскраской строк и колонками =, +

amsfonts, amssymb, amsmath

Стандартная математика

algorithm, algpseudocode

Псевдокод алгоритмов

siunitx

Научная нотация чисел

euscript

Красивый математический шрифт для операторов

marvosym, bbding

Пиктограммы — буллиты, крестики, галочки

graphicx

Вставка изображений (\includegraphics)

tabularx, multirow, multicol

Вставка таблиц и объединение ячеек в них по строкам/столбцам

afterpage

Размещение плавающих рисунков и таблиц

caption

Подписи к рисункам/таблицам

textcase

Преобразование регистра (\MakeTextUppercase)

ifthen

Условные операторы внутри стилевого файла

xpatch

Для изменения чужих макросов

Отключаем увеличенные пробелы после точки при помощи \frenchspacing и разрешаем использовать в гиперссылках unicode и цвет, создавать закладки:

\hypersetup{unicode=true, colorlinks=true, bookmarks=true}

Цветовая палитра

В любом корпоративном шаблоне есть набор «фирменных» цветов. В YourPres.cls палитра в десятом разделе файла состоит из одного базового цвета и серии производных, подобранных в единой гамме:

% YourBase — основной брендовый цвет (темно-фиолетовый).
% Используется: заголовки фреймов, шапка таблиц, фон титула, блоки, буллиты.
\definecolor{YourBase}{HTML}{5B2C8C}
% YourSectionShaded — цвет неактивных разделов в содержании (светло-фиолетовый).
\definecolor{YourSectionShaded}{HTML}{B59AD9}
% YourBlock — фон блоков и четных строк таблиц (светлая лаванда).
\definecolor{YourBlock}{HTML}{F3EEF7}
% YourBad — цвет «плохо» (для статусов, ошибок).
\definecolor{YourBad}{HTML}{C41E3A}
% YourNeutral — цвет «нейтрально» (янтарный).
\definecolor{YourNeutral}{HTML}{CF9900}
% YourGood — цвет «хорошо» (зеленый).
\definecolor{YourGood}{HTML}{008F6B}
% YourAccent — акцентный цвет (маджента-фиолетовый).
\definecolor{YourAccent}{HTML}{B324D1}
% YourParam ... YourParam5 — параметры графиков (серия фиолетовых оттенков).
\definecolor{YourParam}{HTML}{8E44AD}
\definecolor{YourParam2}{HTML}{75389C}
\definecolor{YourParam3}{HTML}{A569BD}
\definecolor{YourParam4}{HTML}{6C3483}
\definecolor{YourParam5}{HTML}{FF794C}

Выделите HEX-код (например, 5B2C8C) и замените на корпоративный цвет. Если делаете просто стиль для себя, то для подбора палитры можно воспользоваться ресурсом. Полезно добавлять комментарии с назначением — это шпаргалка для коллег и самодокументирование.

На основе палитры настраиваются Beamer-темы:

% Заголовок блока: белый текст на YourBase
\setbeamercolor{block title}{fg=white,bg=YourBase}
% Тело блока: фон YourBlock
\setbeamercolor{block body}{bg=YourBlock}
% Заголовок фрейма: цвет YourBase
\setbeamercolor{frametitle}{fg=YourBase}
% Подписи к рисункам: цвет YourFigureCaption
\setbeamercolor{caption}{fg=YourFigureCaption}
% Цвета буллитов и нумераторов в списках
% По умолчанию Beamer использует синий — перекрашиваем в YourBase (фиолетовый)
% Меняйте YourBase на другой цвет (например YourParam), чтобы сменить оттенок
\setbeamercolor{itemize item}{fg=YourBase}
\setbeamercolor{itemize subitem}{fg=YourBase}
\setbeamercolor{itemize subsubitem}{fg=YourBase}
\setbeamercolor{enumerate item}{fg=YourBase}
\setbeamercolor{enumerate subitem}{fg=YourBase}
\setbeamercolor{enumerate subsubitem}{fg=YourBase}

Принцип простой: изменили HEX-код в определении цвета YourBase — перекрасили сразу frametitle, block title, шапку таблицы, маркеры списков, буллиты и фон титульного слайда. Изменили цвет YourBlock — сменился фон подложки у блоков и т.д.

Шрифты: локальные TTF через Path=fonts/

Корпоративные шрифты обычно поставляются как OTF- или TTF-файлы. Я кладу их в папку fonts/ в репозитории и подключаю через параметр Path=. Поэтому шрифты не нужно устанавливать в систему: при компиляции LaTeX подхватит их прямо из репозитория. Новый разработчик клонирует проект и сразу может его скомпилировать — не нужно разыскивать корпоративные шрифты по всей компании.

В качестве примера в папке fonts/ лежат Inter (Regular, Bold, Italic, BoldItalic), JetBrainsMono (Regular, Bold), OpenSans (Regular, Bold). Для смены шрифтов во всей презентации достаточно добавить новые шрифты в эту папку и прописать имена новых файлов в блоке подключения:

% Глобальные настройки fontspec
\defaultfontfeatures{Ligatures={TeX},Mapping=tex-text}

% Основной шрифт — Inter (Regular / Bold / Italic / BoldItalic)
\setmainfont[Path=fonts/, BoldFont=Inter-Bold.ttf,
             ItalicFont=Inter-Italic.ttf,
             BoldItalicFont=Inter-BoldItalic.ttf]{Inter-Regular.ttf}
\setromanfont[Path=fonts/, ...]{Inter-Regular.ttf}
\setsansfont[Path=fonts/, ...]{Inter-Regular.ttf}

% Моноширинный — JetBrains Mono
\setmonofont[Path=fonts/, BoldFont=JetBrainsMono-Bold.ttf]{JetBrainsMono-Regular.ttf}

Для кириллицы polyglossia требует явного указания шрифтов:

% \cyrillicfont — обязательная команда polyglossia для кириллического основного шрифта
\newfontfamily{\cyrillicfont}[Path=fonts/, ...]{Inter-Regular.ttf}
% \cyrillicfonttt — кириллический моноширинный шрифт
\newfontfamily{\cyrillicfonttt}[Path=fonts/, ...]{JetBrainsMono-Regular.ttf}
% \cyrillicfontsf — кириллический гротеск (sans-serif)
\newfontfamily{\cyrillicfontsf}[Path=fonts/, ...]{Inter-Regular.ttf}
% \cyrillicfontrm — кириллический римский шрифт
\newfontfamily{\cyrillicfontrm}[Path=fonts/, ...]{Inter-Regular.ttf}

Каркас слайда: шапка (headline), подвал (footline), заголовок (frametitle)

Навигационные кнопки (section navigation) Beamer глобально отключаем командой \beamertemplatenavigationsymbolsempty. Оставляем в шапке только логотип в правом верхнем углу:

% Верхний колонтитул: логотип справа вверху
% \vspace*{0.5cm} — отступ сверху от логотипа
% \vspace*{-0.85cm} — компенсация, чтобы основной текст не съехал вниз
\setbeamertemplate{headline}{\vspace*{0.5cm}\hspace*{.5cm}\scriptsize{
\hspace*{50pt} \hfill \includegraphics[width=0.95cm]{YourStyle/logo.png}\hspace*{.7cm}}\vspace*{-0.85cm}}

Меняйте 0.5cm (отступ сверху), 0.95cm (ширина логотипа) и -0.85cm (компенсация), чтобы подогнать положение логотипа под свой макет.

В подвале оставляем только номер текущего слайда, обернутый в цветной прямоугольник цвета YourBlock:

% Нижний колонтитул: номер страницы в цветном боксе справа внизу
% \fcolorbox{YourBlock}{YourBlock}{...} — рамка и заливка одним цветом
\setbeamertemplate{footline}{\hspace*{.5cm}\scriptsize{
\hspace*{50pt} \hfill\fcolorbox{YourBlock}{YourBlock}{\hspace*{.25cm}\insertframenumber\hspace*{.25cm}}\hspace*{.7cm}}}

Определяем стиль заголовков и подзаголовков слайдов:

\defbeamertemplate*{frametitle}{my theme}
{%
  % Если подзаголовок не задан явно, используем название текущего раздела
  \ifx\insertframesubtitle\empty
    \let\insertframesubtitle\secname
  \fi
  \begin{beamercolorbox}{frame title}%
    % Если подзаголовок пустой — показываем только заголовок
    \ifx\insertframesubtitle\@empty%
      % ОТСТУП СВЕРХУ, когда есть только заголовок
      % Увеличьте до 0.45cm, чтобы опустить заголовок ниже
      \vspace*{0.45cm}\\
      \insertframetitle
    \else%
      % ОТСТУП СВЕРХУ, когда есть и заголовок, и подзаголовок
      % Увеличьте до 0.35cm, чтобы опустить всю группу ниже
      \vspace*{0.35cm}\\
      % Печатаем подзаголовок (название раздела) — маленьким шрифтом, заглавными
      \usebeamercolor[fg]{framesubtitle}\usebeamerfont{framesubtitle}
      \hspace*{0.03cm}\MakeTextUppercase{\insertframesubtitle}\vspace*{-0.1cm}\\
      % Печатаем заголовок фрейма — крупно
      \usebeamercolor[fg]{frametitle}\usebeamerfont{frametitle}\insertframetitle
    \fi
    % Отступ снизу после заголовка перед содержимым
    % Увеличьте до 0.25cm, чтобы добавить воздуха между заголовком и текстом
    \vspace*{0.25cm}
  \end{beamercolorbox}%
}

Подзаголовок (subtitle) автоматически переводится в верхний регистр (\MakeTextUppercase), поэтому в tex-файле его можно писать в любом регистре. Если subtitle не передан явно, автоматически подставляется название секции (\secname). Это экономит время и делает навигацию единообразной. Отступы сверху вынесены в отдельные \vspace*, их легко менять под свой макет.

Полноэкранные изображения, титульный и финальный слайды

Чтобы показывать в презентации полноэкранные изображения без колонтитулов и заголовков на слайде, определим команду:

\newcommand{\FullSlideImage}[1] {
   {
      \usebackgroundtemplate{\includegraphics[width=\paperwidth]{#1}}
      \setbeamertemplate{footline}{}
      \setbeamertemplate{headline}{}
      \setbeamertemplate{frametitle}{}{}
      \begin{frame}{}
      \end{frame}
   }
}

Теперь слайд с полноэкранным изображением img/diagram.png можно создать, просто написав \FullSlideImage{img/diagram.png}.

Для генерации финального слайда с полноэкранным фоновым изображением YourStyle/finalslide.png используйте команду \Yourfinalslide. Не забудьте заменить фон финального слайда в папке YourStyle на свой.

На титульный слайд поместим полноэкранное фоновое изображение YourStyle/titlepage.png. Также замените его в папке YourStyle на фон из вашего дизайна, и поверх него выведем название презентации и имя автора:

\newcommand{\Yourtitlepage}{
   {
      \usebackgroundtemplate{
        \includegraphics[width=\paperwidth,height=\paperheight]{YourStyle/titlepage.png}
      }
      \setbeamertemplate{footline}{}
      \setbeamertemplate{headline}{}
      \setbeamertemplate{frametitle}{}{}
      \begin{frame}
         \hspace*{1.5cm}
         \begin{minipage}[h]{0.77\linewidth}
            \vspace*{5cm}
            {\color{white}
               {\Huge\sffamily{\bfseries\inserttitle} } \\
               \vskip1pt
               \insertauthor
            }
         \end{minipage}
      \end{frame}
   }
}

Значения \vspace*{5cm} (отступ сверху) и \hspace*{1.5cm} (отступ слева), а также шрифт, используемый для названия и автора, можно менять под свой макет.

Например, напишем ультракороткую презентацию из одного титульного слайда:

\documentclass{YourPres}
% XeLaTeX, UTF-8

\title{Оптимизация расчетов на GPU}
\author{Денис Денисов}

\begin{document}
  \Yourtitlepage
\end{document}

Сохраним этот tex-файл и скомпилируем. Появится pdf-файл из одной страницы такого вида:

Титульный слайд
Титульный слайд

Слайд с информацией об авторе

В классе определена команда \roundpic, которая делает круглую обрезку фотографии с помощью TikZ:

\newcommand{\roundpic}[2] {
  \tikz\node [circle, minimum width = #1,
    path picture = {
      \node [anchor=center] at (path picture bounding box.center) {
        \includegraphics[width=#1]{#2}};
    }] {};}

Эта команда используется в \bioTune, которая размещает фото автора и четыре пункта с информацией о нем в блоках с регулируемыми пропорциями:

% \bioTune{photo}{name}{title}{fact1}{fact2}{photo_width}{text_width}
%   — базовая команда для размещения фото и текста про автора.
%   Аргументы 6 и 7 регулируют соотношение ширины фото и текста.
%   Размер круглой обрезки фото задается множителем 0.65\linewidth внутри
%   minipage шириной #6\linewidth. Меняйте 0.65 на большее (например 0.85),
%   чтобы кружок был крупнее, или на меньшее (0.5), чтобы он был мельче.
\newcommand{\bioTune}[7] {
  \mbox{ }\hfill
  \begin{minipage}[h]{#6\linewidth}
    \hfill\roundpic{0.65\linewidth}{#1}\hfill
  \end{minipage}\hspace*{0.5cm}
  \begin{minipage}[h]{#7\linewidth}
  {\color{white}{\huge{\textbf{#2}}}\\
      #3\\ \vskip2pt
      \begin{itemize}
        \item #4
        \item #5
      \end{itemize}
    }
  \end{minipage}
  \hfill\mbox{ }
}

У \bioTune есть две обертки с пропорциями для случая одного автора и двух:

% Один автор: фото 25% ширины, текст 42%
\newcommand{\bio}[5]{\bioTune{#1}{#2}{#3}{#4}{#5}{0.25}{0.42}}
% Пара авторов: фото 16% ширины, текст 62%
\newcommand{\bioPair}[5]{\bioTune{#1}{#2}{#3}{#4}{#5}{0.16}{0.62}}

Можно редактировать пропорции в них, а также добавлять больше авторов.

Добавим команды для создания слайдов с информацией об авторах с использованием этих оберток:

\newcommand{\SingleAuthorPage}[5] {
  {
    % Фон страницы — YourBase (темно-фиолетовый)
    \setbeamercolor{background canvas}{bg=YourBase}
    % Убираем колонтитулы
    \setbeamertemplate{footline}{}
    \setbeamertemplate{headline}{}
    \setbeamertemplate{frametitle}{}{}
    % Белые буллиты
    \setbeamertemplate{itemize item}{\color{white}$\bullet$}
    \setbeamercolor{itemize/enumerate body}{fg=white}
    \begin{frame}\vskip0.75cm
       \bio{#1}{#2}{#3}{#4}{#5}
    \end{frame}
  }
}

\newcommand{\PairCoAuthorsPage}[2] {
  {
    \setbeamercolor{background canvas}{bg=YourBase}
    \setbeamertemplate{footline}{}
    \setbeamertemplate{headline}{}
    \setbeamertemplate{frametitle}{}{}
    \setbeamertemplate{itemize item}{\color{white}$\bullet$}
    \setbeamercolor{itemize/enumerate body}{fg=white}
    \begin{frame}\vskip0.75cm
       #1\\ \vskip1cm #2
    \end{frame}
  }
}

В качестве примера добавим такой слайд к нашей ультракороткой презентации из предыдущего пункта:

  \SingleAuthorPage{img/author.png}{Денис Денисов}
                   {Инженер-исследователь, Компания Н}
                   {Опыт в HPC — 8 лет}
                   {Автор 10+ публикаций}

После компиляции в pdf-файле появится вторая страница:

Слайд о себе любимом
Слайд о себе любимом

Примеры для двух авторов представлены в демо-презентации. Для изменения вида таких страниц отредактируйте в командах выше значения отступов, цветов и т.д.

Секционные слайды — автосодержание

Одна из самых удобных фич Beamer — \AtBeginSection. Я использую ее, чтобы при каждом вызове \section{Название} автоматически вставлялся слайд с оглавлением, где выделен текущий раздел. В примере для этого я использовала цепочку стрелок — семь $\blacktriangleright$ слева от названия, а также цвет и жирное начертание шрифта, «затенив» остальные разделы оглавления с помощью полупрозрачного YourSectionShaded:

% Патч: убираем \vfill в содержании, заменяем на \vspace{0.6cm},
% чтобы секции не разъезжались по всей высоте.
\patchcmd{\beamer@sectionintoc}
  {\vfill}
  {\vspace{0.6cm}}
  {}
  {}

\AtBeginSection{
    {
    % Темно-фиолетовый фон всего слайда
    \setbeamercolor{background canvas}{bg=YourBase}
    % Убираем колонтитулы
    \setbeamertemplate{footline}{}
    \setbeamertemplate{headline}{}
    \setbeamertemplate{frametitle}{}{}
    % Шрифт активного раздела — крупный, жирный
    \setbeamerfont{section in toc}{size=\Large, series=\bfseries}
    % Шрифт неактивных разделов — крупный, обычный
    \setbeamerfont{section in toc shaded}{size=\Large, series=\mdseries}
    % Активный раздел — белый
    \setbeamercolor{section in toc}{fg=alerted text.fg, fg=white}
    % Неактивные разделы — полупрозрачный фон + цвет YourSectionShaded
    \setbeamercolor{section in toc shaded}{bg=YourSectionShaded!20, fg=YourSectionShaded}
    % Шаблон неактивного раздела — просто название
    \setbeamertemplate{section in toc shaded}{\inserttocsection}
    % Шаблон активного раздела — цепочка стрелок от левого края
    \setbeamertemplate{section in toc}{\hspace{-2.35cm}\makebox[2.35cm][l]{\color{white}$\blacktriangleright$$\blacktriangleright$$\blacktriangleright$$\blacktriangleright$$\blacktriangleright$$\blacktriangleright$$\blacktriangleright$}\inserttocsection}

    \begin{frame}
      \vfill
      \hspace*{1.6cm}\begin{minipage}[h]{0.75\linewidth}\linespread{1.6}
        \tableofcontents[currentsection]
      \end{minipage}
      \vfill
    \end{frame}
    }
}

Автоматически сгенерированные в начале секций оглавления есть и в демо-презентации:

Пример секционного слайда
Пример секционного слайда

Вы можете заменить цепочку стрелок в \setbeamertemplate{section in toc}{...} на подчеркивание, любые другие символы либо убрать совсем, если того требует ваш брендбук.

Подсветка кода (listings)

Настройки listings подгоняются под цветовую палитру:

\lstset{
  basicstyle=\small\ttfamily,              % основной шрифт кода
  commentstyle=\color{YourGood},           % комментарии — зеленый
  keywordstyle=\color{YourBase},           % ключевые слова — основной цвет
  basicstyle=\Yourcode,                    % используется \Yourcode (\small\ttfamily)
  numbers=left,                            % нумерация строк слева
  xleftmargin=2em,                         % отступ слева под номера
  frame=single,                            % рамка вокруг листинга
  framexleftmargin=1.5em,                  % отступ рамки слева
  numberstyle=\tiny\color{YourFigureCaption}, % стиль номеров строк
  stepnumber=1,                            % нумеровать каждую строку
  numbersep=5pt,                           % отступ номера от кода
  backgroundcolor=\color{YourBlock},       % фон — как у Beamer-блоков
  rulecolor=\color{YourBlock},             % рамка сливается с фоном
  stringstyle=\color{YourBad},             % строки — красный
  emphstyle=\color{YourAccent},            % выделенные функции — акцентный
  showspaces=false,                        % не показывать пробелы
  showstringspaces=false,                  % не показывать пробелы в строках
  showtabs=false,                          % не показывать табуляцию
  tabsize=2,                               % размер табуляции = 2 пробела
  captionpos=t,                            % подпись сверху
  breaklines=true,                         % перенос длинных строк
  breakatwhitespace=false,                 % переносить в любом месте (не только по пробелу)
  escapeinside={\%*}{*)}                   % экранирование в LaTeX внутри кода
}

Все цвета (YourGood, YourBase, YourBlock, YourBad, YourAccent) можно заменить на свои — подсветка перестроится автоматически.

Можно определять свои стили для диалектов. Например, в классе определен стиль CUDA для языка C++ с подсветкой CUDA-специфичных функций:

\lstdefinestyle{CUDA}{language=C++,
    emph={
        cudaMalloc, cudaFree,
        __global__, __shared__, __device__, __host__,
        __syncthreads, __umul24,
    }
}

Использование:

\begin{lstlisting}[language=C++, style=CUDA]
// ваш код
\end{lstlisting}

Можно подгружать код прямо из файлов, указывать нужные номера строк и т.д. Например, как в демо-презентации:

\lstinputlisting[language=Python, linerange={2-4,6-13,32-35},title=Вставка из example.py]{code/example.py}

В итоге в презентации все листинги стилизованы и имеют автоподсветку кода:

Пример слайда с листингами
Пример слайда с листингами

Таблицы с автораскраской

Таблицы — частая боль в LaTeX. Я сделала так, чтобы строки окрашивались автоматически с чередованием белого и цвета YourBlock. А шапка — всегда на YourBase-фоне с белым текстом:

% Шапка: фон YourBase, белый жирный текст
\def \YourTableHeadRow {\rowcolor{YourBase}\rowstyle{\bfseries\color{white}}}

% Авточередование цветов строк
\newcommand{\Yourtable}[1][oddheadrows]{
  \ifthenelse{\equal{evenheadrows}{#1}}
    {\rowcolors{1}{}{YourBlock}}
    {\rowcolors{1}{YourBlock}{}}
  \renewcommand{\arraystretch}{1.5}
}

Для автостилизации таблиц необходимо перед окружением таблицы использовать команду Yourtable. Если шапка таблицы состоит из четного числа строк, то \Yourtable[evenheadrows]. Перед каждой строкой шапки нужно использовать команду YourTableHeadRow.

Есть нюанс: \rowcolor применяется ко всем столбцам строки. Если в шапке есть объединенные ячейки или мультиряд, нужно уметь «сбрасывать» стиль. Для этого определены два специальных типа колонок:

% = сбрасывает \rowstyle (первый столбец)
\newcolumntype{=}{>{\gdef\@rowstyle{}}}
% + применяет \rowstyle (остальные столбцы)
\newcolumntype{+}{>{\@rowstyle}}

Как это работает:

  • = ставится в преамбуле таблицы перед типом первого столбца — это сбрасывает стиль предыдущей строки;

  • + ставится в преамбуле таблицы перед типом каждого следующего столбца — это вставляет сохраненный \@rowstyle, который был установлен через \rowstyle внутри \YourTableHeadRow.

Для примера наберем самую простую табличку:

\Yourtable
\begin{tabular}{=c|+c|+c|+c}
\YourTableHeadRow
Заголовок 1 & Заголовок 2 & Заголовок 3 & Заголовок 4 \\
данные 1    & данные 2    & данные 3    & данные 4    \\
данные 5    & данные 6    & данные 7    & данные 8    \\
\end{tabular}

На слайде она будет выглядеть так:

Дополнительно в классе настроены:

% Цвет линий-разделителей в таблицах — белый
% Так как строки цветные, линии должны быть не видны
\arrayrulecolor{white}
% Толщина линий
\setlength{\arrayrulewidth}{0.5pt}
% Отступ текста от краев ячейки
\setlength{\tabcolsep}{0.75em}

Цвет, толщину линий и размер отступов смело меняйте на свои.

Иконки, блоки, карточки

Иконки собраны в папке YourStyle/icons/. В текущем наборе 33 иконки в стиле «белый контур на прозрачном фоне» (512×512 px, PNG). Они взяты из Material Design Icons (MDI) — свободной библиотеки под лицензией Apache 2.0. Подмените их на иконки из вашего дизайна или выберите иконки на свой вкус с этого же или других бесплатных ресурсов:

Для удобного доступа к иконкам сделаны две команды-обертки:

% [размер]{имя файла} — по умолчанию стандартный размер 24pt
\newcommand{\icon}[2][24pt]{\includegraphics[width=#1, height=#1]{YourStyle/icons/#2.png}}

% {имя файла} — сокращенная версия, размером всегда 20pt
\newcommand{\iconS}[1]{\icon[20pt]{#1}}

\icon[32pt]{tools} вставляет иконку tools размером 32×32pt, \icon{tools} — размером 24×24pt, а \iconS{tools} — размером 20×20pt.

В демо-презентации на 11-м слайде есть каталог, где все иконки собраны в виде таблицы с названиями:

Набор иконок из репозитория с примерами
Набор иконок из репозитория с примерами

Штатные Beamer-блоки (block) переопределим, чтобы добавить опциональную иконку в заголовок:

\renewenvironment<>{block}[2][]{%
\begin{actionenv}%
\def\insertblocktitle{\par\vspace{-0.1em}\leftskip=0.45em\rightskip=0.45em \normalsize\textbf{\ifstrempty{#1}{#2}{\raisebox{-.5\height}{\hspace{-3pt}\icon{#1}}\hspace*{0.1cm}\raisebox{-0.5\height}{\hbox{#2}}}}\vspace*{0.1cm}
}
\par \usebeamertemplate{block begin}\leftskip=0.45em\rightskip=0.45em
\vspace{0.1em}%
}
{\par\vspace*{0.1cm}\usebeamertemplate{block end}
\end{actionenv}}

Внутри блока добавлен горизонтальный отступ. Его можно менять на свое значение, чтобы текст не упирался в края:

\addtobeamertemplate{block begin}{\hspace*{0.1cm}\begin{minipage}[t]{\linewidth-0.1cm}\addtolength{\leftmargini}{0.17cm}}{}
\addtobeamertemplate{block end}{}{\end{minipage}\vspace*{0.05cm}}

Чтобы сверстать блок с иконкой tools, набираем \begin{block}[tools]{Заголовок} ... \end{block}. Если иконка не нужна, пишем как обычно: \begin{block}{Заголовок} ... \end{block}.

В демо-презентации можно увидеть, как выглядят блоки с иконками:

Примеры блоков с иконками
Примеры блоков с иконками

И без иконок:

Примеры блоков без иконок
Примеры блоков без иконок

Для верстки списков преимуществ, характеристик и т.п. удобно использовать карточки с иконками и без. Они определены в классе следующим образом:

% \Yourcard[icon]{width}{title}{description} — карточка с опциональной иконкой
%   width — доля \linewidth (например, 0.27 для трех карточек в ряд и 0.4 — для двух)
\newcommand{\Yourcard}[4][]{
\begin{minipage}[t]{#2\linewidth}
  % Цветной квадратик слева вверху — с иконкой, если она есть, или пустой, если ее нет
  \colorbox{YourBase}{\ifstrempty{#1}{\makebox(4,4){}}{\makebox(16,16){\iconS{#1}}}}
  \vspace{0.2cm}\\
  \textbf{#3}\\
  #4
\end{minipage}
}

В презентации элементы-карточки выглядят так:

Примеры карточек с иконками (верхний ряд) и без иконок (нижний ряд)
Примеры карточек с иконками (верхний ряд) и без иконок (нижний ряд)

Анимации из последовательности кадров

Стандартные методы вставки видео в PDF работают нестабильно. А Flash Player в Adobe Reader с 2020 года вовсе не поддерживается. Альтернатива — разбить видео на PNG-кадры c помощью простого скрипта или онлайн-конвертера и вставить их как анимацию через пакет animate с методом method=ocg (Optional Content Groups):

% Анимация без элементов управления (циклический автопросмотр, как GIF)
\newcommand{\FramesAsGIF}[6]{\animategraphics[loop,autoplay,method=ocg,width=#2,height=#3,keepaspectratio]{#4}{#1}{#5}{#6}}

% С кнопками play/stop
\newcommand{\FramesAsVideoPlayer}[6]{
   \animategraphics[loop,method=ocg,controls={play,stop},width=#2,height=#3,keepaspectratio]{#4}{#1}{#5}{#6}
}

% С полным набором кнопок управления
\newcommand{\FramesAsVideoExtraPlayer}[6]{
   \animategraphics[loop,method=ocg,controls,width=#2,height=#3,keepaspectratio]{#4}{#1}{#5}{#6}
}

Аргументы этих команд:

  1. Путь до кадров (с префиксом имени файла без номера и расширения),

  2. Ширина,

  3. Высота,

  4. Частота кадров (fps),

  5. Номер первого кадра,

  6. Номер последнего кадра.

Примеры использования из демо-презентации:

% Анимация без элементов управления (циклический автопросмотр, как GIF)
\FramesAsGIF{video/resonans/Re100Pair0_85Resonans-}{2.4cm}{2.4cm}{4}{0}{28}

% С кнопками play/stop
\FramesAsVideoPlayer{video/resonans/Re100Pair0_85Resonans-}{2.4cm}{2.4cm}{4}{0}{28}

% С полным набором кнопок управления
\FramesAsVideoExtraPlayer{video/resonans/Re100Pair0_85Resonans-}{2.4cm}{2.4cm}{4}{0}{28}

На слайде выглядят так (слева направо):

Примеры встроенных на слайд анимаций
Примеры встроенных на слайд анимаций

Для просмотра анимаций скачайте демо-презентацию и откройте в любой программе для просмотра PDF на девятом слайде.

Последние штрихи: гиперссылки, отступы в списках, полезные мелочи

Ссылки настроим так, чтобы в PDF не было цветных рамок вокруг текста ссылки. Вместо них сделаем подчеркивание:

\makeatletter
\Hy@AtBeginDocument{%
  \def\@pdfborder{0 0 1}%
  \def\@pdfborderstyle{/S/U/W 1}%
}
\makeatother

Цвет URL-ссылок привязан к YourBase (в примере это фиолетовый), а внутренние ссылки не перекрашиваются:

\hypersetup{colorlinks,linkcolor=,urlcolor=YourBase,linkbordercolor=YourBase,urlbordercolor=YourBase}
\urlstyle{same}

\urlstyle{same} устанавливает, что URL печатаются тем же шрифтом, что и основной текст, а не моноширинным по умолчанию. Если ваш корпоративный стиль требует другого цвета ссылок, достаточно поменять YourBase в urlcolor=YourBase на нужный.

По умолчанию Beamer использует большие отступы в itemize / enumerate. В классе они уменьшены и настраиваются отдельно для каждого уровня вложенности:

% Отступ слева для первого уровня
\setlength\leftmargini{1.4em}
% Отступ между маркером и текстом
\setlength\labelsep{7pt}

Дополнительно через \xpatch переопределены внутренние макросы Beamer, чтобы можно было менять межстрочный интервал только внутри списков:

\newcommand\setlistsep[3]{%
    \setlength{\my@beamer@itemsepi}{#1}%   первый уровень
    \setlength{\my@beamer@itemsepii}{#2}%  второй уровень
    \setlength{\my@beamer@itemsepiii}{#3}% третий уровень
}

После этого переопределения в классе можно указать \setlistsep{2ex}{1.5ex}{1ex}, и межстрочные расстояния в списках изменятся по всей презентации. Если хочется более плотные списки, уменьшайте значения в фигурных скобках.

В класс можно добавлять свои команды для ускорения повседневного форматирования текста на слайдах. Например, сейчас определено несколько таких коротких команд:

% Моноширинный шрифт для вставки LaTeX-команд в тексте
\def \Yourcode {\small\ttfamily}
% Зеленая галочка
\def \YourCheckedbox {\color{YourGood}\Checkedbox}
% Красный крестик
\def \YourCrossedbox {\color{YourBad}\Crossedbox}
% Фиолетовая pointing hand
\def \YourHandRight {\color{YourBase}\HandRight}
% Цветной бокс вокруг текста (рамка YourBase, заливка 20%)
\newcommand{\Yourcolorbox}[1]{\fcolorbox{YourBase}{YourBase!20}{#1}}

\Yourcode удобен, когда нужно вставить имя LaTeX-команды прямо в текст: \Yourcode{\textbackslash section{...}}. Галочка и крестик пригодятся в списках «плюсов и минусов», \Yourcolorbox для выделения ключевого термина цветным фоном. Размер шрифта в \Yourcode регулируется: замените \small на \footnotesize, если шрифт кажется крупным.

В самом конце \YourPres.cls добавляем:

  • \setbeamercovered{dynamic} — скрытые элементы (например, на оверлеях) не просто исчезают, а плавно затемняются. Глаз не теряет контекст.

  • \setcounter{secnumdepth}{5} — глубокая нумерация разделов (до subparagraph), хотя на практике в презентациях используется редко.

  • \def\emptyset{\varnothing} — более красивый символ пустого множества вместо стандартного \emptyset.

  • \mode<presentation> / \mode<all> — гарантирует, что класс работает только в режиме презентации Beamer.

Подведем итоги

Мы разобрали минимальный, но достаточный набор, чтобы превратить корпоративный брендбук в самодостаточный LaTeX-класс.

Дальше можно добавлять:

  • SVG-иконки — заменить PNG на вектор для четкости на Retina-экранах или использовать команды Font Awesome или MDI напрямую через пакеты;

  • автогенерацию каталога иконок — написать скрипт, который сканирует папку и генерирует LaTeX-таблицу;

  • поддержку светлой/темной темы через \newcommand{\LightTheme}{...} / \DarkTheme;

  • событийные варианты — например, переопределять титульный слайд для конференций или мероприятий;

  • разбивку на модули — можно выделить colors.sty, fonts.sty, tables.sty и подключать их из основного класса;

  • динамическую загрузку шрифтов через \IfFileExists;

  • и целую кучу всего.

Можно дописать еще хоть 10 000 строк кода, добавив десятки новых функций, реорганизовав код — и все равно будет, что улучшать. Но ядро корпоративного стиля — цвета, шрифты, каркас слайда, блоки, таблицы, иконки, авторские страницы — умещается здесь, в одном достаточно компактном файле. Сейчас это ~800 строк с комментариями, из которых ~500 строк кода, который мы полностью разобрали в статье.

Начать работать с шаблоном можно прямо по демо-презентации даже тем, кому LaTeX в новинку. Если вы еще не используете систему контроля версий для своих презентаций, попробуйте такой подход:

  1. Вынесите шаблон в отдельный репозиторий.

  2. Подключите его к репозиторию с презентацией как submodule:

    git submodule add https://github.com/vvp-cfd/beamer-template-kit.git company-pres-template
    

    Git автоматически добавит информацию о submodule в .gitmodules.

  3. Подключите класс в презентации через \documentclass{YourPres}.

  4. И спокойно пишите презентацию, не отвлекаясь на оформление.

Когда шаблон обновляется, сделайте git submodule update —remote в своих проектах с презентациями.


Надеюсь, статья оказалась полезной и для тех, кто только осваивает LaTeX/Beamer, и для тех, кто давно хотел разобраться с созданием классов и стилевых файлов, но все не доходили руки. А если после прочтения вы поняли, что хотите больше узнать в целом про LaTeX или в частности про Beamer, вот подборка литературы:

  1. Beamer Presentations: A Tutorial for Beginners.

  2. LaTeX — слайды и пакет Beamer.

  3. A simple guide to Beamer — Step by Step.

  4. Львовский С.М. Набор и верстка в системе LaTeX.

  5. Балдин Е.М. Компьютерная типография LaTeX.

  6. Кузнецов А.В. Основы LaTeX.

  7. Столяров А.В. Сверстай диплом красиво: LaTeX за три дня.

  8. Knuth D.E. The TeXbook.