以下 MWE 构建某种自定义节点(两个节点的组合)以获得所需的结果:
\documentclass{article}
\usepackage{tikz}
\tikzset{
every node/.style={fill=blue!30,draw,rectangle,inner sep=0pt,outer sep=0pt},
innerRectangle/.style={minimum height=2cm, minimum width=2cm},
outerRectangle/.style={fill=red!50,minimum height=3cm, minimum width=2.5cm},
}
\begin{document}
\begin{tikzpicture}
\node[outerRectangle] (o) {};
\node[innerRectangle,anchor=east] (i) at (o.east) {};
\end{tikzpicture}
\end{document}
输出为:
问:有没有更简单的方法,例如为一侧或每一侧定义一个具有自定义内部 sep 的单节点定义?
更新 1(由 Ignasi 的回答引发):
我没有提到我想将文本插入内部节点,并且此文本应遵守自定义内部分隔符。以下 MWE(基于 Ignasi 的回答,我只是添加了包lipsum
并替换minimum width
为text width
)演示了该问题:
\documentclass{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
every node/.style={
fill=blue!30,
draw,
rectangle,
inner sep=0pt,outer sep=0pt
},
outerRectangle/.style={%
fill=red!50,
minimum height=3cm,
text width=5cm,
},%
innerRectangle/.style={%
path picture={%
\draw[fill=blue!30] ([yshift=-#1]path picture bounding box.north east)
-|([xshift=#1]path picture bounding box.west)
|-([yshift=#1]path picture bounding box.south east)
--cycle;}},
innerRectangle/.default=5mm%<- when called without parameter
}
\begin{document}
\begin{tikzpicture}
\node[outerRectangle, innerRectangle] (x) {\lipsum[1]};
\end{tikzpicture}
\end{document}
更新产生的框的屏幕截图:
答案1
您可以使用path picture
选项向您的节点添加内部填充区域:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
every node/.style={fill=blue!30,draw,rectangle,inner sep=0pt,outer sep=0pt},
outerRectangle/.style={fill=red!50,minimum height=3cm, minimum width=2.5cm},
innerRectangle/.style={%
path picture={%
\draw[fill=blue!30] ([yshift=-#1]path picture bounding box.north east)
-|([xshift=#1]path picture bounding box.west)
|-([yshift=#1]path picture bounding box.south east)
--cycle;}},
innerRectangle/.default=3mm
}
\begin{document}
\begin{tikzpicture}
\node[outerRectangle] (o) {A};
\node[outerRectangle,anchor=east,
innerRectangle=5mm, right=of o] (o1) {ABC};
\node[outerRectangle, innerRectangle=2mm, below= of o] (o2) {text};
\node[outerRectangle,anchor=east, innerRectangle, right=of o2] (o3) {12345};
\end{tikzpicture}
\end{document}
更新:
这是一个替代解决方案,我希望它能解决文本使用哪个区域的问题。以前的解决方案使用了一个节点,在其上inner border
绘制了一个。在这种情况下,一个inner node
用于文本,并添加了一个额外的路径作为外边框。这个外边框是用一个fit
节点定义的。虽然这个外节点有自己的名称供参考,但我不知道如何使用它进行定位,所以定位只能用内部节点完成。
\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{fit, positioning}
\tikzset{
myborder/.style={%
append after command={%
\pgfextra
\node[fit={([yshift=-#1]\tikzlastnode.south east)
([shift={(-#1,#1)}]\tikzlastnode.north west)},
fill=red!30, draw, inner sep=0pt] (\tikzlastnode-b) {};\endpgfextra}},
myborder/.default=3mm
}
\begin{document}
\begin{tikzpicture}
\node[draw, fill=blue!30, text width=4cm,
myborder] (A) {\lipsum[2]};
\node[draw, fill=green!30,
myborder=2mm, right= 0pt of A] (B) {ABC};
\end{tikzpicture}
\end{document}