Múltiples imágenes conectadas: etiquetado y relleno de página

Múltiples imágenes conectadas: etiquetado y relleno de página

Gracias a esta pregunta anterior¿Cómo conectar imágenes con flechas en Latex?

Pude crear un conjunto de imágenes conectadas por flechas. Sin embargo, tengo dos preguntas:

  • ¿Cómo etiqueto cada una de las imágenes (para hacer referencia en el texto a, por ejemplo, la figura 1.2 o 1.5)?
  • por algunas razones, la imagen generada ocupa toda la página (visualmente es más de media página) o, al menos, no se permite ningún texto en la misma página de la imagen. ¿Alguna idea sobre cómo corregir este problema?

gracias

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[lablum/.style={label=below:#1,name=img-#1},
marr/.style={line width=1mm,-latex}]
\matrix[column sep=1cm,row sep=5mm] (mat)
{ \node[lablum=1]{\includegraphics[width=3cm]{example-image-     duck}};
 & \node[lablum=2]{\includegraphics[width=3cm]{example-image-duck}};\\
\node[lablum=4]{\includegraphics[width=3cm]{example-image-duck}};
& \node[lablum=3]{\includegraphics[width=3cm]{example-image-duck}};\\
\node[lablum=5]{\includegraphics[width=3cm]{example-image-duck}};
& \node[lablum=6]{\includegraphics[width=3cm]{example-image-duck}};\\
};
\draw[marr] (img-1) -- (img-2);
\draw[marr] ([xshift=1mm]img-2.south east) coordinate (aux) 
-- (img-3.north-|aux);
\draw[marr] (img-3) -- (img-4);
\draw[marr] ([xshift=-1mm]img-4.south west) coordinate (aux) 
-- (img-5.north-|aux);
\draw[marr] (img-5) -- (img-6);
\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}
\end{document}

Respuesta1

Si quieres seguir con un matrix, puedes simplificar las cosas. Primero, usaría la opción matrix of nodes(es necesario cargar la matrixbiblioteca para esto), lo que hace que sea mucho más fácil diseñar los nodos de la matriz.

Luego, puede configurar las etiquetas automáticamente usando el figurecontador actual (y agregando 1, porque solo se actualiza una vez que \captionse escribe) y agregarle el argumento que proporciona a través de su lablumestilo.

Tenga en cuenta que ya es posible hacer referencia a los nodos de la matriz utilizando nombres de nodos específicos; por ejemplo, el primer nodo en la esquina superior izquierda de su matriz sería mat-1-1, por lo que no necesita definir sus propios nombres de nodos, pero como desea Coloca las subfiguras de manera bustrofedónica, lo mantuve a tu manera.

En cuanto a su problema de que la figura ocupa toda la página: probablemente se deba al tamaño de las subfiguras. Intenta escalarlos un poco. El siguiente ejemplo muestra que la figura debe colocarse en una página con texto si esto es posible:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\usepackage{lipsum}

\begin{document}

\lipsum[1]

\begin{figure}
\centering
\begin{tikzpicture}[
    lablum/.style={
        label=below:{\pgfmathparse{int(\thefigure+1)}\pgfmathresult.#1},
        name={img-#1},
    },
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[matrix of nodes, column sep=1cm, row sep=5mm] (mat)
{ |[lablum=1]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum=2]| \includegraphics[width=3cm]{example-image-duck} \\
  |[lablum=4]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum=3]| \includegraphics[width=3cm]{example-image-duck} \\
  |[lablum=5]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum=6]| \includegraphics[width=3cm]{example-image-duck} \\
};
\draw[marr] (img-1) -- (img-2);
\draw[marr] ([xshift=1mm]img-2.south east) coordinate (aux) 
    -- (img-3.north-|aux);
\draw[marr] (img-3) -- (img-4);
\draw[marr] ([xshift=-1mm]img-4.south west) coordinate (aux) 
    -- (img-5.north-|aux);
\draw[marr] (img-5) -- (img-6);
\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}
\end{document}

ingrese la descripción de la imagen aquí


