File:  [LON-CAPA] / loncom / html / adm / jsMath / extensions / leaders.js
Revision 1.2: download - view: text, annotated - select for diffs
Tue Oct 9 21:29:22 2007 UTC (16 years, 11 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_99_1, version_2_5_99_0, version_2_12_X, version_2_11_X, version_2_11_5_msu, version_2_11_5, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, bz6209-base, bz6209, bz5969, bz2851, PRINT_INCOMPLETE_base, PRINT_INCOMPLETE, HEAD, GCI_3, GCI_2, GCI_1, BZ5971-printing-apage, BZ5434-fox, BZ4492-merge, BZ4492-feature_horizontal_radioresponse
- jsMath 3.4e

    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,-.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]
   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]},
  103:     rightarrow: {rep:  [2,0x00], right: [2,0x21]},
  104:     leftrightarrow: {left: [2,0x20], rep: [2, 0x00], right: [2,0x21]}
  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]]);
  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)}
  116:     box.x = -(leader.w + box.w)/2;
  117:     var space = jsMath.Box.Space((leader.w-box.w)/2);
  118:     box = jsMath.mItem.Atom(data[1]? 'op': 'ord',
  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>