为新命令传递数组类型参数

为新命令传递数组类型参数

我环顾四周,似乎找不到任何地方,但我想知道是否有地方可以做以下事情:

\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_14_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}

在此处输入图片描述

答案3

我不知道它是否仍未记录,但有一个数学函数dim用于计算逗号分隔数组中的内容。因此,您可以使用它来分支 via \ifnum

\documentclass{article}
\usepackage{pgfmath,pgffor}
\def\loopy#1{%
  \foreach\x in#1{%
    \pgfmathdim{\x}\edef\tmp{\noindent There are \pgfmathresult{} elements.\par}\tmp%
  }
}
\begin{document}
\loopy{{{1,2},{1,2,3},{2,3,4,5}}}
\end{document}

在此处输入图片描述

相关内容