úÎN{JI#      !"portable experimentalbyorgey@cis.upenn.eduR#$%&'()*+,-./0123Contents of a box. 4&A sub-box with a specified alignment. 5A column of sub-boxes. 6A row of sub-boxes. 7A raw string. 8 No content. 1Data type for specifying the alignment of boxes. 9Align at the bottom/right. :Centered, biased to the bottom/right. ;Centered, biased to the top/left. <Align at the top/left. BThe basic data type. A box has a specified size and some sort of  contents. =>Align boxes along their tops. !Align boxes along their bottoms. Align boxes to the left. Align boxes to the right. ,Align boxes centered, but biased to the left/top in case of  unequal parities. -Align boxes centered, but biased to the right/bottom in case of  unequal parities. =The null box, which has no content and no size. It is quite  useless.  emptyBox r c is an empty box with r rows and c columns. ? Useful for effecting more fine-grained positioning of other B boxes, by inserting empty boxes of the desired size in between  them. A 1x1$ box containing a single character. A (1 x len$) box containing a string of length len. =Paste two boxes together horizontally, using a default (top)  alignment. @Paste two boxes together horizontally with a single intervening 5 column of space, using a default (top) alignment. <Paste two boxes together vertically, using a default (left)  alignment. BPaste two boxes together vertically with a single intervening row / of space, using a default (left) alignment. FGlue a list of boxes together horizontally, with the given alignment.  hsep sep a bs lays out bs horizontally with alignment a,  with sep" amount of space in between each. DGlue a list of boxes together vertically, with the given alignment.  vsep sep a bs lays out bs vertically with alignment a,  with sep" amount of space in between each. punctuateH a p bs! horizontally lays out the boxes bs with a  copy of p interspersed between each. A vertical version of .  para algn w t is a box of width w, containing text t,  aligned according to algn!, flowed to fit within the given  width.  columns w h t# is a list of boxes, each of width w and height  at most h, containing text t flowed into as many columns as  necessary. ?mkParaBox a n s makes a box of height n with the text s  aligned according to a. @*Flow the given text into the given width. ABCDEFGHalignHoriz algn n bx creates a box of width n , with the  contents and height of bx$, horizontally aligned according to  algn. alignVert algn n bx creates a box of height n , with the  contents and width of bx", vertically aligned according to  algn. align ah av r c bx creates an r x c box with the contents  of bx$, aligned horizontally according to ah and vertically  according to av.  Move a box "up"0 by putting it in a larger box with extra rows, / aligned to the top. See the disclaimer for . ?Move a box down by putting it in a larger box with extra rows, 2 aligned to the bottom. See the disclaimer for . BMove a box left by putting it in a larger box with extra columns, 9 aligned left. Note that the name of this function is A something of a white lie, as this will only result in the box B being moved left by the specified amount if it is already in a ! larger right-aligned context. :Move a box right by putting it in a larger box with extra 3 columns, aligned right. See the disclaimer for . ! Render a 4 as a String, suitable for writing to the screen or  a file. I" Padded take":  takeP a n xs is the same as  take n xs, if n  < = length xs; otherwise it is xs followed by enough copies of  a to make the length equal to n. JtakePA  is like I#, but with alignment. That is, we  imagine a copy of xs( extended infinitely on both sides with  copies of a, and a window of size n placed so that xs has . the specified alignment within the window; takePA algn a n xs ( returns the contents of this window. KGenerate a string of spaces. L!Render a box as a list of lines. M?Render a box as a list of lines, using a given number of rows. NBRender a box as a list of lines, using a given number of columns. O!Resize a rendered list of lines. P9Resize a rendered list of lines, using given alignments. "6A convenience function for rendering a box to stdout. Q9Convenient ability to use bare string literals as boxes. #  !"%   !"#  !"R      !"#$%%&'(()*+,-.//0123456789:;<=>?@ABCDEFGHIJKLMNOP boxes-0.1.2Text.PrettyPrint.Boxes AlignmentBoxrowscolstopbottomleftrightcenter1center2nullBoxemptyBoxchartext<><+>///+/hcathsepvcatvsep punctuateH punctuateVparacolumns alignHoriz alignVertalignmoveUpmoveDownmoveLeft moveRightrenderprintBoxWordwLengetWordLinelLengetWords ParaContentBlock fullLineslastLinePara paraWidth paraContentContentSubBoxColRowTextBlank AlignLast AlignCenter2 AlignCenter1 AlignFirstcontent mkParaBoxflow emptyParagetLinesmkLine startLinemkWordaddWordPaddWordLwordFitstakePtakePAblanks renderBoxrenderBoxWithRowsrenderBoxWithCols resizeBoxresizeBoxAligned $fIsStringBox