Annotation of loncom/html/adm/jsMath/extensions/leaders.js, revision 1.2

1.1       albertel    1: /*
                      2:  *  extensions/leaders.js
                      3:  *  
                      4:  *  Part of the jsMath package for mathematics on the web.
                      5:  *
                      6:  *  This file implements the \overbrace, \underbrace, \overrightarrow 
                      7:  *  and \overleftarrow macros. It will be loaded automatically when needed,
                      8:  *  or can be loaded by
                      9:  *  
                     10:  *    jsMath.Extension.Require('leaders');
                     11:  *
                     12:  *  ---------------------------------------------------------------------
                     13:  *
                     14:  *  Copyright 2005-2006 by Davide P. Cervone
                     15:  * 
                     16:  *  Licensed under the Apache License, Version 2.0 (the "License");
                     17:  *  you may not use this file except in compliance with the License.
                     18:  *  You may obtain a copy of the License at
                     19:  * 
                     20:  *      http://www.apache.org/licenses/LICENSE-2.0
                     21:  * 
                     22:  *  Unless required by applicable law or agreed to in writing, software
                     23:  *  distributed under the License is distributed on an "AS IS" BASIS,
                     24:  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                     25:  *  See the License for the specific language governing permissions and
                     26:  *  limitations under the License.
                     27:  */
                     28: 
                     29: /********************************************************************/
                     30: 
                     31: jsMath.Add(jsMath.Box,{
                     32: 
                     33:   /*
                     34:    *  Create a horizontally stretchable "delimiter" (like over- and
                     35:    *  underbraces).
                     36:    */
                     37: //###  Add size?
                     38:   Leaders: function (W,leader) {
                     39:     var h; var d; var w; var html; var font;
                     40:     if (leader.lmid) {// braces
                     41:       font = jsMath.TeX.fam[leader.left[0]];
                     42:       var left = this.GetCharCode(leader.left);
                     43:       var right = this.GetCharCode(leader.right);
                     44:       var lmid = this.GetCharCode(leader.lmid);
                     45:       var rmid = this.GetCharCode(leader.rmid);
                     46:       w = (W - left.w - right.w - lmid.w - rmid.w)/2 - .1; h = .4; d = .3;
                     47:       if (w < 0) {w = 0}
                     48:       html = this.AddClass(left.tclass,left.c,left.font) 
                     49:            + jsMath.HTML.Rule(w,left.h)
                     50:            + this.AddClass(lmid.tclass,lmid.c+rmid.c,lmid.font)
                     51:            + jsMath.HTML.Rule(w,right.h)
                     52:            + this.AddClass(right.tclass,right.c,right.font);
                     53:     } else { //arrows
                     54:       font = jsMath.TeX.fam[leader.rep[0]];
                     55:       var left = this.GetCharCode(leader.left? leader.left: leader.rep);
                     56:       var rep = this.GetCharCode(leader.rep);
                     57:       var right = this.GetCharCode(leader.right? leader.right: leader.rep);
                     58:       var n = Math.ceil((W - left.w - right.w + .4)/(rep.w - .3));
                     59:       w = (W - left.w - right.w + .4 - n*(rep.w - .3));
                     60:       if (leader.left) {h = left.h; d = left.d} else {h = right.h; d = right.d}
                     61:       if (d == null) {d = 0}; if (h == null) {h = 0}
                     62:       var html = this.AddClass(left.tclass,left.c,left.font); var m = Math.floor(n/2);
                     63:       var ext = jsMath.HTML.Place(rep.c,-.3,0);
                     64:       var ehtml = ''; for (var i = 0; i < m; i++) {ehtml += ext};
                     65:       html += this.AddClass(rep.tclass,ehtml,rep.font) + jsMath.HTML.Spacer(w);
                     66:       ehtml = ''; for (var i = m; i < n; i++) {ehtml += ext};
                     67:       html += this.AddClass(rep.tclass,ehtml,rep.font);
                     68:       if (jsMath.Browser.msieFontBug) {html += '<span style="display: none">x</span>'}
                     69:       html += jsMath.HTML.Place(this.AddClass(right.tclass,right.c,right.font),-.4,0);
                     70:     }
                     71:     w = jsMath.EmBoxFor(html).w;
                     72:     if (w != W) {
                     73:       w = jsMath.HTML.Spacer((W-w)/2);
                     74:       html = w + html + w;
                     75:     }
                     76:     var box = new jsMath.Box('html',html,W,h,d);
                     77:     box.bh = jsMath.TeX[font].h; box.bd = jsMath.TeX[font].d;
                     78:     return box;
                     79:   }
                     80: 
                     81: });
                     82: 
                     83: jsMath.Package(jsMath.Parser,{
                     84:   
                     85:   macros: {
1.2     ! albertel   86:     overbrace:           ['HandleLeaders','downbrace',1],
        !            87:     underbrace:          ['HandleLeaders','upbrace',1,1,-.05],
        !            88:     overrightarrow:      ['HandleLeaders','rightarrow',],
        !            89:     underrightarrow:     ['HandleLeaders','rightarrow',null,1,-.2],
        !            90:     overleftarrow:       ['HandleLeaders','leftarrow'],
        !            91:     underleftarrow:      ['HandleLeaders','leftarrow',null,1,-.2],
        !            92:     overleftrightarrow:  ['HandleLeaders','leftrightarrow'],
        !            93:     underleftrightarrow: ['HandleLeaders','leftrightarrow',null,1,-.2]
1.1       albertel   94:   },
                     95:   
                     96:   /*
                     97:    *  The horizontally stretchable delimiters
                     98:    */
                     99:   leaders: {
                    100:     downbrace:  {left: [3,0x7A], lmid: [3,0x7D], rmid: [3,0x7C], right: [3,0x7B]},
                    101:     upbrace:    {left: [3,0x7C], lmid: [3,0x7B], rmid: [3,0x7A], right: [3,0x7D]},
                    102:     leftarrow:  {left: [2,0x20], rep:   [2,0x00]},
1.2     ! albertel  103:     rightarrow: {rep:  [2,0x00], right: [2,0x21]},
        !           104:     leftrightarrow: {left: [2,0x20], rep: [2, 0x00], right: [2,0x21]}
1.1       albertel  105:   },
                    106: 
                    107:   /*
                    108:    *  Implements \overbrace, \underbrace, etc.
                    109:    */
                    110:   HandleLeaders: function (name,data) {
                    111:     var box = this.ProcessArg(this.cmd+name); if (this.error) return;
                    112:     box = jsMath.Box.Set(box,'D',this.mlist.data.size).Remeasured();
                    113:     var leader = jsMath.Box.Leaders(box.w,this.leaders[data[0]]);
1.2     ! albertel  114:     if (data[2]) {leader.y = -leader.h-box.d+(data[3]||0)}
        !           115:             else {leader.y = box.h + Math.max(0,leader.d)+(data[3]||0)}
1.1       albertel  116:     box.x = -(leader.w + box.w)/2;
                    117:     var space = jsMath.Box.Space((leader.w-box.w)/2);
1.2     ! albertel  118:     box = jsMath.mItem.Atom(data[1]? 'op': 'ord',
1.1       albertel  119:       jsMath.Box.SetList([leader,box,space],'T',this.mlist.data.size));
                    120:     box.limits = (data[1]? 1: 0);
                    121:     this.mlist.Add(box);
                    122:   }
                    123:   
                    124: });

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>