原因

原因

-- cycle在 TikZ 图片中,、\coordinates 和键的组合name(或使用括号)仅有时有效。

 \documentclass{article}
 \usepackage{tikz}
 \begin{document}
 \tikzset{
   mypic/.pic = {
     \coordinate (a) at (0,0);
     \coordinate (b) at (1,0);
     \coordinate (c) at (1,1);
     \coordinate (d) at (0,1);
     \path[draw,fill=yellow] (a) -- (b) -- (c) -- (d) -- cycle;
   },
 }
 try 1:        \tikz \pic (k)     {mypic};
 try 2:        \tikz \pic[name=l] {mypic};
 without name: \tikz \pic         {mypic};
 try 3:        \tikz \pic (m)     {mypic};
 \end{document}

给出:

第一和第二个方格是开放的,第三和第四个方格是封闭的

删除坐标并按\path[draw,fill=yellow] (0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;预期使用,所有方块均被关闭并填充。

答案1

您可以更换

\path[draw,fill=yellow] (a) -- (b) -- (c) -- (d) -- cycle;

经过

\path[draw,fill=yellow] (a.center) -- (b.center) -- (c.center) -- (d.center) -- cycle;

原因

当你尝试命名图片时(picname),Ti(cooname)Z 会以 来命名图片中的坐标(picnamecorname),这样非常方便,因为你可以在不同的图片中引用相同的坐标。

当 TiZ 想要构建路径,它会测试给定的输入是否是节点。如果是节点,它会将路径分解成几部分,这样路径就不会与节点重叠。另一方面,如果是坐标,它会继续路径

本次测试由

\expandafter\ifx\csname pgf@sh@ns@#2\endcsname\tikz@coordinate@text

其中#2corname, 是\tikz@coordinate@text字符串coordinate。此测试将失败,因为\pgf@sh@ns@corname未定义。请记住,坐标名为picnamecorname,因此正确的是\pgf@sh@ns@picnamecorname

最终的结果是路径被断成了碎片,无法填充。

但是如果你先执行未命名的版本,TiZ 将绘制预期的图形,并且将遵循协议。因此绘图将保持不变。

这可能与http://tex.stackexchange.com/questions/75146/draw-a-path-between-many-nodes-using-foreach有关

答案2

我想到最简单的解决方案是:

\documentclass{article}
\usepackage{tikz}
\begin{document}

\tikzset{
  mypic/.pic = {
    code = {
      \coordinate (a1) at (0,0);
      \coordinate (c1) at (1,1);
      \path[draw,fill=yellow] (a1) rectangle (c1);
    }
  }
}

try 1:        \tikz \pic (k)     {mypic};
try 2:        \tikz \pic[name=l] {mypic};
without name: \tikz \pic         {mypic};
try 3:        \tikz \pic (m)     {mypic};

\end{document}

不需要定义所有 4 个坐标,只需定义形成矩形的坐标。

此解决方案的主要问题是它仅适用于矩形。如果您想绘制更具体的图形,则应该使用模块shape中的其他 s shapes


与您面临的问题相关:在手册(版本 3.0.1a)的第 218 页中,它说即使您不关闭图形(不写cycle,或者不在最后位置重复第一个坐标),它的填充颜色仍然会被绘制。

根据我的实验,这肯定是coordinates 如何管理在其点之间画线的问题。

相关内容