TikZ 节点内的垂直空间

TikZ 节点内的垂直空间

我正在尝试在节点内插入一些垂直空间(因此它将被稍后填充)。

\node [draw,rounded corners,minimum height=5cm] (node1) {\underline{Case 1}};

这是给出的:

在此处输入图片描述

然而,我想要情况1位于节点的顶部。

有谁能帮忙吗?提前致谢。

答案1

anchor您可以通过使用和第二个节点来实现想要的效果:

\documentclass{article}
\usepackage{tikz}
%%\usetikzlibrary{calc}%% not necessary, but potentially useful
\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \node [draw,rounded corners,minimum height=5cm,minimum width=2cm] (node1) {};
  \node [anchor=north west] at (node1.north west) {\underline{Case 1}};
\end{tikzpicture}

\end{document}

在此处输入图片描述

这里发生的事情是node1.north west告诉\node您想要将内容放置在何处。anchor=north west告诉\node使用文本的左上角作为所要放置的位置。

如果我们做的一些事情与你实际想要的完全不同,那么会更容易看到发生了什么(但也许这会清楚地说明这两个north west指令的含义):

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
  \node [draw,rounded corners,minimum height=5cm,minimum width=4cm] (node1) {};
  \node [anchor=north west] at (node1.north west) {\fbox{Case: anchor is NW}};
  \node [anchor=south west] at (node1.north west) {\fbox{Case: anchor is SW}};
  \node [anchor=south east] at (node1.north west) {\fbox{Case: anchor is SE}};
  \node [anchor=north east] at (node1.north west) {\fbox{Case: anchor is NE}};
  \foreach \myanchor in {north west,south west,north east,south east}
    { 
      \node[fill,circle,inner sep=1pt,outer sep=1ex,anchor=\myanchor] at (node1.north west){};
    }
\end{tikzpicture}

\end{document}

在此处输入图片描述

请注意,anchoring 是关于文本的角相对于正在使用的节点的位置(在本例中是)node1.north west

此外,使用 TikZ 库,calc您可以更好地控制定位:

  \node [anchor=north west] at ($(node1.north west)+(1ex,-2ex)$) {\underline{Case 1}};

这里的定位更加极端一些,有助于说明正在发生的事情。

更新

如果您经常这样做,那么(按照@Qrrbrbirlbel 的建议),您可以定义一种样式并在一个节点内完成所有操作:

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[my case/.style={draw,
                                    rounded corners,
                                    minimum height=5cm,
                                    minimum width=4cm,
                                    append after command={node[anchor=north west]
                                                          at  (\tikzlastnode.north west)
                                                          {#1}}}]
  \node [my case={\textbf{Case A:}}] (node1) {};
\end{tikzpicture}

\end{document}

是的,您可以为此定义一个命令:

\documentclass{article}
\usepackage{tikz}
\def\mycasenode(#1)#2;{\node[my case={#2}] (#1) {};}
\begin{document}

\begin{tikzpicture}[my case/.style={draw,
                                    rounded corners,
                                    minimum height=5cm,
                                    minimum width=4cm,
                                    append after command={node[anchor=north west]
                                                          at  (\tikzlastnode.north west)
                                                          {#1}}}]
  %\node [my case={\textbf{Case A:}}] (node1) {};
  \mycasenode (node1) {\textbf{Case A:}};
\end{tikzpicture}

\end{document}

注意我是如何创建定义来模仿 TikZ 命令和节点样式的。

答案2

我通常会有另一个专门用于显示的节点。我发现这更容易。

\node [draw,rounded corners,minimum height=5cm] (node1) {};
\node [below=0cm of node1.north]{\underline{Case 1}};

答案3

当 TikZ 收集某个节点的文本时,它会将其直接放入一个框(\hbox)中,这个框(除了选项text widthtext heighttext depth)的大小与其内容完全相同。

然后,这个框及其尺寸用于计算其周围的形状(在我们的例子中是rectangle)。这个框总是放置在形状的一个特定位置(大多数情况下,这是中心)。如果不重写形状,我们就无法更改此位置。

在这个答案中,采用了不同的方法。在收集了节点内容并创建了框之后,将重新设置框。

键的值valign height用于将节点放入更大(更高)的框中。可以使用valign接受以下值的键更改垂直对齐方式:

  • top
  • center(默认)和
  • bottom

我不是拳击专家,因此可能有更好的方法来重新使用\pgfnodeparttextbox并将其装入新盒子中。

应该注意的是,这种方法最适合矩形,因为框的垂直高度会改变形状尺寸的计算。解决
这个问题的另一种方法可能是 \pgfnodeparttextbox直接改变框的高度和深度(即从高度中减去一个长度,然后加上深度,会将框的内容推到顶部,但不会改变框本身的大小)。这可能会导致文本突出形状。
本主题与以下主题类似:关于将节点内容提升到某个值的相关问题(我主要指的是答案中的图像)。

我认为这只对矩形才真正可行。

代码

\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\makeatletter
\def\tikz@valign{c}
\tikzset{
  enforce alignment/.code={% even without text width
    \csname if#1\endcsname
      \def\tikz@text@width
        {\pgfkeysvalueof{/pgf/minimum width}-2*(\pgfkeysvalueof{/pgf/inner xsep})}%
    \else
      \let\tikz@text@width\pgfutil@empty
    \fi},
  enforce alignment/.default=true,
  valign/.is choice,
  valign/top/.code=\def\tikz@valign{t},
  valign/center/.code=\def\tikz@valign{c},
  valign/bottom/.code=\def\tikz@valign{b},
  valign height/.initial=%
    \pgfkeysvalueof{/pgf/minimum height}-2*(\pgfkeysvalueof{/pgf/inner ysep})}
\patchcmd\tikz@fig@continue{\tikz@node@transformations}{%
  \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/tikz/valign height}}%
  \pgf@y\ht\pgfnodeparttextbox
  \advance\pgf@y\dp\pgfnodeparttextbox
  \ifdim\pgf@y<\pgf@x
  \if\tikz@valign b%
    \advance\pgf@x-\dp\pgfnodeparttextbox
    \setbox\pgfnodeparttextbox\vbox to \pgf@x{\vfill\hbox{\unhbox\pgfnodeparttextbox}}%
  \else\if\tikz@valign t%
    \setbox\pgfnodeparttextbox\vbox to \pgf@x{\hbox{\unhbox\pgfnodeparttextbox}\vfill}%
  \fi\fi\fi
  %
  \tikz@node@transformations}{}{}
\makeatother
\tikzset{nodes={draw,rounded corners},minimum height=1.5cm,minimum width=2cm}
\begin{document}
\begin{tikzpicture}
  \node [text=red,  valign=top]    {Case t};
  \node                            {Case c};
  \node [text=blue, valign=bottom] {Case b};
\end{tikzpicture}
\begin{tikzpicture}[enforce alignment]
  \node [text=red,  valign=top,    align=left ]  {Case t};
  \node [                         align=center]  {Case c};% or "enforce alignment=false"
  \node [text=blue, valign=bottom, align=right]  {Case b};
\end{tikzpicture}
\begin{tikzpicture}[enforce alignment, align=center, minimum height=3cm]
  \node [text=red,  valign=top]                 {Case t Case t Case t Case t};
  \node                            at (right:2) {Case c Case c Case c Case c};
  \node [text=blue, valign=bottom] at (right:4) {Case b Case b Case b Case b};
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述在此处输入图片描述

在此处输入图片描述

相关内容