Tikz 流程图:节点内的文本垂直位置?

Tikz 流程图:节点内的文本垂直位置?

在 TikZ 流程图中,是否可以精确调整节点文本的位置?对于水平位置,你可以(大部分)使用align={left|center|right},但我似乎找不到垂直位置的东西。

参考:TikZ 手册 3.0.1a,§17.4.3:文本参数

虽然对于简单节点这似乎没用,但我想对使用“fit”生成的“边界框”节点执行此操作。

考虑一下这个MWE:

\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,fit}
\begin{document} 

\tikzset{
    block/.style={
        rectangle, draw, fill=blue!10, text width=5em, text centered, rounded corners
    }
}

\tikzset{
    container/.style={
        draw, rectangle, dashed, inner sep=3em
    }
}

\begin{tikzpicture}[node distance = 3cm]
    \node [block] (b1) {Hello};
    \node [block,right of=b1] (b2) {World};
    \node[container,fit=(b1) (b2)] (cont1) {Caption};
\end{tikzpicture}

\end{document}

因此,“标题”文本出现在节点的中心。我该如何定位它,比如说,框的底部中心?

在此处输入图片描述

答案1

最简单的方法是使用一个单独的节点作为标题,为其设置一个锚点,并将其定位在容器节点的锚点上。

在此处输入图片描述

代码:

\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,fit}
\begin{document} 

\tikzset{
    block/.style={
        rectangle, draw, fill=blue!10, text width=5em, text centered, rounded corners
    }
}

\tikzset{
    container/.style={
        draw, rectangle, dashed, inner sep=3em
    }
}

\begin{tikzpicture}[node distance = 3cm]
    \node [block] (b1) {Hello};
    \node [block,right of=b1] (b2) {World};
    \node[container,fit=(b1) (b2)] (cont1) {};
    \node[anchor=south] at (cont1.south) {Caption};
\end{tikzpicture}

\end{document}

答案2

像这样吗?

\documentclass{article}
%\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,fit}
\begin{document} 

\tikzset{
    block/.style={
        rectangle, draw, fill=blue!10, text width=5em, text centered, rounded corners
    }
}

\tikzset{
    container/.style={
        draw, rectangle, dashed, inner sep=3em
    }
}

\begin{tikzpicture}%[]
    \node [block] (b1) {Hello};
    \node [node distance = 3cm,block,right of=b1] (b2) {World};
    \node[container,fit=(b1.base) (b2.base)] (cont1) {Caption};
\end{tikzpicture}
\end{document}

在此处输入图片描述

编辑我误解了这个问题(因为我没有仔细阅读)。“Caption”标签与“Hello”和“World”框不对齐的事实误导了我。我保留了上述答案,以防有人对同样的事情感到疑惑。和@Mike一样,我相信最简单的方法就是添加一个节点。

\documentclass{article}
%\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,fit}
\begin{document} 

\tikzset{
    block/.style={
        rectangle, draw, fill=blue!10, text width=5em, text centered, rounded corners
    }
}

\tikzset{
    container/.style={
        draw, rectangle, dashed, inner sep=3em, 
    }
}

\begin{tikzpicture}%[]
    \node [block] (b1) {Hello};
    \node [node distance = 3cm,block,right of=b1] (b2) {World};
    \node[container,fit=(b1.base) (b2.base),text centered] (cont1) {};
    \node[above] at (cont1.south) {Caption};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

默认情况下,节点内容始终垂直居中于其区域内。我不确定 100%,但我认为在节点内容固定后,区域由添加xsepysep边距决定。因此,如果您想要一个非垂直居中的节点,最好在phantom打印文本上方或下方添加一些不可见的文本(带有或 0pt 规则)。

另一个选项是使用label选项。事实上,alabel是一个独立节点,它是在 ( postaction) 标记节点绘制后添加的。类似于 marmot 或 Mike 的解决方案,但两个命令都压缩为一个。

标签的默认位置是north锚点,但只需选择新位置和标签锚点就可以轻松地放置在其他位置。

在这种特殊情况下,您应该使用用 定义的标签label={[anchor=south]south:Caption},但下面的代码显示了一些其他示例:

\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,fit}
\begin{document} 

\tikzset{
    block/.style={
        rectangle, draw, fill=blue!10, 
        text width=5em, text centered, rounded corners
    },
    container/.style={
        draw, rectangle, dashed, inner sep=3em
    }   
}

\begin{tikzpicture}[node distance = 3cm]
    \node [block] (b1) {Hello};
    \node [block,right of=b1] (b2) {World};
    \node [container,fit=(b1) (b2),
        label={[anchor=south]south:Caption 1},
        label=Caption 2,
        label={[below right =5mm and 3mm]north west:Caption 3},
        label=center:Caption 4,
        ] (cont1) {};
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容