检查数字是否在数字列表中

检查数字是否在数字列表中

我的最终目标是根据节点的值突出显示某些节点​​,而且节点数量会很多,所以我需要在 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}

相关内容