我正在寻找一种“之后”剪辑的正确方法。事实上,我想剪辑到一个我还不知道的节点的坐标。所以我需要先绘制它,然后才能剪辑。但剪辑仅适用于之后的命令...所以太晚了。
目前,我在一个类似幻影的节点(没有任何风格)中绘制了情节,然后我再次绘制它,但我认为这样很脏,如果图片很大,我不想绘制两倍的图片。
这是我想要的(好)结果(请注意中间的漂亮切口):
以及我正在使用的错误代码(顺便说一句,当我不使用好的工具时,不要犹豫地告诉我在 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}