Puedes dejar que TikZ/PGF también calcula las etiquetas de forma completamente automática (solo necesita saber de alguna manera el recuento de columnas de antemano):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
    boustrophedon matrix/.style args={#1/#2}{
        matrix of nodes,
        nodes in empty cells, 
        boustrophedon matrix column count/.initial={#2},
        boustrophedon matrix step cell counter/.code={
            \pgfmathparse{
                mod(\pgfmatrixcurrentrow, 2) == 0 ?
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * 
                    \pgfmatrixcurrentrow -
                    \pgfmatrixcurrentcolumn + 1) :
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * 
                    (\pgfmatrixcurrentrow - 1) + 
                    \pgfmatrixcurrentcolumn)
            } 
            \global\pgfkeyslet{/tikz/boustrophedon matrix cell counter}{\pgfmathresult}
        },
        execute at begin cell={
            |[boustrophedon matrix step cell counter, label={below:{
                    \pgfmathparse{int(\thefigure+1)}\pgfmathresult.%
                    \pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}
                }
            },
            name={#1-index-\pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}}]|
        },
    },
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[boustrophedon matrix={matrix one/2}, column sep=1cm, row sep=5mm]{ 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
};

\draw[marr] (matrix one-index-1) -- (matrix one-index-2);
\draw[marr] (matrix one-index-2.south east) -- (matrix one-index-3.north east);
\draw[marr] (matrix one-index-3) -- (matrix one-index-4);
\draw[marr] (matrix one-index-4.south west) -- (matrix one-index-5.north west);
\draw[marr] (matrix one-index-5) -- (matrix one-index-6);

\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}

\end{document}

ingrese la descripción de la imagen aquí

Con tres columnas:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
    boustrophedon matrix/.style args={#1/#2}{
        matrix of nodes,
        nodes in empty cells, 
        boustrophedon matrix column count/.initial={#2},
        boustrophedon matrix step cell counter/.code={
            \pgfmathparse{
                mod(\pgfmatrixcurrentrow, 2) == 0 ?
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * (\pgfmatrixcurrentrow) -
                    \pgfmatrixcurrentcolumn + 1) :
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * (\pgfmatrixcurrentrow - 1) + 
                    \pgfmatrixcurrentcolumn)
            } 
            \global\pgfkeyslet{/tikz/boustrophedon matrix cell counter}{\pgfmathresult}
        },
        execute at begin cell={
            |[boustrophedon matrix step cell counter, label={below:{
                    \pgfmathparse{int(\thefigure+1)}\pgfmathresult.%
                    \pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}
                }
            },
            name={#1-index-\pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}}]|
        },
    },
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[boustrophedon matrix={matrix two/3}, column sep=1cm, row sep=5mm]{ 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
};

\draw[marr] (matrix two-index-1) -- (matrix two-index-2);
\draw[marr] (matrix two-index-2) -- (matrix two-index-3);
\draw[marr] (matrix two-index-3.south east) -- (matrix two-index-4.north east);
\draw[marr] (matrix two-index-4) -- (matrix two-index-5);
\draw[marr] (matrix two-index-5) -- (matrix two-index-6);

\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}

\end{document}

ingrese la descripción de la imagen aquí


Hacer referencia probablemente sea más fácil usando el subcaptionpaquete, pero siempre puedes crear tus propios contadores de referencia (creé una macro \refsetcounterque se basa en \refstepcounter, pero en lugar de aumentar, el contador lo establece en un valor específico que resulta útil aquí):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\newcounter{matrix}
\newcounter{matrixnode}[matrix]
\renewcommand*{\thematrixnode}{\thematrix.\arabic{matrixnode}}

