在一个子部分内局部仅使用一个平滑条项目符号

在一个子部分内局部仅使用一个平滑条项目符号

受到这个问题的启发修改 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

相关内容