-- cycle
在 TikZ 图片中,、\coordinate
s 和键的组合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)
,这样非常方便,因为你可以在不同的图片中引用相同的坐标。
当 Ti钾Z 想要构建路径,它会测试给定的输入是否是节点。如果是节点,它会将路径分解成几部分,这样路径就不会与节点重叠。另一方面,如果是坐标,它会继续路径
本次测试由
\expandafter\ifx\csname pgf@sh@ns@#2\endcsname\tikz@coordinate@text
其中#2
是corname
, 是\tikz@coordinate@text
字符串coordinate
。此测试将失败,因为\pgf@sh@ns@corname
未定义。请记住,坐标名为picnamecorname
,因此正确的是\pgf@sh@ns@picnamecorname
。
最终的结果是路径被断成了碎片,无法填充。
但是如果你先执行未命名的版本,Ti钾Z 将绘制预期的图形,并且将遵循协议。因此绘图将保持不变。
答案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
,或者不在最后位置重复第一个坐标),它的填充颜色仍然会被绘制。
根据我的实验,这肯定是coordinate
s 如何管理在其点之间画线的问题。