So verhindern Sie, dass eine Tikz-Matrix in Beamer herumspringt

So verhindern Sie, dass eine Tikz-Matrix in Beamer herumspringt

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-stylesdie Änderungen hinzufügen. Ihr \CircledBefehl verschachtelt tikzpictures, ich habe ihn durch einen circledStil 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 altTaste 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}

Bildbeschreibung hier eingeben

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 tikzpictures 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.

verwandte Informationen