我正在尝试重新排列网格内的值。例如,以下代码
\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
答案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
以获取相反顺序的数字。