我想知道我们是否可以使用 beamer 外部主题标题的子部分infolines
(右半部分)来显示当前部分的迷你框架项目符号。假设该部分有三个框架,标题将如下所示
该部分的第一帧:
Section Title @oo
Frame title
该部分的下一帧:
Section Title o@o
Frame title
等等。
我猜这可以通过修改来实现\dohead
,但我不知道如何调整。任何帮助都将不胜感激。
答案1
这是一个相当 hackish 的解决方案:它从miniframes
外部主题开始并修补内部beamer
命令以便从标题中删除其他部分:
\documentclass{beamer}
% "Beamer infolines outer theme with miniframe bullets only for the current section"
% (http://tex.stackexchange.com/a/45152/3323)
\useoutertheme[subsection=false]{miniframes}
\setbeamertemplate{mini frame in other section}{}
\usepackage{etoolbox}
\makeatletter
\let\beamer@section@set@min@width=\relax
\patchcmd{\insertnavigation}{\hskip-1.875ex plus-1fill}{}{}{}
\patchcmd{\sectionentry}{\hskip1.875ex plus 1fill}{}{}{}
\patchcmd{\sectionentry}{\hyperlink{Navigation#3}{{\usebeamertemplate{section in head/foot shaded}}}}{}{}{}
\patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection}}{\usebeamertemplate{mini frame in other subsection of current section}}{}{}
\patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection}}{\usebeamertemplate{mini frame in other section}}{}{}
\patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection of current section}}{\usebeamertemplate{mini frame in other subsection}}{}{}
\makeatother
\begin{document}
\section{Section 1}
\subsection{Subsection 1}
\frame{\frametitle{Frame 1}}
\frame{\frametitle{Frame 2}}
\frame{\frametitle{Frame 3}}
\subsection{Subsection 2}
\frame{\frametitle{Frame 1}}
\frame{\frametitle{Frame 2}}
\frame{\frametitle{Frame 3}}
\frame{\frametitle{Frame 4}}
\section{Section 2}
\subsection{Subsection 1}
\frame{\frametitle{Frame 1}}
\frame{\frametitle{Frame 2}}
\frame{\frametitle{Frame 3}}
\frame{\frametitle{Frame 4}}
\subsection{Subsection 2}
\frame{\frametitle{Frame 1}}
\frame{\frametitle{Frame 2}}
\frame{\frametitle{Frame 3}}
\frame{\frametitle{Frame 4}}
\frame{\frametitle{Frame 5}}
\end{document}
标题示例:
(如果您希望将所有小框架放在一行中,而不是每个小节使用一行,则可以\documentclass[compress]{beamer}
照常使用。)
代码解释:
我们使用外部主题miniframes
并删除所有不属于当前部分的小框架:
\useoutertheme[subsection=false]{miniframes}
\setbeamertemplate{mini frame in other section}{}
现在,etoolbox
用于beamer
从负责生成导航栏的宏中删除一些代码:
删除各部分之间的空格:
\let\beamer@section@set@min@width=\relax \patchcmd{\insertnavigation}{\hskip-1.875ex plus-1fill}{}{}{} \patchcmd{\sectionentry}{\hskip1.875ex plus 1fill}{}{}{}
根本不显示当前部分以外的部分:
\patchcmd{\sectionentry}{\hyperlink{Navigation#3}{{\usebeamertemplate{section in head/foot shaded}}}}{}{}{}
修复当前
beamer
版本中的不一致问题:目前,该模板mini frame in other subsection
既用于当前部分中的小框架,也用于其他部分中的小框架,其中后一种情况应该使用mini frame in other section
:\patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection}}{\usebeamertemplate{mini frame in other subsection of current section}}{}{} \patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection}}{\usebeamertemplate{mini frame in other section}}{}{} \patchcmd{\slideentry}{\usebeamertemplate{mini frame in other subsection of current section}}{\usebeamertemplate{mini frame in other subsection}}{}{}