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>