第三次的结果

第三次的结果

我想用 beamer 做一个演示文稿,并在几个帧(在开始或结束处)中包含其他帧的缩略图,并与它们建立超链接,每张幻灯片有 4x3 或 5x4 个缩略图。

目的是允许轻松快捷地导航(只需按下键盘的homeend键,然后单击要转到的框架)。

第三次的结果

整个文件

以下代码生成的 28 帧动画版本

缩略图幻灯片

请注意,如果缩略图太多,它们将会分散到几张幻灯片中。

第 11 张幻灯片,包含第一部分缩略图

第 12 张幻灯片,包含第二部分缩略图

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%

缩略图按优先顺序标有\frametitlesusubsection标题、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/](社区博客))。

我已经提供了下面的答案一个概念证明,它重新\inputtex 文件并生成缩略图而不依赖于以前编译的 PDF,但它比版本要脆弱得多\includegraphics

参考

我在处理此问题时使用过/未使用过的东西的(非详尽)列表:

答案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.pdfmyslides-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 帧:

带有随机圆圈的 10 帧

这是第 11 帧的缩略图,在倒数第二张缩略图中,第 10 帧的图形位置不正确,并且有不同的随机圆圈:

带缩略图的第 11 帧

少说话,多代码

定义一个计数器来记住将帧绘制为缩略图时的递归级别:

\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

参考

我在处理此问题时使用过/未使用过的东西的(非详尽)列表:

答案4

延伸至亚历克斯厄巴的方法

我已经修改了亚历克苏布拉的方法包含一些附加功能,并希望与大家分享,以防有人发现它们有用。

选项:幻灯片显示

当使用诸如 、 、 等叠加层时\pause\onlyLaTeX\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}

相关内容