<< DiscreteMath`Combinatorica` coversQ[parent_, child_] := And [ Length[parent] >= Length[child] , Min[Take[ parent, Length@child] - child] >= 0] planepartitionQ[par_] := MatchQ[par, {{___Integer} ..}] && If[Length[par] > 1, And @@ MapThread[coversQ, {Drop[par, -1], Rest[par]}], True] planepartitions[n_Integer] := Module[{l1, l2, l3, l4}, l1 = z @@@ Partitions[n] ; l2 = l1 /. k_Integer /; (k > 1) :> w @@ Partitions[k]; l3 = l2 /. z[x_w, y : (1 ...)] :> Thread[z[x, y], w] /. z[x__w] :> Outer[z, x] /. z[x__w, y : (1 ...)] :> Outer[z, x, Sequence @@ ({y} /. 1 -> w[1])] /. w -> Sequence; l4 = l3 /. z[x___List, y : (1 ..)] :> z[x, Sequence @@ Transpose[{{y}}]] /. z -> List; Cases[Union[l4], _?planepartitionQ]]