Beamer:基于帧号(而不是页码)的目录

Beamer:基于帧号(而不是页码)的目录

我正在尝试在 Beamer 中生成目录,但我不想在右侧显示页码,而是想访问/显示帧号。所以我的问题是:

如何创建显示框架编号(而不是页码)的目录?

或者:我如何访问指示(标准乳胶)目录使用页码()的命令?我必须假设,如果我获得访问权限,那么我可以用框架编号( )\thepage替换页码。对吗?\theframenumber

我明白这在简单的演示文稿中不会成为问题,因为页码与帧号相同。但是,我正在为讲座创建演示文稿,并且同时使用beamerarticle(在同一个文件中)开发复杂的讲义。例如,某些帧未显示在讲义中(例如,帮助我在讲座期间提出观点的图片不需要包含在讲义中。或者某些标题幻灯片\AtBeginSection只会占用讲义中的空间而不会添加任何重要信息)。因此,我希望文章版本(讲义)中的目录与我在墙上展示的目录(我的 beamer 演示文稿)相同 - 尽管包含的帧不同。换句话说,我需要beamerarticle计算帧数。或者beamerarticle(或标准 latex)有一个选项允许我\theframenumber在常规文档中实现。

我知道这可能是一个难以解决的问题,因为该beamerarticle软件包的目标之一是忽略\begin{frame}\end{frame}和其他与帧相关的命令。所以我预计在文章模式下计算帧数并不容易。但话又说回来,这就是我在这里问你的原因。...也许可以创建一个新命令,我可以将其全局放置在每个帧之前/之后。

这是一个非常简化的 MWE 演示文稿:

%\documentclass{beamer} %uncomment to produce presentation

\documentclass{article} %comment out to produce presentation
\usepackage{beamerarticle} %comment out to produce presentation


\begin{document}

\begin{frame}
\frametitle{Title 1}
\tableofcontents % Works well in beamer, but does not show correct frame numbers in article mode

In article mode, I would like this list to read as follows:

1 Sec One .... Frame 2

2 Sec Two .... Frame 4 

3 Sec Three .... Frame 6
\end{frame}


\section{Sec One}
\begin{frame}
\frametitle{Title 2}
\end{frame}


\begin{frame}
\frametitle{Title 3}
\end{frame}


\section{Sec Two}
\begin{frame}
\frametitle{Title 4}
\end{frame}


\section{Sec Three}
\mode<presentation>{ % Only shows up in presentation, so list of frames must make a jump here
\begin{frame}
\frametitle{Title 5}
\end{frame}
}


\begin{frame}
\frametitle{Title 6}
\end{frame}


\end{document}

我非常感谢任何正确的意见或指示。任何能帮助我解决这个问题的东西都很棒。谢谢。



更新:

根据 SimonDispa 的帖子,我能够进行一些调整,但仍然没有得到完整的解决方案。我相信或包refcount可以zref帮我完成任务。

首先,由于我有很多演示文稿/讲义,其中我将使用这种方法,所以我希望解决方案更加自动化(或更加全球化)。根据这篇文章\atBeginSection(diabonas 的回答),当我编译 beamerarticle 时,可以进行工作

