我环顾四周,似乎找不到任何地方,但我想知道是否有地方可以做以下事情:
\newcommand{\loopy}[1]{
\begin{tikzpicture}
\foreach \x in #1 {
\foreach \y in \x {
\node at (\y_1,\y_2);
}
}
\end{tikzpicture}
}
\loopy{{{1,2},{2,3}}}
然后“loopy”命令将遍历并绘制 (1,2) 和 (2,3) 处的节点。我不确定这是否可行,或者您将如何去做?
此外,有没有办法查看数字中的元素数量?假设我传入
\loopy{{{1,2,3},{2,3}}}
有没有办法知道第一个集合有 3 个元素,第二个集合有 2 个?
编辑(添加更多描述)
上面的例子过于简单,所以我将举一个更“复杂”的例子来展示我想要做的事情:
\newcommand{\loopy}[1]{
\begin{tikzpicture}
\foreach \x in #1 {
\if \x has 2 elements {
\foreach \y in \x {
\node at (\y_1,\y_2);
}
}
\else if \x has 3 elements {
\foreach \y in \x {
\node at (\y_1,\y_2) {\y_3};
}
}
\else if \x has 4 elements {
\foreach \y in \x {
\node at (\y_1,\y_2);
\node at (\y_3,\y_4);
}
}
}
\end{tikzpicture}
}
\loopy{{{1,2},{1,2,3},{2,3,4,5}}}
答案1
这个问题似乎有点定义不明确,但确实可以以嵌套的方式解析一般列表,并根据每个连续的 rank-1 列表的列表长度执行不同的操作。这里
\loopy{1,2: 2,3,7: 2,4,4,5}
会将 a 放置2
在位置 (1,2),因为它是一个 2 元素列表。它会将 a 放置3_7
在位置 (2,3),因为7
是列表中从坐标 (2,3) 开始的第三个元素。最后,它会将 和 放置4_1
在4_2
(2,4) 和 (4,5),因为 4 元素列表以 开始2,4
并以 结束4,5
。
\documentclass{article}
\usepackage{listofitems,tikz}
\newcommand{\loopy}[1]{%
\setsepchar{:/,}%
\readlist\mylist{#1}%
\begin{tikzpicture}
\foreachitem\x\in\mylist[]{%
\ifnum\listlen\mylist[\xcnt]=2\relax
\node at (\mylist[\xcnt,1],\mylist[\xcnt,2]){$2$};
\else
\ifnum\listlen\mylist[\xcnt]=3\relax
\node at (\mylist[\xcnt,1],\mylist[\xcnt,2]){$3_{\mylist[\xcnt,3]}$};
\else
\ifnum\listlen\mylist[\xcnt]=4\relax
\node at (\mylist[\xcnt,1],\mylist[\xcnt,2]){$4_1$};
\node at (\mylist[\xcnt,3],\mylist[\xcnt,2]){$4_2$};
\fi
\fi
\fi
}
\end{tikzpicture}
}
\begin{document}
\loopy{1,2: 2,3,7: 2,4,4,5}
\end{document}
答案2
这是一个“低级”的解决方案。
我\def\switch#1,#2,#3,#4,#5;{...}
使用类似 来定义调用哪个\switch1,2,3,,,,;
,它将参数设置#4
为空(并且#5
为,,
)。因此我们可以通过 来检查只有 3 个参数\ifx,#4,<executed when #4 is empty>\else...\fi
。
完整代码如下:
\documentclass[tikz,border=7pt]{standalone}
\def\switch#1,#2,#3,#4,#5;{
\ifx,#2,\node[green] at (#1,1) {one variable : #1};\else
\ifx,#3,\node[red] at (#1,#2) {two variables: #1,#2};\else
\ifx,#4,\node[blue] at (#2,#3) {three variables: #1,#2,#3};\else
\draw[orange] (#1,#2) -- node[sloped, above]{four variables:#1,#2,#3,#4} (#3,#4);
\fi\fi\fi
}
\newcommand*{\loopy}[1]{
\begin{tikzpicture}
\foreach \x in {#1} {
\expandafter\switch\x,,,,;
}
\end{tikzpicture}
}
\begin{document}
\loopy{{1},{1,2},{1,2,3},{-1,3,4,5}}
\end{document}