Cómo evitar que una matriz tikz salte en el proyector

Cómo evitar que una matriz tikz salte en el proyector

Tengo una serie de diapositivas/transiciones que muestran una matriz donde inserto algunos espacios entre columnas y números de círculo y en un momento agrego una fila adicional en la parte inferior. Me gustaría que la matriz permanezca en el mismo lugar verticalmente y que todos los elementos (que están encuadrados) permanezcan en el mismo lugar cuando todo lo que hago es rodear un número o agregar una fila en la parte inferior de la matriz (ver ejemplo para qué significa esto exactamente). Básicamente, me gustaría que dejara de saltar tanto como fuera posible. ¿Cómo puedo hacer esto?

Aquí hay un ejemplo bastante largo que muestra el problema:

\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}

Respuesta1

Dibujaría la matriz solo una vez y la usaría overlay-beamer-stylespara agregar los cambios. Su \Circledcomando anida tikzpictures, lo reemplacé por un circledestilo y una variación circled onque agrega el círculo solo en algunas superposiciones específicas. P.ej

|[circled on=<{2,6,7}>]| 7

rodea el nodo 7 solo en las superposiciones 2, 6 y 7. También agregué un ejemplo de cómo se puede usar la altclave para cambiar la separación de columnas específicas en ciertas superposiciones,

alt=<2>{column 2/.style={column sep=7mm},column 3/.style={column sep=7mm}}{},

pero no tenía la pasión para implementarlos todos.

\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}

ingrese la descripción de la imagen aquí

Como puede ver, no más saltos y código mucho más corto (y, aunque no necesariamente lo vea de esta manera, lo más importante es que no más mensajes anidados tikzpicture).

APÉNDICE: Se agregó una fila adicional que solo es visible en ciertas superposiciones y está separada por una línea. La visibilidad está controlada por

row 7/.style={visible on=<4-5>},

y

\draw[visible on=<{4,5}>] (mat.west|-aux) -- (mat.east|-aux);

respectivamente.

información relacionada