在此线程中(包括最小的工作示例)
在自定义 beamer 主题中,每个小节一个导航项目符号,且 subsection=false
我找到了一种解决方案,在使用 miniframe 时,可以按子部分绘制一个圆,而不是每帧绘制一个圆。它工作得很好,除了一个问题:
在许多 PDF 查看器中(例如在 Windows 上:Foxit、SumatraPDF、Adobe Acrobat;在 Linux 上:Evince),圆圈链接到子部分的最后一帧,而不是链接到第一帧。例如,使用 qpdfview,导航可以正常工作。我的 PDF 将被分发,因此它应该可以在大多数常见的 PDF 查看器中正常工作。
有谁知道这种行为可能是什么原因造成的以及我该如何解决这个问题?
编辑:由于似乎没有人有解决方案,是否有人知道我如何才能简单地从导航圈中删除链接以避免链接到错误页面的问题?
答案1
为了回答您的原始问题:在自定义 beamer 主题中,每个小节一个导航项目符号,且 subsection=false实际上,它不会为每个子节生成一个迷你框架,而是将一个子节的所有迷你框架堆叠在一起。这样,许多链接会在同一位置创建,从而导致 PDF 查看器出现问题,因为它们不知道要遵循哪一个。
我开发了一种解决方法,即只为每个子节的第一个小框架生成链接:这是通过\beamer@link
在使用后清空负责生成链接的宏的定义来实现的。当开始新的子节时,将恢复原始定义,从而为以下子节生成链接提供了机会。
\documentclass[compress]{beamer}
\useoutertheme[subsection=false]{miniframes}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\slideentry}{\advance\beamer@xpos by1\relax}{}{}{}
\newcommand*{\nofurther@beamer@link}{\gdef\beamer@link(##1/##2){}}
\pretocmd{\beamer@link}{\nofurther@beamer@link}{}{}
\let\beamer@linkorig=\beamer@link
\def\beamer@subsectionentry#1#2#3#4#5{\advance\beamer@xpos by1\relax\let\beamer@link=\beamer@linkorig}
\makeatother
\begin{document}
\section{S1}
\subsection{SS1}
\frame{1}
\frame{2}
\frame{3}
\subsection{SS2}
\frame{1}
\frame{2}
\frame{3}
\end{document}
答案2
通过调用 提供链接,\beamer@link(a/b)
其中a
和b
是框架的第一张和最后一张幻灯片。在\slideentry
命令中是第四个参数。因此,我们可以通过从中a/b
删除文本来删除此调用:\beamer@link(#4)
\slideentry
\documentclass[compress]{beamer}
\useoutertheme[subsection=false]{miniframes}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\slideentry}{\advance\beamer@xpos by1\relax}{}{}{}
\patchcmd{\slideentry}{\beamer@link(#4)}{}{}{}
\def\beamer@subsectionentry#1#2#3#4#5{\advance\beamer@xpos by1\relax}%
\makeatother
\begin{document}
\section{S1}
\subsection{SS1}
\frame{1}
\frame{2}
\frame{3}
\subsection{SS2}
\frame{1}
\frame{2}
\frame{3}
\end{document}