# Matrix with uneven element lengths

From the answer to this question

When editing the elements of the matrix to become uneven in length, the display of the matrix becomes disturbed. How can this be solved

\documentclass{beamer}
\usepackage{verbatim}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows, arrows.meta, positioning, calc, intersections, decorations.pathreplacing, decorations.pathmorphing, decorations.markings, shapes, shapes.misc, shapes.symbols, shapes.geometric, patterns, backgrounds, trees, shadows, fit,matrix}
\begin{document}
\begin{frame}[t,fragile]
\frametitle{matrix}
\begin{tikzpicture}
\matrix (x) [matrix of nodes, row sep=10pt, column sep=10pt] {%
15.1 & 23.7 & 19.7 & 15.4 & 18.3 & 23.0\\
17.4 & 18.6 & 12.9 & 20.3 & 13.7 & 21.4\\
10.3 & 26.1 & 15.718.918.9 & 14.0 & 17.8 & 33.8\\
23.2 & 12.9 & 29.8 & 18.3 & 14.2 & 20.8\\
13.5 & 17.1 & 20.7 & 27.1 & 18.918.9 & 16.6\\};
\draw<2->[ultra thick, blue, latex'-] (x-2-1) node [fill, red!40!white, circle, inner sep=8pt, opacity=.4]{} -- (x-4-5) node [fill, blue!40!white, circle, inner sep=8pt, opacity=.4]{};
% Node names: (<name of matrix>-<row>-<column>)
\foreach \i in {1,...,6}
\draw ($(x-1-\i.north west)+(-5pt,5pt)$) -- ($(x-5-\i.south west)+(-5pt,-5pt)$);%vertical lines
\foreach \i in {1,...,5}
\draw ($(x-\i-1.south west)+(-5pt,-5pt)$) -- ($(x-\i-6.south east)+(5pt,-5pt)$);%horizontal lines
\draw ($(x-1-1.north west)+(-5pt,5pt)$) -| ($(x-5-6.south east)+(5pt,-5pt)$);%upper and right borders
\end{tikzpicture}
\end{frame}
\end{document}


• marmot's code [tex.stackexchange.com/a/484608/31034] runs well for me. – ferahfeza Apr 14 '19 at 9:40
• @ferahfezaWhenthe matrix elements are lengthy, they are displayed beyond borders – Hany Apr 14 '19 at 10:17
• @ferahfezaPlease refer to this image when applying marmots code i.stack.imgur.com/aC1bQ.jpg – Hany Apr 14 '19 at 10:23
• @Hany The border is not a feature of the matrix. It is added manually. In this case, you have to find another way to draw the borders. – user156344 Apr 14 '19 at 13:49
• One can certainly add lines by fitting the nodes on both sides and drawing lines in the middle between these fits, see tex.stackexchange.com/a/443198/121799. – user121799 Apr 14 '19 at 14:25

One can use the fit library to always draw the lines between the tallest/widest matrix entries. I added a style full matrix grid which can be used as

\draw[matrix name=x,matrix cols=6,matrix rows=5,full matrix grid];


If you want to draw only a subset of vertical or horizontal lines, you can use the redefined vlines or hlines styles, which now also use fit.

\documentclass{beamer}
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,fit,matrix}
\tikzset{matrix rows/.initial=5,matrix cols/.initial=6,matrix name/.initial=x,
vline/.style={/utils/exec=\foreach \XX in {1,...,\pgfkeysvalueof{/tikz/matrix rows}}
{\ifnum\XX=1
\xdef\MatLstA{(\pgfkeysvalueof{/tikz/matrix name}-\XX-#1)}
\xdef\MatLstB{(\pgfkeysvalueof{/tikz/matrix name}-\XX-\the\numexpr1+#1\relax)}
\else
\xdef\MatLstA{\MatLstA (\pgfkeysvalueof{/tikz/matrix name}-\XX-#1)}
\xdef\MatLstB{\MatLstB (\pgfkeysvalueof{/tikz/matrix name}-\XX-\the\numexpr1+#1\relax)}
\fi},
insert path={node[fit=\MatLstA,inner sep=0pt] (fitA) {}
node[fit=\MatLstB,inner sep=0pt] (fitB) {}
($(fitA.east)!0.5!(fitB.west)$) coordinate (aux)
(\pgfkeysvalueof{/tikz/matrix name}.north-|aux) -- (\pgfkeysvalueof{/tikz/matrix name}.south-|aux)}},
hline/.style={/utils/exec=\foreach \XX in {1,...,\pgfkeysvalueof{/tikz/matrix cols}}
{\ifnum\XX=1
\xdef\MatLstA{(\pgfkeysvalueof{/tikz/matrix name}-#1-\XX)}
\xdef\MatLstB{(\pgfkeysvalueof{/tikz/matrix name}-\the\numexpr1+#1\relax-\XX)}
\else
\xdef\MatLstA{\MatLstA (\pgfkeysvalueof{/tikz/matrix name}-#1-\XX)}
\xdef\MatLstB{\MatLstB (\pgfkeysvalueof{/tikz/matrix name}-\the\numexpr1+#1\relax-\XX)}
\fi},insert path={node[fit=\MatLstA,inner sep=0pt] (fitA) {}
node[fit=\MatLstB,inner sep=0pt] (fitB) {}
($(fitA.south)!0.5!(fitB.north)$) coordinate (aux)
(\pgfkeysvalueof{/tikz/matrix name}.west|-aux) -- (\pgfkeysvalueof{/tikz/matrix
name}.east|-aux)}},
full matrix grid/.style={vline/.list={1,...,\the\numexpr\pgfkeysvalueof{/tikz/matrix
cols}-1},hline/.list={1,...,\the\numexpr\pgfkeysvalueof{/tikz/matrix rows}-1},
insert path={(\pgfkeysvalueof{/tikz/matrix name}.south west) rectangle
(\pgfkeysvalueof{/tikz/matrix name}.north east)}}}
\begin{document}
\begin{frame}[t,fragile]
\frametitle{matrix}
\begin{tikzpicture}
\matrix (x) [matrix of nodes, row sep=10pt, column sep=10pt] {%
15.1 & 23.7 & 19.7 & 15.4 & 18.3 & 23.0\\
17.4 & 18.6 & 12.9 & 20.3 & 13.7 & 21.4\\
10.3 & 26.1 & 15.718.918.9 & 14.0 & 17.8 & 33.8\\
23.2 & 12.9 & 29.8 & 18.3 & 14.2 & 20.8\\
13.5 & 17.1 & 20.7 & 27.1 & 18.918.9 & 16.6\\};
\draw<2->[ultra thick, blue, latex'-] (x-2-1) node [fill, red!40!white, circle, inner sep=8pt, opacity=.4]{} -- (x-4-5) node [fill, blue!40!white, circle, inner sep=8pt, opacity=.4]{};
% Node names: (<name of matrix>-<row>-<column>)
% \draw[vline/.list={1,...,5},hline/.list={1,...,4}] (\pgfkeysvalueof{/tikz/matrix name}.north west) rectangle
%  (\pgfkeysvalueof{/tikz/matrix name}.south east); %
\draw[matrix name=x,matrix cols=6,matrix rows=5,full matrix grid]; %

\end{tikzpicture}
\end{frame}
\end{document}


P.S. The outer lines can be drawn with draw`, too.

• @marmotThank you very much for your time and effort. I appreciate your answer very much – Hany Apr 14 '19 at 14:58