我想用 beamer 做一个演示文稿,并在几个帧(在开始或结束处)中包含其他帧的缩略图,并与它们建立超链接,每张幻灯片有 4x3 或 5x4 个缩略图。
目的是允许轻松快捷地导航(只需按下键盘的home
或end
键,然后单击要转到的框架)。
第三次的结果
整个文件
缩略图幻灯片
请注意,如果缩略图太多,它们将会分散到几张幻灯片中。
thumbs-3.tex
编译使用:
rm -f thumbs-3-copy.pdf
cp thumbs-3.pdf thumbs-3-copy.pdf
pdflatex thumbs-3.tex
来源:
\documentclass{beamer}
\usepackage{thumbs-3}
\begin{document}
\showthumbs[Welcome]
\begin{frame}\Huge 1\end{frame}
\begin{frame}{With frame title}\Huge 2\end{frame}
\section{Example slides}
\begin{frame}\Huge 3\end{frame}
\subsection{Subsection slides}
\begin{frame}\Huge 4\only<2>{.1}\end{frame}
\subsubsection{Subsubsection slides}
\begin{frame}\Huge 5\end{frame}
\begin{frame}{Subsubsection slide with frame title}\Huge 6\end{frame}
\def\thumbframetitle{Title just for thumbnail}
\begin{frame}{Subsubsection slide with frame title and thumbnail title}\Huge 6\end{frame}
\def\thumbframetitle{}% Stop using a special frame title for thumbnails.
\showthumbs
\section{Random slides}
% Generate some random slides
\begin{onethumb}[2]
\foreach \i in {7,...,10} {
\begin{frame}
\begin{center}
\begin{tikzpicture}
\foreach \c in {0,...,3} {
\pgfmathsetmacro\r{0.6*rnd+0.3}
\pgfmathsetmacro\g{0.6*rnd+0.3}
\pgfmathsetmacro\b{0.6*rnd+0.3}
\definecolor{CircleColor}{rgb}{\r,\g,\b}
\node[circle, fill=CircleColor, minimum size=rnd*2cm] at (rnd*5cm-2.5cm, rnd*4cm-2cm) {};
}
\node at (0,0) {\Huge\i};
\path[use as bounding box] (-3.5cm,-3cm) rectangle (3.5cm,3cm);
\end{tikzpicture}
\end{center}
\end{frame}
}
\end{onethumb}
\foreach \i in {11,...,18} {
\begin{frame}{Random slide \i}\Huge\i\end{frame}
}
\begin{frame}[allowframebreaks]{Testing allowframebreaks}
\begin{itemize}
\item A
\foreach \i in {1,...,20} {
\item Very \i
}
\item Long
\item List
\end{itemize}
\end{frame}
\showthumbs[Any questions?]
\end{document}
thumbs-3.sty
\usepackage{morewrites}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{etextools}
% https://tex.stackexchange.com/q/40297/5699
\newcommand\addtofrml[1]{%
\write\@auxout{\noexpand\@writefile{frml}{\noexpand #1}}%
}
\newcommand{\loadframelist}{\ifx\thumbtitles\undefined\xdef\thumbtitles{}\fi\@starttoc{frml}}
\newcounter{thumbid}
\setcounter{thumbid}{0}
\newif\ifaddthumb
\newif\ifaddcomma\addcommafalse
\def\testaddthumb{\addthumbtrue}
% Hook at the end of each frame (could work if hooked at the beginning I guess).
\let\thumbframetitle\empty
\setbeamertemplate{background}{%
\addtocounter{thumbid}{1}%
\testaddthumb%
\ifaddthumb%
% Get either the frametitle, current (sub)(sub)section title, or just "Frame 42"
\xdef\thumbtitle{}%
\ifx\thumbtitle\empty\ifx\thumbframetitle\empty\else\xdef\thumbtitle{\thumbframetitle}\fi\fi%
\ifx\thumbtitle\empty\ifx\beamer@frametitle\empty\else\xdef\thumbtitle{\beamer@frametitle}\fi\fi%
\ifx\thumbtitle\empty\ifx\subsubsecname\undefined\else\xdef\thumbtitle{\subsubsecname}\fi\fi%
\ifx\thumbtitle\empty\ifx\subsecname\undefined\else\xdef\thumbtitle{\subsecname}\fi\fi%
\ifx\thumbtitle\empty\ifx\secname\undefined\else\xdef\thumbtitle{\secname}\fi\fi%
\ifx\thumbtitle\empty \xdef\thumbtitle{Frame \arabic{thumbid}}\fi%
% Append ",42/Frame Title" to \thumbtitles
\ifaddcomma%
\addtofrml{%
\xdef\noexpand\thumbtitles{\noexpand\thumbtitles,\arabic{thumbid}/\thumbtitle}%
}%
\else%
\addtofrml{%
\xdef\noexpand\thumbtitles{\arabic{thumbid}/\thumbtitle}%
}%
\global\addcommatrue%
\fi%
\fi%
}
% Should take an overlay specification, but I don't know how to handle these.
\newenvironment{onethumb}[1][1]{%
\gdef\onethumbcount{0}%
\gdef\onethumbgoal{#1}%
\gdef\testaddthumb{%
\count@=\onethumbcount%
\advance\count@ by 1%
\xdef\onethumbcount{\the\count@}%
\ifnum\onethumbcount=\onethumbgoal\relax\addthumbtrue\else\addthumbfalse\fi%
}%
}{%
\gdef\testaddthumb{\addthumbtrue}%
}
\newenvironment{nothumbs}{
\gdef\testaddthumb{\addthumbfalse}
}{
\gdef\testaddthumb{\addthumbtrue}
}
\newcommand\showthumbs[1][]{
{
\setbeamertemplate{frametitle continuation}{}
\begin{nothumbs}
\begin{frame}[allowframebreaks]{#1}
\pgfmathsetmacro\thumbwidth{0.2*\linewidth}
\pgfmathsetmacro\thumbheight{\thumbwidth/\paperwidth*\paperheight}
\loadframelist
\begin{center}
\foreach \thid/\thtitle in \thumbtitles {%
\hyperlink{page.\thid}{%
% https://tex.stackexchange.com/a/39601/5699
\begin{tikzpicture}[baseline={([yshift={-\ht\strutbox}]current bounding box.north)}]
\node[draw, inner sep=0pt] (thumb) {
\IfFileExists{\jobname-copy.pdf}{%
\includegraphics[width=\thumbwidth pt, height=\thumbheight pt, page=\thid] {\jobname-copy.pdf}
}{%
\begin{minipage}[t][\thumbheight pt]{\thumbwidth pt}\vfill No thumbnail\vfill\end{minipage}
}%
};
\node[anchor=north, font=\tiny, inner xsep=0pt, inner ysep=0.1cm, yshift=-0.05cm, text width=\thumbwidth pt, align=center] at (thumb.south) {\thtitle};
\end{tikzpicture}%
} % space here, outside of hyperlink
}%
\end{center}
\end{frame}
\end{nothumbs}
}
}
采取 1
这是第一个(后验(在问题提出后很久才添加)尝试:
- 使用 tikz 的
\foreach
循环来生成一系列\includegraphics
包含先前编译生成的 PDF 的页面。 该(编辑:相反,我写下了每个带有缩略图的帧的标题和帧号。)totcount
包应该有助于了解要包含的框架(页面)的范围。\hyperlink{page.42}{\includegraphics...}
应该把这些缩略图变成超链接(从这个 TeX.SX 答案)。
thumbs-1.tex
:
\documentclass{beamer}
\usepackage{thumbs-1}
\begin{document}
\showthumbs
插入一个或多个包含其他帧的缩略图的帧,并超链接到实际帧。可以在文档开头调用它:
\showthumbs
一些带有和不带有 s 的幻灯片\frametitle
,位于各个级别的(子)(子)部分的内部和外部:
\begin{frame}\Huge 1\end{frame}
\begin{frame}{With frame title}\Huge 2\end{frame}
\section{Example slides}
\begin{frame}\Huge 3\end{frame}
\subsection{Subsection slides}
带有覆盖的框架:
\begin{frame}\Huge 4\only<2>{.1}\end{frame}
\subsubsection{Subsubsection slides}
\begin{frame}\Huge 5\end{frame}
\begin{frame}{Subsubsection slide with frame title}\Huge 6\end{frame}
\section{Random slides}
\showthumbs
可以调用多次,并且位于文档中间:
\showthumbs
一些随机幻灯片,带有一个缩略图(组中的第二张):
\begin{onethumb}[2]
\foreach \i in {7,...,10} {
\begin{frame}
\begin{center}
\begin{tikzpicture}
\foreach \c in {0,...,3} {
\pgfmathsetmacro\r{0.6*rnd+0.3}
\pgfmathsetmacro\g{0.6*rnd+0.3}
\pgfmathsetmacro\b{0.6*rnd+0.3}
\definecolor{CircleColor}{rgb}{\r,\g,\b}
\node[circle, fill=CircleColor, minimum size=rnd*2cm] at (rnd*5cm-2.5cm, rnd*4cm-2cm) {};
}
\node at (0,0) {\Huge\i};
\path[use as bounding box] (-3.5cm,-3cm) rectangle (3.5cm,3cm);
\end{tikzpicture}
\end{center}
\end{frame}
}
\end{onethumb}
其他虚拟幻灯片,每张都有一个缩略图:
\foreach \i in {11,...,20} {
\begin{frame}{Dummy slide \i}\Huge\i\end{frame}
}
\showthumbs
可以多次调用,并且在文档的最后:
\showthumbs
\end{document}
thumbs-1.sty
:
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{etextools}
使用来自这个问题,将帧编号和帧标题列表写入辅助文件:
\newcommand\addtofrml[1]{%
\write\@auxout{\noexpand\@writefile{frml}{\noexpand #1}}%
}
\newcommand{\loadframelist}{\ifx\thumbtitles\undefined\xdef\thumbtitles{}\fi\@starttoc{frml}}
\newcounter{thumbid}
\setcounter{thumbid}{0}
\newif\ifaddthumb
\def\testaddthumb{\addthumbtrue}
在每一帧的末尾挂上钩子(我猜如果在开头挂上钩子可能会有效):
\setbeamertemplate{background}{%
\addtocounter{thumbid}{1}%
\testaddthumb%
\ifaddthumb%
缩略图按优先顺序标有\frametitle
、susubsection
标题、subsection
标题、标题或“框架”:section
\xdef\thumbtitle{%
\ifx\beamer@frametitle\empty%
\ifx\insertsubsubsectionhead\empty%
\ifx\insertsubsectionhead\empty%
\ifx\insertsectionhead\empty%
Frame \arabic{thumbid}%
\else\insertsectionhead\fi%
\else\insertsubsectionhead\fi%
\else\insertsubsubsectionhead\fi%
\else\beamer@frametitle\fi%
}%
附加,42/Frame Title
到\thumbtitles
宏:
\ifaddcomma
\addtofrml{%
\xdef\noexpand\thumbtitles{\noexpand\thumbtitles,\arabic{thumbid}/\thumbtitle}%
}%
\else
\addtofrml{%
\xdef\noexpand\thumbtitles{\arabic{thumbid}/\thumbtitle}%
}%
\global\addcommatrue
\fi
\fi%
}
\begin{onethumb}[42]…\end{onethumb}
允许一组帧只有一个缩略图(组中的第 42 帧,默认情况下为一个)。这实际上应该使用 beamer 的叠加规范,通过键入 允许为第 2 到第 4 帧和第 6 帧创建一个缩略图\begin{onethumb}<2-4,6>…\end{onethumb}
,但我还没有实现这一点。
\newenvironment{onethumb}[1][5]{%
\gdef\onethumbcount{0}%
\gdef\onethumbgoal{#1}%
\gdef\testaddthumb{%
\count@=\onethumbcount%
\advance\count@ by 1%
\xdef\onethumbcount{\the\count@}%
\ifnum\onethumbcount=\onethumbgoal\relax\addthumbtrue\else\addthumbfalse\fi%
}%
}{%
\def\testaddthumb{\addthumbtrue}%
}
\begin{nothumbs}…\end{nothumbs}
禁止创建封闭框架的缩略图。
\newenvironment{nothumbs}{
\def\testaddthumb{\addthumbfalse}
}{
\def\testaddthumb{\addthumbtrue}
}
\def\showthumbs{
包含由 生成的缩略图的帧\showthumbs
被封闭在 中\begin{nothumbs}…\end{nothumbs}
,否则在第二次编译之后,它们将包含自身的副本,并且在每次编译时更递归地包含它们,因此 PDF 会越来越大。
\begin{nothumbs}
\begin{frame}[allowframebreaks]
\pgfmathsetmacro\thumbwidth{0.2*\linewidth}
\pgfmathsetmacro\thumbheight{\thumbwidth/\paperwidth*\paperheight}
\loadframelist
\begin{center}
循环遍历/文件\thumbtitles
中定义的宏。.aux
.frml
\foreach \thid/\thtitle in \thumbtitles {%
\hyperlink{page.\thid}{%
使用以下方法调整包含缩略图及其标签的 tikzpicture 的垂直对齐方式这个答案:
\begin{tikzpicture}[baseline={([yshift={-\ht\strutbox}]current bounding box.north)}]
带框架和比例的缩略图:
\node[draw, inner sep=0pt] (thumb) {%
\includegraphics[width=\thumbwidth pt, height=\thumbheight pt, page=\thid] {\jobname.pdf}%
};
缩略图下方的标签:
\node[anchor=north, font=\tiny, inner xsep=0pt, inner ysep=0.1cm, yshift=-0.05cm, text width=\thumbwidth pt, align=center] at (thumb.south) {\thtitle};
\end{tikzpicture}%
在每个缩略图之间插入一个空格,但只能插入一个(其余重要的行以 结尾%
)。空格必须在 之外\hyperlink
,如中所述这个答案我的后续问题。
} % space here, outside of hyperlink
}%
\end{center}
\end{frame}
\end{nothumbs}
}
我不知道如何\includegraphics
仅在 PDF 存在时(例如在第一次编译期间)运行命令。\includegraphics
然后运行命令会导致错误,并且由于错误不会生成任何 PDF……鸡和蛋的问题 :)。
我很感激能找到解决这个最后一个问题的方法(\includegraphics
仅当 PDF 存在时才运行命令),或者任何其他自动生成这些幻灯片的方法。
第二次
和这个答案,我可以有条件地运行 \includegraphics 命令。
我只需替换此代码(在末尾.sty
):
\node[draw, inner sep=0pt] (thumb) {%
\includegraphics[width=\thumbwidth pt, height=\thumbheight pt, page=\thid] {\jobname.pdf}%
};
通过这个:
\node[draw, inner sep=0pt] (thumb) {%
\IfFileExists{\jobname.pdf}{%
\includegraphics[width=\thumbwidth pt, height=\thumbheight pt, page=\thid] {\jobname.pdf}%
}{%
\begin{minipage}[t][\thumbheight pt]{\thumbwidth pt}\vfill No thumbnail\vfill\end{minipage}%
}%
};
我现在遇到了另一个问题:pdflatex
生成文档时,它会覆盖\includegraphics
尝试读取的 pdf。
梅威瑟:
\documentclass{beamer}
\usepackage{graphicx}
\usepackage{tikz}
\begin{document}
\begin{frame}\Huge 1\end{frame}
\begin{frame}\Huge 2\end{frame}
\begin{frame}\Huge 3\end{frame}
\begin{frame}\Huge 4\end{frame}
\begin{frame}
\foreach \i in {1,...,4} {
\IfFileExists{\jobname.pdf}{%
\fbox{\includegraphics[width=0.2\linewidth, page=\i] {\jobname.pdf}}%
}{No thumbnail}
}
\end{frame}
\end{document}
当我运行上述示例时,出现以下错误,因为\jobname.pdf
已被打开进行写入并被截断pdflatex
:
Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table
!pdfTeX error: pdflatex (file ./thumbs.pdf): xpdf: reading PDF image failed
拍摄 3
如果我手动复制\jobname.pdf
到\jobname-copy.pdf
(编辑:更改.copy.pdf
为,-copy.pdf
因为有时它会失败),每次编译后,并在中使用以下代码.sty
,它运行良好:
\node[draw, inner sep=0pt] (thumb) {%
\IfFileExists{\jobname-copy.pdf}{%
\includegraphics[width=\thumbwidth pt, height=\thumbheight pt, page=\thid] {\jobname-copy.pdf}%
}{%
\begin{minipage}[t][\thumbheight pt]{\thumbwidth pt}\vfill No thumbnail\vfill\end{minipage}%
}%
};
编译需要按如下方式进行:
rm -f thumbs-3-copy.pdf
cp thumbs-3.pdf thumbs-3-copy.pdf
pdflatex thumbs-3.tex
当文档中的帧数减少时,在下一次(第二次)编译期间,将\includegraphics
失败,从而阻止 PDF 生成。然后,文件thumbs-3-copy.pdf
被删除,并且无法创建新副本(因为 PDF 生成失败)。因此在下一次(第三次)编译时,由于文件thumbs-3-copy.pdf
不存在,因此不会\includegraphics
尝试,并且生成成功。在下一次(第四次)编译时,缩略图最终被创建。
如果您不理解上述内容,请尝试将帧数从 5 减少到 2(例如),而不运行命令rm
:编译将永久失败。使用rm
,大约 4 次编译后一切都会解决。
第四次
我尝试自动复制 pdf(使用这个 TeX.SX 问题的答案),但即使我在之后运行复制\documentclass{beamer}
,复制仍然是一个截断的文件(如果我将复制代码移到之前documentclass
,代码会中断,但我认为这不会有什么区别)。以下是执行复制的代码:
\documentclass{beamer}
\newread\in%
\openin\in=\jobname.pdf%
\newwrite\out%
\immediate\openout\out\jobname-copy.pdf%
\endlinechar-1%
\loop \unless\ifeof\in%
\readline\in to\l%
\immediate\write\out{\l}%
\repeat%
\immediate\closeout\out%
\closein\in%
\usepackage{graphicx}
\usepackage{tikz}
\begin{document}
\begin{frame}\Huge 1\end{frame}
\begin{frame}\Huge 2\end{frame}
\begin{frame}\Huge 3\end{frame}
\begin{frame}\Huge 4\end{frame}
\begin{frame}
\foreach \i in {1,...,4} {
\IfFileExists{\jobname-copy.pdf}{\fbox{\includegraphics[width=0.2\linewidth, page=\i] {\jobname-copy.pdf}}}{No thumbnail}
}
\end{frame}
\end{document}
因此我想知道是否可以仅使用 (La)TeX 代码来告诉 (La)TeX 在生成新 PDF 文件之前备份旧 PDF 文件。
拿 5
我们认为这是不可能的,因为在pdflatex
复制文件时已经打开并截断了文件,导致副本包含一个换行符字节。
我们错了。
pdflatex
直到与它有关时才打开输出文件,并且在之前它不会打开它\documentclass{beamer}
(实际上,它甚至在之后也不会打开它\documentclass{article}
)。
因此,通过移动复制代码多于,\documentclass{beamer}
并通过添加\endlinechar13
以防止投影机损坏,可以复制pdf文件。
\newread\in%
\openin\in=\jobname.pdf%
\newwrite\out%
\immediate\openout\out\jobname-copy.pdf%
\endlinechar-1%
\loop \unless\ifeof\in%
\readline\in to\l%
\immediate\write\out{\l}%
\repeat%
\immediate\closeout\out%
\closein\in%
\endlinechar13%
\documentclass{beamer}
\usepackage{graphicx}
\usepackage{tikz}
\begin{document}
\begin{frame}\Huge 1\end{frame}
\end{document}
但是,复制的 PDF 已损坏,因为当\read
读取一行时,它会删除任何尾随空格,而这在本例中很重要。
采取 6
我问如何读取文件(包括尾随空格),但答案却让人失望~:
- 纯 TeX 毫无希望。
- Pdf(La)Tex 提供了
\pdffiledump
,它解决了读取问题,但是非 ASCII 字节的写入方式(当写入副本时)取决于实现。 - 使用 Lua(La)Tex 时,可以在 lua 中执行复制,但并非所有人都使用 Lua(La)Tex。
结论
因此,使用时最好的解决方案似乎\includegraphics
是手动复制 PDF,或者使用 Lua(La)Tex(这是未来,但我猜没有它“应该”那么普及,请参阅安德鲁·斯泰西 (Andrew Stacey) 的这次非常有趣的采访在 TeX.SX 的 [http://tex.blogoverflow.com/](社区博客))。
我已经提供了下面的答案一个概念证明,它重新\input
tex 文件并生成缩略图而不依赖于以前编译的 PDF,但它比版本要脆弱得多\includegraphics
。
参考
我在处理此问题时使用过/未使用过的东西的(非详尽)列表:
- 覆盖规格:
- 生成幻灯片列表:
- 创建投影仪幻灯片列表
- 如何获取当前(子)(子)部分名称:变量当前部分名称是什么?在latex-community.org
- 在框架标题、(子)(子)部分和默认字符串之间进行选择:\empty 和 @empty 有什么区别?
- 使用循环为另一个(foreach)循环生成列表
- 缩略图的对齐方式(包括其文本):https://tex.stackexchange.com/a/39601/5699
- 指向给定页面的 PDF 超链接
- 文件副本:
- 不扩展的文件复制
- 刷新 Latex 文件 io 缓冲区
- 包括二进制数据
- 如何将一个文件的内容复制到另一个文件?
- 我自己的问题:\read: 尾随空格被删除, 和二 出色的答案
\write
不可打印的 ASCII 字符保存到文件中- 我拼命尝试,想改变
\jobname
一半的时间,但它不会影响 PDF 文件名:如何影响使用 pdfLaTeX 创建的 pdf 文件的名称(从源代码内部)?
- Andrew Stacey 的采访
\tracingall
(我总是忘记这个名字!)
答案1
您可以使用宏测试\IfFileExist{filename}{then-do-this}{else-do-this}
文件是否filename
存在并做出相应响应。如果文件filename
存在,则then-do-this
执行分支,否则执行else-do-this
分支。用您自己的代码替换then-do-this
和。else-do-this
在您新给定的 MWE 中,我将删除复制文件的部分pdf
,并将构建缩略图幻灯片的部分更改为(假设您有 4 个缩略图要包含):
\IfFileExists{\jobname-copy.pdf}{%
\begin{frame}
\foreach \i in {1,...,4} {
\fbox{\includegraphics[width=0.2\linewidth, page=\i] {\jobname-copy.pdf}}
}
\end{frame}
}{\typeout{No Thumbnails included}}
现在您只需执行(您可以将其放入批处理文件中):
pdflatex myslides.tex
pdflatex myslides.tex
cp myslides.pdf myslides-copy.pdf
pdflatex myslides.tex
仅当文件存在时才会包含缩略图myslides-copy.pdf
。如果文件不存在,则myslides.tex
编译时不会包含缩略图。
更新 2:
您收到错误消息的原因
错误:PDF 文件已损坏 - 尝试重建外部参照表...
myslides.pdf
很简单:您要复制已经打开的文件来编译它。那是不可能的。因此,您必须先编译演示文稿以获取帧并关闭此文件myslides.pdf
。然后复制文件myslides.pdf
以myslides-copy.pdf
将缩略图包含myslides-copy.pdf
到新的编译文件中myslides.pdf
。
答案2
我知道这里的问题已经得到解答,但是因为我喜欢概览幻灯片的想法,所以我试图使事情变得更简单一些。
我想到了一个很小的包裹:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{display}
\IfFileExists{\jobname.pdf}{%
\immediate\write18{cp \jobname.pdf \jobname-display.pdf}}{}
\RequirePackage{tikz}
% the slide overview will be appended at the very end of the talk
\AtEndDocument{\slidedisplay}
\newcounter{display@lastpage}
% macro to insert the slide overview
\newcommand{\slidedisplay}{%
\begin{frame}[allowframebreaks,plain,bg=black]{Slide Display}
\centering
\hypertarget{slidedisplay}{}
\IfFileExists{\jobname-display.pdf}{%
\setlength{\baselineskip}{60pt}%
\setlength{\fboxsep}{0pt}%
\pdfximage{\jobname-display.pdf}%
\pgfmathsetcounter{display@lastpage}{%
min(\the\count0 - 1,\the\pdflastximagepages)}
\foreach \i in {1,...,\thedisplay@lastpage}{%
\,\hyperlink{page.\i}{%
\fbox{\includegraphics[scale=0.2,page=\i]{\jobname-display.pdf}}}\,%
\linebreak[0]%
}%
}{%
Recompile document \\
(and don't forget `\texttt{--shell-escape}')
}%
\end{frame}%
}
此方法使用 shell 命令cp
复制已编译的 PDF 文件。因此,我怀疑它能否在 Windows 下开箱即用。
正如其他答案中所述,要包含的 PDF 文件必须在修改之前进行复制。因此,必须在beamer
文档类之前加载上述包。
一个例子:
\RequirePackage{display}
\documentclass{beamer}
\title{Title of the Presentation}
\author{Author Name}
\date{Somewhere, \today}
\begin{document}
\begin{frame}[plain,t]
\titlepage
\end{frame}
\foreach \i in {1,...,15}{%
\begin{frame}{Frame \insertframenumber}
\centering
\scalebox{10.0}{%
\color{blue!60!black!60!white}\bfseries \insertframenumber%
}
\hyperlink{slidedisplay}{Go to Slide Display}
\end{frame}}
\appendix
\end{document}
编译两次并使用--shell-escape
标志(--enable-write18
我认为是针对 MikTeX)得到以下结果:
缩略图与相应页面有超链接。可以使用锚点来引用幻灯片显示本身slidedisplay
。
答案3
这是一个概念证明,表明我们不需要\includegrphics
在之前编译生成的 PDF 上使用。
此方法通过使用 来工作\input{\jobname}
,在重新定义frame
环境以生成缩放的minipage
而不是实际的帧之后。
优点
虽然它比版本脆弱得多\includegraphics
,但它具有优势缩略图幻灯片可以包含其自身的缩略图,以用户选择的任意递归级别(在 \includegraphics` 版本中,这只是一个意外,你无法真正选择极限。
限制
在目前的状态下,它可能无法与 beamer 覆盖(\only<1-3>{…}
)、框架选项(包括\begin{frame}{Frame title}…\end{frame}
和\begin{frame}[allow frame breaks]…\end{frame}
)一起使用,在两个框架之间运行时会表现不同\def
,它会遇到未设计为运行两次的代码的问题(框架编号、脚注编号、pgf 的随机……),并且在边距和对齐方面存在许多问题。
例如,下面是代码的第 10 帧:
这是第 11 帧的缩略图,在倒数第二张缩略图中,第 10 帧的图形位置不正确,并且有不同的随机圆圈:
少说话,多代码
定义一个计数器来记住将帧绘制为缩略图时的递归级别:
\ifx\recursivethumb\undefined
\def\recursivethumb{}
\newcounter{recursivethumb}
\setcounter{recursivethumb}{0}
\else
\global\addtocounter{recursivethumb}{1}
\fi
\documentclass
,\usepackage
并且\begin{document}
仅在“顶层”运行:
\ifnum\value{recursivethumb}=0
\documentclass{beamer}
\usepackage{boxedminipage}
\usepackage{geometry}
\usepackage{graphicx} % scalebox
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\fi
一些示例框架:
\begin{frame}
\Huge 1
\end{frame}%
\begin{frame}
\multiply\fboxrule by 20%
\begin{boxedminipage}{\linewidth}
\Huge 2
\end{boxedminipage}
\end{frame}%
\begin{frame}
\begin{boxedminipage}{\linewidth}
\Huge 3
\end{boxedminipage}
\end{frame}%
\begin{frame}
\Huge 4\footnote{A very long footnote, for example \lipsum[2]}
\end{frame}%
\begin{frame}
\begin{tikzpicture}
\node {\Huge 5};
\end{tikzpicture}
\end{frame}%
\begin{frame}{}
{\Huge 6}
\lipsum[2]
\end{frame}%
一些随机帧:
\foreach \i in {7,...,10} {%
\begin{frame}%
\begin{center}%
\begin{tikzpicture}%
\foreach \c in {0,...,3} {%
\pgfmathsetmacro\r{0.6*rnd+0.3}%
\pgfmathsetmacro\g{0.6*rnd+0.3}%
\pgfmathsetmacro\b{0.6*rnd+0.3}%
\definecolor{CircleColor}{rgb}{\r,\g,\b}%
\node[circle, fill=CircleColor, minimum size=rnd*2cm] at (rnd*5cm, rnd*4cm) {};%
}%
\end{tikzpicture}%
\Huge \i%
\end{center}%
\end{frame}%
}
创建一个保存框,以便在我们重新浏览\input
文档时保存这些框架:
\ifnum\value{recursivethumb}=0
\newsavebox{\mybox}%
\fi
在这里选择递归的级别数:
\ifnum\value{recursivethumb}<3% Three levels of recursion, wheeeee !
并创建一个包含缩略图的框架:
\begin{frame}%
防止换行创建新的段落:
\endlinechar-1%
备份frame
环境:
\let\oldframe=\frame%
\let\oldendframe=\endframe%
将环境替换frame
为保存框架\mybox
并输出其缩放和框架版本的环境(迷你页面会破坏所有边距和长度,因此需要重置它们以使其看起来像一个真正的框架,这里没有完全完成,脚注也不会在正确的位置)。 请参阅这个答案和这个问题,还支持叠加这应该有帮助:
\renewenvironment{frame}{%
\xdef\oldhoffset{\the\hoffset}%
\xdef\oldlinewidth{\the\linewidth}%
\xdef\oldtextwidth{\the\textwidth}
\xdef\oldcolumnwidth{\the\columnwidth}
% TODO : save other dimensions that are modified by \boxedminipage.
\endlinechar13%
\begin{lrbox}{\mybox}%
\boxedminipage{\paperwidth}%
\minipage[t][\paperheight]{\paperwidth}%
\linewidth=\oldlinewidth%
\hoffset=\oldhoffset%
\textwidth=\oldtextwidth%
\columnwidth=\oldcolumnwidth%
}{%
\endminipage%
\endboxedminipage%
\end{lrbox}%
\endlinechar-1%
\fbox{\scalebox{0.15}{\usebox{\mybox}}} %
}%
递归\input
当前文档(注意这是在\ifnum
上面的内容中,因此它不会无限循环):
\input{\jobname}%
恢复frame
环境(如果我们要在几个物理框架上布置缩略图,我认为我们必须循环“重新定义frame
/保存,缩放并显示几个帧/恢复frame
/新的物理帧”几次):
\let\frame=\oldframe%
\let\endframe=\oldendframe%
恢复换行符的行为,终止缩略图布局的物理框架,并终止\ifnum
对无限递归的保护:
\endlinechar13%
\end{frame}
\fi
\end{document}
仅当我们处于“顶层”时才插入:
\ifnum\value{recursivethumb}=0
\def\maybeenddocument{\end{document}}
\else
\addtocounter{recursivethumb}{-1}
\def\maybeenddocument{}
\fi
\maybeenddocument
参考
我在处理此问题时使用过/未使用过的东西的(非详尽)列表:
- 这是我了解到的地方
\scalebox
:如何将 Tikz 绘图和文本一起缩放? - 我自己关于如何创建
\scalebox
环境的问题:带有 \bgroup/\egroup 的 Savebox 在 beamer 中不起作用(针对环境)(我肯定需要深入研究lrbox
环境的实现) - 在多幻灯片框架中重复幻灯片的缩放版本、\savebox 和 \usebox?
- 我的一个诀窍允许
\begin{document}…\end{document}
嵌套(通常跨多个文件,alastandalone
)。
答案4
延伸至亚历克斯厄巴的方法
我已经修改了亚历克苏布拉的方法包含一些附加功能,并希望与大家分享,以防有人发现它们有用。
选项:幻灯片显示
当使用诸如 、 、 等叠加层时\pause
,\only
LaTeX\visible
会创建很多幻灯片。再加上亚历克斯布布拉的方法,这会导致多张索引幻灯片出现冗余内容。为了解决这个问题,我添加了传递要显示的幻灯片编号列表的选项。
索引编号
在做演讲时,观众经常会要求你回到“那张幻灯片上有...”的图。幻灯片索引是朝着正确方向迈出的一步,但他们可能很难表达他们正在谈论哪张幻灯片。为了解决这个问题,我在每个缩略图的左下角都加了一个数字,以便于识别它们。
重新开始编号
上述编号的问题在于,您的索引幻灯片可能看起来像这样:2、3、5、10、11、17;具体取决于哪些幻灯片有覆盖。为了解决这个问题,我声明了一个新计数器,iter
并且每次索引中显示幻灯片时都会步进计数器。这会将上面示例中的数字重置为:1、2、3、4、5、6(这对观众来说可能更合理)。
一致的间距
如果幻灯片上有超过 9 个缩略图,并且使用上述索引,则两位数幻灯片之间的空间会更大。为了解决这个问题,我使用一个if
语句并插入一个幻影“1” 占据空间。
如果有人有更好的方法,请提出建议。这是我能想到的最好的方法
当我写这篇文章时,我意识到,出于某种原因,数字不要继续在索引幻灯片 II 上,如果有人知道原因,请随意修改答案。
显示.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{display}
\RequirePackage{kvoptions}
\DeclareStringOption[{1,...,\thedisplay@lastpage}]{slides}
\ProcessKeyvalOptions*
\IfFileExists{\jobname.pdf}{%
\immediate\write18{cp \jobname.pdf \jobname-display.pdf}}{}
\RequirePackage{tikz}
% the slide overview will be appended at the very end of the talk
\AtEndDocument{\slidedisplay}
\newcounter{display@lastpage}
% macro to insert the slide overview
\newcommand{\slidedisplay}{%
\begin{frame}[allowframebreaks,plain,bg=black]{Slide Display}
\begin{center}
\hypertarget{slidedisplay}{}
\IfFileExists{\jobname-display.pdf}{%
\setlength{\baselineskip}{60pt}%
\setlength{\fboxsep}{0pt}%
\pdfximage{\jobname-display.pdf}%
\pgfmathsetcounter{display@lastpage}{%
min(\the\count0 - 1,\the\pdflastximagepages)}
\foreach \i in \display@slides{%
\,\hyperlink{page.\i}{%
\fbox{\includegraphics[scale=0.2,page=\i]{\jobname-display.pdf}}}\,%
\linebreak[0]}}%
{Recompile document \\
(and don't forget `\texttt{--shell-escape}')}
\end{center}
\end{frame}}
主文本
\RequirePackage{thumbs} % \RequirePackage[slides={2,3,5,7,10}]{display}
\documentclass{beamer}
\title{Title of the Presentation}
\author{Author Name}
\date{Somewhere, \today}
\begin{document}
\begin{frame}[plain,t]
\titlepage
\end{frame}
\foreach \i in {1,...,15}{%
\begin{frame}{Frame \insertframenumber}
\begin{center}
\scalebox{10.0}{%
\color{blue!60!black!60!white}\bfseries \insertframenumber} \\
\hyperlink{slidedisplay}{Go to Slide Display}
\end{center}
\end{frame}}
\end{document}