我需要一些聪明人的帮助;)
我想用 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}