This has bugged me for quite a while too. I tried making sure all text was
unicode. Didn't help. The text was converted to U8 before determining the
size of the boxes, still messing up the alignment.
This thread prompted me to think about the problem again. Instead of trying
to build the entire logic to box I thought of a different approach. Convert
the text to display boxed to literal without any U8 characters. Any
character will do. I chose 'x'. Then the boxing works just fine. Format the
boxed 'x's into a literal array. Then take the data from the original, make
sure it is all unicode and replace the 'x's with this data. A little work
was needed to reorder the data for ranks greater than 1.
This gave me a chance to study L: and S: as they simplified doing this. It
seems to work for fixed-width fonts. Variable width fonts still mess up
alignment.
box=:3 : 0
to_uni=.(7 u:"1":)`]@.(131072=3!:0)
try. ts=.;(<@,)S:0 t=.to_uni L:0 y catch. ts=.0 end.
if. +./131072 32~:(3!:0)&>ts;<y do. y return. end.
ts=.' '(I.ts e. TAB,CR,LF)}ts
inc=.(3 : 'u:box_n=:>:box_n')"0
i=.I.'x'=,tx=.":('x'"0)L:0 t
box_n=:n1=.a.i.'@'
i=.i/:n1(<#]),3 u: 7 u:"1":(inc)L:0 t
($tx)$ts i},tx
)
tst=:(2 3$7 u:'ABCDΣF');i.3 4 5
box tst
┌───┬──────────────┐
│ABC│ 0 1 2 3 4│
│DΣF│ 5 6 7 8 9│
│ │10 11 12 13 14│
│ │15 16 17 18 19│
│ │ │
│ │20 21 22 23 24│
│ │25 26 27 28 29│
│ │30 31 32 33 34│
│ │35 36 37 38 39│
│ │ │
│ │40 41 42 43 44│
│ │45 46 47 48 49│
│ │50 51 52 53 54│
│ │55 56 57 58 59│
└───┴──────────────┘
The alignment in your browser may not be perfect, but it looked good in my
ijx session.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm