Annotation of loncom/html/adm/jsMath/extensions/AMSmath.js, revision 1.1
1.1 ! albertel 1: /*
! 2: * extensions/AMSmath.js
! 3: *
! 4: * Part of the jsMath package for mathematics on the web.
! 5: *
! 6: * This file defines most of the macros and environments from
! 7: * the amsmath LaTeX package. You can activate it by calling
! 8: *
! 9: * jsMath.Extension.Require('AMSmath');
! 10: *
! 11: * once jsMath.js has been loaded, or by adding "extensions/AMSmath.js"
! 12: * to the loadFiles array in jsMath/easy/load.js.
! 13: *
! 14: * You may wish to load AMSsymbols.js as well, but note that it
! 15: * requires the extra msam10 and msb10 fonts that you will have
! 16: * to install on your server first.
! 17: *
! 18: * ---------------------------------------------------------------------
! 19: *
! 20: * Copyright 2007 by Davide P. Cervone
! 21: *
! 22: * Licensed under the Apache License, Version 2.0 (the "License");
! 23: * you may not use this file except in compliance with the License.
! 24: * You may obtain a copy of the License at
! 25: *
! 26: * http://www.apache.org/licenses/LICENSE-2.0
! 27: *
! 28: * Unless required by applicable law or agreed to in writing, software
! 29: * distributed under the License is distributed on an "AS IS" BASIS,
! 30: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
! 31: * See the License for the specific language governing permissions and
! 32: * limitations under the License.
! 33: */
! 34:
! 35: /********************************************************************/
! 36:
! 37: jsMath.Extension.Require("moreArrows");
! 38:
! 39: jsMath.Package(jsMath.Parser,{
! 40: macros: {
! 41: intI: ['Macro','\\mathchoice{\\!}{}{}{}\\!\\!\\int'],
! 42: iint: ['Macro','\\!\\!\\!\\mathop{\\,\\,\\,\\int\\intI}'],
! 43: iiint: ['Macro','\\!\\!\\!\\mathop{\\,\\,\\,\\int\\intI\\intI}'],
! 44: iiiint: ['Macro','\\!\\!\\!\\mathop{\\,\\,\\,\\int\\intI\\intI\\intI}'],
! 45: idotsint: ['Macro','\\!\\!\\mathop{\\,\\,\\int\\cdots\\int}'],
! 46:
! 47: dddot: ['Macro','\\mathop{#1}\\limits^{\\textstyle ...}',1],
! 48: ddddot: ['Macro','\\mathop{#1}\\limits^{\\textstyle ....}',1],
! 49:
! 50: sideset: ['Macro','\\mathop{\\rlap{\\phantom{#3}}}#1\\!{#3}#2',3],
! 51: stackrel: ['Macro','\\mathrel{\\mathop{#2}\\limits^{#1}}',2],
! 52:
! 53: boxed: ['Macro','\\fbox{$\\displaystyle{#1}$}',1],
! 54:
! 55: tag: 'HandleTag',
! 56: notag: ['Macro',''],
! 57:
! 58: substack: ['Macro','\\begin{subarray}{c}#1\\end{subarray}',1],
! 59:
! 60: varliminf: ['Macro','\\mathop{\\underline{\\raise1.5pt{\\rule{0pt}{.6em}{0pt}\\smash{\\lower1.5pt{\\rm lim}}}}}'],
! 61: varlimsup: ['Macro','\\mathop{\\overline{\\rule{0pt}{.6em}{0pt}\\smash{\\rm lim}}}'],
! 62: varinjlim: ['Macro','\\mathop{\\underrightarrow{\\rm lim}}'],
! 63: varprojlim: ['Macro','\\mathop{\\underleftarrow{\\rm lim}}'],
! 64:
! 65: DeclareMathOperator: 'HandleDeclareOp',
! 66: operatorname: 'HandleOperatorName',
! 67:
! 68: genfrac: 'Genfrac',
! 69: frac: ['Genfrac',"","","",""],
! 70: tfrac: ['Genfrac',"","","","1"],
! 71: dfrac: ['Genfrac',"","","","0"],
! 72: binom: ['Genfrac',"(",")","0pt",""],
! 73: tbinom: ['Genfrac',"(",")","0pt","1"],
! 74: dbinom: ['Genfrac',"(",")","0pt","0"],
! 75:
! 76: cfrac: 'CFrac',
! 77:
! 78: shoveleft: ['HandleShove','left'],
! 79: shoveright: ['HandleShove','right']
! 80: },
! 81:
! 82: environments: {
! 83: align: ['Array',null,null,'rlrlrlrlrlrl',[5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18],1,'D'],
! 84: 'align*': ['Array',null,null,'rlrlrlrlrlrl',[5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18],1,'D'],
! 85: multline: 'Multline',
! 86: 'multline*': 'Multline',
! 87: split: ['Array',null,null,'rl',[5/18],1,'D'],
! 88: gather: ['Array',null,null,'c',null,1,'D'],
! 89: 'gather*': ['Array',null,null,'c',null,1,'D'],
! 90: subarray: ['Array',null,null,null,[0,0,0,0],1,'S',0,.25],
! 91: smallmatrix: ['Array',null,null,'cccccccccc',[1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3],1,'S',0]
! 92: },
! 93:
! 94: delimiter: {
! 95: '\\lvert': [4,2,0x6A,3,0x0C],
! 96: '\\rvert': [5,2,0x6A,3,0x0C],
! 97: '\\lVert': [4,2,0x6B,3,0x0D],
! 98: '\\rVert': [5,2,0x6B,3,0x0D]
! 99: },
! 100:
! 101: /*
! 102: * Ignore the tag for now
! 103: */
! 104: HandleTag: function (name) {
! 105: var arg = this.trimSpaces(this.GetArgument(this.cmd+name)); if (this.error) return;
! 106: if (arg == "*") this.GetArgument(this.cmd+name);
! 107: },
! 108:
! 109: /*
! 110: * Handle \DeclareMathOperator
! 111: */
! 112: HandleDeclareOp: function (name) {
! 113: var limits = "";
! 114: var cs = this.trimSpaces(this.GetArgument(this.cmd+name)); if (this.error) return;
! 115: if (cs == "*") {
! 116: limits = "\\limits";
! 117: cs = this.trimSpaces(this.GetArgument(this.cmd+name)); if (this.error) return;
! 118: }
! 119: if (cs.charAt(0) == "\\") {cs = cs.substr(1)}
! 120: var op = this.GetArgument(this.cmd+name); if (this.error) return;
! 121: op = op.replace(/\*/g,'\\char{cmr10}{0x2A}').replace(/-/g,'\\char{cmr10}{0x2D}');
! 122: jsMath.Parser.prototype.macros[cs] = ['Macro','\\mathop{\\rm '+op+'}'+limits];
! 123: },
! 124:
! 125: HandleOperatorName: function (name) {
! 126: var limits = "";
! 127: var op = this.trimSpaces(this.GetArgument(this.cmd+name)); if (this.error) return;
! 128: if (op == "*") {
! 129: limits = "\\limits";
! 130: op = this.trimSpaces(this.GetArgument(this.cmd+name)); if (this.error) return;
! 131: }
! 132: op = op.replace(/\*/g,'\\char{cmr10}{0x2A}').replace(/-/g,'\\char{cmr10}{0x2D}');
! 133: this.string = '\\mathop{\\rm '+op+'}'+limits+this.string.slice(this.i);
! 134: this.i = 0;
! 135: },
! 136:
! 137: /*
! 138: * Record presence of \shoveleft and \shoveright
! 139: */
! 140: HandleShove: function (name,data) {
! 141: if (this.mlist.data.entry == null) {this.mlist.data.entry = {}}
! 142: this.mlist.data.entry.shove = data[0];
! 143: },
! 144:
! 145: /*
! 146: * Handle \cfrac
! 147: */
! 148: CFrac: function (name) {
! 149: var lr = this.GetBrackets(this.cmd+name); if (this.error) return;
! 150: var num = this.GetArgument(this.cmd+name); if (this.error) return;
! 151: var den = this.GetArgument(this.cmd+name); if (this.error) return;
! 152:
! 153: num = this.Process('\\strut\\textstyle{'+num+'}'); if (this.error) return;
! 154: den = this.Process('\\strut\\textstyle{'+den+'}'); if (this.error) return;
! 155: var data = this.mlist.data;
! 156: var TeX = jsMath.Typeset.TeX(data.style,data.size);
! 157:
! 158: if (lr != "") {
! 159: if (lr != 'l' && lr != 'r') {this.Error("Illegal alignment specified in "+this.cmd+name); return}
! 160: num = jsMath.Box.Set(num,data.style,data.size);
! 161: den = jsMath.Box.Set(den,data.style,data.size);
! 162: if (num.w > den.w) {
! 163: if (lr == 'l') {den.html += jsMath.HTML.Spacer(num.w-den.w)}
! 164: else {den.html = jsMath.HTML.Spacer(num.w-den.w) + den.html}
! 165: den.w = num.w;
! 166: } else if (num.w < den.w) {
! 167: if (lr == 'l') {num.html += jsMath.HTML.Spacer(den.w-num.w)}
! 168: else {num.html = jsMath.HTML.Spacer(den.w-num.w) + num.html}
! 169: num.w = den.w;
! 170: }
! 171: }
! 172:
! 173: this.mlist.Add(jsMath.mItem.Fraction(name,num,den,TeX.default_rule_thickness));
! 174: },
! 175:
! 176: /*
! 177: * Implement AMS generalizes fraction
! 178: */
! 179: Genfrac: function (name,data) {
! 180: var left = data[0]; var right = data[1];
! 181: var thickness = data[2]; var style = data[3];
! 182:
! 183: if (left != null) {left = this.delimiter[left]} else
! 184: {left = this.GetDelimiterArg(this.cmd+name); if (this.error) return}
! 185: if (right != null) {right = this.delimiter[right]} else
! 186: {right = this.GetDelimiterArg(this.cmd+name); if (this.error) return}
! 187: if (thickness == null) {thickness = this.GetArgument(this.cmd+name); if (this.error) return}
! 188: if (style == null) {style = this.GetArgument(this.cmd+name); if (this.error) return}
! 189:
! 190: var num = this.ProcessArg(this.cmd+name); if (this.error) return;
! 191: var den = this.ProcessArg(this.cmd+name); if (this.error) return;
! 192:
! 193: if (left == "") {left = null}; if (right == "") {right = null}
! 194: if (thickness == "") {
! 195: var TeX =jsMath.Typeset.TeX(this.mlist.data.style,this.mlist.data.size);
! 196: thickness = TeX.default_rule_thickness;
! 197: } else {
! 198: thickness = this.ParseDimen(thickness,this.cmd+name,0,0);
! 199: }
! 200:
! 201: var frac = jsMath.mItem.Fraction(name,num,den,thickness,left,right);
! 202:
! 203: if (style != "") {
! 204: style = (["D","T","S","SS"])[style];
! 205: if (style == null) {this.Error("Bad math style for "+this.cmd+name); return}
! 206: var mlist = new jsMath.mList([new jsMath.mItem('style',{style:style}),frac]);
! 207: this.mlist.Add(jsMath.mItem.Atom('inner',{type:'mlist',mlist: mlist}));
! 208: } else {
! 209: this.mlist.Add(frac);
! 210: }
! 211: },
! 212:
! 213: /*
! 214: * Implements the multline environment
! 215: */
! 216: Multline: function (name,delim) {
! 217: var data = this.mlist.data;
! 218: var width = this.GetBrackets(this.cmd+'begin{'+name+'}'); if (this.error) return;
! 219: var arg = this.GetEnd(name); if (this.error) return;
! 220:
! 221: var parse = new jsMath.Parser(arg+this.cmd+'\\',null,data.size,'D');
! 222: parse.matrix = name; parse.row = []; parse.table = []; parse.rspacing = [];
! 223: parse.Parse(); if (parse.error) {this.Error(parse); return}
! 224: parse.HandleRow(name,1); // be sure the last row is recorded
! 225:
! 226: //
! 227: // check rows for extra columns and maximum width
! 228: //
! 229: var i; var row; var W = 0;
! 230: for (i = 0; i < parse.table.length; i++) {
! 231: row = parse.table[i];
! 232: if (row.length > 1) {
! 233: this.Error("Rows can contain only one equation in '"+name+"' environment");
! 234: return;
! 235: }
! 236: if (row[0].w > W) {W = row[0].w}
! 237: }
! 238:
! 239: //
! 240: // Determine width of display
! 241: //
! 242: if (width == "") {width = W+2} else {
! 243: width = this.ParseDimen(width,name,0,0);
! 244: if (width < W) {width = W}
! 245: }
! 246:
! 247: //
! 248: // Shove the top and bottom lines
! 249: //
! 250: if (parse.table.length > 1) {
! 251: parse.table[0][0].entry.shove = 'left';
! 252: row = parse.table[parse.table.length-1];
! 253: if (!row[0].entry.shove) {row[0].entry.shove = 'right'}
! 254: }
! 255: //
! 256: // Adjust widths of shoved lines
! 257: //
! 258: for (i = 0; i < parse.table.length; i++) {
! 259: row = parse.table[i][0];
! 260: if (row.entry.shove && row.w < width) {
! 261: switch (row.entry.shove) {
! 262: case 'left':
! 263: row.html += jsMath.HTML.Spacer(width-row.w);
! 264: break;
! 265:
! 266: case 'right':
! 267: row.html = jsMath.HTML.Spacer(width-row.w)+row.html;
! 268: break;
! 269: }
! 270: row.w = width;
! 271: }
! 272: }
! 273:
! 274: //
! 275: // Do the layout
! 276: //
! 277: var box = jsMath.Box.Layout(data.size,parse.table);
! 278: this.mlist.Add(jsMath.mItem.Atom('ord',box));
! 279: },
! 280:
! 281: /*
! 282: * Get a delimiter or empty argument
! 283: */
! 284: GetDelimiterArg: function (name) {
! 285: var c = this.trimSpaces(this.GetArgument(name)); if (this.error) return null;
! 286: if (c == "") return null;
! 287: if (this.delimiter[c]) return this.delimiter[c];
! 288: this.Error("Missing or unrecognized delimiter for "+name);
! 289: return null;
! 290: }
! 291: });
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>