在回复中关于阴影的问题,建议使用该backgrounds
库,以便一个对象的阴影不会与之前绘制的另一个对象重叠。
如果我正确理解了文档,我必须将on background layer
其作为选项传递给scope
,而不是path
。另一方面, apreaction
在内部构造一个范围(根据文档)。
是否可以更改由 内部构建的范围的选项preaction
?如何更改?如果不能,对 TikZ 的增强将以优雅的方式解决“重叠阴影”问题。
答案1
令我惊讶的是,问题的答案TikZ 中的“Z 级别”似乎适用于前置操作和后置操作。这是一个相当简单的例子。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/46957/86}
\usepackage{tikz}
\pgfdeclarelayer{back}
\pgfsetlayers{back,main}
\makeatletter
\pgfkeys{%
/tikz/on layer/.code={
\pgfonlayer{#1}\begingroup
\aftergroup\endpgfonlayer
\aftergroup\endgroup
},
/tikz/node on layer/.code={
\pgfonlayer{#1}\begingroup
\expandafter\def\expandafter\tikz@node@finish\expandafter{\expandafter\endgroup\expandafter\endpgfonlayer\tikz@node@finish}%
},
}
\begin{document}
\begin{tikzpicture}
\draw[line width=1cm,red] (2,1) -- (2,-1);
\draw[ultra thick,white,preaction={on layer=back,line width=1cm,blue,draw}] (0,0) -- (4,0);
\draw[line width=1cm,red] (2,-2) -- (2,-4);
\draw[ultra thick,white,postaction={on layer=back,line width=1cm,blue,draw}] (0,-3) -- (4,-3);
\begin{scope}[xshift=5cm]
\draw[line width=1cm,red] (2,1) -- (2,-1);
\draw[ultra thick,white,preaction={line width=1cm,blue,draw}] (0,0) -- (4,0);
\draw[line width=1cm,red] (2,-2) -- (2,-4);
\draw[ultra thick,white,postaction={line width=1cm,blue,draw}] (0,-3) -- (4,-3);
\end{scope}
\end{tikzpicture}
\end{document}
结果:
左图为蓝线设置了图层,右图没有。上图将蓝线绘制为预操作,下图为后操作。在每幅图中,垂直红线都绘制在水平线之前。因此,对于上两幅图,指定的顺序是:红色、蓝色、白色。对于下两幅图,指定的顺序是:红色、白色、蓝色(我向你保证,这完全是巧合)。在设置了“on layer”的情况下,渲染是:蓝色、红色、白色。这表示蓝线(动作线)被on layer=back
键发送到后面。