% blx bly trx try box
% create a new box array
/box {
4 array astore
} def
% box box-select
% unpacks box to define various box-* variables
/box-select {
aload pop
/box-try exch def
/box-trx exch def
/box-bly exch def
/box-blx exch def
/box-width box-trx box-blx sub abs def
/box-height box-try box-bly sub abs def
} def
% box box-rect
% output box as a rect suitable for rectstoke etc.
/box-rect {
box-select
box-blx box-bly box-width box-height
} def
% box box-path
% output box as a path suitable for stroke, clip, etc.
/box-path {
box-select
newpath
box-blx box-bly moveto
box-blx box-try lineto
box-trx box-try lineto
box-trx box-bly lineto
closepath
} def
% box border box-border
% create a new box bordered within a box
/box-border {
/border exch def
box-select
box-blx border add
box-bly border add
box-trx border sub
box-try border sub
box
} def
% box tiles space pad box-vsplit
% split box vertically into 'tiles' new boxes, spaced apart by 'space'
% and padded within the original box by 'pad'
/box-vsplit {
/box-pad exch def
/box-space exch def
/box-tiles exch def
box-select
/box-height
box-try box-bly sub
box-pad 2 mul sub
box-space box-tiles 1 sub mul sub
box-tiles div
def
/box-width
box-trx box-blx sub
box-pad 2 mul sub
def
/box-blx box-blx box-pad add def
/box-bly box-bly box-pad add def
1 1 box-tiles {
pop
box-blx box-bly box-blx box-width add box-bly box-height add box
/box-bly box-bly box-height add box-space add def
} for
} def
% box tiles space pad box-hsplit
% as per box-vsplit, splitting box horizontally
/box-hsplit {
/box-pad exch def
/box-space exch def
/box-tiles exch def
box-select
/box-height box-height
box-pad 2 mul sub
def
/box-width box-width
box-pad 2 mul sub
box-space box-tiles 1 sub mul sub
box-tiles div
def
/box-blx box-blx box-pad add def
/box-bly box-bly box-pad add def
1 1 box-tiles {
pop
box-blx box-bly box-blx box-width add box-bly box-height add box
/box-blx box-blx box-width add box-space add def
} for
} def
/box-focus {
/box-box exch def
gsave
box-box box-select
box-box box-path clip
box-blx box-bly translate
} def
/box-defocus {
grestore
} def