我正在尝试在 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{}
辅助文件的方法,以及一个将该编号或标签读回目录的方法。
我尝试了refcount
和zref
包,因为我相信这些包可以解决问题。但是,我对这些命令不够熟悉,似乎无法将它们拼凑在一起。我错了吗?可以使用这些包中提供的工具来完成吗?或者其他方法会更好?
这是更新的完整 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
选择的框架,以列出各节中的第一个框架,除非第一个框架处于第五个框架的模式()。etoc
presentation
Title 5
在这种情况下,第二个(Title 6
)被选择为“第一个”。
文章模式请注意,在 beamer 模式下,第五帧的标题是Title 5
投影机模式(默认样式不包含列表中的章节编号)
这是主要代码,在文章模式下设置
% !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 %%%%%%%%%%%%%%%%%%%%%%%%%%