使用矩形打印坐标之和或不同的 ID

使用矩形打印坐标之和或不同的 ID

我正在尝试创建一些随机矩形(只需要创建 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函数使用全局变量、nodesx0和。它循环遍历节点列表,直到找到重叠或用尽已知节点。 y0bxby

  • 该语法会在使用前就地incr i增加索引变量。i

相关内容