Tikz:由几条具有先前命名的路径的曲线包围的阴影区域

Tikz:由几条具有先前命名的路径的曲线包围的阴影区域

这两个问题已经分别回答了,使用先前命名的路径来遮蔽区域应该很有趣。 是否有可能将这两个宏合并起来?

在此处输入图片描述

\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,例如这里

相关内容