我正在使用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}
所以,我的问题是:
- 有一个更好的方法吗?
- 我如何确保这些页面只被添加之内文档(不是第一页或最后一页)?
额外的、可能不一定有用的背景知识
我正在使用 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}