答案1
您已经知道矩阵维度,只有十二个节点。它们易于管理。然后您可以使用并matrix
忘记问题 ;-)foreach
ifthenelse
\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
我不会用ifthen
。pgf 会员测试可以用来实现你的条件\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}