我从 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}