\foreach 可以处理列表列表吗?

\foreach 可以处理列表列表吗?

此代码绘制了易经

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{math}
\usepackage{ifthen}

\begin{document}
\begin{tikzpicture}
\tikzset{
   hexagram/.pic={
     \foreach \d [count=\n] in {#1}{
       \ifthenelse{\d=0}
         {\draw [yshift=\n*2cm, line width=1cm, purple] (-6,0) -- (-1,0)  (1,0) -- (6,0);}
         {\draw [yshift=\n*2cm, line width=1cm, purple] (-6,0)          --         (6,0);}
     }}
}
\pic at (15,0) {hexagram = {0,0,0,0,0,0}};
\end{tikzpicture}
\end{document}

当我尝试用绘制所有剩余的 63 个卦时,foreach我得到了一个错误,好像foreach无法处理元素为列表的列表:用以下行替换

\pic at (15,0) {hexagram = {0,0,0,0,0,0}};

比如说,

\foreach [count=\n] \m in {{0, 0, 0, 0, 0, 0}, 
                           {0, 0, 0, 0, 0, 1}, 
                           {0, 0, 0, 0, 1, 0}, 
                           {0, 0, 0, 0, 1, 1}, 
                           {0, 0, 0, 1, 0, 0}, 
                           {0, 0, 0, 1, 0, 1}, 
                           {0, 0, 0, 1, 1, 0}, 
                           {0, 0, 0, 1, 1, 1}}{
\pic at (\n*15,0) {hexagram = \m};
}

我获得了

./iching2.tex:28: Missing = inserted for \ifnum. [}] ./iching2.tex:28: Missing number, treated as zero. [}]

错误。我该怎么办?

答案1

您必须去掉内部元素周围的括号,否则它们将被视为单个实体,无法进行迭代,也无法与数字进行比较。这可以通过多种方式实现,但最简单的方法是使用/.expand once处理程序。您也可以使用两次或扩展键,但最好精确扩展所需的扩展次数。

将内部 pic 命令替换为

\pic at (\n*15,0) {hexagram/.expand once = \m};

给出

在此处输入图片描述

答案2

@percusse 的回答很完美。

但如果您想继续使用{hexagram = \m}{hexagram/.expand once = \m}您可以像这样修改图片的定义:

方法一。您可以更换

\foreach \d [count=\n] in {#1}{

\edef\set{#1}   
\foreach \d [count=\n] in \set{

方法二。 (基于@percusse 的回答)您可以更换

hexagram/.pic={

pics/hexagram/.style={hexaone/.expand once=#1},
hexaone/.pic={

结果总是一样的:

在此处输入图片描述

相关内容