Path: utzoo!mnetor!uunet!husc6!cmcl2!nrl-cmf!ames!ucsd!sdcsvax!ucsdhub!hp-sdd!hplabs!hp-pcd!hplsla!hpubvwa!hpfcse!hpuecoa!bgphp1!rclark From: rclark@bgphp1.UUCP (Roger N. Clark) Newsgroups: comp.sys.hp Subject: Re: Nroff driver for LaserJet Message-ID: <830002@bgphp1.UUCP> Date: 9 Mar 88 16:18:02 GMT References: <262@fedeva.UUCP> Organization: U.S. Geological Survey, Branch of Geophysics, Denver Lines: 818 > Does anybody have an nroff driver for the LaserJet Series II? Well, this is not specifically for the Series II, but it is probably compatible. I have also been waiting for someone to post the laserjet nroff driver table. HP helped me with the one below. They sent the version from Bruce Townsend (Bruce had it configured for another printer). I figured out all the escape codes for the laser and made the table delow. I gave the table to HP with the hope that they would do their own quality test on it and make it an HP supported product. I still think it is crazy that HP says they support the laser printers on HPUX and they support nroff. Most people would make the logical connection that the laser is supported by nroff! I guess HP thinks it is (as a bumb printer)! OH Well. Anyway, below are three files. The laserjet Table, a simple makeit shell script (it makes a table called tabhplaser2, the 2 for my second try). I use the ms macros most often and they need modifying if you want to do underlining, italic and bold at the same time. I still do not have it right. So if anyone figures it out, please send it to me. There is also a file called CHAR.SET which is the complete nroff charracter set as I understand it. After making the laser table, run the command: nroff -ms -Thplaser2 | . We use the table for many manuscripts, letters and memos. It has even been used for a thesis. We have not found any bugs for text. BUT tbl and neqn do NOT work correctly. There is something wrong with positioning. For example, boxes are not perfect and for complicated equations, characters can get overwritten by lines used for division. If someone figures out this bug, please let me know! (Any opinions expressed here are mine and not necessarily those of the USGS) Roger N. Clark U.S. Geological Survey, MS 964 Box 25046 Federal Center Denver, CO 80225-0046 (303) 236-1332 FTS 776-1332 {known-world}!hplabs!hpfcla!hpfcse!hpuecoa!bgphp1!rclark #---------------------------------- cut here ---------------------------------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by rclark at bgphp1 on Wed Mar 9 08:43:03 1988 # # This archive contains: # laser.c makeit CHAR.SET # # Error checking via wc(1) will be performed. # Error checking via sum(1) will be performed. echo x - laser.c cat >laser.c <<'@EOF' /*********************************************************************** * * * TABLE - A PROGRAM TO PREPARE NROFF DRIVER TABLES * * copyright (c) 1985 by Bruce Townsend and Bell Northern Research * * Permission hereby granted to use, distribute, modify, or copy * * except for profit, providing this disclaimer is included. * * * * * * Please send bug reports to Bruce Townsend (utcs!bnr-vpa!bruce) * * * * Usage: 1) Modify this source to initialize the "t" structure. * * 2) If the amount of char data that the structure * * references is very large, you may want to redefine * * C_SIZE * * 3) check to see whether or should * * be #included. One of these include files may be * * necessary to provide settings for t.bset, t.breset * * 4) Compile this source: * * cc -O table.c -o table * * 5) Run the program as "table filename", where filename * * is of the form "tab*", as in: "tab450" * * 6) Locate the tabfile in the proper place (on our system * * the directory is /usr/lib/term * * * * Date: Mon Feb 25 1985 * *----------------------------------------------------------------------* * October 18, 1987: * * This version is for the HP Laserjet with the 92286J Math Elite * * Font Cartridge. * * * * The entries are my best attempt but are not gaurenteed. * * We have been using the table for over 2 years and have found no * * problems on our HP9000 series 500 (until the 5.2 addition of * * kchar). * * * * Roger N. Clark, USGS Branch of Geophysics, Denver (303) 236-1332 * * hpfcla!hpfcse!hpfcmr!hpuecoa!bgphp1!rclark * ***********************************************************************/ #include #include /* ... or use */ /* #include /* ... or use */ #define C_SIZE 10000 /* The maximum amount of character data allowed in the initialized structure t - increase if necessary */ #define INCH 240 struct { /* Initialize this structure */ int bset; int breset; int Hor; int Vert; int Newline; int Char; int Kchar; int Em; int Halfline; int Adj; char *twinit; char *twrest; char *twnl; char *hlr; char *hlf; char *flr; char *bdon; char *bdoff; char *iton; char *itoff; char *ploton; char *plotoff; char *up; char *down; char *right; char *left; char *codetab[256-32]; char *zzz; } t = { /***************************************************************** * * * HP LASERJET (kchar stuff not checked at all!) * * * *****************************************************************/ /*bset*/ 0, /*breset*/ 0177420, /*Hor*/ INCH/120, /*Vert*/ INCH/48, /*Newline*/ INCH/6, /*Char*/ INCH/12, /*Kchar*/ INCH/12, /*Em*/ INCH/12, /*Halfline*/ INCH/12, /*Adj*/ INCH/12, /*twinit*/ "\033E\033&l14c1e7.64c66F", /* default reset 66 lines per page, ignore unprintible region of page near top and bottom */ /*twrest*/ "\033E\033&l14c1e7.64c66F", /*twnl*/ "\n", /*hlr*/ "\033&a-1R\033=", /*hlf*/ "\033=", /*flr*/ "\033&a-1R", /*bdon*/ "\033(s7B\033(s0S", /*bdoff*/ "\033(s0B\033(s0S", /*iton*/ "\033(s1S\033(s0B", /*itoff*/ "\033(s0S\033(s0B", /*ploton*/ "\033&k2H\033&l1C", /* horizontal space:1/120, vertical space: 1/48 inch */ /*plotoff*/ "\033&k10H\033&l7.64C", /*horizontal space:1/12, vertical space: 1/6 inch 7.64/48 inch actually */ /*up*/ "\033&a-1R", /* */ /*down*/ "\n", /*right*/ " ", /*left*/ "\b", /*codetab*/ "\001 ", /*space*/ "\001!", /*!*/ "\001\042", /*"*/ "\001#", /*#*/ "\001$", /*$*/ "\001%", /*%*/ "\001&", /*&*/ "\001'", /*' close*/ "\001(", /*(*/ "\001)", /*)*/ "\001*", /***/ "\001+", /*+*/ "\001,", /*,*/ "\001-", /*- hyphen*/ "\001.", /*.*/ "\001/", /*/*/ "\2010", /*0*/ "\2011", /*1*/ "\2012", /*2*/ "\2013", /*3*/ "\2014", /*4*/ "\2015", /*5*/ "\2016", /*6*/ "\2017", /*7*/ "\2018", /*8*/ "\2019", /*9*/ "\001:", /*:*/ "\001;", /*;*/ "\001<", /*<*/ "\001=", /*=*/ "\001>", /*>*/ "\001?", /*?*/ "\001@", /*@*/ "\201A", /*A*/ "\201B", /*B*/ "\201C", /*C*/ "\201D", /*D*/ "\201E", /*E*/ "\201F", /*F*/ "\201G", /*G*/ "\201H", /*H*/ "\201I", /*I*/ "\201J", /*J*/ "\201K", /*K*/ "\201L", /*L*/ "\201M", /*M*/ "\201N", /*N*/ "\201O", /*O*/ "\201P", /*P*/ "\201Q", /*Q*/ "\201R", /*R*/ "\201S", /*S*/ "\201T", /*T*/ "\201U", /*U*/ "\201V", /*V*/ "\201W", /*W*/ "\201X", /*X*/ "\201Y", /*Y*/ "\201Z", /*Z*/ "\001[", /*[*/ "\001\134", /*\*/ "\001]", /*]*/ "\001^", /*^*/ "\001_", /*_ dash*/ "\001`", /*` open*/ "\201a", /*a*/ "\201b", /*b*/ "\201c", /*c*/ "\201d", /*d*/ "\201e", /*e*/ "\201f", /*f*/ "\201g", /*g*/ "\201h", /*h*/ "\201i", /*i*/ "\201j", /*j*/ "\201k", /*k*/ "\201l", /*l*/ "\201m", /*m*/ "\201n", /*n*/ "\201o", /*o*/ "\201p", /*p*/ "\201q", /*q*/ "\201r", /*r*/ "\201s", /*s*/ "\201t", /*t*/ "\201u", /*u*/ "\201v", /*v*/ "\201w", /*w*/ "\201x", /*x*/ "\201y", /*y*/ "\201z", /*z*/ "\001{", /*{*/ "\001|", /*|*/ "\001}", /*}*/ "\001~", /*~*/ "\001\033&k6H \033&k10H", /*narrow sp set at 1/2 space, 12cpi*/ "\001-", /*hyphen*/ "\001\033(1QL\033(8U", /*bullet*/ "\001\033(2Ql\033(8U", /*square*/ "\001\033(0Q-\033(8U", /*3/4 em*/ "\001_", /*rule*/ "\001\033(0Ew\033(8U", /*1/4*/ "\001\033(0Ex\033(8U", /*1/2*/ "\0033/4", /*3/4*/ "\001-", /*minus*/ "\202fi", /*fi*/ "\202fl", /*fl*/ "\202ff", /*ff*/ "\203ffi", /*ffi*/ "\203ffl", /*ffl*/ "\001\033(0Q#\033(8U", /*degree*/ "\001\033(0A>\033(8U", /*dagger*/ "\001\033(0A#\033(8U", /* section*/ "\001'", /*foot mark*/ "\001'", /*acute accent*/ "\001`", /*grave accent*/ "\001_", /*underrule*/ "\001\033(1Qk\033(8U", /*slash (longer)*/ "\001\033&k3H \033&k10H", /*half narrow space, set at 1/4 space at 12cpi*/ "\001 ", /*unpaddable space*/ "\001\033(0AA\033(8U", /*alpha*/ "\001\033(0AB\033(8U", /*beta*/ "\001\033(0Aq\033(8U", /*gamma*/ "\001\033(0Aw\033(8U", /*delta*/ "\001\033(0AE\033(8U", /*epsilon*/ "\001\033(0Az\033(8U", /*zeta*/ "\001\033(0Ah\033(8U", /*eta*/ "\001\033(0Ar\033(8U", /*theta*/ "\001\033(0Ai\033(8U", /*iota*/ "\001\033(0Ak\033(8U", /*kappa*/ "\001\033(0Ag\033(8U", /*lambda*/ "\001\033(0Am\033(8U", /*mu*/ "\001\033(0An\033(8U", /*nu*/ "\001\033(0Au\033(8U", /*xi*/ "\001o", /*omicron*/ "\001\033(0Ap\033(8U", /*pi*/ "\001\033(0Ao\033(8U", /*rho*/ "\001\033(0As\033(8U", /*sigma*/ "\001\033(0At\033(8U", /*tau*/ "\001\033(0Ay\033(8U", /*upsilon*/ "\001\033(0Ad\033(8U", /*phi*/ "\001\033(0Ax\033(8U", /*chi*/ "\001\033(0Ac\033(8U", /*psi*/ "\001\033(0Al\033(8U", /*omega*/ "\001\033(0QC\033(8U", /*Gamma*/ "\001\033(0QD\033(8U", /*Delta*/ "\001\033(0QH\033(8U", /*Theta*/ "\001\033(0QK\033(8U", /*Lambda*/ "\001\033(0QN\033(8U", /*Xi*/ "\001\033(0QP\033(8U", /*Pi*/ "\001\033(0QR\033(8U", /*Sigma*/ "\000\0", /**/ "\001\033(0QT\033(8U", /*Upsilon*/ "\001\033(0QU\033(8U", /*Phi*/ "\001\033(0QW\033(8U", /*Psi*/ "\001\033(0QX\033(8U", /*Omega*/ "\001\033(0Q!\033(8U", /*square root*/ "\001\033(0Q[\033(8U", /*terminal sigma*/ "\001\033(1Q0\033(8U", /*root en*/ "\001\033(0Q^\033(8U", /*>=*/ "\001\033(0Q\134\033(8U", /*<=*/ "\001\033(0A-\033(8U", /*identically equal*/ "\001-", /*equation minus*/ "\001\033(0A)\033(8U", /*approx =*/ "\001~", /*approximates*/ "\001\033(0Q]\033(8U", /*not equal*/ "\001\033(0A|\033(8U", /*right arrow*/ "\001\033(0A~\033(8U", /*left arrow*/ "\001\033(0A{\033(8U", /*up arrow*/ "\001\033(0A_\033(8U", /*down arrow*/ "\001\033(0Q=\033(8U", /*equation equal*/ "\001\033(0Q*\033(8U", /*multiply*/ "\001\033(0A(\033(8U", /*divide*/ "\001\033(0A%\033(8U", /*plus-minus*/ "\001\033(1Q5\033(8U", /*cup (union)*/ "\001\033(1Q6\033(8U", /*cap (intersection)*/ "\001\033(1Q:\033(8U", /*subset of*/ "\001\033(1Q;\033(8U", /*superset of*/ "\001\033(1Q>\033(8U", /*improper subset*/ "\001\033(1Q?\033(8U", /*improper superset*/ "\001\033(0A<\033(8U", /*infinity*/ "\001\033(0AF\033(8U", /*partial derivative*/ "\001\033(0A$\033(8U", /*gradient*/ "\001\033(1QH\033(8U", /*not*/ "\001\033(1QU\033(8U", /*int. sign*/ "\001\033(0A&\033(8U", /*proportional to*/ "\001\033(1QX\033(8U", /*empty set*/ "\001\033(1Q7\033(8U", /*member of*/ "\001+", /*equation plus*/ "\001\033(2Q,\033(8U", /*registered*/ "\001\033(2Q-\033(8U", /*copyright*/ "\001\033(0A\042\033(8U", /*box rule (042 is ")*/ "\001c\b/", /*cent sign*/ "\001\033(0A>\033(8U\b-", /*dbl dagger*/ "\001\033(1Q&\033(8U", /*right hand*/ "\001\033(1Q(\033(8U", /*left hand*/ "\001*", /*math * */ "\001 ", /*bell system sign*/ "\001|", /*or (was star)*/ "\001\033(1QM\033(8U", /*circle*/ "\001\033(1Qb\033(8U", /*left top of big curley*/ "\001\033(1Qd\033(8U", /*left bottom of big curley)*/ "\001\033(1Qr\033(8U", /*right top */ "\001\033(1Qt\033(8U", /*right bottom */ "\001\033(1Qc\033(8U", /*left center of big curly bracket*/ "\001\033(1Qs\033(8U", /*right center of big curly bracket*/ "\001\033(1Qu\033(8U", /*bold vertical*/ "\001\033(1Qa\033(8U", /*left floor(left bot of big sq bract)*/ "\001\033(1Qq\033(8U", /*right floor (rb of ")*/ "\001\033(1Q`\033(8U", /*left ceiling (lt of ")*/ "\001\033(1Qp\033(8U", /*right ceiling (rt of ")*/ NULL }; /************* DO NOT ALTER ANYTHING AFTER THIS POINT ***************/ struct { /* This structure will be stored in the tab file */ int bset; int breset; int Hor; int Vert; int Newline; int Char; int Kchar; int Em; int Halfline; int Adj; int twinit; int twrest; int twnl; int hlr; int hlf; int flr; int bdon; int bdoff; int iton; int itoff; int ploton; int plotoff; int up; int down; int right; int left; int codetab[256-32]; int zzz; } t_stor; char c_data[C_SIZE]; char *c_pointer[256]; char *c_end = c_data; int n_strings, c_size; main (argc, argv) int argc; char *argv[]; { FILE *table; int i, j, i_len, j_len; char *tail, *strcpy(); if (argc != 2) { /* Need a file name argument */ fprintf (stderr, "Usage: table \"file\"\n"); exit (1); } /* Open the file */ if ((table = fopen (argv[1], "w")) == NULL) { fprintf (stderr, "File %s not opened for writing\n", argv[1]); exit (1); } /* Copy the integer values from the initialized structure to the storage structure */ t_stor.bset = t.bset; t_stor.breset = t.breset; t_stor.Hor = t.Hor; t_stor.Vert = t.Vert; t_stor.Newline = t.Newline; t_stor.Char = t.Char; t_stor.Kchar = t.Kchar; t_stor.Em = t.Em; t_stor.Halfline = t.Halfline; t_stor.Adj = t.Adj; /* Add the character strings into a character array */ addstring (t.twinit); addstring (t.twrest); addstring (t.twnl); addstring (t.hlr); addstring (t.hlf); addstring (t.flr); addstring (t.bdon); addstring (t.bdoff); addstring (t.iton); addstring (t.itoff); addstring (t.ploton); addstring (t.plotoff); addstring (t.up); addstring (t.down); addstring (t.right); addstring (t.left); for (i = 0; i < 256 - 32; i++) addstring (t.codetab[i]); /* eliminate strings which are tails of other strings */ for (i = 0; i < n_strings; i++) { i_len = strlen (c_pointer[i]); for (j = 0; j < n_strings; j++) { if (i == j) continue; j_len = strlen (c_pointer[j]); if (i_len <= j_len) { /* string i could be tail of string j */ tail = c_pointer[j] + j_len - i_len; if (! strcmp (c_pointer[i], tail)) { clearstring (c_pointer[i]); break; } } } } /* Compress the c_data array to eliminate strings of nulls */ for (i = j = 0; i < n_strings; i++) { if (! *c_pointer[i]) continue; tail = strlen (strcpy (c_pointer[j], c_pointer[i])) + c_pointer[j] + 1; c_pointer[++j] = tail; } c_size = c_pointer[j] - c_data; /* The amount of data to be stored */ /* Now find each string in this table and provide an index to it */ t_stor.twinit = findstring (t.twinit); t_stor.twrest = findstring (t.twrest); t_stor.twnl = findstring (t.twnl); t_stor.hlr = findstring (t.hlr); t_stor.hlf = findstring (t.hlf); t_stor.flr = findstring (t.flr); t_stor.bdon = findstring (t.bdon); t_stor.bdoff = findstring (t.bdoff); t_stor.iton = findstring (t.iton); t_stor.itoff = findstring (t.itoff); t_stor.ploton = findstring (t.ploton); t_stor.plotoff = findstring (t.plotoff); t_stor.up = findstring (t.up); t_stor.down = findstring (t.down); t_stor.right = findstring (t.right); t_stor.left = findstring (t.left); for (i = 0; i < 256 - 32; i++) { t_stor.codetab[i] = findstring (t.codetab[i]); } t_stor.zzz = 0; /* Write the character storage block size */ if (fwrite (&c_size, sizeof (c_size), 1, table) != 1) write_err (); if (fwrite (&t_stor, sizeof (t_stor), 1, table) != 1) write_err (); if (fwrite (c_data, sizeof (*c_data), c_size, table) != c_size) write_err (); if (fclose (table)) { fprintf (stderr, "File %s not closed properly\n", argv[1]); exit (1); } } addstring (string) char *string; { c_pointer[n_strings] = c_end; c_end += strlen (string) + 1; if (c_end >= c_data + C_SIZE) { fprintf (stderr, "Table size too small, increase it!/n"); exit(1); } strcpy (c_pointer[n_strings++], string); } clearstring (string) char *string; { while (*string) *string++ = 0; } findstring (string) char *string; { int c_len, s_len, i; for (i = 0; c_pointer[i]; i++) { if ((c_len = strlen (c_pointer[i])) >= (s_len = strlen (string))) { if (!strcmp (string, c_pointer[i] + c_len - s_len)) return (c_pointer[i] + c_len - s_len - c_data); } } fprintf (stderr, "Serious bug! string not found in table\n"); exit(1); /* NOT REACHED */ } write_err () { fprintf (stderr, "Write to file failed\n"); exit (1); } @EOF set -- `sum makeit <<'@EOF' set -x cc -O laser.c -o laser laser tabhplaser2 mv tabhplaser2 /usr/lib/term rm laser @EOF set -- `sum CHAR.SET <<'@EOF' .nr LL 4.5i .ll 4.5i .nr PO 2.0i .po 2.0i .nr VS 18 .vs 18 .ND .B .ce 2 NROFF Character Set on the HP Laserjet .R .B The Alphabet: .R a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z .B Greek: .R \(*a \(*b \(*g \(*d \(*e \(*z \(*y \(*h \(*i \(*k \(*l \(*m \(*n \(*c \(*o \(*p \(*r \(*s \(ts \(*t \(*u \(*f \(*x \(*q \(*w \(*A \(*B \(*G \(*D \(*E \(*Z \(*Y \(*H \(*I \(*K \(*L \(*M \(*N \(*C \(*O \(*P \(*R \(*S \(*T \(*U \(*F \(*X \(*Q \(*W .B Math Symbols: .R \(sr \(rn \(>= \(<= \(== \(~= \(ap \(!= \(mu \(di \(+- \(cu \(ca \(sb \(sp \(ib \(ip \(if \(pd \(gr \(no \(is \(pt \(es \(mo \(br .B Numbers: .R 1 2 3 4 5 6 7 8 9 0 .B Other Symbols: .R ! @ # $ % ^ & * ( ) _ - + = ~ ` | \\ [ ] : ; " ' ? / > . < , { } \(bu \(em \(sq \(14 \(12 \(de \(dg \(ct \(rg \(co \(sc \(-> \(<- \(ua \(da \(rh \(lh \(ci .bp .nf CHAR INPUT NAME CHARACTER NAME ' ' close quote ` ` open quote \(em \\(em 3/4 Em dash - - hyphen or \(hy \\(hy hyphen \- \\- current font minus \(bu \\(bu bullet \(sq \\(sq square \(ru \\(ru rule \(14 \\(14 1/4 \(12 \\(12 1/2 \(34 \\(34 3/4 \(fi \\(fi fi \(fl \\(fl fl \(ff \\(ff ff \(ffi \\(Fi ffi \(ffl \\(Fl ffl \(de \\(de degree \(dg \\(dg dagger \(fm \\(fm foot mark \(ct \\(ct cent sign \(rg \\(rg registered \(co \\(co copyright \(pl \\(pl math plus \(mi \\(mi math minus \(eq \\(eq math equals \(** \\(** math star \(sc \\(sc section \(aa \\(aa acute accent \(ga \\(ga grave accent \(ul \\(ul underrule \(sl \\(sl slash (matching backslash) \(*a \\(*a alpha \(*b \\(*b beta \(*g \\(*g gamma \(*d \\(*d delta \(*e \\(*e epsilon \(*z \\(*z zeta \(*y \\(*y eta \(*h \\(*h theta \(*i \\(*i iota \(*k \\(*k kappa \(*l \\(*l lambda \(*m \\(*m mu \(*n \\(*n nu \(*c \\(*c xi \(*o \\(*o omicron \(*p \\(*p pi \(*r \\(*r rho \(*s \\(*s sigma \(ts \\(ts terminal sigma \(*t \\(*t tau \(*u \\(*u upsilon \(*f \\(*f phi \(*x \\(*x chi \(*q \\(*q psi \(*w \\(*w omega \(*A \\(*A Alpha \(*B \\(*B Beta \(*G \\(*G Gamma \(*D \\(*D Delta \(*E \\(*E Epsilon \(*Z \\(*Z Zeta \(*Y \\(*Y Eta \(*H \\(*H Theta \(*I \\(*I Iota \(*K \\(*K Kappa \(*L \\(*L Lambda \(*M \\(*M Mu \(*N \\(*N Nu \(*C \\(*C Xi \(*O \\(*O Omicron \(*P \\(*P Pi \(*R \\(*R Rho \(*S \\(*S Sigma \(*T \\(*T Tau \(*U \\(*U Upsilon \(*F \\(*F Phi \(*X \\(*X Chi \(*Q \\(*Q Psi \(*W \\(*W Omega \(sr \\(sr square root \(rn \\(rn root en extender \(>= \\(>= greater than or equal to \(<= \\(<= less than or equal to \(== \\(== exactly equal \(~= \\(~= approx. = \(ap \\(ap approximates \(!= \\(!= not equal \(-> \\(-> right arrow \(<- \\(<- left arrow \(ua \\(ua up arrow \(da \\(da down arrow \(mu \\(mu multiply \(di \\(di divide \(+- \\(+- plus-minus \(cu \\(cu cup (union) \(ca \\(ca cap (intersection) \(sb \\(sb subset of \(sp \\(sp superset of \(ib \\(ib improper subset \(ip \\(ip improper superset \(if \\(if infinity \(pd \\(pd partial derivative \(gr \\(gr gradient \(no \\(no not \(is \\(is integral sign \(pt \\(pt proportional to \(es \\(es empty set \(mo \\(mo member of \(br \\(br box vertical rule \(dd \\(dd double dagger \(rh \\(rh right hand \(lh \\(lh left hand \(bs \\(bs Bell System logo \(or \\(or or \(ci \\(ci circle \(lt \\(lt left top of curly bracket \(lb \\(lb left bottom \(rt \\(rt right top \(rb \\(rb right bottom \(lk \\(lk left center of big curly bracket \(rk \\(rk right center of big curly bracket \(bv \\(bv bold vertical \(lf \\(lf left floor (left bottom of big square bracket) \(rf \\(rf right floor (right bottom) \(lc \\(lc left ceiling (left top) \(rc \\(rc right ceiling (right top) @EOF set -- `sum