I have the following code with two nodes:

\documentclass[crop,tikz]{standalone}
\begin{document}

\usetikzlibrary{positioning,calc}
\tikzstyle{block} = [draw, rectangle, minimum height=1cm, minimum width=1cm, outer sep=0pt]

\begin{tikzpicture}
\node [block,align=center](A) { \shortstack{double \\ type} };
\node [block,align=center,right=1.5cm of A](B) { \shortstack{single \\ type} };

\end{tikzpicture}
\end{document}

Because the content of node A has no "long" character that ranges below the baseline, the distance between the two lines is closer than in the second node B. There, the "g" character ranges below the baseline and therefore it seems that additional space is used and the two blocks are not aligned.

I could fix that by including a \vphantom{g} into node A. However, that would make the line spacing large in both blocks.

Instead, I want that the line space is small, just as if there were no characters that range below the baseline.

Is it possible to somehow "ignore" these characters?

up vote 8 down vote accepted

You should just \smash the [b]aseline of those words/phrases:

enter image description here

\documentclass{article}

\usepackage{tikz,amsmath}

\begin{document}

\usetikzlibrary{positioning,calc}
\tikzstyle{block} = [draw, rectangle, minimum height=1cm, minimum width=1cm, outer sep=0pt]

\begin{tikzpicture}
  \node [block,align=center](A) {\shortstack{double \\ type}};
  \node [block,align=center,right=1.5cm of A](B) {\shortstack{\smash[b]{single} \\ type}};
\end{tikzpicture}

\end{document}

amsmath provides the extended version of \smash.

  • +1 This is the first time I've seen this \smash command, can you give me more details about it? – AndréC Nov 15 at 20:53
  • 3
    See this code and its associated output. \smash removes the height and depth of its argument, while \smash[b]/\smash[t] removes only the depth/height. – Werner Nov 15 at 21:00

Another method is to use the \NextLine macro instead of \\. This eliminates the need to go back and change things just because you changed the text:

enter image description here

References

Code:

\documentclass[crop,tikz, border=2pt]{standalone}
\begin{document}

%% https://tex.stackexchange.com/a/51406/4301
\newcommand*{\IgnodeDescenders}{-\dimexpr\dp\strutbox+\baselineskip}
\newcommand*{\NextLine}{\strut\\[\IgnodeDescenders]}

\usetikzlibrary{positioning,calc}
\tikzstyle{block} = [draw, rectangle, minimum height=1cm, minimum width=1cm, outer sep=0pt]

\begin{tikzpicture}
\node [block,align=center](A) {\shortstack{double\NextLine type}};
\node [block,align=center,right=1.5cm of A](B) {\shortstack{single\NextLine type}};

\end{tikzpicture}
\end{document}
  • Somehow, when I tested this, it seems that the NewLine-line is larger than the "standard" line... If I replace the \NewLine command in the A node with \\, then distance of both lines is smaller although it should be the same? – SampleTime Nov 15 at 22:25

This is discussed at length in the pgfmanual on p. 65. The upshot is that you can add a suitable text depth.

\documentclass[crop,tikz]{standalone}
\begin{document}

\usetikzlibrary{positioning,calc}
\tikzset{block/.style={draw, rectangle, minimum height=1cm, minimum width=1cm,
outer sep=0pt,text height=3ex,text depth=.25ex}}

\begin{tikzpicture}
\node [block,align=center](A) { double \\ type };
\node [block,align=center,right=1.5cm of A](B) {single \\ type };
\draw[red] (A.west) -- (B.east);
\end{tikzpicture}
\end{document}

enter image description here

The red line is only to guide the eye.

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.