Tikz 相当于 pst-rputover

Tikz 相当于 pst-rputover

对于 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}

相关内容