如何在适合的节点和定位的节点之间对齐文本?

如何在适合的节点和定位的节点之间对齐文本?

我正在尝试构建一个与常规底层网格对齐的可变大小块图。这是我的 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不包含任何文本的选项节点,为其命名,然后使用普通节点在所需位置添加文本。或者,考虑使用labelpin选项。

在下面的例子中,我使用了您的代码来说明如何使用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}

结果:

在此处输入图片描述

相关内容