63

A rectangle label does not appear inside the rectangle but on the corner of it.

  \tikzstyle{every node} = [align=center]
   \begin{tikzpicture}
    \draw (0, 0) rectangle (2, 2) node [center] {label}; 
     %center is unknown but was my best guess
  \end{tikzpicture}

How do I move the labelling node to have a common center with the rectangle?

The result should look like this

  \tikzstyle{every node} = [align=center]
  \begin{tikzpicture}
    \draw (0, 0) rectangle (2, 2);
    \node at (1,1) {label};
  \end{tikzpicture}

but without having to specify the center manually.

Alan Munn
  • 218,180
Johannes
  • 1,579
  • 5
    Why not \node[draw,rectangle, minimum size=2cm] at (1,1){label};? – Claudio Fiandrino Feb 01 '13 at 15:10
  • I had that approach before and i am now refactoring. I have trouble realigning my boxe´s if i dont explicitly state start and endpoints. – Johannes Feb 01 '13 at 15:14
  • @Johannes: give a name to the node (e.g. \node[draw,rectangle, minimum size=2cm] (name) at (1,1){label};) then you will have name.south west for the lower left corner and name.north east for the upper right corner. – Claudio Fiandrino Feb 01 '13 at 15:35

3 Answers3

92

You should write instead:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) rectangle (2,2) node[pos=.5] {Test};
\end{tikzpicture}
\end{document}

By using node in a path without option, it will position the node to the last point.

Image Description

Exeleration-G
  • 393
  • 4
  • 13
  • 28
    You can also use [midway] option instead of [pos=.5]. It is equivalent and the syntax sounds perhaps a bit more natural. – JLDiaz Feb 01 '13 at 16:45
17

You can write the Text, that should be centered, after the connection (rectangle in this case). It also works for lines etc.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \draw (0,0) rectangle node{Test} (2,2);
  \end{tikzpicture}
\end{document}
dexteritas
  • 9,161
14

It seems that OP wants to draw a rectangle on fixed coordinates and later on insert the label in its center.

By default a node is a rectangle with a text in its center, so we could use it as an alternative.

Unfortunately node's solution needs some minimum width|height|size (which is not always respected) and it seems that OP doesn't want to compute them.

As an alternative node which does the work for us is a fit node. In this case we can enter both corner coordinates and insert the text with a center label. This solution has the advantage that we have created a correct size node which be used later on in our diagram.

\node[draw, fit={(0,0) (2,2)}, inner sep=0pt, label=center:Test] (A) {};

Rectangle corners can be absolute or relative coordinates. In this case we can use a shift option to place it where we want.

Following code shows both options, in blue Lionel or dexteritas solution and in black a fit node.

\documentclass[tikz, border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{fit}

\begin{document}
\begin{tikzpicture}

\begin{scope}
\node[draw, fit={(0,0) (2,2)}, inner sep=0pt, label=center:Test] (A) {};
\node[draw, fit={(0,0) (2,2)}, xshift=3cm, inner sep=0pt, label=center:Test] (B) {};
\draw (A)--(B);
\end{scope}

\begin{scope}[draw=blue, yshift=2.5cm]
\draw (0,0) rectangle node[draw] (A) {Test} ++(2,2); 
\draw (3,0) rectangle node[draw] (B) {Test} ++(2,2); 
\draw (A)--(B);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

Ignasi
  • 136,588