对于 pstricks 包输出(自 2017-03-28 起在 ctan 上新增)是为了解决以下问题而创建的
简而言之,我正在寻找一个可以阻挡线条但不填充颜色的 \rput* 版本。
在这里提出: PSTricks 中是否有 \rput* 的变体可以保留背景填充颜色?
我对 tikz 的解决方案很感兴趣。我用 tikz 重新创建了最小示例:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\fill[blue!40] (0,0) rectangle (2,2);
\fill[red] plot [smooth] coordinates {(0,2)(1,1)(2,2)} -- cycle;
\draw(1,0)--(1,2);
\node at (1,1) {\Large\sf label};
\end{tikzpicture}
\end{document}
预期输出应为
我正在评估 tikz 中的以下选项:
- 绘制/填充/文本不透明度
- 透明度组
\begin{scope}
\begin{pgfonlayer}
请注意,并非所有 PDF 查看器都支持该knockout
功能。我可以确认它在 macOS 上的 Skim 和 Preview 中不起作用。
不过,我还没有想出如何解决这个问题。
更新 我想添加我正在处理的图片的部分内容,以澄清线条可能会穿过几个节点,这是先验不清楚的:
pst-rputover 文档详细信息
这种风格结合了两种理念。第一个想法StackExchange 用户 Werner 在本页建议在 pst-node.sty 中使用,
\psDefBoxNodes
以获取每个标签所占框角的坐标。第二个想法是使用这些坐标并\psclip
删除参数中与标签重叠的对象部分\coverable
。实现第二个想法的唯一微妙之处在于我们想要进行“反向剪辑”:我们希望保留标签外部的区域,而不是标签内部的区域。
相关问题
答案1
仅供参考:此版本还考虑了圆角或更一般的任意节点形状。这样您就无需输入大量坐标。
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\makeatletter % https://tex.stackexchange.com/a/38995/121799
\tikzset{
use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother
\tikzset{remember path/.style={save path=\tmprotect}}
% https://tex.stackexchange.com/a/12033/121799
\tikzset{reverseclip/.style={insert path={(current bounding box.north
east) rectangle (current bounding box.south west)}}}
\begin{document}
\begin{tikzpicture}
\fill[blue!40] (0,0) rectangle (2,2);
\fill[red] plot [smooth] coordinates {(0,2)(1,1)(2,2)} -- cycle;
\node[remember path,font=\Large\sf] at (1,1) {label};
\clip[use path=\tmprotect,reverseclip];
\draw(1,0)--(1,2);
\end{tikzpicture}
\begin{tikzpicture}
\fill[blue!40] (-1,0) rectangle (3,4);
\fill[red] plot [smooth] coordinates {(-1,4)(0,2)(1,1)(2,2)(3,4)} -- cycle;
\node[remember path,font=\Large\sf,rounded corners] at (1,1) {label};
\clip[use path=\tmprotect,reverseclip];
\node[remember path,font=\Large\sf,shape=diamond] at (2,2) {label 3};
\clip[use path=\tmprotect,reverseclip];
\node[remember path,font=\Large\sf,shape=ellipse] at (0,2) {label 2};
\clip[use path=\tmprotect,reverseclip];
\fill[gray,opacity=0.2] (-1,0) rectangle (3,4);
\draw [blue,thick] (-1,4) -- (1,0) -- (3,4);
\end{tikzpicture}
\end{document}
答案2
您可以根据标签进行剪辑:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\fill[color=blue!40] (0,0) rectangle (2,2);
\fill[red] plot [smooth] coordinates {(0,2)(1,1)(2,2)} -- cycle;
\node at (1,1) (mynodeA){\Large\sffamily label};
\node at (0.5,1.5) (mynodeB){\sffamily label};
\begin{scope}
\foreach \n in {mynodeA, mynodeB}{
\path [clip]
(\n.north east) --
(\n.south east) --
(\n.south west) --
(\n.north west) -- cycle
(current bounding box.south east) --
(current bounding box.north east) --
(current bounding box.north west) --
(current bounding box.south west) -- cycle;
}
\draw(1,0)--(1,2);
\draw(0.5,0)--(0.5,2);
\draw(0,1.8)--(2,0.5);
\end{scope}
\end{tikzpicture}
\end{document}
答案3
把线分成两部分吗?
\documentclass[tikz, margin=3.141592]{standalone}
\begin{document}
\begin{tikzpicture}
\fill[blue!40] (0,0) rectangle (2,2);
\fill[red] plot [smooth] coordinates {(0,2)(1,1)(2,2)} -- cycle;
\node at (1,1) (label) {\Large\sf label};
\draw (1,0) -- (label) (label) -- (1,2);
\end{tikzpicture}
\end{document}