% Make atBeginSection work in article mode
\mode<article>
\makeatletter
\expandafter\let\expandafter\originalsection\expandafter=\csname @orig\string\section\endcsname
\def\sectionwithhook{\@ifstar\@sectionwithhook\@@sectionwithhook}
\newcommand{\@sectionwithhook}[1]{\originalsection*{#1}}
\newcommand{\@@sectionwithhook}[2][]{\beamer@ifempty{#1}{\originalsection{#2}}{\originalsection[#1]{#2}}\beamer@atbeginsection}
\renewcommand<>{\section}{\alt#1{\sectionwithhook}{\beamer@secgobble}}
\makeatother
\mode<all>

这样我就可以在每个部分的开头设置一个计数器(MyFrameNumber),将其设置为当前帧号加 1,

\AtBeginSection[]
{
\mode<article>{\setcounter{MyFrameNumber}{\theframenumber+1}}
}

感谢这个tocloft包,我可以操纵目录的外观,我想这样做如下:

\mode<article>{
\usepackage{tocloft}
\renewcommand{\cftsecleader}{\dotfill{} Starts at Frame 
% How to make \theMyFrameNumber work and update properly in toc?
% It currently produces a 0  
 \theMyFrameNumber{}
% Can it be done with the refcount package ? 
% Can it be done with the zref package ? 
}}

但它留下了一个问题\theMyFrameNumber{}。我不得不稍微猜测一下,但有几个潜在的问题会阻止它正常工作:

  • 目录是在文档的其余部分之前生成的(但正确处理辅助文件可能会解决这个问题)。
  • 计数器MyFrameNumber未写入辅助文件,并且 toc 无法访问该信息。因此,它会为所有实例打印零。
  • 即使计数器MyFrameNumber按原样写入辅助文件,它目前也只有一个值(最后一个/最高的值)

因此,我相信如果我有一个允许我交叉引用的方法,我就可以做到这一点\theMyFrameNumber{}。换句话说,我需要一个将当前编号(或标签)写入\theMyFrameNumber{}辅助文件的方法,以及一个将该编号或标签读回目录的方法。

我尝试了refcountzref包,因为我相信这些包可以解决问题。但是,我对这些命令不够熟悉,似乎无法将它们拼凑在一起。我错了吗?可以使用这些包中提供的工具来完成吗?或者其他方法会更好?

这是更新的完整 MWE,感觉非常接近:

%\documentclass{beamer} %uncomment to produce presentation

\documentclass{article} %comment out to produce presentation
\usepackage{beamerarticle} %comment out to produce presentation

\usepackage{calc}
%\usepackage{refcount}
%\usepackage{zref}


\global\newcounter{MyFrameNumber}

\mode<article>{
\usepackage{tocloft}
\renewcommand{\cftsecleader}{\dotfill{} Starts at Frame 
% How to make \theMyFrameNumber work properly in toc?
% It currently produces a 0  
 \theMyFrameNumber{}
% Can it be done with the refcount package ? 
% Can it be done with the zref package ? 
}}



% Make atBeginSection work in article mode
\mode<article>
\makeatletter
\expandafter\let\expandafter\originalsection\expandafter=\csname @orig\string\section\endcsname
\def\sectionwithhook{\@ifstar\@sectionwithhook\@@sectionwithhook}
\newcommand{\@sectionwithhook}[1]{\originalsection*{#1}}
\newcommand{\@@sectionwithhook}[2][]{\beamer@ifempty{#1}{\originalsection{#2}}{\originalsection[#1]{#2}}\beamer@atbeginsection}
\renewcommand<>{\section}{\alt#1{\sectionwithhook}{\beamer@secgobble}}
\makeatother
\mode<all>


\AtBeginSection[]
{
\mode<article>{\setcounter{MyFrameNumber}{\theframenumber+1}}
%
%\begin{frame}
%\frametitle{Table of Contents}
%\tableofcontents[currentsection]
%\end{frame}
}





\begin{document}


\begin{frame}
\frametitle{Title 1}
\pagenumbering{gobble} % suppress page numbering in TOC
\tableofcontents % Works well in beamer, but does not show correct frame number in article



\bigskip
In article mode, I would like this list to read as follows:

\bigskip
1 Sec One \dotfill{} Starts at Frame 2\\

2 Sec Two \dotfill{} Starts at Frame 4\\

3 Sec Two \dotfill{} Starts at Frame 5\\

\end{frame}


\section{Sec One}

\begin{frame}
\frametitle{Title 2}
% Here \theMyFrameNumber works flawlessly 
This is frame \theMyFrameNumber{} 
% Check correctness
(\theframenumber)
\end{frame}


\begin{frame}
\frametitle{Title 3}
% Here \theMyFrameNumber does not work 
% because it only incremented/updated atBeginSection
This is frame \theMyFrameNumber{} 
% Check correctness
(\theframenumber)
\end{frame}


\section{Sec Two}

\begin{frame}
\frametitle{Title 4}
% Here \theMyFrameNumber works flawlessly 
This is frame \theMyFrameNumber{} 
% Check correctness
(\theframenumber)
\end{frame}


\section{Sec Three}
\begin{frame}
\frametitle{Title 5}
% Here \theMyFrameNumber works flawlessly 
This is frame \theMyFrameNumber{} 
% Check correctness
(\theframenumber)
\end{frame}  

\end{document}

仅用于解决问题。修复后将删除以下所有内容。


@SimonDispa 提供的解决方案很棒,最终结果看起来正是我想要的。但是,当我在计算机上编译代码时,它看起来像这样:

在此处输入图片描述

如您所见,蓝色目录无法正确编译。我尝试操作代码(在 beamerarticleETOC.tex 中,我将其直接复制到主文档中),但没有成功。

答案1

更新根据后续交流。

所有额外的代码都包含在内beamerarticleETOC.tex,可以在文章模式下加载。

所提出的解决方案基于该etoc软件包。

框架声明一个由从目录中\paragraph选择的框架,以列出各节中的第一个框架,除非第一个框架处于第五个框架的模式()。etocpresentationTitle 5

在这种情况下,第二个(Title 6)被选择为“第一个”。

文章模式请注意,在 beamer 模式下,第五帧的标题是Title 5

C

A

投影机模式(默认样式不包含列表中的章节编号)

b

这是主要代码,在文章模式下设置

% !TeX TS-program = pdflatex    

%% article mode 
%\documentclass{beamer}  % beamer mode only
%\newcommand{\listofframesinsection}{\tableofcontents} % beamer mode only

\documentclass{article}%  for article mode only
\usepackage{beamerarticle}%  for article mode only
\input{beamerarticleETOC}%  for article mode with etoc only

\renewcommand{\contentsname}{} 

\begin{document}
    
\begin{frame}   % << without title!
    \listofframesinsection      % \tableofcontents in beamer mode                   
    \bigskip
    
    \color{red} In article mode, I would like this list to read as follows: \par        
    \bigskip
    1 Sec One \dotfill{} Starts at Frame 2\par      
    2 Sec Two \dotfill{} Starts at Frame 4\par      
    3 Sec Three \dotfill{} Starts at Frame 5\par    
\end{frame} 

\section{Sec One F2 \& F3} 
\begin{frame}
    \frametitle{Title 2}    
\end{frame}

\begin{frame}
    \frametitle{Title 3}
\end{frame}

\section{Sec Two F4}
\begin{frame}
    \frametitle{Title 4}
\end{frame}

\section{Sec Three F5 \& F6}
\mode<presentation>{ % % Only shows up in presentation,
\begin{frame}
    \frametitle{Title 5}
\end{frame} 
}
\begin{frame}
    \frametitle{Title 6}
\end{frame}  
    
\end{document}

这是文件beamerarticleETOC.tex

%%%% beamerarticleETOC.tex starts %%%%%%%%%%%%%%%%%%%%%

\usepackage{etoc}
\etocsettocdepth{all}

\setbeamertemplate{frametitle}{% rename frame for etoc
    \paragraph{\renameframe}
    \noindent\mbox{}\par
} 

\newcommand{\renameframe}{% Frame + frame number
    Frame\ \insertframenumber \quad
    (\insertframetitle) 
}

\newcommand{\formatlist}{\color{blue}\normalsize\rmfamily\bfseries} %format list of first frames
\newcommand{\listframes}{} % optional title

\newcommand{\listofframesinsection}{%
    \begingroup 
    \etocsetlevel {section}{1}%  sections
    \etocsetlevel {paragraph}{2}%  frames as paragraphs 
    \etoctoclines % package default styles for sections
    \etocsettocstyle {\formatlist\noindent \listframes\par}{}%
    \etocsetnexttocdepth {paragraph}%
    \etocsetstyle {paragraph}
    {}
    {\leavevmode\leftskip 0em\relax} % left indent
    {\etociffirst{Starts at \,\etocname \par}}
    {}
    \etocsetstyle {section}
    {}{}
    {\formatlist    \etocnumber. \etocname \dotfill}
    {\parfillskip 10pt plus 1fil\relax }    
    \tableofcontents
    \endgroup 
}
\etocsetnexttocdepth{section}
%%%% beamerarticleETOC.tex ends %%%%%%%%%%%%%%%%%%%%%%%%%%

相关内容