Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

In the following code, I would like to place the backgrounds under the numbers and not the contrary as it is the case actually.

Screenshot

enter image description here

Code

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usepackage{graphicx}

% 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},
  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}
}

% Original code-----------------------------------------------------------
% 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{
\fill[highlight] (#1-#2.north west) rectangle (#1-#2.south east);
}

\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{
\fill[highlight] (#1-1.north west) rectangle (#1-9.south east);
}

\def\highlighcolumn#1{
\fill[highlight] (1-#1.north west) rectangle (9-#1.south east);
}

\def\hintcell#1#2#3{
\node at (#1-#2) {\hintbox{#3}};
}

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

% UGLY code. Do not read :-)
\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 in {#1} {
      \ifnum\n=\m
       \node[hint] 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);
    \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}{ }

    \node[anchor=center] at (4.5, -0.5) {Unsolved Sudoku};
    \highlightcell{2}{8};
    \highlightrow{8}
    \highlighcolumn{5}
    \circlecell{5}{2}
    \crosscell{8}{1}
    \hintcell{5}{5}{2,7,8}
    \hintcell{1}{1}{3,4,6,7}
    \highlightrectangle{4}{1}{6}{3}
  \end{scope}
\end{tikzpicture}

\end{document}

The code comes from this answer

share|improve this question
1  
Look for the background library, on background and pgfonlayer in the manual. –  Daniel Jan 12 '13 at 9:28

1 Answer 1

up vote 6 down vote accepted

Use a scope with the on background layer option in each command that draws background:

enter image description here

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usepackage{graphicx}

% 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},
  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}
}

% Original code-----------------------------------------------------------
% 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\hintcell#1#2#3{
\node at (#1-#2) {\hintbox{#3}};
}

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

% UGLY code. Do not read :-)
\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 in {#1} {
      \ifnum\n=\m
       \node[hint] 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);
    \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}{ }

    \node[anchor=center] at (4.5, -0.5) {Unsolved Sudoku};
    \highlightcell{2}{8};
    \highlightrow{8}
    \highlighcolumn{5}
    \circlecell{5}{2}
    \crosscell{8}{1}
    \hintcell{5}{5}{2,7,8}
    \hintcell{1}{1}{3,4,6,7}
    \highlightrectangle{4}{1}{6}{3}
  \end{scope}
\end{tikzpicture}
\end{document}
share|improve this answer
    
I will have to learn more about TikZ. This code will be a great start for this. Thanks a lot ! –  projetmbc Jan 12 '13 at 13:50

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.