\makeatletter
\newcommand{\refsetcounter}[2]{\setcounter{#1}{#2}%
    \protected@edef\@currentlabel
       {\csname p@#1\endcsname\csname the#1\endcsname}%
}
\makeatother

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
    boustrophedon matrix/.style args={#1/#2}{
        matrix of nodes,
        nodes in empty cells, 
        boustrophedon matrix column count/.initial={#2},
        boustrophedon matrix step cell counter/.code={
            \pgfmathparse{
                mod(\pgfmatrixcurrentrow, 2) == 0 ?
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * (\pgfmatrixcurrentrow) -
                    \pgfmatrixcurrentcolumn + 1) :
                int(\pgfkeysvalueof{/tikz/boustrophedon matrix column count} * (\pgfmatrixcurrentrow - 1) + 
                    \pgfmatrixcurrentcolumn)
            } 
            \global\pgfkeyslet{/tikz/boustrophedon matrix cell counter}{\pgfmathresult}
        },
        row 1 column 1/.append style={
            execute at begin cell={
                \refstepcounter{matrix}
            }
        },
        execute at begin cell={
            |[boustrophedon matrix step cell counter, label={below:{
                    \pgfmathparse{int(\thefigure+1)}\pgfmathresult.%
                    \pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}
                    \refsetcounter{matrixnode}{\pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}}
                    \label{matrixnode:#1-\pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}}
                }
            },
            name={#1-index-\pgfkeysvalueof{/tikz/boustrophedon matrix cell counter}}]|
        },
    },
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[boustrophedon matrix={matrix two/3}, column sep=1cm, row sep=5mm]{ 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} & 
  \includegraphics[width=3cm]{example-image-duck} \\
};

\draw[marr] (matrix two-index-1) -- (matrix two-index-2);
\draw[marr] (matrix two-index-2) -- (matrix two-index-3);
\draw[marr] (matrix two-index-3.south east) -- (matrix two-index-4.north east);
\draw[marr] (matrix two-index-4) -- (matrix two-index-5);
\draw[marr] (matrix two-index-5) -- (matrix two-index-6);

\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}

See subfigure \ref{matrixnode:matrix two-1} and \ref{matrixnode:matrix two-4}.

\end{document}

ingrese la descripción de la imagen aquí

En realidad, no estoy muy seguro de lo que buscas. Si desea mantener el etiquetado y los subtítulos personalizables, tal vez algo como esto podría funcionar:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\newcounter{matrix}
\newcounter{matrixnode}[matrix]
\renewcommand*{\thematrixnode}{\thematrix.\arabic{matrixnode}}

\makeatletter
\newcommand{\refsetcounter}[2]{\setcounter{#1}{#2}%
    \protected@edef\@currentlabel
       {\csname p@#1\endcsname\csname the#1\endcsname}%
}
\makeatother

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
    my custom matrix/.style={
        matrix of nodes, 
        nodes in empty cells, 
        nodes={
            fill=red!10,
            minimum height=3.25cm,
            minimum width=3.25cm,
        },
        every label/.style={
            minimum height=0pt,
        },
        lablum/.style args={##1/##2}{
            label=below:{%
                \pgfmathparse{int(\thefigure+1)}\pgfmathresult.##1: ##2%
                \refsetcounter{matrixnode}{##1}\label{matrixnode:#1-##1}%
            },
            name={#1-index-##1},
        },
        my custom matrix initialise/.code={
            \refstepcounter{matrix}
        },
        my custom matrix initialise
    },
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[column sep=1cm, row sep=5mm, my custom matrix={mat}] { 
  |[lablum={1/my caption}]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum={2/foo}]| \includegraphics[width=3cm]{example-image-duck} \\
  |[lablum={7/bar}]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum={5/baz}]| \includegraphics[width=3cm]{example-image-duck} & 
  |[lablum={3/foo}]| \includegraphics[width=3cm]{example-image-duck} \\
};
\draw[marr] (mat-index-1) -- (mat-index-2);
\draw[marr] (mat-index-3) -- (mat-index-5);
\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}

See subfigure \ref{matrixnode:mat-1} and \ref{matrixnode:mat-5}.

\end{document}

ingrese la descripción de la imagen aquí

Agregué algo de estilo para que las celdas de la matriz tengan el mismo tamaño. Para que esto quede más claro, agregué algo de color a los nodos para mostrar, que puedes simplemente eliminar (eliminando fill=red!10).


Finalmente, las cosas pueden ser mucho más fáciles usando el subcaptionpaquete, sin embargo, no podrá colocar libremente los nodos (por ejemplo, de derecha a izquierda):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\usepackage{subcaption}

\captionsetup[subfigure]{labelformat=simple}
\DeclareCaptionSubType*{figure}
\renewcommand\thesubfigure{\thefigure.\arabic{subfigure}}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
    marr/.style={
        line width=1mm,
        -latex
    }]
\matrix[matrix of nodes, column sep=1cm, row sep=5mm] (mat) { 
  \subcaptionbox{foo\label{subfig:1-1}}{\includegraphics[width=3cm]{example-image-duck}} & 
  \subcaptionbox{bar\label{subfig:1-2}}{\includegraphics[width=3cm]{example-image-duck}} \\
  \subcaptionbox{baz\label{subfig:1-3}}{\includegraphics[width=3cm]{example-image-duck}} & 
  \subcaptionbox{foo\label{subfig:1-4}}{\includegraphics[width=3cm]{example-image-duck}} & 
  \subcaptionbox{bar\label{subfig:1-5}}{\includegraphics[width=3cm]{example-image-duck}} \\
};
\draw[marr] (mat-1-1) -- (mat-1-2);
\end{tikzpicture}
\caption{A matrix of figures.}
\label{fig:pffft}
\end{figure}

See subfigure \ref{subfig:1-1} and \ref{subfig:1-5}.

\end{document}

ingrese la descripción de la imagen aquí

información relacionada