在 tikz 中使用 arrayjobx 时遇到问题 - 如何在 tikz 中使用数组?

在 tikz 中使用 arrayjobx 时遇到问题 - 如何在 tikz 中使用数组?

我需要一些聪明人的帮助;)

我想用 TikZ 画一幅图,它很大程度上基于随机化,我想让它非常参数化。它实际上是一个由 n 个节点组成的图,其中边与节点的关联基于先前节点的位置,因此可以不是只用一个 for 循环完成所有操作,这是不可能的(而且我需要独立的 x 和 y 坐标)。在我的计划中,我将 x 和 y 坐标存储在一个数组中,稍后检索数据进行计算。但我遇到了问题……

TikZ 中的数组使用有限或描述不当(如何存储/更改数据初始化?所以我使用包arrayjobx。下面是一个最小的非工作示例(从我的记忆来看,不幸的是,我的编码PC目前无法访问;但我希望您在没有100%保证可编译的示例的情况下看到问题):

\begin{tikzpicture}
\newarray\xcoord
\def \n {5}
\foreach \i in {1,...,\n}
  {
  % roll randomvalues and store them in arrays xcoord
  \pgfmathsetmacro{\xe}{rnd*10}
  \xcoord(\i)={\xe}

  \foreach \j in {1,...,\i}
  {
    % access data in second nested loop; accessing is done with \checkArrayname and \cachedata to avoid parsing errors
    \checkxcoord(\j)
    \let\xf\cachedata
    % next line is just for "debugging"
    \node[draw,circle] at (\i,\j) {\xf};
  }
}
\end{tikzpicture}

我可以在第一个循环中毫无问题地访问数据。它工作正常。但在第二个嵌套循环中,无论应该\j具有什么值,\xf都会获取 的值\xcoord(\i),而不是\xcoord(\j)。我尝试了不同的方法,使用计数器\j,使用长度参数而不是\let,等等。但结果总是一样的。

什么可能导致此行为? 你们有人知道解决方法吗?

答案1

如下任务

\xcoord{\i}={\xe}

通常\xcoord加载 \xe,而不是其价值(其价值可能会改变)。

如果你想用的值加载它\xe,那么说

\begin{tikzpicture}
\newarray\xcoord
\expandarrayelementtrue
\def \n {5}
\foreach \i in {1,...,\n}
  {
  % roll randomvalues and store them in arrays xcoord
  \pgfmathsetmacro{\xe}{rnd*10}
  \xcoord(\i)={\xe}
[...]

对条件的更改\ifexpandarrayelement将仅限于此tikzpicture(环境形成一个组)。如果arrayjobx环境中有其他任务不必遵守此设置,则在不需要扩展时将其放在或说\expandarrayelementtrue中。\foreach\expandarrayelementfalse

答案2

看起来的结果\xe没有被扩展。

\documentclass{standalone}
\usepackage{tikz,arrayjobx}

\begin{document}

\begin{tikzpicture}
\newarray\xcoord
\def \n {5}
\foreach \i in {1,...,\n}
  {
  % roll randomvalues and store them in arrays xcoord
  \pgfmathsetmacro{\xe}{rnd*10}
  \edef\temp{\noexpand\xcoord(\noexpand\i)={\xe}}\temp

  \foreach \j in {1,...,\i}
  {
    \node[draw,circle] at (2*\i,2*\j) {\xcoord(\j)};
  }
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容