使用两个循环在网格内打印

使用两个循环在网格内打印

我正在尝试重新排列网格内的值。例如,以下代码

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

\begin{document}

\tikz\draw grid(4,4)foreach[count=~]\l in{1,...,16}  
{({.5+mod(~-1,4},{3.5-div(~-1,4})node{\l}}; 

\end{document}

给出一个 4*4 的网格,其中每个框都有一个从 1 到 16 的数字。例如:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

我怎样才能用两个for 循环这样网格就变成

1  2  2   1
3  4  4   3
3  4  4   3
1  2  2   1

对于 8 行 8 列,每个象限应从 1 开始并以 16 结束。

    1  2  3  4     4  3  2  1  
    5  6  7  8     8  7  6  5  
    9  10 11 12    12 11 10 9
    13 14 15 16    16 15 14 13

    13 14 15 16    16 15 14 13  
    9  10 11 12    12 11 10 9
    5  6  7   8    8  7  6  5
    1  2  3   4    4  3  2  1

另外,我怎样才能在网格内打印,例如-

a=1  a=2  a=2   a=1
a=3  a=4  a=4   a=3
a=3  a=4  a=4   a=3
a=1  a=2  a=2   a=1

我正在尝试构建对 x 行和 y 列(而不是 4 行和 4 列)有效的通用代码。

我发现上面的代码来自这里

答案1

以下是如何获得双循环的方法,在第一个循环的foreach表达式中添加第二个循环。{...}foreach

示例输出

\documentclass{article}

\usepackage{tikz}

\begin{document}

\tikz\draw grid(4,4) foreach \x  in {1,...,4}
  { foreach[evaluate={\z = int((\x*(5-\x)/2+\y*(5-\y))-5)}] \y in {1,...,4}
  {({.5+(\x-1)},{4.5-\y}) node{$a = \z$}}};

\end{document}

要更改打印的值,只需调整语句\z中的公式即可evaluate。请注意,这里使用了,这样就不会显示 int小数答案等。1.0

这是您的新模式规范的一个版本,其中变量\n\m(偶数)给出列和行的总数量,以及一个\s存储尺寸的变量,用于缩放框大小以使内容适合:

示例输出

\documentclass{article}

\usepackage{tikz}

\begin{document}

\def\n{6}
\def\m{8}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach[evaluate] \x  in {1,...,\n}
  { foreach[evaluate={\z = int(min(\x,\n+1-\x)+\n*min(\y-1,\m-\y)/2)}] \y in {1,...,\m}
  {({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};

\end{document}

答案2

\documentclass[tikz,border=7mm]{standalone} 
\begin{document}
\tikz\draw grid(4,4)foreach
    [evaluate={\x=.5+mod(\l-1,4);\y=3.5-div(\l-1,4);\z=int(5-(\x-2)^2/2-(\y-2)^2)}]
    \l in{1,...,16}{(\x,\y)node{$a=\z$}};
\end{document}

答案3

像这样?(现在我已经纠正了对称性……)

在此处输入图片描述

我用以下方法制作了它元帖子代码,包裹在luamplib. 用 编译lualatex

\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
    numeric u, v, N; N = 2; 
    u = 14mm; v = 9mm;
    for i=0 upto 3:
        for j=0 upto N-1:
            for k=0 upto N-1:
                label("$a=" & decimal (N**2-(k+N*j)) & "$", 
                      (k+2/3,j+2/3) xscaled u yscaled v
                      if (i mod 3) > 0: reflectedabout(up,down) fi
                      if i > 1: reflectedabout(left,right) fi
                );
            endfor
        endfor
    endfor
endfig;
\end{mplibcode}
\end{document}

如果你设置N=4上述内容,你将获得:

在此处输入图片描述

等等...

在此处输入图片描述

label这些值由三个循环中间的 生成。具体来说decimal (N**2-(k+N*j)),生成一个值为 的字符串N^2-(k+N*j)——如果您想要不同的数字,您可以调整此公式。因此,要获取从a=1中间开始的数字,您可以将公式更改为decimal (1+k+N*j)

如果您希望数字按其他顺序排列,那么您可以(例如)交换坐标中的j和的值k以获取列优先序列,或从中减去它们N以获取相反顺序的数字。

相关内容