Несколько связанных изображений: маркировка и заполнение страницы

Несколько связанных изображений: маркировка и заполнение страницы

Благодаря этому ранее заданному вопросуКак соединить изображения со стрелками в Latex?

Мне удалось создать набор изображений, связанных стрелками. Однако у меня есть два вопроса:

  • как мне подписать каждое из изображений (чтобы сослаться в тексте, например, на рисунок 1.2 или 1.5)
  • по каким-то причинам сгенерированное изображение заполняет всю страницу (визуально это больше полстраницы) или, по крайней мере, на той же странице изображения не допускается текст. Есть идеи, как исправить эту проблему?

Спасибо

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

решение1

Если вы хотите придерживаться matrix, вы можете упростить вещи. Во-первых, я бы использовал опцию matrix of nodes(для этого вам нужно загрузить библиотеку matrix), что значительно упрощает стилизацию узлов матрицы.

Затем вы можете автоматически задать метки, используя текущий figureсчетчик (и прибавляя к нему 1, поскольку он обновляется только после \captionнабора текста) и добавить к нему аргумент, который вы указываете через свой lablumстиль.

Обратите внимание, что ссылаться на узлы матрицы можно, используя конкретные имена узлов, например, первый узел в верхнем левом углу вашей матрицы будет mat-1-1, поэтому вам не нужно определять собственные имена узлов, но поскольку вы хотите разместить подфигуры в бустрофедонической манере, я оставил все как есть.

Что касается вашей проблемы с тем, что рисунок заполняет всю страницу: Вероятно, это связано с размером подрисунков. Попробуйте немного их масштабировать. В примере ниже показано, что рисунок следует разместить на странице с текстом, если это возможно:

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

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


Ты можешь позволить ТикZ/PGF также полностью автоматически рассчитывает метки для вас (вам нужно только заранее каким-то образом указать количество столбцов):

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

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

С тремя столбцами:

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

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


Ссылаться, вероятно, проще с помощью subcaptionпакета, но вы всегда можете создать свои собственные счетчики ссылок (я создал макрос \refsetcounter, который основан на \refstepcounter, но вместо увеличения счетчика устанавливает его на определенное значение, что здесь очень удобно):

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

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

На самом деле, я не совсем уверен, что вы ищете. Если вы хотите сохранить возможность настраивать маркировку и субтитры, возможно, что-то вроде этого подойдет:

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

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

Я добавил немного стиля, чтобы ячейки матрицы имели одинаковый размер. Чтобы сделать это более понятным, я добавил немного цвета к узлам, которые можно просто удалить (удалив fill=red!10).


Наконец, все может быть намного проще с использованием subcaptionпакета, однако вы не сможете легко и свободно располагать узлы (например, справа налево):

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

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

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