2

I am trying to draw Sudokus with Latex and this works so far quite well, but when I explain some strategies it is hard to follow without any labeling on the side and on the top.

I would like to have a pre-column from A to I and a pre-row from 1 to 9 at the top of the Sudoku Grid.

In the end, the left and top side should be labeled like this:

enter image description here

The code i am currently using is from Sudoku - Special Styles for hints (Answer)

I would be very happy if someone could help me, because I have not made it so far.

Have a nice day everyone. :)

2
  • You can add the precolumn and the row above by replacing \draw (0, 0) grid (9, 9); by \draw (-1, 0) grid (9, 9); \draw (0, 9) grid (9, 10); . But this will clash with the labels you also want. Do you have the labels inside or outside the extra column and/or row?
    – user121799
    Dec 23, 2018 at 14:08
  • It was meant exactly how you solved it in your solution underneath. Thank you very much, helped me a lot :)
    – finwes
    Dec 23, 2018 at 15:58

1 Answer 1

4

It is fairly easy to add the labels.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,shapes}
\usepackage{xstring}

% Some customizable styles
\tikzset {
    highlight/.style = {
        yellow,
        opacity = 0.3
    },
    digit/.style = {
        minimum height = 5mm,
        minimum width = 5mm,
        anchor = center
    },
    circle/.style = {
        draw = green!80!black,
        dotted,
        very thick
    },
    circle number/.style = {
        draw = #1,
        very thick
    },
    cross/.style = {
        red,
        opacity = .5,
        shorten >= 1mm,
        shorten <= 1mm,
        very thick,
        line cap = round
    },
    hint/.style = {
        blue,
        font = \sf,
        minimum width = 3mm,
        minimum height = 3mm,
    },
    hint special/.style = {
        blue,
        font = \sf,
        minimum width = 3mm,
        minimum height = 3mm,
        fill=red!20,
        inner sep=0pt,
    },
    hint border/.style = {
        blue,
        font = \sf,
        minimum width = 2mm,
        minimum height = 3mm,
        inner sep=0pt, outer sep=0pt,
        draw=red, thick,
        rounded corners=1pt,
    }
}

% Modified the \node to give a unique name to each one, which is the
% row number, a dash and the column number. E.g: 1-1, 4-5, etc.
\newcounter{row}
\newcounter{col}

\newcommand\setrow[9]{
    \setcounter{col}{1}
    \foreach \n in {#1, #2, #3, #4, #5, #6, #7, #8, #9} {
        \edef\x{\value{col} - 0.5}
        \edef\y{9.5 - \value{row}}
        \node[digit,name={\arabic{row}-\arabic{col}}] at (\x, \y) {\n};
        \stepcounter{col}
    }
    \stepcounter{row}
}

% New code -------------------------------------------------------------
\def\highlightcell#1#2{
    \begin{scope}[on background layer]
        \fill[highlight] (#1-#2.north west) rectangle (#1-#2.south east);
    \end{scope}
}

\def\circlecell#1#2{
    \draw[circle] (#1-#2) circle(4mm);
}

\def\crosscell#1#2{
    \draw[cross] (#1-#2.north west) -- (#1-#2.south east);
    \draw[cross] (#1-#2.north east) -- (#1-#2.south west);
}

\def\highlightrow#1{
    \begin{scope}[on background layer]
        \fill[highlight] (#1-1.north west) rectangle (#1-9.south east);
    \end{scope}
}

\def\highlighcolumn#1{
    \begin{scope}[on background layer]
        \fill[highlight] (1-#1.north west) rectangle (9-#1.south east);
    \end{scope}
}

\def\highlightrectangle#1#2#3#4{
    \begin{scope}[on background layer]
        \fill[highlight] (#1-#2.north west) rectangle (#3-#4.south east);
    \end{scope}
}

\def\hintcell#1#2#3{
    \node at (#1-#2) {\hintbox{#3}};
}
%    \def\hintcellSpecial#1#2#3{
%        \node  [hint special] at (#1-#2) {\hintbox{#3}};
%    }
%    \def\hintcellBorder#1#2#3{
%        \node  [hint border] at (#1-#2) {\hintbox{#3}};
%    }

% Command to circle numbers:
% #1: optional -> circle color
% #2: mandatory -> cell identifier
% #3: mandatory -> name of the cell
\newcommand\circlenumber[3][red!80!black]{
    \draw[circle number=#1, radius=5mm] (#2) circle node[outer sep=1mm] (#3){};
}


% UGLY code. Do not read :-)
%  Sorry, it needed to be read to obtain solution :-)
\def\hintbox#1{
    \resizebox{4.5mm}{4.5mm}{%
        \tikz[scale=0.3]{%
            \def\auxc{0}
            \foreach \m in {1,...,9} {
                \pgfmathparse{mod(\auxc,3)}
                \xdef\x{\pgfmathresult}
                \pgfmathparse{-floor(\auxc/3)}
                \xdef\y{\pgfmathresult}
                \xdef\hintprinted{0}
                \foreach \n/\Style in {#1} {
                    \ifnum\n=\m
                        \IfStrEqCase{\Style}{%
                            {}{\node[hint] at (\x,\y) {\n};}                                
                            {\n}{\node[hint] at (\x,\y) {\n};}
                            {border}{\node[hint border] at (\x,\y) {\n};}                           
                            {special}{\node[hint special] at (\x,\y) {\n};}
                        }
                        \xdef\hintprinted{1}
                    \fi
                }
                \ifnum\hintprinted=0
                    \node[hint, opacity=0.1] at (\x,\y) {\m};
                \fi
                \pgfmathparse{\auxc+1}
                \xdef\auxc{\pgfmathresult}
            }
        }%
    }
}


\begin{document}

\begin{tikzpicture}[scale=.5]
    \begin{scope}
        \draw (0, 0) grid (9, 9);
        \foreach \X [count=\Y] in {A,...,I}
        {\node[anchor=south east] at (0,9-\Y) {\Y};
        \node[anchor=south west] at (\Y-1,9) {\X};
        }
        \draw[very thick, scale=3] (0, 0) grid (3, 3);

        \setcounter{row}{1}
        \setrow { }{2}{ }  {5}{ }{1}  { }{9}{ }
        \setrow {8}{ }{ }  {2}{ }{3}  { }{ }{6}
        \setrow { }{3}{ }  { }{6}{ }  { }{7}{ }

        \setrow { }{ }{1}  { }{ }{ }  {6}{ }{ }
        \setrow {5}{4}{ }  { }{ }{ }  { }{1}{9}
        \setrow { }{ }{2}  { }{ }{ }  {7}{ }{ }

        \setrow { }{9}{ }  { }{3}{ }  { }{8}{ }
        \setrow {2}{ }{ }  {8}{ }{4}  { }{ }{7}
        \setrow { }{1}{ }  {9}{ }{7}  { }{6}{ }

        \hintcell{5}{5}{2,7/special,8/border}
        \hintcell{1}{1}{3/border,4,6/special,7}

    \end{scope}
\end{tikzpicture}

\end{document}

enter image description here

Or, if you want the labels more centered, use

    \foreach \X [count=\Y] in {A,...,I}
    {\node[anchor=east] at (0,9-\Y+0.5) {\Y};
    \node[anchor=south] at (\Y-0.5,9) {\X};
    }

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .