我有很多 beamer/tikz 代码,每帧都有多个幻灯片。我最终得到了很多看起来像这样的代码(不是 MWE,只是一个例子):
\only<1-3>{
\node (rpctrace Message) [message, anchor=north, opacity=0] {};
}
\only<4-5>{
\node (rpctrace Message) [message, anchor=north] {};
}
\only<6>{
\node (rpctrace Message) [message, anchor=north, fill=none, dashed] {};
}
所以现在,我可能想在 5 和 6 之间添加一张新幻灯片,这样 6 就变成了 7。所以,我需要改为4-5
阅读4-6
并6
改为7
。
有什么方法可以轻松更改一大堆\only
宏的编号?
相反,有时我需要删除幻灯片并调整编号。
有任何想法吗?
答案1
在 beamer 演示文稿中已经有了一个强大的机制来实现这一点...您需要使用符号+
和.
。
有关他们的更多信息,我将推荐你参阅beamer 手册,第 9.6.4 节。
为了我们的目的,我将提供一点解释。
小解释
+
基本上,每当您在覆盖规范中写一个符号时,就像这样:<+>
一个计数器称为
beamerpauses
已更新,并添加了一个单位。计数器更新后,它+
用计数器的值替换符号beamerpauses
。<1>
如果在符号后的括号中写一个数字
+
,它会将值移动那么多。<+-+(2)>
将被取代
<1-3>
但有一个问题,即使一个规范中有多个
+
符号,它也只会更新计数器的值一次对于每个覆盖规范。(假设您始终只想添加“一个”框架)因此,您必须随后手动更新该值。
在我们的示例中,我们希望暂停持续 3 帧。因此,我们需要在
\only<>
命令完成后添加两个额外的暂停:\only<+-+(2)>{ %your code here } \addtocounter{beamerpauses}{2} %continue
解决方案
考虑到这一点,现在我们可以使用相对坐标,如此例所示:
第一个
frame
显示了如何重写幻灯片以使用相对覆盖规范。该投影仪演示文稿的第二部分
frame
展示了现在如何轻松地在幻灯片之间添加其他幻灯片,而无需重写整个框架。
接着就,随即:
\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}
\frametitle{First try}
\begin{tikzpicture}
\only<+-+(2)>{
\node {First};
}
\addtocounter{beamerpauses}{2}
\only<+-+(1)>{
\node {Second};
}
\addtocounter{beamerpauses}{1}
\only<+>{
\node {Third};
}
\end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Intermediate step}
\begin{tikzpicture}
\only<+-+(2)>{
\node {First};
}
\addtocounter{beamerpauses}{2}
\only<+-+(1)>{
\node {Second};
}
\addtocounter{beamerpauses}{1}
\only<+-+(3)>{
\node {Between second and third};
}
\addtocounter{beamerpauses}{3}
\only<+>{
\node {Third};
}
\end{tikzpicture}
\end{frame}
\end{document}
如果您有多个元素,而不仅仅是您的 tikz 图片:
如果您有多个元素,而不仅仅是 tikz 图片,并且想要对同一帧上的所有元素使用相对坐标。您可以beamerpauses
在每个“元素”开始之前将计数器更新为零。
% itemize using relative overlay... with + and the like.
\setcounter{beamerpauses}{0}
\begin{tikzpicture}
\only<+-+(2)>{
%your code here
}
\addtocounter{beamerpauses}{2}
%continue
\end{tikzpicture}
答案2
我不喜欢相对幻灯片编号的复杂性以及不断重置计数器的需要。相反,我编写了一个 GNU Emacs LISP 函数来调整使用绝对编号的宏的beamerpauses
编号。\only
此代码创建了两个新的交互式函数slide-duplicate
和slide-remove
,它们提示输入幻灯片编号,然后启动交互式搜索和替换以相应地调整编号。它仅适用于绝对编号\only
宏。
(defun slide-func (slide)
"add or remove a slide number from only macros"
(let ((mystr (match-string 0)) (start 0) value1 value2 newstr (sign (/ slide (abs slide))))
(save-match-data (while (string-match "\\([0-9]+\\)\\(-\\([0-9]+\\)?\\)?" mystr start)
(setq value1 (string-to-number (match-string 1 mystr)))
(setq value2 (cond ((match-string 3 mystr) (string-to-number (match-string 3 mystr)))
((match-string 2 mystr) 1000000)
(t value1)))
(if (> value1 (abs slide)) (setq value1 (+ value1 sign)))
(if (>= value2 (abs slide)) (setq value2 (+ value2 sign)))
(setq newstr (cond ((> value1 value2) "0")
((eq value1 value2) (format "%d" value1))
((>= value2 999999) (format "%d-" value1))
(t (format "%d-%d" value1 value2))))
(setq mystr (replace-match newstr nil nil mystr))
(setq start (+ (match-beginning 0) (length newstr)))))
mystr))
(defun slide-duplicate (slide)
"duplicate slide numbers in only macros"
(interactive "NSlide number to duplicate: ")
(query-replace-regexp "\\only<[0-9-,]+>" `(replace-eval-replacement replace-quote (slide-func ,slide))))
(defun slide-remove (slide)
"remove slide numbers from only macros"
(interactive "NSlide number to remove: ")
(query-replace-regexp "\\only<[0-9-,]+>" `(replace-eval-replacement replace-quote (slide-func ,(- slide)))))
将其复制到 emacs 中并运行eval-region
,或者将其放入您的.emacs
文件中,或者以任何其他您想要的方式运行它。