为什么以下文档无法正确编译?我想要一个绘制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
有几件事是错误的。
它给出的错误是命令
tkzDrawArc
未定义。这通常意味着某些库尚未加载。事实上,你漏写了\usetkzobj{all}
,它会加载来自包的所有命令。当你写作时
\n/2
,它并没有按照你的想法去做。该
\foreach
命令可以使用 来编写/
,它具有特殊含义......就我们对这个问题的意图和目的而言,我们只会说您不能在 foreach 命令本身中进行数学运算,您必须在将结果放在 foreach 结构上之前进行数学运算。
\foreach
因此,我们将使用命令在外部执行它们\pgfmathtruncatemacro
,然后我们将在我们的内部使用该宏\foreach
。\pgfmathtruncatemacro\nhalf{\n/2} ... \foreach {1, ..., \nhalf}
括号不会折叠成进行数学运算的名称。因此,当您写入时
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)
存在逻辑错误:在您的示例中,遵循您的逻辑所需的最后一个点是,而您在第一个 中
t_6
仅定义了。本着仅最低限度地修改您的初始意图的精神,我只会添加 为止的点。t_4
\foreach
t_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}