这两个问题已经分别回答了,使用先前命名的路径来遮蔽区域应该很有趣。 是否有可能将这两个宏合并起来?
\documentclass[tikz]{standalone}
\usetikzlibrary{intersections}
%%%% Tikz: shading region bounded by several curves
%%%% thanks to Qrrbrbirlbel
%%%% http://tex.stackexchange.com/questions/140312/tikz-shading-region-bounded-by-several-curves
\tikzset{
saveuse path/.code 2 args={
\pgfkeysalso{#1/.style={insert path={#2}}}%
\global\expandafter\let\csname pgfk@\pgfkeyscurrentpath/.@cmd%
\expandafter\endcsname
% not optimal as it is now global through out the document
\csname pgfk@\pgfkeyscurrentpath/.@cmd\endcsname
\pgfkeysalso{#1}},/pgf/math set seed/.code=\pgfmathsetseed{#1}
}
%%%% Calling a previously named path in tikz
%%%% thanks to Andrew Stacey
%%%% http://tex.stackexchange.com/questions/26382/calling-a-previously-named-path-in-tikz
\makeatletter
\tikzset{
use path for main/.code={%
\tikz@addmode{%
\expandafter\pgfsyssoftpath@setcurrentpath\csname tikz@intersect@path@name@#1\endcsname
}%
},
use path for actions/.code={%
\expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\expandafter\let\expandafter\tikz@actions@path\csname tikz@intersect@path@name@#1\endcsname}%
},
use path/.style={%
use path for main=#1,
use path for actions=#1,
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\path[name path={Rond}] (0,0) circle (.5) ;
\draw[use path=Rond] ;
\begin{scope}[overlay]
\clip[saveuse path={A}{(0,0) circle (1.5)}] [preaction={fill=red!30}] ;
\path[saveuse path={B}{(0,0) circle (1 and 2)},dashed] [draw,preaction={fill=blue!30}];
\end{scope}
\path[A,B] ;
\end{tikzpicture}
\end{document}
答案1
这里有一个高级路径保存技术show path construction
从库中使用decorations.pathreplacing
。
例如\path[save tikz path=\test] (0,0) -- (1,1);
宏之后\test
将包含(0,0) -- (1,1)
。
\documentclass[varwidth,border=7pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\tikzset{
store savedtikzpath in/.code = {\xdef#1{\savedtikzpath}},
append tikz path/.style = {
decoration={show path construction,
moveto code={\xdef\savedtikzpath{\savedtikzpath (\tikzinputsegmentfirst)}},
lineto code={\xdef\savedtikzpath{\savedtikzpath -- (\tikzinputsegmentlast)}},
curveto code={\xdef\savedtikzpath{\savedtikzpath%
.. controls (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)%
.. (\tikzinputsegmentlast)}},
closepath code={\xdef\savedtikzpath{\savedtikzpath -- cycle}}
},
decorate
},
append tikz path/.append style={postaction = {store savedtikzpath in=#1}},
append tikz path/.default = \savedtikzpath,
save tikz path/.style = {append tikz path=#1},
save tikz path/.prefix code={\xdef\savedtikzpath{}},
}
\begin{document}
\begin{tikzpicture}
\path[postaction={save tikz path=\rod},draw] (0,0) circle (.5);
\path[postaction={save tikz path=\A},fill=red!30] (0,0) circle (1.5);
\clip \A;
\path[postaction={save tikz path=\B},draw,dashed,fill=blue!30] (0,0) circle (1 and 2);
\shade[even odd rule,top color=yellow] \B \rod;
\draw[red] \rod;
\end{tikzpicture}
\end{document}
笔记:这也应该可以实现spath3
,例如这里。