Как остановить матрицу tikz от прыжков в бимере

Как остановить матрицу tikz от прыжков в бимере

У меня есть ряд слайдов/переходов, показывающих одну матрицу, где я вставляю некоторые пробелы между столбцами и обвожу числа, и в какой-то момент добавляю дополнительную строку внизу. Я бы хотел, чтобы матрица оставалась на том же месте по вертикали и чтобы все элементы (которые заключены в рамки) оставались на том же месте, когда я просто обвожу число или добавляю строку внизу матрицы (см. пример, чтобы узнать, что это значит). По сути, я бы хотел, чтобы она перестала прыгать, насколько это возможно. Как это сделать?

Вот довольно длинный пример, демонстрирующий проблему:

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

решение1

Я бы нарисовал матрицу только один раз и использовал overlay-beamer-stylesдля добавления изменений. Ваша \Circledкоманда вкладывает tikzpictures, я заменил ее стилем circledи вариацией circled on, которая добавляет круг только на некоторых определенных наложениях. Например

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

обводит узел 7 только на наложениях 2, 6 и 7. Я также добавил один пример того, как можно использовать клавишу altдля изменения разделения столбцов определенных столбцов на определенных наложениях,

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

но у меня не было желания реализовать все из них.

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

введите описание изображения здесь

Как видите, больше никаких переходов и гораздо более короткий код (и, хотя вы, возможно, не обязательно так считаете, самое главное, больше никаких вложенных tikzpictures).

ПРИЛОЖЕНИЕ: Добавлена ​​дополнительная строка, которая видна только на определенных наложениях и отделена линией. Видимость контролируется

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

и

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

соответственно.

Связанный контент