我的最终目标是根据节点的值突出显示某些节点,而且节点数量会很多,所以我需要在 for 循环中加入条件。我尝试了以下 MWE,但它并没有达到我的预期。
本质上,我需要检查一个整数是否在整数列表中,并根据该整数绘制一个节点。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x in {10, 9,..., 0}
{
\ifcase \x10
\or5
\node[] {\x};
\fi
}
\end{tikzpicture}
\end{document}
编辑:接受答案后,重新措辞问题以提高清晰度。
答案1
\if
我正确理解了这个问题,你想检查一个数字是否等于 A、B、C 等。可以按如下方式完成。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \X in {10, 9,..., 0}
{
\pgfmathtruncatemacro{\itest}{ifthenelse(\X==5||\X==7,1,0)}
\ifnum\itest=1
\node at (\X,0) {\X};
\fi
}
\end{tikzpicture}
\end{document}
对于更广泛的应用,我建议memberQ
功能,它有朝一日可能会成为 pgf 世界的一部分,也可能不会。它测试整数是否在整数列表中。
\documentclass{article}
\usepackage{tikz}
\makeatletter
\pgfmathdeclarefunction{memberQ}{2}{%
\begingroup%
\edef\pgfutil@tmpb{0}%
\edef\pgfutil@tmpa{#2}%
\expandafter\pgfmath@member@i#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 in {10, 9,..., 0}
{
\pgfmathtruncatemacro{\itest}{memberQ({1,4,8},\X)}
\ifnum\itest=1
\node at (\X,0) {\X};
\fi
}
\end{tikzpicture}
\end{document}
答案2
\ifcase
与其他语言中的语句不同switch
,在其他语言中,您可以选择哪些值具有自己的分支。语法\ifcase
是:
\ifcase<number>
<case 0>
\or <case 1>
\or <case 2>
\or <as many as you want>
\else <other cases>
\fi
您不能跳过任何值。在您的代码中您需要:
\foreach \x in {10, 9,..., 0}
{
\ifcase\x \relax
% 0
\or % 1
\or % 2
\or % 3
\or % 4
\or % 5
\node[] {\x};
\or % 6
\or % 7
\or % 8
\or % 9
\or % 10
\else % other cases
\fi
}
这是少数情况。对于少数例外情况,您可以使用\ifnum
:
\foreach \x in {10, 9,..., 0}
{
\ifnum\x=5 \relax
\node[] {\x};
\else\ifnum\x=10 \relax
% do things with \x=10
\else
% possibly more cases
\fi\fi
}
一旦遇到多个案例,情况就会变得一团糟。
我的建议是:\int_case:nnF
。您可以单独指定每个案例,并在没有其他案例的情况下指定错误分支:
\documentclass{article}
\usepackage{tikz}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \IntCasennF \int_case:nnF
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\foreach \x in {10, 9,..., 0}
{
\IntCasennF {\x}
{
{5}{\node[] {\x};}
{10}{<Code for 10>}
}
{<Other cases>}
}
\end{tikzpicture}
\end{document}