我一直在尝试获取fit
TikZ 中的键来缩放节点,以便它仅匹配其适合节点的高度,但我没有成功。我试图让红色框的大小与蓝色框的大小相同:
\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{positioning,fit}
\newcommand{\filler}[1]{\begin{minipage}{12cm}\small\lipsum[#1]\end{minipage}}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}[node distance=0pt,outer sep = 2pt, text centered]
\tikzstyle{box}=[rectangle,draw,inner sep=0em]
\tikzstyle{vline}=[box, rotate=90, fill=red!20, minimum height=1cm]
\tikzstyle{hline}=[box, fill=blue!20, minimum width=10cm]
\node[vline] (a) at (0,0) {\textbf{How do I extend this node to fit?}};
\node[hline] (b1) [below right = of a.south east] {\filler{1}};
\node[hline] (b2) [below = of b1] {\filler{2}};
\node[hline] (b3) [below = of b2] {\filler{3}};
\end{tikzpicture}
\end{document}
问题:对于节点a
,如何保持 x 维度固定,而 y 维度缩放至节点的高度(b1,b2,b3)
?
答案1
\documentclass[border=5]{standalone}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{positioning,fit}
\newcommand{\filler}[1]{\small\lipsum[#1]}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}[node distance=2pt,align = justify]
\tikzset{
box/.style={rectangle,draw,inner sep=0em},
vline/.style={box, fill=red!20, align=center},
hline/.style={box, fill=blue!20, text width=12cm}
}
\node[hline] (b1) {\filler{1}};
\node[hline] (b2) [below = of b1] {\filler{2}};
\node[hline] (b3) [below = of b2] {\filler{3}};
\coordinate [left=12pt of b1.north west] (top);
\coordinate [left=12pt of b3.south west] (bottom);
\node[vline, minimum width=10pt,fit=(top)(bottom),
label={[rotate=90]center:\textbf{How do I extend this node to fit?}}] (a) {};
\end{tikzpicture}
\end{document}
概括
- 我从你的宏中删除了
minipage
环境并在你的选项中替换为,因为这会产生相同的效果。\filler
text centered
text justified
tikzpicture
- 我将其替换
node distance=0pt
为node distance=2pt
。 - 二
coordinates
:top
和bottom
被定义为与fit
节点选项一起使用。现在,节点a
不再b1
根据节点定位,而是根据节点和使用库来定位。a
a
b1
b3
fit
更新coordinates
:对于 ,使用两个就足够了,fit
因为节点(a)
只会在两个坐标和这两个点之间定义的任何坐标周围创建一个边界框。只要坐标对齐,这样做没有坏处,因为坐标理论上是无量纲的。至于 节点10pt
的宽度(a)
,我认为这就是你想要的;如果不是,你可以将其更改为你喜欢的尺寸:)
a
使用该选项可以解决节点文本旋转的问题label
。更新:需要解决方法,因为使用此解决方案,rotate=90
直接在节点选项中执行操作将旋转节点形状和文本。
更新
- 我已将Gonzalo 的回答中的旧
\tikzstyle
内容替换为。\tikzset
答案2
这是不使用fit
库或额外坐标的另一种选择。我使用let
语法来计算节点所需的长度;我还将旧\tikzstyle
语法更改为新语法\tikzset
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\usepackage{lipsum}
\newcommand{\filler}[1]{{\small\lipsum[#1]}}
\begin{document}
\begin{tikzpicture}[node distance=2pt,align=justify]
\tikzset{
box/.style={rectangle,draw},
vline/.style={box, fill=red!20,align=center,minimum height=1cm,rotate=90},
hline/.style={box, fill=blue!20, text width=12cm}
}
\node[hline] (b1) {\filler{1}};
\node[hline] (b2) [below = of b1] {\filler{2}};
\node[hline] (b3) [below = of b2] {\filler{3}};
\path let \p1 = (b1.north), \p2 = (b3.south) in
node[vline,inner xsep=0pt,text width=\y1-\y2-\pgflinewidth,anchor=south east]
at ([xshift=-2pt]b1.north west) {some text here};
\end{tikzpicture}
\end{document}
答案3
另一个解决方案。它也使用fit
tikzlibrary,但不需要额外的coordinates
tikzlibrary calc
。
\node[vline, minimum width=1cm,
fit=(b1.north)(b3.south),
label={[rotate=90]center:\textbf{How do I extend this node to fit?}},
left=of b1.north west, anchor=north east] (a) {};
声明一个节点,其高度包括b1.north
和b3.south
,并且其右上角 ( anchor=north east
) 位于node distance
处。声明之后b1.north west
很重要,因为最后一个选项将锚点固定到。anchor
left=of
east
\documentclass[border=5]{standalone}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{positioning,fit}
\newcommand{\filler}[1]{\small\lipsum[#1]}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}[node distance=2pt,align = justify]
\tikzset{
box/.style={rectangle,draw,inner sep=0em},
vline/.style={box, fill=red!20, align=center},
hline/.style={box, fill=blue!20, text width=12cm}
}
\node[hline] (b1) {\filler{1}};
\node[hline] (b2) [below = of b1] {\filler{2}};
\node[hline] (b3) [below = of b2] {\filler{3}};
%\coordinate [left=12pt of b1.north west] (top);
%\coordinate [left=12pt of b3.south west] (bottom);
\node[vline, minimum width=10pt,
fit=(b1.north)(b3.south),
label={[rotate=90]center:\textbf{How do I extend this node to fit?}},
left=of b1.north west, anchor=north east, minimum width=1cm ] (a) {};
\end{tikzpicture}
\end{document}