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 pgfonlayer
Umgebung 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}
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 beamer
spezifische 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 .draw
background
\only
\onslide
Ich würde dringend empfehlen, die backgrounds
Bibliothek 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}
Ein kleines Detail: \bf
ist veraltet, verwenden Sie es \textbf
für solche Zwecke.