Как удалить некоторые страницы из навигационных маркеров в Beamer?

Как удалить некоторые страницы из навигационных маркеров в Beamer?

Я делаю beamerпрезентацию, используя miniframesвнешнюю тему с маркерами навигации и subsection=falseопцией, что означает, что маркеры все в одной строке. Проблема в том, что если в одном разделе слишком много страниц, маркеры перетекают в следующий раздел:

Section 1 Section 2
oooooooooooooooooooo

У меня обычно много кадров, некоторые из них просто задают вопрос, ведущий к следующему подробному кадру. Мне на самом деле не нужно, чтобы эти кадры были представлены навигационными маркерами, и их удаление решило бы проблему. Есть идеи, как это сделать?

Я мог бы схитрить, используя наложения, чтобы вопрос и ответ были в одном кадре, но это было бы беспорядок...

Пример кода для ответа на вопрос percusse: это должно дать вам один круг на кадр, а не один на подраздел. Если вы добавите много кадров в один подраздел, круги переполнят следующий раздел.

\documentclass[compress]{beamer}
\useoutertheme[subsection=false]{miniframes}
\begin{document}
\section{S1}
\subsection{SS1}
\frame{1}
\frame{2}
\frame{3}
\subsection{SS2}
\frame{1}
\frame{2}
\frame{3}
...
\end{document}

решение1

Мини-фреймы генерируются с использованием \beamer@framepagesзаписей во вспомогательном .navфайле. Если вы удалите их для определенных фреймов, они не появятся в навигации 1 . Для этого вам нужно пропатчить макрос, \beamer@writeslidentryотвечающий за запись команд в .navфайл:

\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}
\makeatother

Включите этот код в свой документ, после чего вы сможете переключаться между исходной реализацией и измененной, не генерируя никаких мини-кадров, с помощью \miniframesonи \miniframesoff.

1 Однако это может иметь некоторые нежелательные последствия, о которых я не знаю!

Полный пример кода:

\documentclass[compress]{beamer}
\useoutertheme[subsection=false]{miniframes}
\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}
\makeatother
\begin{document}
\section{S1}
\subsection{SS1}
\frame{1}
\miniframesoff
\frame{2}
\miniframeson
\frame{3}
\subsection{SS2}
\miniframesoff
\frame{1}
\miniframeson
\frame{2}
\frame{3}
\end{document}

Итоговый заголовок (отображаются только четыре из шести мини-фреймов):

заголовок, созданный примером кода, показывающий только четыре (из шести изначально) мини-фрейма

Связанный контент