使用不存在的节点进行剪辑

使用不存在的节点进行剪辑

我正在寻找一种“之后”剪辑的正确方法。事实上,我想剪辑到一个我还不知道的节点的坐标。所以我需要先绘制它,然后才能剪辑。但剪辑仅适用于之后的命令...所以太晚了。

目前,我在一个类似幻影的节点(没有任何风格)中绘制了情节,然后我再次绘制它,但我认为这样很脏,如果图片很大,我不想绘制两倍的图片。

这是我想要的(好)结果(请注意中间的漂亮切口):

好结果

以及我正在使用的错误代码(顺便说一句,当我不使用好的工具时,不要犹豫地告诉我在 tikz 中编码的任何更好的方法):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,matrix,chains,positioning,decorations.pathreplacing,arrows,fit,patterns,calc,decorations.markings,decorations.pathmorphing,backgrounds}

\begin{document} 

\begin{tikzpicture}[
  a/.style = {draw},
  box/.style = {draw,opacity=0.7,inner sep=0.2em,rounded rectangle}
  ]
  \matrix[matrix of nodes,text depth=0.3em,text height=1em,column sep=-\pgflinewidth](ma){
    |[a]| $a_1$ & |[a]| $a_2$ & |[a]| $\dots$ & |[a]| $a_{m-2}$ & |[a]| $a_{m-1}$ & |[a]| $a_{m}$&
    |[a]| $a_1$ & |[a]| $a_2$ & |[a]| $\dots$ & |[a]| $a_{m-2}$ & |[a]| $a_{m-1}$ & |[a]| $a_{m}$& |[a]| $\dots$&
    |[a]| $a_1$ & |[a]| $a_2$ & |[a]| $\dots$ & |[a]| $a_{m-2}$ & |[a]| $a_{m-1}$ & |[a]| $a_{m}$\\
  };
  \begin{scope}[on background layer]
    \begin{scope}
      \node[fit=(ma-1-1)(ma-1-6),rounded rectangle,inner sep=0.2em] (l) {};
      \clip(l.west |- l.north) rectangle (ma-1-6.south east |- l.south east);
      \node[fit=(ma-1-1)(ma-1-6),fill=green,box] (l) {};
    \end{scope}
    \begin{scope}
      \node[fit=(ma-1-7)(ma-1-12),rounded rectangle,inner sep=0.2em] (l) {};
      \clip(ma-1-7.west |- l.north) rectangle (l.east |- l.south);
      \node[fit=(ma-1-7)(ma-1-12),fill=yellow,box] (l) {};
    \end{scope}
    \node[fit=(ma-1-14)(ma-1-19),fill=blue!50,box] {};
  \end{scope}
\end{tikzpicture}

\end{document}

答案1

剪辑时不需要太精确,只要剪掉不想要的部分,保留想要的部分即可。所以关键部分就在交汇点。其余的并不重要。

matrix of math nodes会使您的代码更加整洁,并且更易于阅读。此外,如果您有box参数,则可以写成box=<colour>而不是fill=<colour>, box一直这样。

但剪辑对我来说总是感觉很老套和不够优雅,所以我不知道你是否认为这是一种改进。事实上,我不知道我是否这么认为。例如,它需要在西端硬编码一点额外的空间,这可能比你的原版更不优雅。

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{shapes.misc,matrix,fit,backgrounds}
\begin{document}
\begin{tikzpicture}[
  box/.style = {draw, opacity=0.7, inner sep=0.2em, rounded rectangle, fill=#1}
  ]
  \matrix [matrix of math nodes, every node/.append style={draw}, text depth=0.3em, text height=1em, column sep=-\pgflinewidth] (ma) {
     a_1 &  a_2 &  \dots &  a_{m-2} &  a_{m-1} &  a_{m}&
     a_1 &  a_2 &  \dots &  a_{m-2} &  a_{m-1} &  a_{m}&  \dots&
     a_1 &  a_2 &  \dots &  a_{m-2} &  a_{m-1} &  a_{m}\\
  };
  \begin{scope}[on background layer]
    \begin{scope}
      \clip (ma-1-6.east |- current bounding box.south) rectangle ([xshift=-2mm]current bounding box.north west);
      \node[fit=(ma-1-1)(ma-1-6), box=green] (l) {};
    \end{scope}
    \begin{scope}
      \clip (ma-1-7.west |- current bounding box.south) rectangle (current bounding box.north east);
      \node[fit=(ma-1-7)(ma-1-12), box=yellow] (l) {};
    \end{scope}
    \node[fit=(ma-1-14)(ma-1-19), box=blue!50] {};
  \end{scope}
\end{tikzpicture}
\end{document}

相同的结果

相关内容