Если вы работаете в крупной компании, где утвержден корпоративный шаблон презентаций, скорее всего, он выполнен в 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}
Меняйте эти значения, если нужно сдвинуть текст к краям или от краев.
Далее подключаются все необходимые пакеты:
|
Пакет |
Назначение |
|---|---|
|
|
Подключение TTF/OTF-шрифтов по пути |
|
|
Для копирования кириллицы из PDF |
|
|
Русский/английский язык (замена babel для XeLaTeX) |
|
|
Unicode-подстановки для XeTeX |
|
|
Цветовая палитра |
|
|
Круглые фото авторов (path picture) |
|
|
Подсветка кода |
|
|
Анимация из последовательности PNG-кадров ( |
|
|
Стилизация таблиц с автораскраской строк и колонками |
|
|
Стандартная математика |
|
|
Псевдокод алгоритмов |
|
|
Научная нотация чисел |
|
|
Красивый математический шрифт для операторов |
|
|
Пиктограммы — буллиты, крестики, галочки |
|
|
Вставка изображений ( |
|
|
Вставка таблиц и объединение ячеек в них по строкам/столбцам |
|
|
Размещение плавающих рисунков и таблиц |
|
|
Подписи к рисункам/таблицам |
|
|
Преобразование регистра ( |
|
|
Условные операторы внутри стилевого файла |
|
|
Для изменения чужих макросов |
Отключаем увеличенные пробелы после точки при помощи 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} hfillfcolorbox{YourBlock}{YourBlock}{hspace*{.25cm}insertframenumberhspace*{.25cm}}hspace*{.7cm}}}
Определяем стиль заголовков и подзаголовков слайдов:
defbeamertemplate*{frametitle}{my theme}
{%
% Если подзаголовок не задан явно, используем название текущего раздела
ifxinsertframesubtitleempty
letinsertframesubtitlesecname
fi
begin{beamercolorbox}{frame title}%
% Если подзаголовок пустой — показываем только заголовок
ifxinsertframesubtitle@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.77linewidth}
vspace*{5cm}
{color{white}
{Hugesffamily{bfseriesinserttitle} } \
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] {
tikznode [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.65linewidth внутри
% minipage шириной #6linewidth. Меняйте 0.65 на большее (например 0.85),
% чтобы кружок был крупнее, или на меньшее (0.5), чтобы он был мельче.
newcommand{bioTune}[7] {
mbox{ }hfill
begin{minipage}[h]{#6linewidth}
hfillroundpic{0.65linewidth}{#1}hfill
end{minipage}hspace*{0.5cm}
begin{minipage}[h]{#7linewidth}
{color{white}{huge{textbf{#2}}}\
#3\ vskip2pt
begin{itemize}
item #4
item #5
end{itemize}
}
end{minipage}
hfillmbox{ }
}
У 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.75linewidth}linespread{1.6}
tableofcontents[currentsection]
end{minipage}
vfill
end{frame}
}
}
Автоматически сгенерированные в начале секций оглавления есть и в демо-презентации:
Вы можете заменить цепочку стрелок в setbeamertemplate{section in toc}{...} на подчеркивание, любые другие символы либо убрать совсем, если того требует ваш брендбук.
Подсветка кода (listings)
Настройки listings подгоняются под цветовую палитру:
lstset{
basicstyle=smallttfamily, % основной шрифт кода
commentstyle=color{YourGood}, % комментарии — зеленый
keywordstyle=color{YourBase}, % ключевые слова — основной цвет
basicstyle=Yourcode, % используется Yourcode (smallttfamily)
numbers=left, % нумерация строк слева
xleftmargin=2em, % отступ слева под номера
frame=single, % рамка вокруг листинга
framexleftmargin=1.5em, % отступ рамки слева
numberstyle=tinycolor{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{bfseriescolor{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. Подмените их на иконки из вашего дизайна или выберите иконки на свой вкус с этого же или других бесплатных ресурсов:
-
IconFinder — iconfinder.com (фильтр Free);
-
SVG Repo — svgrepo.com (CC0 / MIT);
-
Flaticon — flaticon.com (Free с указанием автора);
-
Font Awesome — fontawesome.com (Free-пак).
Для удобного доступа к иконкам сделаны две команды-обертки:
% [размер]{имя файла} — по умолчанию стандартный размер 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}%
definsertblocktitle{parvspace{-0.1em}leftskip=0.45emrightskip=0.45em normalsizetextbf{ifstrempty{#1}{#2}{raisebox{-.5height}{hspace{-3pt}icon{#1}}hspace*{0.1cm}raisebox{-0.5height}{hbox{#2}}}}vspace*{0.1cm}
}
par usebeamertemplate{block begin}leftskip=0.45emrightskip=0.45em
vspace{0.1em}%
}
{parvspace*{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]{#2linewidth}
% Цветной квадратик слева вверху — с иконкой, если она есть, или пустой, если ее нет
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}
}
Аргументы этих команд:
-
Путь до кадров (с префиксом имени файла без номера и расширения),
-
Ширина,
-
Высота,
-
Частота кадров (fps),
-
Номер первого кадра,
-
Номер последнего кадра.
Примеры использования из демо-презентации:
% Анимация без элементов управления (циклический автопросмотр, как 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. В классе они уменьшены и настраиваются отдельно для каждого уровня вложенности:
% Отступ слева для первого уровня
setlengthleftmargini{1.4em}
% Отступ между маркером и текстом
setlengthlabelsep{7pt}
Дополнительно через xpatch переопределены внутренние макросы Beamer, чтобы можно было менять межстрочный интервал только внутри списков:
newcommandsetlistsep[3]{%
setlength{my@beamer@itemsepi}{#1}% первый уровень
setlength{my@beamer@itemsepii}{#2}% второй уровень
setlength{my@beamer@itemsepiii}{#3}% третий уровень
}
После этого переопределения в классе можно указать setlistsep{2ex}{1.5ex}{1ex}, и межстрочные расстояния в списках изменятся по всей презентации. Если хочется более плотные списки, уменьшайте значения в фигурных скобках.
В класс можно добавлять свои команды для ускорения повседневного форматирования текста на слайдах. Например, сейчас определено несколько таких коротких команд:
% Моноширинный шрифт для вставки LaTeX-команд в тексте
def Yourcode {smallttfamily}
% Зеленая галочка
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), хотя на практике в презентациях используется редко. -
defemptyset{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 в новинку. Если вы еще не используете систему контроля версий для своих презентаций, попробуйте такой подход:
-
Вынесите шаблон в отдельный репозиторий.
-
Подключите его к репозиторию с презентацией как submodule:
git submodule add https://github.com/vvp-cfd/beamer-template-kit.git company-pres-templateGit автоматически добавит информацию о submodule в
.gitmodules. -
Подключите класс в презентации через
documentclass{YourPres}. -
И спокойно пишите презентацию, не отвлекаясь на оформление.
Когда шаблон обновляется, сделайте git submodule update —remote в своих проектах с презентациями.
Надеюсь, статья оказалась полезной и для тех, кто только осваивает LaTeX/Beamer, и для тех, кто давно хотел разобраться с созданием классов и стилевых файлов, но все не доходили руки. А если после прочтения вы поняли, что хотите больше узнать в целом про LaTeX или в частности про Beamer, вот подборка литературы:
-
Львовский С.М. Набор и верстка в системе LaTeX.
-
Балдин Е.М. Компьютерная типография LaTeX.
-
Кузнецов А.В. Основы LaTeX.
-
Столяров А.В. Сверстай диплом красиво: LaTeX за три дня.
-
Knuth D.E. The TeXbook.
Автор: valeriaP
