我在使用foreach的时候遇到了以下问题:

我在使用foreach的时候遇到了以下问题:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \foreach \x in{0,0.1,...,0.5}{
       \node[] at (20*\x,0) {\x};
       }
  \end{tikzpicture}
\end{document}

在此处输入图片描述

但是,如下:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \foreach \x in{0,0.125,...,0.5}{
       \node[] at (20*\x,0) {\x};
       }
  \end{tikzpicture}
\end{document}

在此处输入图片描述

这是正常的。

答案1

欢迎来到 TeX.SE。正如评论中所说,这是一个精度问题,因为 TikZ 执行浮点计算的方式(\dimen默认情况下它使用 TeX 寄存器)。由于计算的数字是很接近到所需的精度,您只需要使用\pgfmathprintnumber以便排版将数字四舍五入到所需的精度:

\documentclass[tikz,border=1mm]{standalone}
\begin{document}
\begin{tikzpicture}
  \foreach \x in {0, 0.1, ..., 0.5} {
    \node at (20*\x, 0) {%
      \pgfmathprintnumber[fixed, precision=1]{\x}%
  };
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

底线:计算是一回事,通常并不完全准确。数字格式化是另一件\pgfmathprintnumber做得很好的事情。

答案2

除了显示数字的精度(如其他解决方案中所述)之外,还存在缺少节点的问题。在第一个 foreach 循环中,最后一个节点未显示,因为 PGF 认为下一个值大于,因此0.50003超出0.5了循环的界限。

正如 Symbol1 在评论中所说,最好在使用语法时在循环中使用整数,...以确保不会发生这种情况。这意味着坐标计算需要更改,但这很容易合并。稍微复杂一点的是计算显示的数字。这可以在节点文本本身中使用,pgfmathparse{\x/10}\pgfmathprintnumber[fixed, precision=1]{\pgfmathresult}也可以在 foreach 循环本身中完成(如果您要多次使用该数字,这会更有用)。

\documentclass{standalone}
%\url{https://tex.stackexchange.com/q/610368/86}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \foreach \x in{0,0.1,...,0.5}{
       \node[] at (20*\x,0) {\x};
       }
  \end{tikzpicture}

  \begin{tikzpicture}
    \foreach[evaluate=\x as \displayx using \x/10] \x in{0,1,...,5}{
       \node[] at (2*\x,0) {\pgfmathprintnumber[fixed, precision=1]{\displayx}};
       }
  \end{tikzpicture}
\end{document}

带显示值的循环

答案3

借用并改编了 frugon 的技术,半逻辑轴的精度

\documentclass{standalone}
\usepackage{pgfplots, tikz}
\begin{document}
\begin{tikzpicture}
    \foreach \x in{0,0.1,...,0.5}{
       \node[] at (20*\x,0) {\pgfmathprintnumber{\x}};
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容