Ich habe eine Reihe von Folien/Übergängen, die eine Matrix zeigen, in der ich einige Lücken zwischen Spalten und Zahlen einfüge und an einer Stelle unten eine zusätzliche Zeile hinzufüge. Ich möchte, dass die Matrix vertikal an derselben Stelle bleibt und dass alle Elemente (die eingerahmt sind) an derselben Stelle bleiben, wenn ich nur eine Zahl einkreise oder unten in der Matrix eine Zeile hinzufüge (siehe Beispiel, was das genau bedeutet). Im Grunde möchte ich, dass das Herumspringen so weit wie möglich aufhört. Wie kann ich das erreichen?
Hier ist ein ziemlich langes Beispiel, das das Problem zeigt:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, calc, matrix}
\newcommand\Circle[1]{%
\tikz[baseline=(char.base)]\node[circle,draw,inner sep=2pt] (char) {#1};}
\begin{document}
\begin{frame}[fragile]
\frametitle{title}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 & 2 & 3 & 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
8 & 4 & 5 & 6 & 6 \\
7 & 5 & 2 & 7 & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & 9 & 0 & 2 & 4 \\
};
\end{tikzpicture}
\end{center}
\begin{itemize}
\item A line of text
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{title}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 & 2 & 3 & 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
\Circle{8} & 4 & \Circle{5} & 6 & \Circle{6} \\
7 & 5 & 2 & \Circle{7} & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & \Circle{9} & 0 & 2 & 4 \\
& & & & \\
\hline \\
8 & 9 & 5 & 7 & 6 \\
};
\end{tikzpicture}
\end{center}
\begin{itemize}
\item Some text
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{title}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 &[5mm] 2 &[5mm] 3 & 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
8 & 4 & \Circle{5} & 6 & 6 \\
7 & 5 & 2 & 7 & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & 9 & 0 & 2 & 4 \\
& & & & \\
\hline \\
8 & 9 & 5 & 7 & 6 \\
};
\end{tikzpicture}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{title}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 &[5mm] 2 & 3 & 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
8 & 4 & 5 & 6 & 6 \\
7 & 5 & 2 & 7 & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & 9 & 0 & 2 & 4 \\
& & & & \\
\hline \\
8 & 9 & 5 & 7 & 6 \\
};
\end{tikzpicture}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{title}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 & 2 &[5mm] 3 &[5mm] 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
8 & 4 & 5 & 6 & 6 \\
7 & 5 & 2 & 7 & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & 9 & 0 & 2 & 4 \\
& & & & \\
\hline \\
8 & 9 & 5 & 7 & 6 \\
};
\end{tikzpicture}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{title}
\begin{overlayarea}{\linewidth}{\textheight}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
row sep=2mm,
row 1/.style={nodes={draw=none}}]
{
0 & 1 & 2 &[5mm] 3 &[5mm] 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
8 & 4 & 5 & 6 & 6 \\
7 & 5 & 2 & \Circle{7} & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & 9 & 0 & 2 & 4 \\
& & & & \\
\hline \\
8 & 9 & 5 & 7 & 6 \\
};
\end{tikzpicture}
\end{center}
\pause
\begin{itemize}
\item More text
\end{itemize}
\end{overlayarea}
\end{frame}
\end{document}
Antwort1
Ich würde die Matrix nur einmal zeichnen und overlay-beamer-styles
die Änderungen hinzufügen. Ihr \Circled
Befehl verschachtelt tikzpicture
s, ich habe ihn durch einen circled
Stil und eine Variante ersetzt circled on
, die den Kreis nur bei bestimmten Überlagerungen hinzufügt. Beispiel:
|[circled on=<{2,6,7}>]| 7
umkreist den 7. Knoten nur bei den Overlays 2, 6 und 7. Ich habe auch ein Beispiel hinzugefügt, wie Sie mit der alt
Taste die Spaltentrennung bestimmter Spalten bei bestimmten Overlays ändern können.
alt=<2>{column 2/.style={column sep=7mm},column 3/.style={column sep=7mm}}{},
Aber mir fehlte die Leidenschaft, sie alle umzusetzen.
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, calc, matrix,overlay-beamer-styles}
\tikzset{circled/.style={path picture={
\draw let \p1=($(path picture bounding box.north east)-(path picture bounding
box.south west)$),\n1={min(\x1,\y1)/2.2} in
(path picture bounding box.center) circle[radius=\n1];}},
circled on/.style={alt=#1{circled}{}}}
\begin{document}
\begin{frame}[fragile,t]
\frametitle{title}
\centering
\begin{tikzpicture}
\matrix (m) [matrix of nodes,
nodes={draw, minimum size=8mm},
column sep=3mm,
alt=<2>{column 2/.style={column sep=7mm},column 3/.style={column sep=7mm}}{},
% you need to add the other variations of the column seps here
row sep=2mm,
row 7/.style={visible on=<4-5>},
row 1/.style={nodes={draw=none}}] (mat)
{
0 & 1 & 2 & 3 & 4 \\[-3mm]
6 & 2 & 4 & 4 & 5 \\
|[circled on=<2>]| 8 & 4 & |[circled on=<{2,3}>]| 5 & 6 & |[circled on=<2>]| 6 \\
7 & 5 & 2 & |[circled on=<{2,6,7}>]| 7 & 5 \\
6 & 5 & 1 & 6 & 5 \\
5 & |[circled on=<2>]| 9 & 0 & 2 & 4 \\[2mm]
8 & 9 & 5 & 7 & 6 \\
};
\path (mat-6-1.south) -- (mat-7-1.north) coordinate[midway](aux);
\draw[visible on=<{4,5}>] (mat.west|-aux) -- (mat.east|-aux);
\end{tikzpicture}
\only<1>{\begin{itemize}
\item A line of text
\end{itemize}}
\only<2>{\begin{itemize}
\item Some text
\end{itemize}}
\only<7>{\begin{itemize}
\item More text
\end{itemize}}
\end{frame}
\end{document}
Wie Sie sehen, keine Sprünge mehr und viel kürzerer Code (und, auch wenn Sie das nicht unbedingt so sehen, vor allem keine verschachtelten tikzpicture
s mehr).
NACHTRAG: Eine zusätzliche Zeile wurde hinzugefügt, die nur auf bestimmten Overlays sichtbar ist und durch eine Linie getrennt ist. Die Sichtbarkeit wird gesteuert durch
row 7/.style={visible on=<4-5>},
Und
\draw[visible on=<{4,5}>] (mat.west|-aux) -- (mat.east|-aux);
jeweils.