我有以下代码,正在尝试更好地理解它:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{figure}[htb]
\begin{tikzpicture}
\def\firstcircle{ (-1,0) circle (2cm) }
\def\secondcircle{ (1,0) circle (2cm) }
\begin{scope}
\clip \firstcircle;
\fill[red!50!white] \secondcircle;
\end{scope}
\begin{scope}
\begin{scope}[even odd rule]
\clip \secondcircle (-3,-3) rectangle (3,3);
\fill[blue!50!white] \firstcircle;
\end{scope}
\end{scope}
\end{tikzpicture}
\end{figure}
\end{document}
这将绘制一个有两个圆圈的维恩图。第一个scope
环境会剪掉第一个圆圈,然后将第一个圆圈中属于第二个圆圈的所有内容都涂成红色。这样对吗?
第二个scope
让我感到困惑。我不明白为什么我需要同时输入\secondcircle
和(-3,3) rectangle (3,3)
。为什么这会对第一个圆圈中的内容产生阴影效果,而第二个圆圈中没有的内容?
答案1
第二条\clip
命令包含两个不同的封闭路径,第二个是圆形,第二个是矩形,比当前绘图区域稍大。表示even odd rule
如果某个区域被一个、三个、五个……区域(奇数)覆盖,则该区域位于剪切结果路径内。否则,如果某个区域未被覆盖,被两个、四个……区域(偶数)覆盖,则该区域被排除在外。
在这种情况下,除第二个圆形之外的整个矩形都在第二种情况的剪切区域中。
pgf手动的对规则的解释略有不同(可能更精确一些,但也更复杂一些)。可以在“15.5 填充路径”下的“15.5.2 图形参数:内部规则”小节中找到。
问题中的例子可以进一步细化:
- 嵌套
scope
环境不是必需的。 - 可以使用 的尺寸来替换矩形的神奇数字
current bounding box
。 - 选项
overlay
从边界框计算中删除第二个圆和矩形,只保留第一个圆。\fbox
可视化固定边界框。
完整示例:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{figure}[htb]
% Check bounding box with \fbox
\setlength{\fboxsep}{0pt}
\fbox{\begin{tikzpicture}
\def\firstcircle{ (-1,0) circle (2cm) }
\def\secondcircle{ (1,0) circle (2cm) }
\begin{scope}
\clip \firstcircle;
\fill[red!50!white, overlay] \secondcircle;
\end{scope}
\begin{scope}[even odd rule, overlay]
\clip
\secondcircle
(current bounding box.south west) rectangle
(current bounding box.north east)
;
\fill[blue!50!white] \firstcircle;
\end{scope}
\end{tikzpicture}}
\end{figure}
\end{document}