逐个元素地迭代使用命令参数

逐个元素地迭代使用命令参数

我想迭代地“使用”列表中的元素并在 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 ...

}}}

相关内容