解释

解释

问题

晚上好大家。

呼叫 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,我将不得不自己处理对齐问题。

如果您想询问任何特定命令,请发表评论。

相关内容