如何在 TikZ 中的 \foreach 中跳过某个值?

如何在 TikZ 中的 \foreach 中跳过某个值?

抱歉,我问了一个非常“入门级”的问题,但在谷歌上搜索了有关如何在 TikZ 中执行条件逻辑的描述后,我没有看到一个直接而简单的答案。我看到了许多非常复杂的例子,其重点不是解释条件逻辑的用法,而是完成某些特定任务,我无法完全弄清楚获得基本 if-then-else 所必需的条件。

我正在尝试对一些浮点数进行双循环,并希望跳过\i\j都为零的特殊情况。这是一个非常简化的示例:

\foreach \i in {-3,...,3} {
  \foreach \j in {-3,...,3} {
    \node at (\i,\j) {\i+\j};
  }
}

我见过使用的示例\ifnum,但没有一个涉及执行布尔计算。这里我需要类似

\foreach \i in {-3,...,3} {
  \foreach \j in {-3,...,3} {
    \ifnum {\i!=0 \AND \j!=0} {\node at (\i,\j) {\i+\j};};
  }
}

但是我找不到关于如何正确书写否定、连词等的文档。更一般地说,如果有人知道这种 TikZ 编程入门级文档的参考资料,我将不胜感激!


如果它有价值,这里有一个更完整的示例来说明我试图做什么。以下代码会引发错误,大概是因为\i\j都为零的情况。

\begin{tikzpicture}
        \foreach \i in {-3,-2.5,...,3} {
          \foreach \j in {-3,-2.5,...,3} {
            \pgfmathsetmacro \d {2*sqrt((\i)^2+(\j)^2)};
            \draw[->] ({\i},{\j}) -- ({\i - \i/\d}, {\j-\j/\d});
          };
        };
    \end{tikzpicture}

答案1

第一个图表使用低级\ifdim,不会\d进一步评估(在这种情况下没有问题,因为它已经包含一个值)。

无需使用其他支持条件的软件包或 LaTeX3 工具,您可以使用math第二张图所示的库。(不需要\d在里面进行评估\tikzmath。)

但实际上你可以做所有事情math(第 3 张图)。

所有这些方法仅支持 16,000 范围内的数字(并且由于您\d在路径内使用,因此无论如何都会遇到麻烦),因为它使用 PGFMath,但对于“真正的”浮点数学,您将需要查看其他解决方案,例如由乌尔丽克·菲舍尔

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
\foreach \i in {-3,-2.5,...,3} {
  \foreach \j in {-3,-2.5,...,3} {
    \pgfmathsetmacro \d {2*sqrt((\i)^2+(\j)^2)};
    \unless\ifdim\d pt=0pt
      \draw[->] ({\i},{\j}) -- ({\i - \i/\d}, {\j-\j/\d});
    \fi
  }
}
\end{tikzpicture}
\begin{tikzpicture}
\foreach \i in {-3,-2.5,...,3} {
  \foreach \j in {-3,-2.5,...,3} {
    \tikzmath{
      \d = 2*sqrt((\i)^2+(\j)^2);
      if \d != 0 then {
        { \draw[->] ({\i},{\j}) -- ({\i - \i/\d}, {\j-\j/\d}); };
      };
    }
  }
}
\end{tikzpicture}
\begin{tikzpicture}
\tikzmath{
  for \i in {-3,-2.5,...,3} {
    for \j in {-3,-2.5,...,3} {
      \d = 2*sqrt((\i)^2+(\j)^2);
      if \d != 0 then {
        { \draw[->] ({\i},{\j}) -- ({\i - \i/\d}, {\j-\j/\d}); };
      };
    };
  };
}
\end{tikzpicture}
\end{document}

答案2

\documentclass[tikz]{standalone}
\ExplSyntaxOn
\cs_set_eq:NN\fpcompareTF\fp_compare:nNnTF
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
        \foreach \i in {-3,-2.5,...,3} {
          \foreach \j in {-3,-2.5,...,3} {
            \pgfmathsetmacro \d {2*sqrt((\i)^2+(\j)^2)}
            \fpcompareTF{\d}={0}{}
            {
              \draw[->] ({\i},{\j}) -- ({\i - \i/\d}, {\j-\j/\d});
            }
          }
        }
    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容