每 n 帧插入一帧

每 n 帧插入一帧

我正在使用beamer它进行演示(某种程度上),并希望每隔n框架(让我们保持一般性)。作为额外的挑战,我希望这些额外的幻灯片能够不是按常规编号进行计数(尽管使用自定义计数器也许可以更好地解决这个问题?见下文)。

我尝试过的方法

我已经快要完成这个了,但我想我的方法还可以改进。

到目前为止,我一直在尝试使用everypage在每一页上进行检查,看是否应该在后面添加一张额外的幻灯片(我使用 进行检查pgf),如果是,我则用 插入一个框架afterpage

作品,但它添加了太多额外的幻灯片,因为在 10 页的演示文稿中,它会在末尾添加一张额外的幻灯片(第 10 页之后,这在技术上没有错,但不是我想要的)。此外,这意味着我需要添加包,只是为了这个(这只是因为我可以pgf免费获得beamer)!

此外,为此我一直在使用framenumber,但最好使用不同的自定义计数器(因为beamer,你知道......用途 framenumber)。

\documentclass{beamer}

\usepackage{afterpage}
\usepackage{everypage}

% Regular slide
\newcommand{\baseslide}[1]{
  \begin{frame}{\phantom{bg}}
    \begin{center}%
      \LARGE #1
    \end{center}
  \end{frame}
}

% Extra slide
\newcommand{\extraslide}{
  \baseslide{This slide was inserted}
  \addtocounter{framenumber}{-1}
}

% Modulo test using pgfmathparse
% Based on http://tex.stackexchange.com/a/15303/18982
\newcommand\modulo[4]{ 
  \begingroup
  \pgfmathsetmacro{\a}{#1}
  \pgfmathsetmacro{\b}{#2}
  \pgfmathparse{mod(\a,\b)==0} 
  \ifdim\pgfmathresult pt= 1 pt 
    #3
  \else 
    #4
  \fi 
  \endgroup
}

% At every page, check if the next should come before an inserted slide
\AddEverypageHook{
  \modulo{\value{framenumber}+1}{5}{
    % If so, add a slide after that page
    \afterpage{\extraslide}
  }{}
}

\begin{document}

\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
% Slide should go here
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
\baseslide{This is test \insertframenumber}
% But it also goes here, and it shouldn't!

\end{document}

所以,我的问题是:

  1. 有一个更好的方法吗?
  2. 我如何确保这些页面只被添加之内文档(不是第一页或最后一页)?

额外的、可能不一定有用的背景知识

我正在使用 Beamer 生成一系列幻灯片,其中包含一些文字,我可以一次向人们展示一张,以引起某些反应。在这个特定情况下,它们是录音过程中要读出的句子。

我插入的额外幻灯片是“休息”,这样我就可以让参与者(表演者?)有时间休息、喝水或做人们放松时所做的事情。

答案1

使用非答案pdftk

使用现有的解决方案(MWE),可以通过以下方法轻松删除最后的虚假幻灯片(如果存在的话)pdftk(尽管这种后期制作让我内心感到很肮脏):

pdftk "input.pdf" cat 1-r2 output "output.pdf"

另一种可能性是采取一个完整的pdftk解决方案。

我编写了这个bash脚本,它运行良好……但它会弄乱分页(当然),这样一来,在一个原本有 10 页的文件中,如果你每 5 页添加一张幻灯片,那么原本是第 6 页的页面在最终的 pdf 中就会变成第 7 页(并标记为第 7 页)。我弄乱它的全部原因framenumber首先是保持页码忽略额外的幻灯片,所以在我看来这不是真正的解决方案。但为了完整起见,这里是它:

#/bin/bash

file=$1
every=$2
out=$3

added=$(mktemp PDFXXXX.pdf)
pages=$(
  echo "$(
    pdftk "$file" dump_data |
    grep NumberOfPages   |
    cut -f2 -d" "
  )-1" | bc -l
)
n=$(echo "($pages - 1) / $every" | bc)

pdftk "$file" cat end output "$added"
pdftk "$file" cat 1-r2 output "$out"

for ((i=$n;i>0;i--)); do
  start=$(echo "($i * $every) + 1" | bc)
  end=$(echo "$start - 1" | bc)
  tmp=$(mktemp PDFXXXX.pdf)

  pdftk A="$out" B="$added" cat A1-$end B1 A$start-end output "$tmp"
  mv "$tmp" "$out"
done
rm "$added"

以 形式运行./script.sh "input.pdf" 5 "output.pdf",它将提取的最后一页input.pdf并创建一个新output.pdf文件,并将该页插入5原始文件的每一页中。

答案2

以下示例添加了幻灯片如果需要的话,可以创建一个新的框架。

  • 确保开头没有额外的帧\ifnum\value{framenumber}=0
  • 每个结构末端都无法添加额外的框架

缺点

附加框架必须使用语法\frame{},不能写成\begin{frame}


\documentclass{beamer}

\usepackage{etoolbox} 
\BeforeBeginEnvironment{frame}{
\ifnum\value{framenumber}=0
\else
    \pgfmathparse{int(mod(\value{framenumber},3))}
    \ifnum\pgfmathresult=0
        \addtocounter{framenumber}{-1}
        \frame{%
            whatever
        } 
    \fi
\fi
}


\usepackage{pgffor}
\usepackage{tikz}

\begin{document}

\foreach \i in {1,...,30} {
    \begin{frame}
        \insertframenumber
    \end{frame}
}

\end{document}

相关内容