我正在尝试构建一个与常规底层网格对齐的可变大小块图。这是我的 MWE:
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,chains}
\begin{document}
\begin{tikzpicture}[%
start chain=c going right,
node distance=40mm,
every node/.style={%
anchor=center,
on grid,
align=center,
text width=30mm,
minimum height=6ex,
outer sep=0mm,
inner sep=0mm,
},
]
\node [on chain] (a) {} ;
\node [on chain] (b) {} ;
\node [on chain] (c) {} ;
\node [on chain] (d) {} ;
\node at (a) [draw] {First} ;
\node [draw,fit=(b) (b)] {Second} ;
\node [draw,fit=(c) (d)] {Third} ;
\end{tikzpicture}
\end{document}
以下是部分输出:
现在,如您所见,尽管两段文本的封闭框对齐,但它们的基线严重错位。
(“第三”项的输出未显示,与第二项对齐;它只是为了证明这不是适合单个节点的产物。)
如果我做错了什么?我该如何改正?
答案1
我不认为你做错了什么;在拟合节点中文本的定位需要特别小心。
代码中的以下变化表明,为了拟合节点,文本不会垂直放置在center
节点的锚点中:
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}
\coordinate (a) at (0,0);
\coordinate (b) at (3,2);
\node[
inner sep=0pt,
outer sep=0pt,
draw,
fit={(a) (b)},
label={[red]center:center}
] {center} ;
\node[
inner sep=0pt,
outer sep=0pt,
draw,
align=center,
text width=3cm,
minimum height=2cm,
label={[red]center:center}
]
at (5,1)
{center} ;
\end{tikzpicture}
\end{document}
结果:
PGF 手册(第 630 页)对拟合节点中文本的定位提出了警告,尽管我承认这可能会产生误导,因为它似乎表明文本将放置在center
锚,但显然不是(正如我上面的例子所示,或者甚至如手册上的例子,如果修改代码并将“盒子”放置在center
合适的节点的正确锚点处):
上面的意思是,一般来说,如果节点包含文本,如上例中的框,它将位于框内的中央。将文本放在其他地方会很困难,尤其是更改节点的锚点不会产生预期的效果。
接下来的句子提到了可能的解决方案:
相反,您应该创建一个
fit
不包含任何文本的选项节点,为其命名,然后使用普通节点在所需位置添加文本。或者,考虑使用label
或pin
选项。
在下面的例子中,我使用了您的代码来说明如何使用label
辅助节点将文本放置在所需的位置:
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,chains}
\begin{document}
\begin{tikzpicture}[%
start chain=c going right,
node distance=40mm,
every node/.style={%
anchor=center,
on grid,
align=center,
text width=30mm,
minimum height=6ex,
outer sep=0mm,
inner sep=0mm,
},
]
\node [on chain] (a) {} ;
\node [on chain] (b) {} ;
\node [on chain] (c) {} ;
\node [on chain] (d) {} ;
\node at (a) [draw] {First} ;
\node [draw,fit=(b),label={center:Second}] {} ;
\node [draw,fit=(c) (d)] (fitcd) {} ;
\node at (fitcd.center) {Third};
\end{tikzpicture}
\end{document}
结果: