下面的代码
\newcommand*{\arcthickness}{0.3}
\newcommand*{\myarc}[4]{ % x,y,radius,text
% node is positioned by splitting the arc in two parts
% see http://tex.stackexchange.com/a/76369/6255
\draw (#1,#2) arc (180:90:#3)
node[below=-1.5pt] {\tiny #4}
arc (90:0:#3)
-- ++(-\arcthickness,0) arc (0:180:#3-\arcthickness) -- cycle;
}
\begin{tikzpicture}
\myarc{0}{0}{1}{A}
\myarc{3}{0}{1}{C}
\myarc{1}{0}{1.5}{B}
\end{tikzpicture}
生产
,但我真正想要的是:
相交部分在哪里不是白色,但应该被忽略(剪裁)。原因是该图形应该适用于任何背景颜色。当然,理想情况下,它应该以通用的方式工作,即进一步应用\myarc
覆盖/剪裁先前的图形。
答案1
正如安德鲁所建议的,反向剪辑可用于:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/76409/86}
\usepackage{tikz}
\tikzset{
reverseclip/.style={
clip even odd rule,
insert path={(current page.north east) --
(current page.south east) --
(current page.south west) --
(current page.north west) --
(current page.north east)}
},
clip even odd rule/.code={\pgfseteorule}
}
\newcommand*{\reverseclip}[1]{
\begin{pgfinterruptboundingbox}
\clip[reverseclip] \againpath #1;
\end{pgfinterruptboundingbox}
}
\newcommand*{\arcthickness}{0.3}
\newcommand*{\myarc}[4]{ % x,y,radius,text
% node is positioned by splitting the arc in two parts
% (workaround until new pgf is released)
% see https://tex.stackexchange.com/a/76369/6255
\draw[save path=\arcclippath]
(#1,#2) arc (180:90:#3)
node[below=-1.5pt] {\tiny #4}
arc (90:0:#3)
-- ++(-\arcthickness,0) arc (0:180:#3-\arcthickness) -- cycle;
\reverseclip{\arcclippath}
}
\begin{document}
\begin{tikzpicture}[remember picture]
\myarc{1}{0}{1.5}{B}
\myarc{0}{0}{1}{A}
\myarc{3}{0}{1}{C}
\end{tikzpicture}
\end{document}
笔记:
需要主图片上的键
remember picture
来确保current page
伪节点正常工作。如果没有主图片上的键,它的位置不正确,因此剪辑区域就不是预期的。调试剪辑的一个好方法是将 更改\clip
为\fill
并设置fill opacity=.5
。如果没有 ,remember picture
则 所遮蔽的矩形current page
将偏移到当前图片的位置,而不是页面的位置。但是,overlay
是不必要的,因为在计算其边界框时不会使用图片的额外大块。为了避免路径重复,我们使用 TikZ 保存路径以供日后使用的功能。这是关键
save path
。要恢复它,我们使用名为 的命令\againpath
。为了让剪辑遵循 ,
even odd rule
我们必须使用一些诡计。我们不能将 放在路径本身even odd rule
上\clip
(因为这会触发 TikZ 的可怕警告),而且由于我们希望剪辑继续有效,我们不能将其放在范围内。所以我们必须直接复制 的效果。这是(现在)作为样式的一部分调用的even odd rule
键(因为它可能应该始终为这种类型的剪辑设置)。clip even odd rule
reverseclip