我想在 Ti 中设置文本钾最大宽度和最小高度的 Z 节点,即节点不能水平增长(但对于短文本会缩小)但可以垂直增长(如果文本超过最小高度)。
使用这个varwidth
包看起来并不太难,但问题是,我想顶部对齐所包含的文本。对齐应该适用于单行文本以及多行文本。
钛钾/ 似乎不知道任何文本顶部对齐功能,而是建议使用键text depth=
。不幸的是,这似乎在多行与单行比较中不起作用。
您可以使用以下代码作为示例:
\documentclass{scrreprt}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{varwidth}
\begin{document}
\begin{tikzpicture}
\node (left) [minimum height=2cm,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Short text%
\end{varwidth}%
};
\node at (left.north east) [anchor=north west,minimum height=2cm,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing%
\end{varwidth}%
};
\end{tikzpicture}
\vspace{1cm}
\begin{tikzpicture}
\node (left) [text depth=2cm,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Short text%
\end{varwidth}%
};
\node at (left.north east) [anchor=north west,text depth=2cm,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing%
\end{varwidth}%
};
\end{tikzpicture}
\vspace{1cm}
\begin{tikzpicture}
\node (left) [text depth=2cm,text height=0,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Short text%
\end{varwidth}%
};
\node at (left.north east) [anchor=north west,text depth=2cm,text height=0,inner sep=0,shape=rectangle,draw=black] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing%
\end{varwidth}%
};
\end{tikzpicture}
\end{document}
输出如下所示:
前两个框展示了
varwidth
它是如何工作的,通过将第二个框的宽度增加到 3 厘米,然后打破线条。后两个框是我尝试通过设置来解决它
text depth=2cm
,但正如您所看到的,一个框相对于另一个框增大了。第三幅图是一个实验,用于找出为什么
text depth
不按我预期的方式工作。设置text height=0
将文本垂直居中在文本框中心,并且文本框的高度正确。但现在文本溢出到顶部。
期望的结果是一个高度为 2cm 的框,文本对齐在顶部。也许我忽略了一些显而易见的东西?
编辑:我发现了一个粗鲁的底部对齐方法
阅读在 TikZ 中,可以嵌套节点吗?我想到嵌套环境的想法tikzpicture
。这导致了一种粗糙的底部对齐方式,但没有顶部对齐。
代码如下所示(与我上面的示例文档一起使用):
\begin{tikzpicture}
\node (left) [minimum height=2cm,inner sep=0,text height=2cm,text depth=0,shape=rectangle,draw=black] {%
\begin{tikzpicture}
\node [minimum height=0,inner sep=0,text height=,text depth=,shape=rectangle,draw=red] {%
\begin{varwidth}{3cm}%
Short text%
\end{varwidth}%
};
\end{tikzpicture}%
};
\node at (left.north east) [minimum height=2cm,inner sep=0,text height=2cm,text depth=0,anchor=north west,shape=rectangle,draw=black] {%
\begin{tikzpicture}
\node [minimum height=0,inner sep=0,text height=,text depth=,shape=rectangle,draw=red] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing%
\end{varwidth}%
};
\end{tikzpicture}%
};
\end{tikzpicture}
它很粗糙,因为它没有考虑基线(也许可以用来解决\strut
),并且它嵌套了环境,这实际上需要在内部重置所有参数,因为它们是从外部继承的。
答案1
您可以使用两个节点而不是一个节点来解决这个问题:第一个节点只包含文本,第二个节点使用fit
库在文本周围绘制一个指定最小高度的矩形。
我编写了一个名为的样式add rectangle
,它采用可选高度并使用该append after command
样式在文本节点后直接添加第二个节点。
为了填充背景,您可以使用backgrounds
库并使用环境将矩形放置在背景层上pgfonlayer
。
\documentclass{scrreprt}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc,backgrounds}
\usepackage{varwidth}
\tikzset{
add rectangle/.style={
alias=tempname,
append after command={
; \begin{pgfonlayer}{background}
\node [
fill=yellow,
draw=yellow!80!black,
fit={(tempname) ($(tempname.north)+(0,-#1)$)},
inner sep=0pt] {};
\end{pgfonlayer} \path
}
},
add rectangle/.default=2cm
}
\begin{document}
\begin{tikzpicture}
\node (left) [
add rectangle=2cm
] {%
\begin{varwidth}{3cm}%
Short%
\end{varwidth}%
};
\node at (left.north east) [name=middle,anchor=north west,add rectangle=2cm] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing%
\end{varwidth}%
};
\node at (middle.north east) [anchor=north west,add rectangle=2cm] {%
\begin{varwidth}{3cm}%
Somehow a longer text for testing. This is a really long text that will stretch the box vertically.%
\end{varwidth}%
};
\end{tikzpicture}
\end{document}