Моя навигационная панель в Beamer слишком длинная с ее текущим форматированием. Я думал о переходе на несколько строк для круговой навигации, но это приводит к тому, что вертикальное пространство навигационной панели занимает слишком много места. Кажется, я припоминаю, что в какой-то момент видел презентацию, где круги сжимались до одного круга, если только они не находились внутри текущего подраздела, где они снова расширялись, чтобы иметь точки для каждого кадра в этой точке.
Я был бы признателен за предложения о том, как сохранить однострочную панель навигации, как у меня, но при этом уплотнить панель так, чтобы она уместилась в имеющуюся у меня ширину.
Я также, кажется, припоминаю, что видел презентацию, где были линии между круговыми навигационными маркерами для каждого подподраздела презентации, но пока не смог найти что-то о том, как это сделать. Если бы вы могли указать мне, где это может быть расположено, это было бы здорово.
Заранее спасибо.
решение1
Мини-рамки шаблона проектора имеют 3 предустановленных шаблона:
[default]
показывает маленькие круги как мини-рамки[box]
показывает маленькие прямоугольники как мини-рамки[tick]
показывает небольшие вертикальные полосы в виде мини-рамок
Например, вы можете просто переключиться на tick
шаблон, так как он не занимает много места:
\setbeamertemplate{mini frame}[tick]
\setbeamertemplate{mini frame in current subsection}{tick}
Но, похоже, вы хотите сохранить круги. Так почему бы просто не уменьшить их. Для этого вам придется переопределить шаблоны mini frame
. Поэтому я просто скопировал шаблон default
, переименовал его в scaled circle
и ввел коэффициент масштабирования.
\defbeamertemplate{mini frame}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
[action]
{
\newlength{\myminiframesize}
\setlength{\myminiframesize}{0.14cm}
\newlength{\myminiframeoffset}
\setlength{\myminiframeoffset}{0.03cm}
\setbeamersize{mini frame size=#1\myminiframesize,mini frame offset=#1\myminiframeoffset}
}
\defbeamertemplate{mini frame in current section}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
Затем вы можете просто загрузить его с помощью
\setbeamertemplate{mini frame}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection}[scaled circle]{0.7}
где 0.7
- коэффициент масштабирования.
Полная МВЭ:
\documentclass[compress]{beamer}
\usepackage{calc}
\useoutertheme{miniframes}
\defbeamertemplate{mini frame}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
[action]
{
\newlength{\myminiframesize}
\setlength{\myminiframesize}{0.14cm}
\newlength{\myminiframeoffset}
\setlength{\myminiframeoffset}{0.03cm}
\setbeamersize{mini frame size=#1\myminiframesize,mini frame offset=#1\myminiframeoffset}
}
\defbeamertemplate{mini frame in current section}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\setbeamertemplate{mini frame}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection}[scaled circle]{0.7}
\begin{document}
\section{Section 1}
\subsection{Subsection 1}
\frame{Frame 1}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\subsection{Subsection 2}
\frame{Frame 1}
\frame{Frame 2}
\frame{Frame 3}
\frame{Frame 4}
\frame{Frame 5}
\frame{Frame 6}
\frame{Frame 7}
\frame{Frame 8}
\frame{Frame 9}
\frame{Frame 10}
\end{document}
Коэффициент масштабирования = 0,7
Коэффициент масштабирования = 1
Коэффициент масштабирования = 2
EDIT – Соединить круги
\makeatletter
\def\slideentry#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%
\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{mini frame}%
\ifnum\c@section=#1%
\ifnum\c@subsection=#2%
\usebeamercolor[fg]{mini frame}%
\ifnum\c@subsectionslide=#3%
\ifnum#3=1%
\usebeamertemplate{mini frame first}%\beamer@minislidehilight%
\else%
\usebeamertemplate{mini frame}%\beamer@minislidehilight%
\fi
\else%
\ifnum#3=1%
\usebeamertemplate{mini frame in current subsection first}%
\else%
\usebeamertemplate{mini frame in current subsection}%\beamer@minisliderowhilight%
\fi
\fi%
\else%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi%
\else%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi%
}}}\hskip-10cm plus 1fil%
}\fi\fi%
\else%
\fakeslideentry{#1}{#2}{#3}{#4}{#5}{#6}%
\fi\ignorespaces
}
\makeatother
\defbeamertemplate{mini frame}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
[action]
{
\newlength{\myminiframesize}
\setlength{\myminiframesize}{0.14cm}
\newlength{\myminiframeoffset}
\setlength{\myminiframeoffset}{0.03cm}
\setbeamersize{mini frame size=#1\myminiframesize,mini frame offset=#1\myminiframeoffset}
}
\defbeamertemplate{mini frame first}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current section}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in other section}{scaled circle}[1]
{%
\color{fg!50!bg}
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection first}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in other subsection}{scaled circle}[1]
{%
\color{fg!50!bg}
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\setbeamertemplate{mini frame}[scaled circle]{0.7}
\setbeamertemplate{mini frame first}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection first}[scaled circle]{0.7}
\setbeamertemplate{mini frame in other section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in other subsection}[scaled circle]{0.7}
Выход:
ПРАВКА 2 – Свернуть другие подразделы
\makeatletter
\def\slideentry#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%
\ifbeamer@compress%
\ifnum\c@section=#1
\ifnum\c@subsection=#2
\advance\beamer@xpos by1\relax%
\else%
\ifnum#3=1%
\advance\beamer@xpos by1\relax%
\fi
\fi
\else%
\ifnum#3=1%
\advance\beamer@xpos by1\relax%
\fi
\fi
\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{mini frame}%
\ifnum\c@section=#1%
\ifnum\c@subsection=#2%
\usebeamercolor[fg]{mini frame}%
\ifnum\c@subsectionslide=#3%
\ifnum#3=1%
\usebeamertemplate{mini frame first}%\beamer@minislidehilight%
\else%
\usebeamertemplate{mini frame}%\beamer@minislidehilight%
\fi
\else%
\ifnum#3=1%
\usebeamertemplate{mini frame in current subsection first}%
\else%
\usebeamertemplate{mini frame in current subsection}%\beamer@minisliderowhilight%
\fi
\fi%
\else%
\ifnum#3=1%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi
\fi%
\else%
\ifnum#3=1%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi
\fi%
}}}\hskip-10cm plus 1fil%
}\fi\fi%
\else%
\fakeslideentry{#1}{#2}{#3}{#4}{#5}{#6}%
\fi\ignorespaces
}
\makeatother
\defbeamertemplate{mini frame}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
[action]
{
\newlength{\myminiframesize}
\setlength{\myminiframesize}{0.14cm}
\newlength{\myminiframeoffset}
\setlength{\myminiframeoffset}{0.03cm}
\setbeamersize{mini frame size=#1\myminiframesize,mini frame offset=#1\myminiframeoffset}
}
\defbeamertemplate{mini frame first}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{fill,stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current section}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in other section}{scaled circle}[1]
{%
\color{fg!50!bg}
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathmoveto{\pgfpoint{0cm}{#1 * 0.05cm}}
\pgfpathlineto{\pgfpoint{#1 * -0.04cm}{#1 * 0.05cm}}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in current subsection first}{scaled circle}[1]
{%
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\defbeamertemplate{mini frame in other subsection}{scaled circle}[1]
{%
\color{fg!50!bg}
\begin{pgfpicture}{0pt}{0pt}{#1 * 0.1cm}{#1 * 0.1cm}
\pgfsetlinewidth{#1 * 0.4pt}
\pgfpathcircle{\pgfpoint{#1 * 0.05cm}{#1 * 0.05cm}}{#1 * 0.05cm}
\pgfusepath{stroke}
\end{pgfpicture}%
}
\setbeamertemplate{mini frame}[scaled circle]{0.7}
\setbeamertemplate{mini frame first}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection}[scaled circle]{0.7}
\setbeamertemplate{mini frame in current subsection first}[scaled circle]{0.7}
\setbeamertemplate{mini frame in other section}[scaled circle]{0.7}
\setbeamertemplate{mini frame in other subsection}[scaled circle]{0.7}