How to draw honeycomb (line of hexagon)?

enter image description here

I defined a new command \hexmult that takes 2 arguments. The first is a positive integer giving the number of rows of hexagons. The second is a comma-separated list, where each entry is of the form i;j/k. The j is the row (starting from the bottom), the i is the hexagon number (from the left), and the k is the cell contents, parsed in math mode (so the minus signs look right). You can fill as many of the cells as you like, or none by making the second argument empty.

The grid is a modification of Alain Matthes's solution here.

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

\newcommand{\hexmult}[2]{\begin{tikzpicture}[hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=1cm, draw,inner sep=0,anchor=south,rotate=30}]
\foreach \j in {1,...,#1}{%
  \foreach \i in {1,...,\j}{%
    \node[hexa] (h\i;\j) at ({(\i-\j/2)*sin(60)},{\j*0.75}) {};} } 
\begin{scope}[execute at begin node=$, execute at end node=$]
\foreach \k/\l in {#2}{\node at (h\k) {\l}; }  
\end{scope}
\end{tikzpicture}}

\begin{document}
\hexmult{4}{1;4/-1,2;4/-2,3;4/+1,4;4/-3,1;3/+2,2;3/-2,3;3/-3,1;2/-4,2;2/+6,1;1/-24}
\hexmult{3}{1;3/-1,2;3/+1,3;3/+2,2;2/+2}
\hexmult{2}{1;2/+2,2;2/-3,1;1/-6}
\end{document}

Note that you are not restricted to using numbers in the hexes. The code

\hexmult{2}{1;2/2x,2;2/-3x,1;1/-6x^2}

will produce the output:

enter image description here


Here's a way to draw your grids "by hand" using Metapost. The links in the comments show you similar approaches in tikz.

enter image description here

\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
  pair u, v;
  u = 23 right;
  v = u rotated 120;
  path gon;
  gon = for i=0 upto 5: 0.57735026919 u rotated (30 + 60i) -- endfor cycle;

  vardef mark(expr x, y, s) = 
      save p; pair p;
      p = origin shifted (x*u) shifted (y*v); 
      fill gon shifted p withcolor 7/8[blue, white];
      draw gon shifted p withcolor 3/4 blue;
      label(s, p);
  enddef;

  mark(0, 0, "$+24$");
  mark(0, 1, "$-4$");
  mark(1, 1, "$-6$");
  mark(0, 2, "$+2$");
  mark(1, 2, "$-2$");
  mark(2, 2, "$+3$");
  mark(0, 3, "$-1$");
  mark(1, 3, "$-2$");
  mark(2, 3, "$+1$");
  mark(3, 3, "$+3$");

endfig;
\end{mplibcode}
\end{document}

This is wrapped up in luamplib so compile with lualatex or adapt for plain MP or gmp package.


If you don't mind specifying the numbers backwards:

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz}
\tikzdeclarecoordinatesystem{hex}{%
 \pgfmathsetmacro\y{int(floor(sqrt(2*(#1))+0.5))}%
 \pgfmathsetmacro\x{int((\y-1)/2*\y))}%  
 \pgfpointxy{((#1)-\x-\y/2)* sin(60)}{\y*0.75}}
\tikzset{hex/.style={insert path={[every hex/.try]
  (30:1/2) \foreach \j in { 1,...,5} {-- (30+\j*60:1/2) } -- cycle 
  (0,0) node {$#1$}}}}
\begin{document}
\tikz\foreach \n [count=\i]in {+24,-4,-6,+2,-2,-3,-1,-2,+1,-3}
  \path [draw, shift=(hex cs:\i), hex=\n];
\tikz\foreach \n [count=\i]in {-6,+2,-3}
  \path [draw, shift=(hex cs:\i), hex=\n];
\tikz[every hex/.style={fill=blue!50!white!50!cyan, draw=white, text=white}]
  \foreach \n [count=\i]in {-2,+1,+3,-1,+1,+2}
    \path [draw, shift=(hex cs:\i), hex=\n];
\end{document}

enter image description here