TikZ Euclide 中 foreach 循环编译时出错

TikZ Euclide 中 foreach 循环编译时出错

为什么以下文档无法正确编译?我想要一个绘制n连续半圆的输出。对于n=4这样的输出:

在此处输入图片描述

有没有什么办法可以修复我的代码?

\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-euclide}

\begin{document}

\begin{tikzpicture}
\def \n{4}
\foreach \i in {0,...,\n}
  {
  \tkzDefPoint(2*\i/\n,0){t_\i}
  \tkzDrawPoint(t_\i)
  }

\foreach \i in {0,...,\n/2}
{
\tkzDrawArc(t_(2*\i+1),t_(2*\i+2))(t_(2*\i))
}
\end{tikzpicture}

\end{document}

这是一个无需的手动解决方案foreach

\begin{tikzpicture}
\tkzDefPoint(0,0){A0}
\tkzDefPoint(.25,0){B0}
\tkzDefPoint(.5,0){A1}  
\tkzDefPoint(.75,0){B1}  
\tkzDefPoint(1,0){A2}  
\tkzDefPoint(1.25,0){B2}  
\tkzDefPoint(1.5,0){A3}  
\tkzDefPoint(1.75,0){B3}  
\tkzDefPoint(2,0){A4}  
\tkzDrawSegments(A0,A4)
\tkzDrawArc(B0,A1)(A0)
\tkzDrawArc(B1,A2)(A1)
\tkzDrawArc(B2,A3)(A2)
\tkzDrawArc(B3,A4)(A3)
\end{tikzpicture}

答案1

有几件事是错误的。

  1. 它给出的错误是命令tkzDrawArc未定义。这通常意味着某些库尚未加载。事实上,你漏写了\usetkzobj{all},它会加载来自包的所有命令。

  2. 当你写作时\n/2,它并没有按照你的想法去做。

    \foreach命令可以使用 来编写/,它具有特殊含义......

    就我们对这个问题的意图和目的而言,我们只会说您不能在 foreach 命令本身中进行数学运算,您必须在将结果放在 foreach 结构上之前进行数学运算。

    \foreach因此,我们将使用命令在外部执行它们\pgfmathtruncatemacro,然后我们将在我们的内部使用该宏\foreach

    \pgfmathtruncatemacro\nhalf{\n/2}
    ...
    \foreach {1, ..., \nhalf}
    
  3. 括号不会折叠成进行数学运算的名称。因此,当您写入时 t_(2*\i+1),它会折叠为t_(2*0+1),这不是您定义的名称(您已定义t_1。每个字符都被视为名称的一部分)。

    这意味着我们必须再次使用相同的技巧。我们分别计算该值,然后使用它。

    \pgfmathtruncatemacro{\first}{(2*\i)}
    \pgfmathtruncatemacro{\second}{(2*\i+1)}
    \pgfmathtruncatemacro{\last}{2*\i-1}
    \tkzDrawArc(t_\first,t_\second)(t_\last)
    
  4. 存在逻辑错误:在您的示例中,遵循您的逻辑所需的最后一个点是,而您在第一个 中t_6仅定义了。本着仅最低限度地修改您的初始意图的精神,我只会添加 为止的点。t_4\foreacht_6

考虑到所有这些,这就是您可以消除这些错误的方法(我擅自添加了命令\tkzDrawLines并删除了它\tkzDrawPoint,以更好地类似于您作为示例发布的图片):

\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}

\begin{tikzpicture}
    \pgfmathtruncatemacro\n{6}
    \pgfmathtruncatemacro\nhalf{\n/2-1}
    \foreach \i in {0,...,\n}{
      \tkzDefPoint(2*\i/\n,0){t_\i}
      %\tkzDrawPoint(t_\i) % Commented out, since in your drawing there are lines, not points drawn
    };
    \tkzDrawLines(t_0,t_\n) % Drawing the line like you show in your picture


    \foreach \i in {0,...,\nhalf}
    {
    \pgfmathtruncatemacro{\first}{(2*\i+1)}
    \pgfmathtruncatemacro{\second}{(2*\i+2)}
    \pgfmathtruncatemacro{\last}{2*\i}
    \tkzDrawArc(t_\first,t_\second)(t_\last)

    }
\end{tikzpicture}

\end{document}

解决方案

答案2

Alex Recuenco 已经解释了您的代码中包含的有关使用的所有错误tkz-euclide,并且 Artificial Stupidity 提供了pstricks解决方案,因此我只需要提供一个纯粹的TikZ解决方案:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\foreach \i in {0,2,4,6}
\draw (\i,0) arc[start angle=180, end angle=0, radius=1cm];
\draw (0,0) -- (8,0);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

如果您只是想获得相同的输出而不管实现细节如何,以下是 PSTricks 解决方案。

\documentclass[pstricks,border=12pt]{standalone}
\def\N{4}
\begin{document}
\begin{pspicture}(\N,.5)
    \multips(0,0)(1,0){\N}{\pscustom{\psarc(.5,0){.5}{0}{180}\closepath}}
\end{pspicture}
\end{document}

在此处输入图片描述

相关内容