A possible solution with tcolorbox
. As it uses nested boxes, it won't be breakable between pages.
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{amsmath, amssymb}
\newtcolorbox{mybox}[1][]{%
enhanced,
size=title,
fontupper=\itshape, fonttitle=\itshape,
sharp corners,
colback=white, colframe=black, coltitle=black,
boxrule=1pt, rightrule=0pt,
segmentation code={\draw (segmentation.west)--++(0:.25\textwidth);},
attach boxed title to top text left={yshift*=-2mm},
boxed title style={size=fbox, colback=white, frame hidden},
#1
}
\begin{document}
\begin{mybox}[title={Buffer}]
$\upharpoonright$(max, \textsc{Init}, Join, Leave)
\begin{mybox}
max : $\mathbb{N}$\\
$items:seq\ MSG$
\tcblower
\#items $\leqslant$ max
\end{mybox}
\begin{mybox}[title={\textsc{Init}}]
items $=\langle\ \rangle$
\end{mybox}
\begin{mybox}[nobeforeafter, width=.48\textwidth, title={Join}]
$\Delta$(items)\\
msg? : MSG
\tcblower
\#items $<$ max\\
items' = items$\overset{\smallfrown}{ }\langle$ msg? $\rangle$
\end{mybox}\hfill
\begin{mybox}[nobeforeafter, width=.48\textwidth, title={Leave}]
$\Delta$(items)\\
msg! : MSG
\tcblower
\#items $\ne \langle \rangle$\\
items $= \langle\text{msg!}\rangle\overset{\smallfrown}{ }$items'
\end{mybox}
\end{mybox}
\end{document}

Update
In case that a brekable solution is necessary, an alternative to nested boxes could be a boxedraster
(or boxeditemize
).
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{amsmath, amssymb}
\usepackage{lipsum}
\usepackage[textheight=10cm]{geometry}
\tcbset{
mybox/.style={%
enhanced,
size=title,
fontupper=\itshape, fonttitle=\itshape,
sharp corners,
colback=white, colframe=black, coltitle=black,
boxrule=1pt, rightrule=0pt,
segmentation code={\draw (segmentation.west)--++(0:.25\textwidth);},
attach boxed title to top text left={yshift*=-2mm},
boxed title style={size=fbox, colback=white, frame hidden},
}
}
\begin{document}
\begin{tcboxeditemize}[raster columns=2, raster equal height=rows, mybox]{mybox, breakable, title={Buffer}}
%
\tcbitem[blank, raster multicolumn=2] $\upharpoonright$(max, \textsc{Init}, Join, Leave)
%
\tcbitem[raster multicolumn=2]
max : $\mathbb{N}$\\
$items:seq\ MSG$
\tcblower
\#items $\leqslant$ max
%
\tcbitem[raster multicolumn=2, title={\textsc{Init}}] items $=\langle\ \rangle$
%
\tcbitem[title={Join}]
$\Delta$(items)\\
msg? : MSG
\tcblower
\#items $<$ max\\
items' = items$\overset{\smallfrown}{ }\langle$ msg? $\rangle$
%
\tcbitem[title={Leave}]
$\Delta$(items)\\
msg! : MSG
\tcblower
\#items $\ne \langle \rangle$\\
items $= \langle\text{msg!}\rangle\overset{\smallfrown}{ }$items'
%
\tcbitem[raster multicolumn=2, title={\textsc{Init}}] items $=\langle\ \rangle$
%
\tcbitem[title={Join}]
$\Delta$(items)\\
msg? : MSG
\tcblower
\#items $<$ max\\
items' = items$\overset{\smallfrown}{ }\langle$ msg? $\rangle$
%
\tcbitem[title={Leave}]
$\Delta$(items)\\
msg! : MSG
\tcblower
\#items $\ne \langle \rangle$\\
items $= \langle\text{msg!}\rangle\overset{\smallfrown}{ }$items'
%
\tcbitem[raster multicolumn=2, title={\textsc{Init}}] items $=\langle\ \rangle$
\end{tcboxeditemize}
\end{document}

tcolorbox
. Did you try something? If so, please share your code and we'll be able to help you out. You would have more response if you offer something to work with instead of asking for something from scratch.tcolorbox
, I have also added my previous attempt to the post. thanks!