tikz 数独型网格

tikz 数独型网格

我从 Roberto Bonvallet 那里借用了数独网格示例的代码http://www.texample.net/tikz/examples/数独/并对其进行了修改以制作不同的网格。在我的 5 x 5 网格的第一列中,我试图从上到下输入数字 3、2、1、0,然后是空白。但是,有两个空白,然后是 3、1,还有另一个空白。我不明白出了什么问题。

\documentclass{article}
\usepackage[pdftex,active,tightpage]{preview}
\usepackage{tikz}
\usepackage{mathpazo}
 \PreviewEnvironment{tikzpicture}
 %%%<
\usepackage{verbatim}
%%%>
\newcounter{row}
\newcounter{col}
\newcommand\setrow[9]{
\setcounter{col}{1}
 \foreach \n in {#1, #2, #3, #4, #5} {
 \edef\x{\value{col} - 0.5}
 \edef\y{5.5 - \value{row}}
 \node[anchor=center] at (\x, \y) {\n};
 \stepcounter{col}
 }
 \stepcounter{row}

\begin{document}
\begin{tikzpicture}[scale=.5]

\begin{scope}
\draw (0, 0) grid (5, 5);
\draw[very thin] (0, 0) grid (5, 5);
\draw[thick,->] (1,1) -- (5,1);
\draw[thick,->] (1,1) -- (1,5);
\draw[thick](1,4) --(4,4);
\draw[thick](4,1) --(4,4);
\setcounter{row}{3}
\setrow {3}{}{ }{}{ }
\setrow {2}{}{ }{}{ }
\setrow {1}{}{ }{}{ }
\setrow {0}{}{ }{}{ }
\setrow { }{0}{1}{2}{3}
\end{scope}
\end{tikzpicture}
\end{document}

答案1

存在的问题:

  • \setrow在(之后\stepcounter{row})的定义中缺少右括号。

  • 您声明了 9 个参数\setrow(来自原始代码),并且您\setrow使用 5 个参数进行调用。由于您的定义只需要 5 个参数,因此我将其更改为\newcommand\setrow[5]{...};否则,对于 9 个参数,您将不得不使用\setrow{}{}{}{}{}{}{}{}{}

  • 您需要更改设置,\setrow以便正确定位数字。更改\edef\y{5.5 - \value{row}}\edef\y{7.5 - \value{row}}

修改后的代码:

\documentclass{article}
\usepackage[pdftex,active,tightpage]{preview}
\usepackage{tikz}
\usepackage{mathpazo}
 \PreviewEnvironment{tikzpicture}
 %%%<
\usepackage{verbatim}
%%%>
\newcounter{row}
\newcounter{col}

\newcommand\setrow[5]{
  \setcounter{col}{1}
  \foreach \n in {#1, #2, #3, #4, #5} {
    \edef\x{\value{col} - 0.5}
    \edef\y{7.5 - \value{row}}
    \node[anchor=center] at (\x, \y) {\n};
    \stepcounter{col}
  }
  \stepcounter{row}
}

\begin{document}
\begin{tikzpicture}[scale=.5]

\begin{scope}
\draw (0, 0) grid (5, 5);
\draw[very thin] (0, 0) grid (5, 5);
\draw[thick,->] (1,1) -- (5,1);
\draw[thick,->] (1,1) -- (1,5);
\draw[thick](1,4) --(4,4);
\draw[thick](4,1) --(4,4);
\setcounter{row}{3}
\setrow{3}{}{ }{}{ }
\setrow {2}{}{ }{}{ }
\setrow {1}{}{ }{}{ }
\setrow {0}{}{ }{}{ }
\setrow { }{0}{1}{2}{3}
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是解决您问题的另一种方法。只要您有可以从网格坐标中计算出来的数字序列,它就可以工作。在下面的代码中,循环foreach与函数一起使用evaluate,将放置nodes在具有偏移量的相应坐标处。

如果您想使用nodes无法通过循环计算出坐标的值作为文本foreach,则可以使用foreach循环两个值(例如\foreach \x\y in {1/9,2/4,3/7} ...)。

\documentclass[tikz, border=6mm]{standalone}

\begin{document}
  \begin{tikzpicture}
    \draw (-1,-1) grid (4,4);
    \draw [<->, very thick] (0,4) |- (4,0);
    \draw [very thick] (0,3) -| (3,0);
    \foreach \x [evaluate=\x as \y using \x+.5] in {0,...,3} {
        \node at (\y,-.5) {\x};
        \node at (-.5,\y) {\x};
    }
  \end{tikzpicture}
\end{document}

渲染图像

相关内容