我想迭代地“使用”列表中的元素并在 Tikz 中使用这些元素。在这种情况下,并行列表的 \foreach 不起作用。我也不需要索引功能,因为我只使用每个元素一次。换句话说,迭代可能是破坏性的。
下面是一个 MVE,它说明了这个想法。我希望将元素逐个传递为 #1,而不是节点中的“X”。列表中使用的分隔符并不重要。
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{scopes,fit,backgrounds}
\usepackage{xparse}
\NewDocumentCommand\test{m} {
\foreach \x in {1,...,3} {%
\foreach \y in {\x,...,3} {%
\node at (\x,\y) {X};% <- elements here instead of X
}}}
\begin{document}
\begin{tikzpicture}
\test{a,b,c,d,e,f}
%or: \test{a/b/c/d/e/f}
\end{tikzpicture}
\end{document}
答案1
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{scopes,fit,backgrounds}
\usepackage{xparse}
\usepackage{listofitems}
\NewDocumentCommand\test{m} {
\readlist\myarray{#1}
\foreach \x in {1,...,3} {%
\foreach \y in {\x,...,3} {%
\pgfmathtruncatemacro{\z}{3*(\x-1)+\y-ifthenelse(\x<3,\x,\x+1)+1}
\node at (\x,\y) {\myarray[\z]};% <- elements here instead of X
}}}
\begin{document}
\begin{tikzpicture}
\test{a,b,c,d,e,f}
%or: \test{a/b/c/d/e/f}
\end{tikzpicture}
\end{document}
答案2
指向listofitems
和 的指针readlist
很有用。我的代码比上面的最小示例更复杂,因此我将其与计数器和结合起来,\itemtomacro
以便能够轻松访问列表项。代码的工作原理如下:
\usepackage{listofitems}
\NewDocumentCommand\test{m} {
\readlist\valarray{#1}%
\global\newcount\mycount\mycount 0\relax%
\foreach \x in {1,...,#1} {%
\foreach \y in {\x,...,#1} {%
\global\advance\mycount 1\relax
\itemtomacro\valarray[\the\mycount]\val
... do something with \val ...
}}}