Here's another one combining Frédérik's use of the positioning library with Greg's suggestion of using the chains library with a couple of other libraries thrown in to the mix (in plain-format):
\font\ss=cmss9
\font\ssbf=cmssbx10 at 9pt
\font\ssit=cmssi9
\let\tenbf\ssbf
\let\tenit\ssit
\input tikz
\usetikzlibrary{
chains, % for the "start chain", "on chain", and "join" [manual section 28, p. 284]
arrows, % for the ">=triangle 45" [manual section 23, p. 256-]
positioning, % for the "left=<optional dimen> of ...",
% and "below left=<optional dimen(s)> of ..."
% [manual section 5.2, p. 62-]
decorations.markings, % for the "X" on a join [manual p. 327-]
shapes.multipart % for the "rectangle split" styles [manual p. 450-453]
}
\tikzpicture[
font=\ss,
node distance=1.5cm and -1cm, % the y distance and x distance of nodes
% ^the x distance is set to a negative value to reserve space
every node/.style={minimum width=3cm,align=center},
every on chain/.style=join,
every join/.style={->,thick,>=triangle 45},
mynode/.style={
on chain=going #1,
% ^you can give parameters to your styles, so that for example:
% node[mynode=below] expands to: node[on chain=going below]
inner xsep=1em,
rectangle split,rectangle split parts=2,
rectangle split ignore empty parts=true,
rectangle split draw splits=false,
every text node part/.style={font=\bf}},
myfail/.style={thick,-,postaction={decorate,decoration={markings,
% I have a feeling this could be accomplished more easily
mark=at position .25 with { \draw (-3pt,-3pt) -- (3pt,3pt)
(3pt,-3pt) -- (-3pt,3pt); }}}}
]
\def\npt{\nodepart{two}} % just a local definition to save typing
\draw[start chain]
node[mynode] {event\npt caption}
node[draw,mynode=below] (proc-1) {process\npt caption}
node[draw,mynode=below right] {intermediary process}
{[start branch,every join/.style=myfail]
node[mynode=below] {failure\npt caption}}
node[draw,mynode=above right] {process\npt caption}
node[draw,mynode=below right] {intermediary process}
node[mynode=below] {success\npt caption};
\draw[every node/.append style={align=left,font=\it}]
node[left=1cm of proc-1] (desc-1) {mechanism\\descriptor}
% ^without the "1cm", the node would've been -1cm left of proc-1
% because of the "node distance" definition for the whole tikzpicture
node[below=of desc-1] {mechanism\\descriptor};
\endtikzpicture
\bye
looks like:
