TikZ 有问题--For 循环和条件

TikZ 有问题--For 循环和条件

本质上,我想要实现的是一个由 12 个圆圈组成的网格,有三行四列。我只希望中间两列是红色,而其他两列是黑色。这是我目前的尝试,无论我做什么,结果都是红色圆圈。

\begin{tikzpicture}

\foreach \x in {0,...,3}{
    \foreach \y in {0,...,2}{
        \ifthenelse{\x in {1,2}}{
            \draw[red,fill=red] (\x,\y) circle (0.4);
        }{
            \draw (\x,\y) circle (0.4);
        }
    }
}

\end{tikzpicture}

上述 TikZ 代码的当前结果:

在此处输入图片描述

答案1

您已经知道矩阵维度,只有十二个节点。它们易于管理。然后您可以使用并matrix忘记问题 ;-)foreachifthenelse

\documentclass[border=1mm, tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes, nodes in empty cells, 
    row sep=2mm, column sep=2mm,
    nodes={circle, draw, minimum width=8mm},
    column 2/.style={nodes={red, fill=red}},
    column 3/.style={nodes={red, fill=red}},
    ]
    { &&&\\&&&\\&&&\\};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

正如@greg在评论中所说,没有所谓的\x in {1,2}测试ifthenelse

阅读完该包的文档后xifthen,您可以:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usepackage{xifthen}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0,...,3}{
    \foreach \y in {0,...,2}{
        \ifthenelse{\x > 0 \AND \x < 3}{
            \draw[red,fill=red] (\x,\y) circle (0.4);
        }{
            \draw (\x,\y) circle (0.4);
        }
    }
}
\end{tikzpicture}
\end{document}

结果是: 白色和红色光盘

答案3

我不会用ifthenpgf 会员测试可以用来实现你的条件\x in {1,2}

\documentclass[tikz,border=3mm]{standalone}
\makeatletter
\pgfmathdeclarefunction{memberQ}{2}{%
  \begingroup%
    \edef\pgfutil@tmpb{0}%
    \edef\pgfutil@tmpa{#2}%
    \expandafter\pgfmath@member@i\pgfutil@firstofone#1\pgfmath@token@stop
    \edef\pgfmathresult{\pgfutil@tmpb}%
    \pgfmath@smuggleone\pgfmathresult%
  \endgroup}
\def\pgfmath@member@i#1{%
    \ifx\pgfmath@token@stop#1%
    \else
      \ifnum#1=\pgfutil@tmpa\relax%
      \gdef\pgfutil@tmpb{1}%
      %\typeout{#1=\pgfutil@tmpa}
      \fi%
      \expandafter\pgfmath@member@i
    \fi}
\makeatother
\begin{document}
\begin{tikzpicture}

\foreach \x [evaluate=\x as \isMember using {int(memberQ({1,2},\x))}] in {0,...,3}{
    \foreach \y in {0,...,2}{
        \draw \ifnum\isMember=1
        [red,fill=red]
        \fi (\x,\y) circle[radius=0.4cm];
    }
}
\end{tikzpicture}
\end{document}

此会员测试有效除非列表的最后一项具有子结构。 函数也存在类似的限制dim,该函数内置于 中pgf,但手册中未提及,大概就是出于这个原因。但是,只要您有普通列表,和 都memberQ可以dim正常工作。(建议的具有更广泛代码的替代方案也有缺点,有时甚至更严重,我希望提出这些方案的人也能提到它们。)

正如你所见,一个普通的事物\ifnum可以被构建到路径中。

\draw \ifnum\itest=1
    [red,fill=red]
    \fi (\x,\y) circle[radius=0.4cm];

然后你只需要画一条路径。你也可以使用常规方法ifthenelse代替memberQ函数。

\documentclass[tikz,border=3mm]{standalone}

\begin{document}
\begin{tikzpicture}

\foreach \x [evaluate=\x as \itest using {int(ifthenelse(\x>0 && \x <3,1,0))}] in {0,...,3}{
    \foreach \y in {0,...,2}{
        \draw \ifnum\itest=1
        [red,fill=red]
        \fi (\x,\y) circle[radius=0.4cm];
    }
}
\end{tikzpicture}
\end{document}

在这种情况下,你甚至不必使用,你可以简单地使用截断结果evaluate的事实,\numexpr

\documentclass[tikz,border=3mm]{standalone}

\begin{document}
\begin{tikzpicture}

\foreach \x  in {0,...,3}{
    \foreach \y in {0,...,2}{
        \draw \ifnum\the\numexpr\x/2\relax=1
        [red,fill=red]
        \fi (\x,\y) circle[radius=0.4cm];
    }
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

没有这样的测试\ifthenelse。但是,您可以使用不同的实现,请参阅https://tex.stackexchange.com/a/467527/4427

\documentclass{article}
\usepackage{xparse}
\usepackage{tikz} % for the application

\ExplSyntaxOn
\NewExpandableDocumentCommand{\xifthenelse}{mmm}
 {
  \bool_if:nTF { #1 } { #2 } { #3 }
 }

\cs_new_eq:NN \numtest     \int_compare_p:n
\cs_new_eq:NN \oddtest     \int_if_odd_p:n
\cs_new_eq:NN \fptest      \fp_compare_p:n
\cs_new_eq:NN \dimtest     \dim_compare_p:n
\cs_new_eq:NN \deftest     \cs_if_exist_p:N
\cs_new_eq:NN \namedeftest \cs_if_exist_p:c
\cs_new_eq:NN \eqdeftest   \token_if_eq_meaning_p:NN
\cs_new_eq:NN \streqtest   \str_if_eq_p:ee
\cs_new_eq:NN \emptytest   \tl_if_blank_p:n
\prg_new_conditional:Nnn \xxifthen_legacy_conditional:n { p,T,F,TF }
 {
  \use:c { if#1 } \prg_return_true: \else: \prg_return_false: \fi:
 }
\cs_new_eq:NN \boolean \xxifthen_legacy_conditional_p:n
\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}

\foreach \x in {0,...,3}{
    \foreach \y in {0,...,2}{
        \xifthenelse{\numtest{1 <= \x <= 2}}{
            \draw[red,fill=red] (\x,\y) circle (0.4);
        }{
            \draw (\x,\y) circle (0.4);
        }
    }
}

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容