Wie kann ich dafür sorgen, dass pgfonlayer in onslide ordnungsgemäß funktioniert?

Wie kann ich dafür sorgen, dass pgfonlayer in onslide ordnungsgemäß funktioniert?

Ich versuche, mit Onslide verschiedene Bildelemente zu gruppieren und zu steuern, wann und wie lange sie auf der Folie erscheinen. Gleichzeitig versuche ich, mit pgfonlayer sicherzustellen, dass einige Dinge „unter“ anderen Dingen gezeichnet werden, um die richtige Okklusion sicherzustellen.

Ich denke, sie sollten völlig unabhängig voneinander sein, aber ich stelle fest, dass, wenn ich Elemente in die pgfonlayer-Umgebung einfüge (die sich innerhalb des Onslide befindet), alle Elemente in derselben pgf-Hintergrundebene in etwas Äquivalentes zu onslide<1-> eingefügt werden. Fast so, als würde der pgfonlayer die Wirkung des Onslide aufheben.

Um genauer zu sein, könnte ich so etwas haben (hier ist eine Skizze des Problems – A, B, C, D sind echte Grafiken, nicht nur Buchstaben):

\onslide<1>{
B
\begin{pgfonlayer}{bg}
A % A should be occluded by B
\end{pgfonlayer}
}

\onslide<2>{
D
\begin{pgfonlayer}{bg}
C % C should be occluded by D
\end{pgfonlayer}
}

und ich erhalte den Effekt, dass A und C immer sichtbar sind.

Gibt es eine einfache Möglichkeit, dies zu beheben? Für jede Hilfe wäre ich sehr dankbar.

Danke,

Ambrosius

p.s. Hier ist ein vollständiges Quellcodebeispiel:

\documentclass[10pt]{beamer}
\title{onslide vs pgfonlayer}
\author[My Team]{My Name}
\date{\today}
\usepackage{tikz}
\begin{document}

\begin{frame}[t]
  \frametitle{First using pgfonlayer only -- works.}

  On this first slide the light colors are on top, even though they are
  drawn before the darker colors.  {\bf pgfonlayer} is used to achieve
  this.

  \pgfdeclarelayer{bg}
  \pgfsetlayers{bg,main}

  \begin{figure}
    \begin{tikzpicture}
      \draw[fill=blue!10] (0,1) circle (1cm);
      \begin{pgfonlayer}{bg}
        \draw[fill=blue] (0,0) circle (1cm);
      \end{pgfonlayer}
      \draw[fill=red!10] (3,1) circle (1cm);
      \begin{pgfonlayer}{bg}
        \draw[fill=red] (3,0) circle (1cm);
      \end{pgfonlayer}
    \end{tikzpicture}
  \end{figure}

\end{frame}


\begin{frame}[t]
  \frametitle{Next, adding onslide -- fails.}
  On this second slide I attempt to use {\bf onslide} to show only one
  side at a time.  First the blues then the reds.
  \pgfdeclarelayer{bg}
  \pgfsetlayers{bg,main}

  \begin{figure}
    \begin{tikzpicture}
      \onslide<1>{
        \draw[fill=blue!10] (0,1) circle (1cm);
        \begin{pgfonlayer}{bg}
          \draw[fill=blue] (0,0) circle (1cm);
        \end{pgfonlayer}
      }
      \onslide<2>{
        \draw[fill=red!10] (3,1) circle (1cm);
        \begin{pgfonlayer}{bg}
          \draw[fill=red] (3,0) circle (1cm);
        \end{pgfonlayer}
      }

    \end{tikzpicture}
  \end{figure}

  First we see light blue with both dark colors, ...\pause and then we
  see light red with both dark colors.  It seems that because I put the
  darker colors into the bg layer, the onslide groupings I put around
  each basic color do not work

\end{frame}
\end{document}

Antwort1

Sie haben Recht: Die pgfonlayerUmgebung hebt die Wirkung des auf \onslide!

Eine Problemumgehung:

\documentclass[10pt]{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}[t]
  \frametitle{pgfonlayer and onslide...}
  \pgfdeclarelayer{bg}
  \pgfsetlayers{bg,main}
  \begin{figure}
    \begin{tikzpicture}
      \onslide<1>{
        \draw[fill=blue!10] (0,1) circle (1cm);
        \begin{pgfonlayer}{bg}
          \onslide<1>{
            \draw[fill=blue] (0,0) circle (1cm);
          }
        \end{pgfonlayer}
      }
      \onslide<2>{
        \draw[fill=red!10] (3,1) circle (1cm);
        \begin{pgfonlayer}{bg}
          \onslide<2>{
            \draw[fill=red] (3,0) circle (1cm);
          }
        \end{pgfonlayer}
      }
    \end{tikzpicture}
  \end{figure}
\end{frame}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ich denke, dies ist einer der Fälle, in denen es zu Missverständnissen zwischen und TikZ kommt. Die einfachste Lösung besteht darin, den Befehlen auf der Ebene beamerspezifische Overlay-Spezifikationen hinzuzufügen, wodurch die Overlay-Spezifikation zu einem wird (wenn ich mich nicht irre). Es wird also absichtlich angewiesen, das zu entfernen, was auf dieser Folie passiert ist, im Gegensatz zu .drawbackground\only\onslide

Ich würde dringend empfehlen, die backgroundsBibliothek von TikZ zu verwenden, die genau auf diese Aufgabe zugeschnitten ist. Ich weiß nicht genau, was sie alles macht, aber es ist am besten, TikZ die Ebenenbildung zu überlassen, wenn wir nur am Hintergrund interessiert sind.

\documentclass[10pt]{beamer}
\title{onslide vs pgfonlayer}
\author[My Team]{My Name}
\date{\today}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}

\begin{frame}[t]{First using pgfonlayer only -- works.}

  On this first slide the light colors are on top, even though they are
  drawn before the darker colors.  \textbf{pgfonlayer} is used to achieve
  this.


  \begin{figure}
    \begin{tikzpicture}
      \draw[fill=blue!10] (0,1) circle (1cm);
    \begin{scope}[on background layer]  
    \draw[fill=blue] (0,0) circle (1cm);
    \end{scope}
      \draw[fill=red!10] (3,1) circle (1cm);
        \begin{scope}[on background layer] 
      \draw[fill=red] (3,0) circle (1cm);
        \end{scope}
    \end{tikzpicture}
  \end{figure}

\end{frame}


\begin{frame}[t]{Next, adding onslide -- fails.}
    On this second slide the light colors are on top, even though they are
  drawn before the darker colors.  \textbf{pgfonlayer} is used to achieve
  this.

  \begin{figure}
    \begin{tikzpicture}
      \onslide<1>{
        \draw[fill=blue!10] (0,1) circle (1cm);
        \begin{scope}[on background layer] 
        \draw<1>[fill=blue] (0,0) circle (1cm);
        \end{scope}
      }
      \onslide<2>{
        \draw[fill=red!10] (3,1) circle (1cm);
        \begin{scope}[on background layer] 
        \draw<2>[fill=red] (3,0) circle (1cm);
        \end{scope}
      }

    \end{tikzpicture}
  \end{figure}

  First \pause and second
\end{frame}
\end{document}

Bildbeschreibung hier eingeben

Ein kleines Detail: \bfist veraltet, verwenden Sie es \textbffür solche Zwecke.

verwandte Informationen