Beamer 信息线外部主题带有仅适用于当前部分的迷你框架项目符号

Beamer 信息线外部主题带有仅适用于当前部分的迷你框架项目符号

我想知道我们是否可以使用 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}

标题示例:

标题示例:第 2 节,第 1 小节,第 3 框架

(如果您希望将所有小框架放在一行中,而不是每个小节使用一行,则可以\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}}{}{}
    

相关内容