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

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: {
        !            86:     overbrace:       ['HandleLeaders','downbrace',1],
        !            87:     underbrace:      ['HandleLeaders','upbrace',1,1],
        !            88:     overrightarrow:  ['HandleLeaders','rightarrow'],
        !            89:     overleftarrow:   ['HandleLeaders','leftarrow']
        !            90:   },
        !            91:   
        !            92:   /*
        !            93:    *  The horizontally stretchable delimiters
        !            94:    */
        !            95:   leaders: {
        !            96:     downbrace:  {left: [3,0x7A], lmid: [3,0x7D], rmid: [3,0x7C], right: [3,0x7B]},
        !            97:     upbrace:    {left: [3,0x7C], lmid: [3,0x7B], rmid: [3,0x7A], right: [3,0x7D]},
        !            98:     leftarrow:  {left: [2,0x20], rep:   [2,0x00]},
        !            99:     rightarrow: {rep:  [2,0x00], right: [2,0x21]}
        !           100:   },
        !           101: 
        !           102:   /*
        !           103:    *  Implements \overbrace, \underbrace, etc.
        !           104:    */
        !           105:   HandleLeaders: function (name,data) {
        !           106:     var box = this.ProcessArg(this.cmd+name); if (this.error) return;
        !           107:     box = jsMath.Box.Set(box,'D',this.mlist.data.size).Remeasured();
        !           108:     var leader = jsMath.Box.Leaders(box.w,this.leaders[data[0]]);
        !           109:     if (data[2]) {leader.y = -leader.h - box.d}
        !           110:             else {leader.y = box.h + Math.max(0,leader.d)}
        !           111:     box.x = -(leader.w + box.w)/2;
        !           112:     var space = jsMath.Box.Space((leader.w-box.w)/2);
        !           113:     box = jsMath.mItem.Atom(data[1]? 'op': 'inner',
        !           114:       jsMath.Box.SetList([leader,box,space],'T',this.mlist.data.size));
        !           115:     box.limits = (data[1]? 1: 0);
        !           116:     this.mlist.Add(box);
        !           117:   }
        !           118:   
        !           119: });

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