受到这个问题的启发修改 Beamer 的外部主题 smoothbars 我只想在本地应用一个平滑条,仅在一个长子部分中。
我想过定义一个新boolean
变量,但似乎不起作用......
我的代码是
\documentclass[slidestop,compress,10pt,xcolor=dvipsnames]{beamer}
\newcommand*\oldmacro{}%
\let\oldmacro\insertshorttitle%
\renewcommand*\insertshorttitle{%
\oldmacro\hfill%
\insertframenumber\,/\,\inserttotalframenumber}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{blocks}[rounded][shadow=true]
\setbeamertemplate{navigation symbols}{}
\usetheme{Ilmenau}
\usepackage{ifthen}
\newboolean{circles}%Define new variable
\setboolean{circles}{false}%Set the variable false
\usepackage{etoolbox}
\ifthenelse{\boolean{circles}}{\makeatletter
\patchcmd{\slideentry}{\advance\beamer@xpos by1\relax}{}{}{}
\def\beamer@subsectionentry#1#2#3#4#5{\advance\beamer@xpos by1\relax}%
\makeatother}
\begin{document}
\section{Results}
\subsection{First Subsection}
\frame{Frame 0}
\subsection{Long Subsection}
\setboolean{circles}{true}%Set the variable true only for this long subsection
\frame{Frame 1}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\subsection{Third Subsection}
\setboolean{circles}{false}%Set the variable back to false
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\end{document}
编辑
Andrew Swann 的答案是
答案1
新答案
如果您希望仅在选定的子部分中而不是在整个演示文稿中显示子部分圆圈,那么您可以提供不同的定义\slideentry
和命令来切换到这些新定义之一。
在下面的代码中,
\slideentry@subsections
仅为当前子部分提供圆圈,可以使用以下方式切换到此样式\subcircles
\slideentry@none
完全删除圆圈及其线条,切换命令是\nocircles
\slideentry@old
是原始定义,改为\stdcircles
。
从第二部分开始\nocircles
并将其打开\subcircles
,然后在第三部分再次将其关闭,得到以下结果:
由。。。生产
\documentclass[slidestop,compress,10pt,xcolor=dvipsnames]{beamer}
\newcommand*\oldmacro{}%
\let\oldmacro\insertshorttitle%
\renewcommand*\insertshorttitle{%
\oldmacro\hfill%
\insertframenumber\,/\,\inserttotalframenumber}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{blocks}[rounded][shadow=true]
\setbeamertemplate{navigation symbols}{}
\usetheme{Ilmenau}
\makeatletter
\def\slideentry@subsections#1#2#3#4#5#6{%
%section number, subsection number, slide number, first/last frame, page number, part number
\ifnum#6=\c@part\ifnum#2>0\ifnum#3>0%
\ifnum\c@section=#1\ifnum\c@subsection=#2%
\beamer@xpos=#3\relax%
\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{mini frame}%
\usebeamercolor[fg]{mini frame}%
\ifnum\c@subsectionslide=#3%
\usebeamertemplate{mini frame}%
\else%
\usebeamertemplate{mini frame in current subsection}%
\fi%
}}}\hskip-10cm plus 1fil%
}\fi\fi\fi\fi%
\fi\ignorespaces
}
\def\slideentry@none#1#2#3#4#5#6{}
\let\slideentry@old\slideentry
\def\subcircles{\let\slideentry\slideentry@subsections}
\def\nocircles{\let\slideentry\slideentry@none}
\def\stdcircles{\let\slideentry\slideentry@old}
\makeatother
\begin{document}
\section{Results}
\subsection{First Subsection}
\nocircles
\frame{Frame 0}
\subsection{Long Subsection}
\subcircles
\frame{Frame 1}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\subsection{Third Subsection}
\nocircles
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\end{document}
上一个答案
(由于讨论发布的代码而保留。)
您的代码的一个问题是,\ifthenelse
在前导码中只执行了一次。另一个问题是,它不可撤销地修补了\slideentry
需要随后切换回其标准定义的情况。
我的选择是定义两个命令,一个 ( \subcircles
) 用于启用新样式,一个 ( \stdcircles
) 用于恢复旧样式。下面是一个实现。
\documentclass[slidestop,compress,10pt,xcolor=dvipsnames]{beamer}
\newcommand*\oldmacro{}%
\let\oldmacro\insertshorttitle%
\renewcommand*\insertshorttitle{%
\oldmacro\hfill%
\insertframenumber\,/\,\inserttotalframenumber}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{blocks}[rounded][shadow=true]
\setbeamertemplate{navigation symbols}{}
\usetheme{Ilmenau}
\usepackage{etoolbox}
\makeatletter
\let\oldbeamer@subsectionentry\beamer@subsectionentry
\let\old@slideentry\slideentry
\def\subscircles{%
\patchcmd{\slideentry}{\advance\beamer@xpos by1\relax}{}{}{}
\def\beamer@subsectionentry##1##2##3##4##5{\advance\beamer@xpos by1\relax}}
\def\stdcircles{%
\let\slideentry\old@slideentry
\let\beamer@subsectionentry\oldbeamer@subsectionentry
}
\makeatother
\begin{document}
\section{Results}
\subsection{First Subsection}
\frame{Frame 0}
\subsection{Long Subsection}
\subscircles
\frame{Frame 1}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\subsection{Third Subsection}
\stdcircles
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\end{document}
旧命令\beamer@subsectionentry
和\slideentry
已保存,因此恢复过程很容易。更改命令\subcircles
只是实现了对的补丁命令过程\slideentry
和对的重新定义\beamer@subsectionentry
。
答案2
问题在于您链接的解决方案是它只控制迷你框架的外观,为了删除多余的框架,迷你框架本身仍然存在,并不断出现在其他子部分中。为了避免这种情况,您必须物理地删除它们,这与提供的解决方案非常相似如何从 Beamer 中的导航项目符号中删除一些页面?:
\documentclass[compress]{beamer}
\usetheme{Ilmenau}
% https://tex.stackexchange.com/a/102459
\usepackage{etoolbox}
\makeatletter
\let\beamer@writeslidentry@miniframeson=\beamer@writeslidentry
\def\beamer@writeslidentry@miniframesoff{%
\expandafter\beamer@ifempty\expandafter{\beamer@framestartpage}{}% does not happen normally
{%else
% removed \addtocontents commands
\clearpage\beamer@notesactions%
}
}
\newcommand*{\miniframeson}{\let\beamer@writeslidentry=\beamer@writeslidentry@miniframeson}
\newcommand*{\miniframesoff}{\let\beamer@writeslidentry=\beamer@writeslidentry@miniframesoff}
\newenvironment{hideminiframes}{\miniframesoff\patchcmd{\slideentry}{\usebeamertemplate{mini frame in current subsection}}{\usebeamertemplate{mini frame}}{}{}}{\miniframeson}
\makeatother
\begin{document}
\section{Results}
\subsection{First Subsection}
\frame{Frame 0}
\subsection{Long Subsection}
\frame{Frame 1}
\begin{hideminiframes}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\end{hideminiframes}
\subsection{Third Subsection}
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\end{document}
使用方法很简单:在只想使用一个迷你框架来显示整个子节的子节中,将所有框架括起来但第一个在一个hideminiframes
环境中。
实现方式与答案已经提到,但有一个小细节:长小节的单个迷你框架应该在整个小节中突出显示,这是通过修补内部beamer
命令来实现的,以便mini frame
始终使用(突出显示的)模板而不是未突出显示的模板mini frame in current subsection
。