很长一段时间以来,我一直使用 tikz 来解决这个问题。
我有一些代码可以根据 frametitle(包括换行符)和 framesubtitle(如果存在)的高度来计算高度。然后我使用 tikz 在这个计算出的高度画一条线。我现在发现自己需要使用 tikzexternalize,如果碰巧有多个 tikz 图片,那么框架内容和 tikz 图像就会丢失。
所以,问题是,如何在不使用 tikz 的情况下在框架上的指定高度(相对于顶部)绘制定义宽度和颜色的水平线?这是我以前做过的方法。
\newcommand{\topline}{%
\calculateLengths{0}
\tikz[remember picture,overlay] {%
\draw[riceBlue] ([yshift=-\contentheadheight+6pt,xshift=2cm]current page.north west)
-- ([yshift=-\contentheadheight+6pt,xshift=\paperwidth-2cm]current page.north west);
}%
}
calculateLengths 命令找到了 frametitle 和 framesubtitle 的下边缘。
答案1
beamercolorbox
beamer 的方式是在 frametitle 模板的末尾使用一个空的。可以使用通常的\setbeamercolor
机制调整颜色,并通过修改中的值来调整线条的粗细colsep=1.5pt
\documentclass[xcolor={dvipsnames},aspectratio=1610]{beamer}
\setbeamercolor{lower separation line head}{bg=red}
\makeatletter
\setbeamertemplate{frametitle}{%
\nointerlineskip%
\vskip0.3cm%
\begin{beamercolorbox}[wd=\paperwidth,leftskip=.3cm,rightskip=.3cm plus1fil,vmode]{frametitle}%
\begin{minipage}{2cm}%
\includegraphics[height=1.2cm]{example-image-a}%
\end{minipage}%
\begin{minipage}{\dimexpr\paperwidth-4.6cm\relax}%
\usebeamerfont*{frametitle}\insertframetitle%
\ifx\insertframesubtitle\@empty%
\strut\par%
\else
\par{\usebeamerfont*{framesubtitle}{\usebeamercolor[fg]{framesubtitle}\insertframesubtitle}\strut\par}%
\fi%%
\end{minipage}%
\begin{minipage}{2cm}%
\hfill
\includegraphics[height=1.2cm]{example-image-b}%
\end{minipage}%
\end{beamercolorbox}%
\vskip1ex
\begin{beamercolorbox}[colsep=1.5pt,wd=\paperwidth]{lower separation line head}
\end{beamercolorbox}
}
\makeatother
\usepackage{tikz}
\begin{document}
\begin{frame}
\frametitle{title}
\end{frame}
\begin{frame}
\frametitle{multiline very very very very very very very very very long title}
\framesubtitle{title}
\end{frame}
\begin{frame}
\frametitle{title}
\framesubtitle{title}
\end{frame}
\end{document}