Я пытаюсь написать пользовательскую тему для beamer. Я застрял на заголовке фрейма, пытаясь вертикально центрировать и Title, и Title+Subtitle в фиксированном размере beamercolorbox. Объединив несколько решений других людей, я пришел к комбинации и \ifx\insertframesubtitle\@empty
. \vbox to 6ex{ \vfil
Это выглядит точно так, как я хочу сейчас, но производит \hbox overfull
для каждого фрейма. Еще одна небольшая проблема заключается в том, что мне пришлось вручную поставить 6ex для версии Title и 6.05 для версии Title+Subtitle, чтобы они были точно такого же размера (не знаю, почему). Я хотел бы более элегантное решение.
Буду признателен за любую помощь!
Основной файл:
\documentclass{beamer}
\usetheme{TEST}
\begin{document}
\begin{frame}{Frame}
\end{frame}
\begin{frame}{Frame Title}{Subtitle}
\end{frame}
\end{document}
beamerthemeTEST.sty :
\mode<presentation>
\definecolor{salmon}{RGB}{240, 145, 145}
\setbeamercolor{frametitle}{fg=white, bg=salmon}
\setbeamerfont{frametitle}{size=\LARGE}
\setbeamerfont{framesubtitle}{size=\normalsize}
\defbeamertemplate*{frametitle}{}[1][]
{
\nointerlineskip%
\ifx\insertframesubtitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, left, leftskip = 1ex]{frametitle}%
\vbox to 6ex{%
\vfil%
\usebeamerfont{frametitle}\strut\insertframetitle%
\vfil}%
\end{beamercolorbox}%
\else%
\begin{beamercolorbox}[wd=\paperwidth, left, leftskip=1ex, rightskip=4ex]{frametitle}%
\vbox to 6.05ex{%
\vfil%
\usebeamerfont{frametitle}\strut\insertframetitle\\%
\usebeamerfont{framesubtitle}\strut\insertframesubtitle%
\vfil}%
\end{beamercolorbox}%
\fi%
}
\mode<all>
EDIT: Если я определяю заголовок фрейма внутри основного файла, заголовок фрейма «Только заголовок» перемещается вверх (не центрируется).
EDIT2: Я нашел следующее решение для переполненного hbox (не совсем понятна механика, но что-то связано с \vbox to
):
\begin{beamercolorbox}[wd=\paperwidth, left]{frametitle}%
\vbox to 40pt{\vfil%
\usebeamerfont{frametitle}\hspace{10pt}\strut\insertframetitle%
\vfil}%
\end{beamercolorbox}%
Все еще пытаюсь найти лучший способ для различных условных значений для \vbox to
.
решение1
Вы можете почерпнуть вдохновение из шаблона заголовка рамки по умолчанию, чтобы сделать заголовок рамки, охватывающий всю ширину листа, не переполняя поля:
\documentclass[11pt]{beamer}
\makeatletter
\setbeamertemplate{frametitle}{%
\ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
\@tempdima=\textwidth%
\advance\@tempdima by\beamer@leftmargin%
\advance\@tempdima by\beamer@rightmargin%
% changed code from here
\begin{beamercolorbox}[sep=0cm,left,wd=\the\@tempdima,leftskip=0.5cm,rightskip=0.5cm]{frametitle}
\begin{minipage}[c][2cm][c]{\textwidth}
\usebeamerfont{frametitle}%
\strut\insertframetitle\strut\par
\ifx\insertframesubtitle\@empty%
\else
{\usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}\strut\insertframesubtitle\strut\par}%
\fi
\end{minipage}
\end{beamercolorbox}%
}
\makeatother
\setbeamerfont{frametitle}{size=\LARGE}
\setbeamerfont{framesubtitle}{size=\normalsize}
\definecolor{salmon}{RGB}{240, 145, 145}
\setbeamercolor{frametitle}{fg=white, bg=salmon}
\begin{document}
\begin{frame}
\frametitle{Frame}
test
\end{frame}
\begin{frame}
\frametitle{Frame Title}
\framesubtitle{Subtitle}
test
\end{frame}
\begin{frame}
content...
\end{frame}
\end{document}