在给定大小的 TikZ 节点中针对单行和多行情况对文本进行顶部对齐

在给定大小的 TikZ 节点中针对单行和多行情况对文本进行顶部对齐

我想在 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}

输出如下所示:

TikZ 输出

  • 前两个框展示了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}

相关内容