Draw lines inside a matrix
You can label the matrix and then use the (m-1-2)
syntax to draw. It means the first row and second column of matrix (m)
(i.e., 1-2
are indices of the entry).
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[cell/.style={rectangle,draw=black}, nodes in empty cells]
\matrix[
matrix of math nodes,
row sep =-\pgflinewidth,
column sep = -\pgflinewidth,
nodes={anchor=center, minimum width=2cm, cell},
column 1/.style = {nodes={minimum width=1cm, fill=lightgray}},
column 2/.style = {nodes={minimum width=3.2cm}},
column 3/.style = {nodes={minimum width=3.2cm}},
row 1/.style = {nodes={text height=1.3ex, text depth=0, fill=lightgray}},
row 2/.style = {text height=1.3ex, text depth=0},
row 3/.style = {text height=1.3ex, text depth=0},
row 4/.style = {text height=1.3ex, text depth=0},
](m)
{ & 1 & 2 \\
1 & \bullet & \bullet \\
2 & \bullet & \bullet \\
3 & \bullet & \bullet \\
};
\draw[-latex] (m-4-3.center) -- (m-3-2.center);
\draw[-latex] (m-4-3.center) -- (m-3-3.center);
\draw[-latex] (m-3-2.center) -- (m-2-2.center);
\draw[-latex] (m-3-3.center) -- (m-2-2.center);
\end{tikzpicture}
\end{document}
A fully automated PSTricks solution:
\documentclass{article}
\usepackage{multido}
\usepackage{pstricks}
\usepackage{xfp}
% settings
\psset{
dimen = m,
fillcolor = gray!60
}
% parameters
\def\Columns{2}
\def\ColumnWidth{3}
\def\Rows{3}
\def\RowHeight{0.7}
\begin{document}
\begin{pspicture}(\fpeval{\Columns*\ColumnWidth+1},\fpeval{(\Rows+1)*\RowHeight})
\multido{\r = 0+\RowHeight}{\fpeval{\Rows+1}}{%
\psframe[fillstyle = solid](0,\r)(1,\fpeval{\r+\RowHeight})%
}
\multido{
\rE = 0+\RowHeight,
\rF = \fpeval{0.5*\RowHeight}+\RowHeight,
\iB = \Rows+-1
}{\Rows}{%
\multido{
\rA = 1+\ColumnWidth,
\rB = \fpeval{0.5*\ColumnWidth+1}+\ColumnWidth,
\rC = \fpeval{0.5*\RowHeight}+\RowHeight,
\rD = \fpeval{1.5*\RowHeight}+-\RowHeight,
\iA = 1+1
}{\Columns}{%
\psframe[fillstyle = solid]%
(\rA,\fpeval{\Rows*\RowHeight})%
(\fpeval{\rA+\ColumnWidth},\fpeval{(\Rows+1)*\RowHeight})
\rput(\rB,\fpeval{(\Rows+0.5)*\RowHeight}){$\iA$}
\psframe(\rA,\rE)(\fpeval{\rA+\ColumnWidth},\fpeval{\rE+\RowHeight})
\rput(\rB,\rF){\psdot}}
\rput(0.5,\rF){$\iB$}}
\psline{->}(\fpeval{1+(\Columns-0.5)*\ColumnWidth},\fpeval{0.5*\RowHeight})%
(\fpeval{1+0.5*\ColumnWidth},\fpeval{(\Rows-1.5)*\RowHeight})
\psline{->}(\fpeval{1+0.5*\ColumnWidth},\fpeval{(\Rows-1.5)*\RowHeight})%
(\fpeval{1+0.5*\ColumnWidth},\fpeval{(\Rows-0.5)*\RowHeight})
\psline{->}(\fpeval{1+(\Columns-0.5)*\ColumnWidth},\fpeval{0.5*\RowHeight})%
(\fpeval{1+(\Columns-0.5)*\ColumnWidth},\fpeval{1.5*\RowHeight})
\psline{->}(\fpeval{1+(\Columns-0.5)*\ColumnWidth},\fpeval{1.5*\RowHeight})%
(\fpeval{1+0.5*\ColumnWidth},\fpeval{(\Rows-0.5)*\RowHeight})
\end{pspicture}
\end{document}
All you have to do is change the values of the parameters and the drawing will be adjusted accordingly.
Update
If you want a macro, here is how it can be done:
\documentclass{article}
\usepackage{multido}
\usepackage{pstricks}
\usepackage{xfp}
% settings
\psset{
dimen = m,
fillcolor = gray!60
}
% \Table[<cell width>,<cell height>]{<number of columns}{<number of rows>}
\def\Table[#1,#2]#3#4{%
\begin{pspicture}(\fpeval{#3*#1+1},\fpeval{(#4+1)*#2})
\multido{\r = 0+#2}{\fpeval{#4+1}}{%
\psframe[fillstyle = solid](0,\r)(1,\fpeval{\r+#2})%
}
\multido{
\rE = 0+#2,
\rF = \fpeval{0.5*#2}+#2,
\iB = #4+-1
}{#4}{%
\multido{
\rA = 1+#1,
\rB = \fpeval{0.5*#1+1}+#1,
\rC = \fpeval{0.5*#2}+#2,
\rD = \fpeval{1.5*#2}+-#2,
\iA = 1+1
}{#3}{%
\psframe[fillstyle = solid]%
(\rA,\fpeval{#4*#2})%
(\fpeval{\rA+#1},\fpeval{(#4+1)*#2})
\rput(\rB,\fpeval{(#4+0.5)*#2}){$\iA$}
\psframe(\rA,\rE)(\fpeval{\rA+#1},\fpeval{\rE+#2})
\rput(\rB,\rF){\psdot}}
\rput(0.5,\rF){$\iB$}}
\psline{->}(\fpeval{1+(#3-0.5)*#1},\fpeval{0.5*#2})%
(\fpeval{1+0.5*#1},\fpeval{(#4-1.5)*#2})
\psline{->}(\fpeval{1+0.5*#1},\fpeval{(#4-1.5)*#2})%
(\fpeval{1+0.5*#1},\fpeval{(#4-0.5)*#2})
\psline{->}(\fpeval{1+(#3-0.5)*#1},\fpeval{0.5*#2})%
(\fpeval{1+(#3-0.5)*#1},\fpeval{1.5*#2})
\psline{->}(\fpeval{1+(#3-0.5)*#1},\fpeval{1.5*#2})%
(\fpeval{1+0.5*#1},\fpeval{(#4-0.5)*#2})
\end{pspicture}}
\begin{document}
\Table[3,0.7]{2}{3}
\end{document}
\end{document}