小解释

小解释

我有很多 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-66改为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
    

解决方案

考虑到这一点,现在我们可以使用相对坐标,如此例所示:

  1. 第一个frame显示了如何重写幻灯片以使用相对覆盖规范。

  2. 该投影仪演示文稿的第二部分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-duplicateslide-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文件中,或者以任何其他您想要的方式运行它。

相关内容