正如@Heidar 在评论中所说,我看到现在有一个用于制作共边图的包(使用 pstricks 或 tikz 绘制的拓扑量子场论图),我鼓励其他人也使用它。但我的具体问题是关于 TikZ 中某个特定的失败语法,我仍然想知道答案。
我正在编写自己的绘制共边的程序包。我想要实现的功能之一是可以选择为共边着色。实现该功能的一种方法是绘制一条连续路径,追踪共边的轮廓,例如一条裤子。
让我给你举一个我想画的东西的例子:
绘制此图的一种方法如下(保存属):
\begin{tikzpicture}[thick]
\filldraw[fill=green!25, fill opacity=0.8]
(1,2.6) .. controls (0.75,2.6) and (0.75,3.4) .. (1,3.4) ..
controls (3,3.4) and (3,4.3) .. (6,4.3) ..
controls (3.25,4.3) and (3.25,3.5) .. (6,3.5) ..
controls (4.8,3.5) and (4.8,2.5) .. (6,2.5) ..
controls (6.25,2.5) and (6.25,1.7) .. (6,1.7) ..
controls (3,1.7) and (3,2.6) .. (1,2.6);
\draw[dashed]
(1,2.6) .. controls (1.25,2.6) and (1.25,3.4) .. (1,3.4);
\draw
(6,4.3) .. controls (5.75,4.3) and (5.75,3.5) .. (6,3.5);
\draw
(6,2.5) .. controls (5.75,2.5) and (5.75,1.7) .. (6,1.7);
\end{tikzpicture}
但这并不像我希望的那样通用。首先,我希望能够有一个命令帮助我从n圈到米圆圈。我的问题是:
如何让 tikz 绘制一条连续路径来追踪共边的轮廓?
我最初尝试使用以下\foreach
命令:
\newcommand{\outline}[2]{
\pgfmathsetmacro{\in}{#1}
\pgfmathsetmacro{\out}{#2}
\pgfmathsetmacro{\intop}{2*\in - 4}
\pgfmathsetmacro{\intopp}{2*\in - 2}
% Connected piece
\draw
(0,0) .. \foreach \a in {0,2,...,\intop}{
controls (-0.25,\a) and (-0.25,\a+1) .. (0,\a+1) ..
controls (0.5,\a+1) and (0.5,\a+2) .. (0,\a+2) ..
} controls (-0.25,\intopp) and (-0.25,\intopp+1) ..
(0,\intopp+1);
}
当我尝试编译它时,我得到了! Undefined control sequence. \pgfutil@reserved@c ->\tikz@curveto@auto
。我将非常感激任何有用的建议。
答案1
答案出奇地简单。事实证明,该\foreach
命令不能出现在路径命令中的任意位置。根据实验,我的猜测是,它只能在 TikZ 寻找下一种路径类型时出现,即在坐标之后。一旦 TikZ 知道了路径类型,它就会进入另一种模式,在该模式下,它只会寻找它知道可以成为该路径一部分的那些东西。
作为一个更简单的例子,尝试:
\draw (0,0) -- \foreach \a in {0,1,...,10} {(\a,0) -- (\a,1) -- } (11,0);
这里,TikZ 在寻找坐标时遇到了\foreach
,所以它会报错。最简单的解决方案是稍微改变一下,以确保 会\foreach
在 TikZ 期望的时间出现。在婴儿的例子中,这将是:
\draw (0,0) \foreach \a in {0,1,...,10} { -- (\a,0) -- (\a,1) } -- (11,0);
对于人类来说,这些是相同的,但第二个编译(并给出一个漂亮的锯齿波)是因为 TikZ\foreach
在能够应对时遇到了它。
在您的示例中,您将拥有:
\pgfmathsetmacro{\in}{#1}
\pgfmathsetmacro{\out}{#2}
\pgfmathsetmacro{\intop}{2*\in - 4}
\pgfmathsetmacro{\intopp}{2*\in - 2}
% Connected piece
\draw
(0,0) \foreach \a in {0,2,...,\intop}{
.. controls (-0.25,\a) and (-0.25,\a+1) .. (0,\a+1) ..
controls (0.5,\a+1) and (0.5,\a+2) .. (0,\a+2)
} .. controls (-0.25,\intopp) and (-0.25,\intopp+1) ..
(0,\intopp+1);
因此,我将第一个移到了..
内部\foreach
,并将..
循环内部的最后一个移到了 外部。现在一切正常。
本回答由包裹答复团队,质量TQFT协调体系的供应商。