Многие презентации включают в себя своего рода визуализатор, с помощью которого слушатели могут легко увидеть, как далеко продвинулась презентация.
Отличный вариант — добавить progress bar
в макет слайда.
Минимальный рабочий пример (МРП):
ПользовательГонсало Мединаопубликовал хороший подход к отображению треугольника над линией:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{pbgray}{HTML}{575757}% background color for the progress bar
\makeatletter
\def\progressbar@progressbar{} % the progress bar
\newcount\progressbar@tmpcounta% auxiliary counter
\newcount\progressbar@tmpcountb% auxiliary counter
\newdimen\progressbar@pbht %progressbar height
\newdimen\progressbar@pbwd %progressbar width
\newdimen\progressbar@tmpdim % auxiliary dimension
\progressbar@pbwd=\linewidth
\progressbar@pbht=1pt
% the progress bar
\def\progressbar@progressbar{%
\progressbar@tmpcounta=\insertframenumber
\progressbar@tmpcountb=\inserttotalframenumber
\progressbar@tmpdim=\progressbar@pbwd
\multiply\progressbar@tmpdim by \progressbar@tmpcounta
\divide\progressbar@tmpdim by \progressbar@tmpcountb
\begin{tikzpicture}[very thin]
\draw[pbgray!30,line width=\progressbar@pbht]
(0pt, 0pt) -- ++ (\progressbar@pbwd,0pt);
\draw[draw=none] (\progressbar@pbwd,0pt) -- ++ (2pt,0pt);
\draw[fill=pbgray!30,draw=pbgray] %
( $ (\progressbar@tmpdim, \progressbar@pbht) + (0,1.5pt) $ ) -- ++(60:3pt) -- ++(180:3pt) ;
\node[draw=pbgray!30,text width=3.5em,align=center,inner sep=1pt,
text=pbgray!70,anchor=east] at (0,0) {\insertframenumber/\inserttotalframenumber};
\end{tikzpicture}%
}
\addtobeamertemplate{headline}{}
{%
\begin{beamercolorbox}[wd=\paperwidth,ht=5ex,center,dp=1ex]{white}%
\progressbar@progressbar%
\end{beamercolorbox}%
}
\makeatother
\begin{document}
\section{Introduction}
\begin{frame}
\frametitle{Introduction}
test
\end{frame}
\section{Motivation}
\begin{frame}
\frametitle{Motivation}
test
\end{frame}
\section{Methodology}
\begin{frame}
\frametitle{Experiments}
test
\end{frame}
\begin{frame}
\frametitle{Statistics}
test
\end{frame}
\section{Results}
\begin{frame}
\frametitle{Results 1}
test
\end{frame}
\begin{frame}
\frametitle{Results 2}
test
\end{frame}
\section{Conclusion}
\begin{frame}
\frametitle{Conclusion}
test
\end{frame}
\end{document}
Вопрос:
Выглядит действительно хорошо, но я бы предпочел добавить это section titles
и на временную шкалу.
Здесь вы можете увидеть:
- ВведениеиМотивацияуже был представлен
- Методологияв настоящее время представлен
- Полученные результатыиЗаключениебудет представлен позже
Можно ли расширить код так, чтобы названия разделов также отображались на временной шкале?
решение1
Знаю, что прошло много времени, но можно винить карантин во Франции за то, что он предоставил мне свободное время...
Я начал с предложения Гонсало Медины и построил недостающие вещи вокруг него. Я считаю, что это самая сложная вещь, которую я когда-либо делал с LaTeX, так что спасибо за ваш вопрос, я многому научился, готовя этот ответ.
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc,patterns.meta}
% To provide total amount of sections throughout the document
\usepackage{totcount}
% Registers de total amount of sections (see https://tex.stackexchange.com/a/192506/141947)
\regtotcounter{section}
% To be able to refer to sections when needed
\usepackage{nameref}
% Redefinition of the \section command so that each one is labeled \label{sec:n} where n is its index
\let\oldsection\section
\renewcommand{\section}[2][\relax]{%
\ifx#1\relax
\oldsection{#2}%
\else
\oldsection[#1]{#2}%
\fi%
\label{sec:\thesection}%
}
% Definition of custom colors based on the initial figure of the bar by the OP
\definecolor{myblue}{HTML}{57AED1}
\definecolor{mygreen}{HTML}{8BC53F}
\definecolor{mygray}{HTML}{DDDDDD}
% Definition of custom tikz styles in order to ease readability
\tikzset{
% Bar style (Argument : color)
sectionbar/.style={
% Filling with one color as a preaction, in order to avoid reset by the pattern color
preaction={fill=#1!70},
% Application of the line pattern on to of the fill
pattern={Lines[angle=45,distance={6pt},line width=3pt]},pattern color=#1
},
% Node style (Arguments : color, section number)
sectionnode/.style 2 args={
fill=#1,
draw=white,
thick,
circle,
text=white,
radius=10pt,
% Display of the section name below the cicle
label={[text=#1]below:\nameref{sec:#2}},
}
}
% Actual definition of the colorbar based on Gonzalo Medina's initial proposal
\makeatletter
\def\pbar@progressbar{} % the progress bar
\newcount\pbar@tmpcnta% auxiliary counter
\newcount\pbar@tmpcntb% auxiliary counter
\newdimen\pbar@pbht %progressbar height
\newdimen\pbar@pbwd %progressbar width
\newdimen\pbar@tmpdim % auxiliary dimension
\pbar@pbwd=\linewidth
\pbar@pbht=4pt
% The progress bar
\def\pbar@progressbar{%
\pbar@tmpcnta=\value{section} % tmpcnta stores the section number
\pbar@tmpcntb=\totvalue{section} % tmbcountb sotres the total amount of sections
\advance\pbar@tmpcntb by 1 % tmbcountb is advanced by 1 in order to have the last bar segment after the last node
\begin{tikzpicture}[very thin]
% Clipping scope to avoid tests for the bar dimensions
\begin{scope}
% Clipping path
\path[rounded corners=2pt,clip] (0pt,{-\pbar@pbht/2}) rectangle (\pbar@pbwd,{\pbar@pbht/2});
% Gray bar (from 0 to last section)
\path[sectionbar=mygray] (0pt,{-\pbar@pbht/2}) rectangle (\linewidth,{\pbar@pbht/2});
% Blue bar (from 0 to the current section)
\path[sectionbar=myblue] (0pt,{-\pbar@pbht/2}) rectangle ({(\[email protected])*\linewidth/\pbar@tmpcntb},{\pbar@pbht/2});
% Green bar (from current to next section)
\path[sectionbar=mygreen] ({(\[email protected])*\linewidth/\pbar@tmpcntb},{-\pbar@pbht/2}) rectangle ({(\pbar@tmpcnta+0.5)*\linewidth/\pbar@tmpcntb},{\pbar@pbht/2});
\end{scope}
% Drawing of the nodes on top of the bars, based on the number of the current section
\foreach \secnumber in {1,...,\totvalue{section}}{
% Number is lower, section is past, blue color
\ifnum\secnumber<\pbar@tmpcnta
\node[sectionnode={myblue}{\secnumber}] at ({(\secnumber-0.5)*\linewidth/\pbar@tmpcntb},0) {\strut\secnumber};
\fi
% Number is equal, section is current, green color
\ifnum\secnumber=\pbar@tmpcnta
\node[sectionnode={mygreen}{\secnumber}] at ({(\secnumber-0.5)*\linewidth/\pbar@tmpcntb},0) {\strut\secnumber};
\fi
% Number is larger, to be done section, gray color
\ifnum\secnumber>\pbar@tmpcnta
\node[sectionnode={mygray}{\secnumber}] at ({(\secnumber-0.5)*\linewidth/\pbar@tmpcntb},0) {\strut\secnumber};
\fi
}
\end{tikzpicture}%
}
\addtobeamertemplate{headline}{}
{%
\begin{beamercolorbox}[wd=\paperwidth,ht=10ex,center,dp=1ex]{white}%
\pbar@progressbar%
\end{beamercolorbox}%
}
\makeatother
\begin{document}
\section{Introduction}
\begin{frame}
\frametitle{Introduction}
test
\end{frame}
\section{Motivation}
\begin{frame}
\frametitle{Motivation}
test
\end{frame}
\section{Methodology}
\begin{frame}
\frametitle{Experiments}
test
\end{frame}
\begin{frame}
\frametitle{Statistics}
test
\end{frame}
\section{Results}
\begin{frame}
\frametitle{Results 1}
test
\end{frame}
\begin{frame}
\frametitle{Results 2}
test
\end{frame}
\section{Conclusion}
\begin{frame}
\frametitle{Conclusion}
test
\end{frame}
\end{document}
РЕДАКТИРОВАТЬПросто ради интереса, немного более простое определение или планка с использованием pgf
ifthenelse
конструкции и предварительных вычислений \linewidth/\pbar@tempcntb
.
% The progress bar
\def\pbar@progressbar{%
\pbar@tmpcnta=\value{section} % tmpcnta stores the section number
\pbar@tmpcntb=\totvalue{section} % tmbcountb sotres the total amount of sections
\advance\pbar@tmpcntb by 1 % tmbcountb is advanced by 1 in order to have the last bar segment after the last node
\pbar@tmpdim=\linewidth
\divide\pbar@tmpdim by \pbar@tmpcntb
\begin{tikzpicture}[very thin]
% Clipping scope to avoid tests for the bar dimensions
\begin{scope}
% Clipping path
\path[rounded corners=2pt,clip] (0pt,{-\pbar@pbht/2}) rectangle (\pbar@pbwd,{\pbar@pbht/2});
% Gray bar (from 0 to last section)
\path[sectionbar=mygray] (0pt,{-\pbar@pbht/2}) rectangle (\linewidth,{\pbar@pbht/2});
% Blue bar (from 0 to the current section)
\path[sectionbar=myblue] (0pt,{-\pbar@pbht/2}) rectangle ({(\[email protected])*\pbar@tmpdim},{\pbar@pbht/2});
% Green bar (from current to next section)
\path[sectionbar=mygreen] ({(\[email protected])*\pbar@tmpdim},{-\pbar@pbht/2}) rectangle ({(\pbar@tmpcnta+0.5)*\pbar@tmpdim},{\pbar@pbht/2});
\end{scope}
% Drawing of the nodes on top of the bars, based on the number of the current section
\foreach \secnumber in {1,...,\totvalue{section}}{
% Conditional definition of the colors
\pgfmathsetmacro{\currcolor}{(\secnumber<\pbar@tmpcnta ? "myblue" : (\secnumber==\pbar@tmpcnta ? "mygreen" : "mygray"))}
\node[sectionnode={\currcolor}{\secnumber}] at ({(\secnumber-0.5)*\pbar@tmpdim},0) {\strut\secnumber};
}
\end{tikzpicture}%
}
\addtobeamertemplate{headline}{}
{%
\begin{beamercolorbox}[wd=\paperwidth,ht=10ex,center,dp=1ex]{white}%
\pbar@progressbar%
\end{beamercolorbox}%
}
\makeatother