The problem is what you said, nodes contain letters with different height and depth and they adjust and align according to it. TiKZ manual explains it in tutorial "Diagrams as simple graphs" and "Cell Pictures".
If you want all nodes aligned but without aligning words you can change nodes anchor with anchor=south
.
\documentclass[tikz,border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix[
matrix of nodes,
column sep=1ex, row sep=1ex,
nodes={
draw,
minimum height=2em,
text width=30mm,
anchor=south
},
] (matrix-optimization) {
Encodings &
Problems &
Algorithms \\
%
Selection &
uiae &
pppp \\
};
\end{tikzpicture}
\end{document}
But if you want nodes and text aligned you need to fix a certain depth and height to nodes.
\documentclass[tikz,border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix[text height=1.5ex,text depth=.25ex,
matrix of nodes,
column sep=1ex, row sep=1ex,
nodes={
draw,
minimum height=2em,
text width=30mm
},
] (matrix-optimization) {
Encodings &
Problems &
Algorithms \\
%
Selection &
uiae &
pppp \\
};
\end{tikzpicture}
\end{document}
After posting my answer I've found this previous question which suggest some other solutions: Problem with TikZ and vertical alignment of text inside nodes
I don't really get the question so I hope this is what you wanted. If you include a full document (such that we copy paste and see the problem on our systems) things are much more easier.
Here, you can change the default setting within a scope but your block
style had a node distance
which was resetting every time it is issued. I've made it 2mm such that we can see the difference easier.
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows,shapes.geometric,positioning}
\begin{document}
\begin{tikzpicture}[decision/.style={diamond, draw, text width=4.5em, text badly centered, node distance=3.5cm, inner sep=0pt},
block/.style ={rectangle, draw, text width=6em, text centered, rounded corners, minimum height=4em, minimum height=2em},
cloud/.style ={draw, ellipse, minimum height=2em},
line/.style ={draw,-latex'},
node distance = 1cm,
auto]
\node [block] (1st) {1st};
\node [block, right= of 1st] (2nd1) {2nd1};
\begin{scope}[node distance=2mm and 10mm]%Here we change it for everything inside this scope
\node [block, above= of 2nd1] (2nd2) {2nd2};
\node [block, below= of 2nd1] (2nd3) {2nd3};
\node [block, right= of 2nd1] (3rd1) {3rd1};
\node [block, above= of 3rd1] (3rd2) {3rd2};
\node [block, above= of 3rd2] (3rd3) {3rd3};
\end{scope}
\node [block, below= of 3rd1] (3rd4) {3rd4};
\node [block, below= of 3rd4] (3rd5) {3rd5};
\path [line] (1st) -- (2nd1);
\path [line] (2nd1) -- (2nd2);
\path [line] (2nd1) -- (2nd3);
\path [line] (2nd2) -- (3rd3);
\path [line] (2nd1) -- (3rd1);
\path [line] (1st) -- (2nd1);
\end{tikzpicture}
\end{document}
Best Answer
You can directly tell where the baseline should meet the picture using the
baseline
option