以前質問されたこの質問のおかげでLatex で矢印を使って画像を接続するにはどうすればよいですか?
矢印でつながれた画像のセットを作成することができました。しかし、2 つの質問があります。
- 各画像にラベルを付けるにはどうすればよいですか(テキスト内で図 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}
Tiに任せることができますけ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}
3 つの列がある場合:
\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}