我正在尝试创建一些随机矩形(只需要创建 9-10 个矩形,而不是随机创建),然后尝试在每个矩形上打印不同的数字。我是 Latex 新手,无法实现。
\begin{tikzpicture}
\foreach \i in {0,...,2}
\foreach \j in {0,...,2}
\node [small-node] (n-\i\j) at (\i + 0.50*rand + 1,\j + 0.50*rand + 1) {$n\i\j}}$};
\end{tikzpicture}
我正在尝试打印 n_1、.. n_10。但这是打印 i 和 j 的连接,我尝试过\value{}
然后添加但没有成功。谢谢。
答案1
一种可能的(纯 TikZ)解决方案是计算渐进数3 * \j + \i + 1
:
\documentclass{beamer}
\usepackage{tikz}
\tikzset{%
small-node/.style = {draw, rectangle},
}
\begin{document}
\begin{frame}
\begin{center}
\begin{tikzpicture}
\foreach \i in {0,...,2}
\foreach \j [evaluate=\j as \prog (initially 0) using int(3 * \j + \i + 1)] in {0,...,2}
\node [small-node] (n-\i\j) at (\i + 0.50*rand + 1,\j + 0.50*rand + 1) {$n\prog$};
\end{tikzpicture}
\end{center}
\end{frame}
\end{document}
PS = 我已经使用了,beamer
因为您将它作为标签(在 Torbjørn T. 编辑之前)并且我发明了这种small-node
风格:下次,请发布完整的 MWE,而不仅仅是代码片段。
答案2
您可以定义一个新的计数器,并在每次经过内循环时将其增加 1。\arabic{countername}
将该值打印为阿拉伯数字。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\newcounter{rectanglecount}
\foreach \i in {0,...,2}
\foreach \j in {0,...,2}
{
\stepcounter{rectanglecount}
\node [draw] (n-\i\j) at (\i + 0.50*rand + 1,\j + 0.50*rand + 1) {$n_{\arabic{rectanglecount}}$};
}
\end{tikzpicture}
\end{document}
\i
如果您想要和的总和\j
,您需要告诉 LaTeX 以某种方式计算该总和,例如如下所示。请注意,\pgfmathtruncatemacro
结果是整数,而\pgfmathsetmacro
您将得到一个带有小数的数字。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\newcounter{rectanglecount}
\foreach \i in {0,...,2}
\foreach \j in {0,...,2}
{
% save result of \i +\j in \tmpval, as integer
\pgfmathtruncatemacro{\tmpval}{\i+\j}
\node [draw] (n-\i\j) at (\i + 0.50*rand + 1,\j + 0.50*rand + 1) {$n_{\tmpval}$};
}
\end{tikzpicture}
\end{document}
答案3
以下是使用替代绘图方法的版本:元帖子包裹在luamplib
。使用 进行编译lualatex
,点击链接获取有关这些工具的更多信息。
我已经包含了一个非常简单的“无重叠”例程。
\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef no_overlaps =
save i; i = 0;
save overlaps; boolean overlaps; overlaps := false;
forever:
exitif not known nodes[incr i];
overlaps := (xpart nodes[i] < x0 + bx) and (x0 - bx < xpart nodes[i])
and (ypart nodes[i] < y0 + by) and (y0 - by < ypart nodes[i]);
exitif overlaps;
endfor
not overlaps
enddef;
beginfig(1);
pair nodes[];
numeric N, s, bx, by;
N = 15; s = 42; bx = 21; by = 13;
for n=1 upto N:
forever:
x0 := s * normaldeviate;
y0 := s * normaldeviate;
exitif no_overlaps;
endfor
draw unitsquare shifted (-1/2,-1/2) xscaled bx yscaled by shifted z0;
label("$n_{" & decimal n & "}$", z0);
nodes[n] := z0;
endfor
endfig;
\end{mplibcode}
\end{document}
笔记
变量:
nodes[]
是已经选择的对的列表;N
要绘制的框的数量;s
比例因子;bx
以及by
要绘制的框的尺寸。请注意,简单的 MP 允许我们将其写为(其中 0 是任何有效的)
z0
的简写。(x0,y0)
suffix
主要部分的内部循环选择随机坐标直到没有重叠,使用
normaldeviate
返回介于 -4 和 4 之间的实数的原语,通常分布在零附近。然后在所选对处绘制一个框,并将该对添加到
nodes[]
列表中。该
no_overlaps
函数使用全局变量、nodes
、x0
和。它循环遍历节点列表,直到找到重叠或用尽已知节点。y0
bx
by
该语法会在使用前就地
incr i
增加索引变量。i