在 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%,但我认为在节点内容固定后,区域由添加xsep
和ysep
边距决定。因此,如果您想要一个非垂直居中的节点,最好在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}