问题
晚上好大家。
呼叫 beamer-class。
是否可以在标题的侧边栏中显示导航树;即显示所有章节和小节,并仅显示当前的章节和小节?
例子
这是一个简单的例子:
\documentclass[presentation]{beamer}
\usepackage[english]{babel}
\usetheme{Singapore}
\usecolortheme{rose}
\setbeamercovered{transparent}
\beamertemplatenavigationsymbolsempty
\begin{document}
\section{Section1}
\subsection{Subsection1}
\begin{frame}
First frame without title.
\end{frame}
\subsection{Subsection2}
\begin{frame}
Second frame without title.
\end{frame}
\section{Section2}
\subsection{Subsection1}
\begin{frame}
Third frame without title.
\end{frame}
\subsection{Subsection2}
\begin{frame}
Fourth frame without title.
\end{frame}
\end{document}
答案1
事实证明,事情并没有那么容易。
无论如何,回想一下,有一个外部主题miniframes
:
此主题安装了一个标题,其中显示了一个水平导航栏。此栏包含演示文稿的每个部分的一个条目。在每个部分条目下方,显示小圆圈,代表该部分中的不同框架。框架按子部分排列,即每个子部分都有一行框架。
每个圆圈都是由 绘制的\slideentry
。此命令读取即将到来的圆圈的数据:它对应哪一页?它属于哪个部分/(子)节?等等。然后确定它是否对应于当前(子)节,以及它是否确实是当前页面。最后用适当的颜色绘制/填充一个圆圈。
那么……我们现在想要什么?我们不需要圆圈,而是需要小节的标题。所以我们\slideentry
应该先读取相同的数据,然后确定关联关系,然后绘制……不……用适当的颜色排版小节标题。
下面我\slideentry
在原有定义的基础上重新定义,仅\hbox{\beamer@link(#4)...}
修改了中的内容。
\documentclass{beamer}
\useoutertheme{miniframes}
\makeatletter
\beamer@theme@subsectionfalse
\def\slideentry#1#2#3#4#5#6{%
\def\insertsubsectionhead{#5}%
\ifnum#6=\c@part\ifnum#2>0\ifnum#3>0%
\ifbeamer@compress%
\advance\beamer@xpos by1\relax%
\else%
\beamer@xpos=#3\relax%
\beamer@ypos=#2\relax%
\fi%
\hbox to 0pt{%
\beamer@tempdim=-\beamer@vboxoffset%
\advance\beamer@tempdim by-\beamer@boxsize%
\multiply\beamer@tempdim by\beamer@ypos%
\advance\beamer@tempdim by -.05cm%
\raise\beamer@tempdim\hbox{%
\beamer@tempdim=\beamer@boxsize%
\multiply\beamer@tempdim by\beamer@xpos%
\advance\beamer@tempdim by -\beamer@boxsize%
\advance\beamer@tempdim by 1pt%
\kern\beamer@tempdim
\global\beamer@section@min@dim\beamer@tempdim
\hbox{\beamer@link(#4){%
\usebeamerfont{subsection in head/foot}
\usebeamercolor{subsection in head/foot}
\ifnum1=#3
\ifnum\c@section=#1
\ifnum\c@subsection=#2
\usebeamertemplate{subsection in head/foot}
\else%
\usebeamertemplate{subsection in head/foot shaded}
\fi%
\else%
\usebeamertemplate{subsection in head/foot hided} % In fact there is no such template. Hence nothing happens. Like there is something but hided
\fi%
\fi
}}}\hskip-10cm plus 1fil%
}\fi\fi%
\else%
\fakeslideentry{#1}{#2}{#3}{#4}{#5}{#6}%
\fi\ignorespaces
}
\begin{document}
\section{Section1}
\subsection{Subsection11}
\frame{{Frame111}}
\frame{{Frame112}}
\frame{{Frame113}}
\subsection{Subsection12}
\frame{{Frame121}}
\frame{{Frame122}}
\frame{{Frame123}}
\frame{{Frame124}}
\subsection{Subsection13}
\frame{{Frame131}}
\frame{{Frame132}}
\section{Section2}
\subsection{Subsection21}
\frame{{Frame211}}
\frame{{Frame212}}
\frame{{Frame213}}
\subsection{Subsection22}
\frame{{Frame221}}
\frame{{Frame222}}
\frame{{Frame223}}
\frame{{Frame224}}
\subsection{Subsection23}
\frame{{Frame231}}
\frame{{Frame232}}
\subsection{Subsection24}
\frame{{Frame241}}
\frame{{Frame242}}
\frame{{Frame243}}
\section{Section3}
\subsection{Subsection31}
\frame{{Frame311}}
\frame{{Frame312}}
\frame{{Frame313}}
\subsection{Subsection32}
\frame{{Frame321}}
\frame{{Frame322}}
\frame{{Frame323}}
\frame{{Frame324}}
\end{document}
如果你hided
用替换shaded
,你可以得到
解释
Beamer 介绍模板系统可帮助用户轻松控制样式。页面上看到的几乎所有内容都与模板相关:标题、页眉/页脚、块(如果有)和导航符号(通常位于右下角)。
在大多数情况下,预先存在的模板已经足够了。因此人们倾向于应用主题,它只是模板集合。就你的情况而言,你的需求与miniframes
主题非常接近。所以我想应用miniframes
,然后进行一些更改。
要理解如何修改miniframes
,我们必须理解如何导航系统的工作方式。简而言之,Beamer 会创建一个.nav
文件,就像一个.toc
文件,其中包含您想要导航到的所有内容。它.nav
看起来像
\beamer@endinputifotherversion {3.36pt} \headcommand {\sectionentry {1}{Section1}{1}{Section1}{0}} \headcommand {\beamer@sectionpages {1}{0}} \headcommand {\beamer@subsectionpages {1}{0}} \headcommand {\beamer@subsectionentry {0}{1}{1}{1}{Subsection11}} \headcommand {\beamer@subsectionpages {1}{0}} \headcommand {\slideentry {1}{1}{1}{1/1}{Subsection11}{0}} \headcommand {\beamer@framepages {1}{1}} \headcommand {\slideentry {1}{1}{2}{2/2}{Subsection11}{0}} \headcommand {\beamer@framepages {2}{2}} \headcommand {\slideentry {1}{1}{3}{3/3}{Subsection11}{0}} \headcommand {\beamer@framepages {3}{3}} ...
那么...假设我们想创建一个仅包含部分标题的导航栏。那么我们应该定义\sectionentry
返回部分标题,并定义其他命令不执行任何操作。
怎么样miniframes
?它基本上定义\sectionentry
为返回节标题,并定义\slideentry
为绘制一个圆圈。对我们来说,我们不希望它绘制圆圈。我们想要\slideentry
做的是检查这是否是子节的第一帧。如果是,则返回子节标题。如果不是,则不执行任何操作。这就是我们获得“ minisubsections
”样式的方法。
怎么样\beamer@subsectionentry
?它不是设计用于返回小节标题吗?
确实如此。但如果我从 开始\beamer@subsectionentry
,我将不得不自己处理对齐问题。
如果您想询问任何特定命令,请发表评论。