fe66a90a2a
of the readers to make spacing at end of output more consistent. Modified tests accordingly. git-svn-id: https://pandoc.googlecode.com/svn/trunk@201 788f1e2b-df1e-0410-8736-df70ead52e1b
1672 lines
64 KiB
HTML
1672 lines
64 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<!-- configuration parameters -->
|
|
<meta name="defaultView" content="slideshow" />
|
|
<meta name="controlVis" content="hidden" />
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
<meta name="generator" content="pandoc" />
|
|
<style type="text/css" media="projection" id="slideProj">
|
|
/* Do not edit or override these styles! The system will likely break if you do. */
|
|
|
|
div#header, div#footer, div#controls, .slide {position: absolute;}
|
|
html>body div#header, html>body div#footer,
|
|
html>body div#controls, html>body .slide {position: fixed;}
|
|
.handout {display: none;}
|
|
.layout {display: block;}
|
|
.slide, .hideme, .incremental {visibility: hidden;}
|
|
#slide0 {visibility: visible;}
|
|
|
|
/* The following styles size, place, and layer the slide components.
|
|
Edit these if you want to change the overall slide layout.
|
|
The commented lines can be uncommented (and modified, if necessary)
|
|
to help you with the rearrangement process. */
|
|
|
|
/* target = 1024x768 */
|
|
|
|
div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
|
|
div#header {top: 0; height: 3em; z-index: 1;}
|
|
div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
|
|
.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;}
|
|
div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
|
|
div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
|
|
margin: 0;}
|
|
#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
|
|
html>body #currentSlide {position: fixed;}
|
|
|
|
/*
|
|
div#header {background: #FCC;}
|
|
div#footer {background: #CCF;}
|
|
div#controls {background: #BBD;}
|
|
div#currentSlide {background: #FFC;}
|
|
*/
|
|
|
|
/* Following are the presentation styles -- edit away! */
|
|
|
|
body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;}
|
|
:link, :visited {text-decoration: none; color: #00C;}
|
|
#controls :active {color: #88A !important;}
|
|
#controls :focus {outline: 1px dotted #227;}
|
|
h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
|
|
ul, pre {margin: 0; line-height: 1em;}
|
|
html, body {margin: 0; padding: 0;}
|
|
|
|
blockquote, q {font-style: italic;}
|
|
blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
|
|
blockquote p {margin: 0;}
|
|
blockquote i {font-style: normal;}
|
|
blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
|
|
blockquote b i {font-style: italic;}
|
|
|
|
kbd {font-weight: bold; font-size: 1em;}
|
|
sup {font-size: smaller; line-height: 1px;}
|
|
|
|
.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
|
|
.slide code.bad, code del {color: red;}
|
|
.slide code.old {color: silver;}
|
|
.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
|
|
.slide pre code {display: block;}
|
|
.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
|
|
.slide li {margin-top: 0.75em; margin-right: 0;}
|
|
.slide ul ul {line-height: 1;}
|
|
.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
|
|
.slide img.leader {display: block; margin: 0 auto;}
|
|
|
|
div#header, div#footer {background: #005; color: #AAB;
|
|
font-family: Verdana, Helvetica, sans-serif;}
|
|
div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat;
|
|
line-height: 1px;}
|
|
div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
|
|
#footer h1, #footer h2 {display: block; padding: 0 1em;}
|
|
#footer h2 {font-style: italic;}
|
|
|
|
div.long {font-size: 0.75em;}
|
|
.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1;
|
|
margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap;
|
|
font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
|
|
color: #DDE; background: #005;}
|
|
.slide h3 {font-size: 130%;}
|
|
h1 abbr {font-variant: small-caps;}
|
|
|
|
div#controls {position: absolute; left: 50%; bottom: 0;
|
|
width: 50%;
|
|
text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
|
|
html>body div#controls {position: fixed; padding: 0 0 1em 0;
|
|
top: auto;}
|
|
div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
|
|
margin: 0; padding: 0;}
|
|
#controls #navLinks a {padding: 0; margin: 0 0.5em;
|
|
background: #005; border: none; color: #779;
|
|
cursor: pointer;}
|
|
#controls #navList {height: 1em;}
|
|
#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;}
|
|
|
|
#currentSlide {text-align: center; font-size: 0.5em; color: #449;}
|
|
|
|
#slide0 {padding-top: 3.5em; font-size: 90%;}
|
|
#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
|
|
font: bold 2em Helvetica, sans-serif; white-space: normal;
|
|
color: #000; background: transparent;}
|
|
#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
|
|
#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
|
|
#slide0 h4 {margin-top: 0; font-size: 1em;}
|
|
|
|
ul.urls {list-style: none; display: inline; margin: 0;}
|
|
.urls li {display: inline; margin: 0;}
|
|
.note {display: none;}
|
|
.external {border-bottom: 1px dotted gray;}
|
|
html>body .external {border-bottom: none;}
|
|
.external:after {content: " \274F"; font-size: smaller; color: #77B;}
|
|
|
|
.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
|
|
img.incremental {visibility: hidden;}
|
|
.slide .current {color: #B02;}
|
|
|
|
|
|
/* diagnostics
|
|
|
|
li:after {content: " [" attr(class) "]"; color: #F88;}
|
|
*/
|
|
</style>
|
|
<style type="text/css" media="projection" id="operaFix">
|
|
/* DO NOT CHANGE THESE unless you really want to break Opera Show */
|
|
.slide {
|
|
visibility: visible !important;
|
|
position: static !important;
|
|
page-break-before: always;
|
|
}
|
|
#slide0 {page-break-before: avoid;}
|
|
|
|
</style>
|
|
<style type="text/css" media="screen" id="outlineStyle">
|
|
/* don't change this unless you want the layout stuff to show up in the outline view! */
|
|
|
|
.layout div, #footer *, #controlForm * {display: none;}
|
|
#footer, #controls, #controlForm, #navLinks, #toggle {
|
|
display: block; visibility: visible; margin: 0; padding: 0;}
|
|
#toggle {float: right; padding: 0.5em;}
|
|
html>body #toggle {position: fixed; top: 0; right: 0;}
|
|
|
|
/* making the outline look pretty-ish */
|
|
|
|
#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
|
|
#slide0 h1 {padding-top: 1.5em;}
|
|
.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
|
|
border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
|
|
#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
|
|
|
|
</style>
|
|
<style type="text/css" media="print" id="slidePrint">
|
|
/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */
|
|
.slide, ul {page-break-inside: avoid; visibility: visible !important;}
|
|
h1 {page-break-after: avoid;}
|
|
|
|
body {font-size: 12pt; background: white;}
|
|
* {color: black;}
|
|
|
|
#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
|
|
#slide0 h3 {margin: 0; padding: 0;}
|
|
#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
|
|
#slide0 {margin-bottom: 3em;}
|
|
|
|
h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;}
|
|
.extra {background: transparent !important;}
|
|
div.extra, pre.extra, .example {font-size: 10pt; color: #333;}
|
|
ul.extra a {font-weight: bold;}
|
|
p.example {display: none;}
|
|
|
|
#header {display: none;}
|
|
#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;}
|
|
#footer h2, #controls {display: none;}
|
|
|
|
/* The following rule keeps the layout stuff out of print. Remove at your own risk! */
|
|
.layout, .layout * {display: none !important;}
|
|
</style>
|
|
<script type="text/javascript">
|
|
// S5 v1.1 slides.js -- released into the Public Domain
|
|
//
|
|
// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
|
|
// about all the wonderful and talented contributors to this code!
|
|
|
|
var undef;
|
|
var slideCSS = '';
|
|
var snum = 0;
|
|
var smax = 1;
|
|
var incpos = 0;
|
|
var number = undef;
|
|
var s5mode = true;
|
|
var defaultView = 'slideshow';
|
|
var controlVis = 'visible';
|
|
|
|
var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
|
|
var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
|
|
var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
|
|
|
|
function hasClass(object, className) {
|
|
if (!object.className) return false;
|
|
return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
|
|
}
|
|
|
|
function hasValue(object, value) {
|
|
if (!object) return false;
|
|
return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
|
|
}
|
|
|
|
function removeClass(object,className) {
|
|
if (!object) return;
|
|
object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
|
|
}
|
|
|
|
function addClass(object,className) {
|
|
if (!object || hasClass(object, className)) return;
|
|
if (object.className) {
|
|
object.className += ' '+className;
|
|
} else {
|
|
object.className = className;
|
|
}
|
|
}
|
|
|
|
function GetElementsWithClassName(elementName,className) {
|
|
var allElements = document.getElementsByTagName(elementName);
|
|
var elemColl = new Array();
|
|
for (var i = 0; i< allElements.length; i++) {
|
|
if (hasClass(allElements[i], className)) {
|
|
elemColl[elemColl.length] = allElements[i];
|
|
}
|
|
}
|
|
return elemColl;
|
|
}
|
|
|
|
function isParentOrSelf(element, id) {
|
|
if (element == null || element.nodeName=='BODY') return false;
|
|
else if (element.id == id) return true;
|
|
else return isParentOrSelf(element.parentNode, id);
|
|
}
|
|
|
|
function nodeValue(node) {
|
|
var result = "";
|
|
if (node.nodeType == 1) {
|
|
var children = node.childNodes;
|
|
for (var i = 0; i < children.length; ++i) {
|
|
result += nodeValue(children[i]);
|
|
}
|
|
}
|
|
else if (node.nodeType == 3) {
|
|
result = node.nodeValue;
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
function slideLabel() {
|
|
var slideColl = GetElementsWithClassName('*','slide');
|
|
var list = document.getElementById('jumplist');
|
|
smax = slideColl.length;
|
|
for (var n = 0; n < smax; n++) {
|
|
var obj = slideColl[n];
|
|
|
|
var did = 'slide' + n.toString();
|
|
obj.setAttribute('id',did);
|
|
if (isOp) continue;
|
|
|
|
var otext = '';
|
|
var menu = obj.firstChild;
|
|
if (!menu) continue; // to cope with empty slides
|
|
while (menu && menu.nodeType == 3) {
|
|
menu = menu.nextSibling;
|
|
}
|
|
if (!menu) continue; // to cope with slides with only text nodes
|
|
|
|
var menunodes = menu.childNodes;
|
|
for (var o = 0; o < menunodes.length; o++) {
|
|
otext += nodeValue(menunodes[o]);
|
|
}
|
|
list.options[list.length] = new Option(n + ' : ' + otext, n);
|
|
}
|
|
}
|
|
|
|
function currentSlide() {
|
|
var cs;
|
|
if (document.getElementById) {
|
|
cs = document.getElementById('currentSlide');
|
|
} else {
|
|
cs = document.currentSlide;
|
|
}
|
|
cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
|
|
'<span id="csSep">\/<\/span> ' +
|
|
'<span id="csTotal">' + (smax-1) + '<\/span>';
|
|
if (snum == 0) {
|
|
cs.style.visibility = 'hidden';
|
|
} else {
|
|
cs.style.visibility = 'visible';
|
|
}
|
|
}
|
|
|
|
function go(step) {
|
|
if (document.getElementById('slideProj').disabled || step == 0) return;
|
|
var jl = document.getElementById('jumplist');
|
|
var cid = 'slide' + snum;
|
|
var ce = document.getElementById(cid);
|
|
if (incrementals[snum].length > 0) {
|
|
for (var i = 0; i < incrementals[snum].length; i++) {
|
|
removeClass(incrementals[snum][i], 'current');
|
|
removeClass(incrementals[snum][i], 'incremental');
|
|
}
|
|
}
|
|
if (step != 'j') {
|
|
snum += step;
|
|
lmax = smax - 1;
|
|
if (snum > lmax) snum = lmax;
|
|
if (snum < 0) snum = 0;
|
|
} else
|
|
snum = parseInt(jl.value);
|
|
var nid = 'slide' + snum;
|
|
var ne = document.getElementById(nid);
|
|
if (!ne) {
|
|
ne = document.getElementById('slide0');
|
|
snum = 0;
|
|
}
|
|
if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
|
|
if (incrementals[snum].length > 0 && incpos == 0) {
|
|
for (var i = 0; i < incrementals[snum].length; i++) {
|
|
if (hasClass(incrementals[snum][i], 'current'))
|
|
incpos = i + 1;
|
|
else
|
|
addClass(incrementals[snum][i], 'incremental');
|
|
}
|
|
}
|
|
if (incrementals[snum].length > 0 && incpos > 0)
|
|
addClass(incrementals[snum][incpos - 1], 'current');
|
|
ce.style.visibility = 'hidden';
|
|
ne.style.visibility = 'visible';
|
|
jl.selectedIndex = snum;
|
|
currentSlide();
|
|
number = 0;
|
|
}
|
|
|
|
function goTo(target) {
|
|
if (target >= smax || target == snum) return;
|
|
go(target - snum);
|
|
}
|
|
|
|
function subgo(step) {
|
|
if (step > 0) {
|
|
removeClass(incrementals[snum][incpos - 1],'current');
|
|
removeClass(incrementals[snum][incpos], 'incremental');
|
|
addClass(incrementals[snum][incpos],'current');
|
|
incpos++;
|
|
} else {
|
|
incpos--;
|
|
removeClass(incrementals[snum][incpos],'current');
|
|
addClass(incrementals[snum][incpos], 'incremental');
|
|
addClass(incrementals[snum][incpos - 1],'current');
|
|
}
|
|
}
|
|
|
|
function toggle() {
|
|
var slideColl = GetElementsWithClassName('*','slide');
|
|
var slides = document.getElementById('slideProj');
|
|
var outline = document.getElementById('outlineStyle');
|
|
if (!slides.disabled) {
|
|
slides.disabled = true;
|
|
outline.disabled = false;
|
|
s5mode = false;
|
|
fontSize('1em');
|
|
for (var n = 0; n < smax; n++) {
|
|
var slide = slideColl[n];
|
|
slide.style.visibility = 'visible';
|
|
}
|
|
} else {
|
|
slides.disabled = false;
|
|
outline.disabled = true;
|
|
s5mode = true;
|
|
fontScale();
|
|
for (var n = 0; n < smax; n++) {
|
|
var slide = slideColl[n];
|
|
slide.style.visibility = 'hidden';
|
|
}
|
|
slideColl[snum].style.visibility = 'visible';
|
|
}
|
|
}
|
|
|
|
function showHide(action) {
|
|
var obj = GetElementsWithClassName('*','hideme')[0];
|
|
switch (action) {
|
|
case 's': obj.style.visibility = 'visible'; break;
|
|
case 'h': obj.style.visibility = 'hidden'; break;
|
|
case 'k':
|
|
if (obj.style.visibility != 'visible') {
|
|
obj.style.visibility = 'visible';
|
|
} else {
|
|
obj.style.visibility = 'hidden';
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
|
|
function keys(key) {
|
|
if (!key) {
|
|
key = event;
|
|
key.which = key.keyCode;
|
|
}
|
|
if (key.which == 84) {
|
|
toggle();
|
|
return;
|
|
}
|
|
if (s5mode) {
|
|
switch (key.which) {
|
|
case 10: // return
|
|
case 13: // enter
|
|
if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
|
|
if (key.target && isParentOrSelf(key.target, 'controls')) return;
|
|
if(number != undef) {
|
|
goTo(number);
|
|
break;
|
|
}
|
|
case 32: // spacebar
|
|
case 34: // page down
|
|
case 39: // rightkey
|
|
case 40: // downkey
|
|
if(number != undef) {
|
|
go(number);
|
|
} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
|
|
go(1);
|
|
} else {
|
|
subgo(1);
|
|
}
|
|
break;
|
|
case 33: // page up
|
|
case 37: // leftkey
|
|
case 38: // upkey
|
|
if(number != undef) {
|
|
go(-1 * number);
|
|
} else if (!incrementals[snum] || incpos <= 0) {
|
|
go(-1);
|
|
} else {
|
|
subgo(-1);
|
|
}
|
|
break;
|
|
case 36: // home
|
|
goTo(0);
|
|
break;
|
|
case 35: // end
|
|
goTo(smax-1);
|
|
break;
|
|
case 67: // c
|
|
showHide('k');
|
|
break;
|
|
}
|
|
if (key.which < 48 || key.which > 57) {
|
|
number = undef;
|
|
} else {
|
|
if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
|
|
if (key.target && isParentOrSelf(key.target, 'controls')) return;
|
|
number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function clicker(e) {
|
|
number = undef;
|
|
var target;
|
|
if (window.event) {
|
|
target = window.event.srcElement;
|
|
e = window.event;
|
|
} else target = e.target;
|
|
if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
|
|
if (!e.which || e.which == 1) {
|
|
if (!incrementals[snum] || incpos >= incrementals[snum].length) {
|
|
go(1);
|
|
} else {
|
|
subgo(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
function findSlide(hash) {
|
|
var target = null;
|
|
var slides = GetElementsWithClassName('*','slide');
|
|
for (var i = 0; i < slides.length; i++) {
|
|
var targetSlide = slides[i];
|
|
if ( (targetSlide.name && targetSlide.name == hash)
|
|
|| (targetSlide.id && targetSlide.id == hash) ) {
|
|
target = targetSlide;
|
|
break;
|
|
}
|
|
}
|
|
while(target != null && target.nodeName != 'BODY') {
|
|
if (hasClass(target, 'slide')) {
|
|
return parseInt(target.id.slice(5));
|
|
}
|
|
target = target.parentNode;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function slideJump() {
|
|
if (window.location.hash == null) return;
|
|
var sregex = /^#slide(\d+)$/;
|
|
var matches = sregex.exec(window.location.hash);
|
|
var dest = null;
|
|
if (matches != null) {
|
|
dest = parseInt(matches[1]);
|
|
} else {
|
|
dest = findSlide(window.location.hash.slice(1));
|
|
}
|
|
if (dest != null)
|
|
go(dest - snum);
|
|
}
|
|
|
|
function fixLinks() {
|
|
var thisUri = window.location.href;
|
|
thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
|
|
var aelements = document.getElementsByTagName('A');
|
|
for (var i = 0; i < aelements.length; i++) {
|
|
var a = aelements[i].href;
|
|
var slideID = a.match('\#slide[0-9]{1,2}');
|
|
if ((slideID) && (slideID[0].slice(0,1) == '#')) {
|
|
var dest = findSlide(slideID[0].slice(1));
|
|
if (dest != null) {
|
|
if (aelements[i].addEventListener) {
|
|
aelements[i].addEventListener("click", new Function("e",
|
|
"if (document.getElementById('slideProj').disabled) return;" +
|
|
"go("+dest+" - snum); " +
|
|
"if (e.preventDefault) e.preventDefault();"), true);
|
|
} else if (aelements[i].attachEvent) {
|
|
aelements[i].attachEvent("onclick", new Function("",
|
|
"if (document.getElementById('slideProj').disabled) return;" +
|
|
"go("+dest+" - snum); " +
|
|
"event.returnValue = false;"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function externalLinks() {
|
|
if (!document.getElementsByTagName) return;
|
|
var anchors = document.getElementsByTagName('a');
|
|
for (var i=0; i<anchors.length; i++) {
|
|
var anchor = anchors[i];
|
|
if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
|
|
anchor.target = '_blank';
|
|
addClass(anchor,'external');
|
|
}
|
|
}
|
|
}
|
|
|
|
function createControls() {
|
|
var controlsDiv = document.getElementById("controls");
|
|
if (!controlsDiv) return;
|
|
var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
|
|
var hideDiv, hideList = '';
|
|
if (controlVis == 'hidden') {
|
|
hideDiv = hider;
|
|
} else {
|
|
hideList = hider;
|
|
}
|
|
controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
|
|
'<div id="navLinks">' +
|
|
'<a accesskey="t" id="toggle" href="javascript:toggle();">Ø<\/a>' +
|
|
'<a accesskey="z" id="prev" href="javascript:go(-1);">«<\/a>' +
|
|
'<a accesskey="x" id="next" href="javascript:go(1);">»<\/a>' +
|
|
'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
|
|
'<\/div><\/form>';
|
|
if (controlVis == 'hidden') {
|
|
var hidden = document.getElementById('navLinks');
|
|
} else {
|
|
var hidden = document.getElementById('jumplist');
|
|
}
|
|
addClass(hidden,'hideme');
|
|
}
|
|
|
|
function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
|
|
if (!s5mode) return false;
|
|
var vScale = 22; // both yield 32 (after rounding) at 1024x768
|
|
var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
|
|
if (window.innerHeight) {
|
|
var vSize = window.innerHeight;
|
|
var hSize = window.innerWidth;
|
|
} else if (document.documentElement.clientHeight) {
|
|
var vSize = document.documentElement.clientHeight;
|
|
var hSize = document.documentElement.clientWidth;
|
|
} else if (document.body.clientHeight) {
|
|
var vSize = document.body.clientHeight;
|
|
var hSize = document.body.clientWidth;
|
|
} else {
|
|
var vSize = 700; // assuming 1024x768, minus chrome and such
|
|
var hSize = 1024; // these do not account for kiosk mode or Opera Show
|
|
}
|
|
var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
|
|
fontSize(newSize + 'px');
|
|
if (isGe) { // hack to counter incremental reflow bugs
|
|
var obj = document.getElementsByTagName('body')[0];
|
|
obj.style.display = 'none';
|
|
obj.style.display = 'block';
|
|
}
|
|
}
|
|
|
|
function fontSize(value) {
|
|
if (!(s5ss = document.getElementById('s5ss'))) {
|
|
if (!isIE) {
|
|
document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
|
|
s5ss.setAttribute('media','screen, projection');
|
|
s5ss.setAttribute('id','s5ss');
|
|
} else {
|
|
document.createStyleSheet();
|
|
document.s5ss = document.styleSheets[document.styleSheets.length - 1];
|
|
}
|
|
}
|
|
if (!isIE) {
|
|
while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
|
|
s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
|
|
} else {
|
|
document.s5ss.addRule('body','font-size: ' + value + ' !important;');
|
|
}
|
|
}
|
|
|
|
function notOperaFix() {
|
|
slideCSS = document.getElementById('slideProj').href;
|
|
var slides = document.getElementById('slideProj');
|
|
var outline = document.getElementById('outlineStyle');
|
|
slides.setAttribute('media','screen');
|
|
outline.disabled = true;
|
|
if (isGe) {
|
|
slides.setAttribute('href','null'); // Gecko fix
|
|
slides.setAttribute('href',slideCSS); // Gecko fix
|
|
}
|
|
if (isIE && document.styleSheets && document.styleSheets[0]) {
|
|
document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
|
|
document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
|
|
document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
|
|
}
|
|
}
|
|
|
|
function getIncrementals(obj) {
|
|
var incrementals = new Array();
|
|
if (!obj)
|
|
return incrementals;
|
|
var children = obj.childNodes;
|
|
for (var i = 0; i < children.length; i++) {
|
|
var child = children[i];
|
|
if (hasClass(child, 'incremental')) {
|
|
if (child.nodeName == 'OL' || child.nodeName == 'UL') {
|
|
removeClass(child, 'incremental');
|
|
for (var j = 0; j < child.childNodes.length; j++) {
|
|
if (child.childNodes[j].nodeType == 1) {
|
|
addClass(child.childNodes[j], 'incremental');
|
|
}
|
|
}
|
|
} else {
|
|
incrementals[incrementals.length] = child;
|
|
removeClass(child,'incremental');
|
|
}
|
|
}
|
|
if (hasClass(child, 'show-first')) {
|
|
if (child.nodeName == 'OL' || child.nodeName == 'UL') {
|
|
removeClass(child, 'show-first');
|
|
if (child.childNodes[isGe].nodeType == 1) {
|
|
removeClass(child.childNodes[isGe], 'incremental');
|
|
}
|
|
} else {
|
|
incrementals[incrementals.length] = child;
|
|
}
|
|
}
|
|
incrementals = incrementals.concat(getIncrementals(child));
|
|
}
|
|
return incrementals;
|
|
}
|
|
|
|
function createIncrementals() {
|
|
var incrementals = new Array();
|
|
for (var i = 0; i < smax; i++) {
|
|
incrementals[i] = getIncrementals(document.getElementById('slide'+i));
|
|
}
|
|
return incrementals;
|
|
}
|
|
|
|
function defaultCheck() {
|
|
var allMetas = document.getElementsByTagName('meta');
|
|
for (var i = 0; i< allMetas.length; i++) {
|
|
if (allMetas[i].name == 'defaultView') {
|
|
defaultView = allMetas[i].content;
|
|
}
|
|
if (allMetas[i].name == 'controlVis') {
|
|
controlVis = allMetas[i].content;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Key trap fix, new function body for trap()
|
|
function trap(e) {
|
|
if (!e) {
|
|
e = event;
|
|
e.which = e.keyCode;
|
|
}
|
|
try {
|
|
modifierKey = e.ctrlKey || e.altKey || e.metaKey;
|
|
}
|
|
catch(e) {
|
|
modifierKey = false;
|
|
}
|
|
return modifierKey || e.which == 0;
|
|
}
|
|
|
|
function startup() {
|
|
defaultCheck();
|
|
if (!isOp)
|
|
createControls();
|
|
slideLabel();
|
|
fixLinks();
|
|
externalLinks();
|
|
fontScale();
|
|
if (!isOp) {
|
|
notOperaFix();
|
|
incrementals = createIncrementals();
|
|
slideJump();
|
|
if (defaultView == 'outline') {
|
|
toggle();
|
|
}
|
|
document.onkeyup = keys;
|
|
document.onkeypress = trap;
|
|
document.onclick = clicker;
|
|
}
|
|
}
|
|
|
|
window.onload = startup;
|
|
window.onresize = function(){setTimeout('fontScale()', 50);}</script>
|
|
<script type="text/javascript">
|
|
/* ASCIIMathML.js - copyright Peter Jipsen, released under the GPL
|
|
See http://www1.chapman.edu/~jipsen/mathml/asciimath.html/ */
|
|
|
|
var checkForMathML = true; // check if browser can display MathML
|
|
var notifyIfNoMathML = true; // display note if no MathML capability
|
|
var alertIfNoMathML = false; // show alert box if no MathML capability
|
|
var mathcolor = "red"; // change it to "" (to inherit) or any other color
|
|
var mathfontfamily = "serif"; // change to "" to inherit (works in IE)
|
|
// or another family (e.g. "arial")
|
|
var displaystyle = true; // puts limits above and below large operators
|
|
var showasciiformulaonhover = true; // helps students learn ASCIIMath
|
|
var decimalsign = "."; // change to "," if you like, beware of `(1,2)`!
|
|
var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters
|
|
var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";
|
|
var doubleblankmathdelimiter = false; // if true, x+1 is equal to `x+1`
|
|
// for IE this works only in <!-- -->
|
|
//var separatetokens;// has been removed (email me if this is a problem)
|
|
var isIE = document.createElementNS==null;
|
|
|
|
if (document.getElementById==null)
|
|
alert("This webpage requires a recent browser such as\
|
|
\nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")
|
|
|
|
// all further global variables start with "AM"
|
|
|
|
function AMcreateElementXHTML(t) {
|
|
if (isIE) return document.createElement(t);
|
|
else return document.createElementNS("http://www.w3.org/1999/xhtml",t);
|
|
}
|
|
|
|
function AMnoMathMLNote() {
|
|
var nd = AMcreateElementXHTML("h3");
|
|
nd.setAttribute("align","center")
|
|
nd.appendChild(AMcreateElementXHTML("p"));
|
|
nd.appendChild(document.createTextNode("To view the "));
|
|
var an = AMcreateElementXHTML("a");
|
|
an.appendChild(document.createTextNode("ASCIIMathML"));
|
|
an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html");
|
|
nd.appendChild(an);
|
|
nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+"));
|
|
an = AMcreateElementXHTML("a");
|
|
an.appendChild(document.createTextNode("MathPlayer"));
|
|
an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");
|
|
nd.appendChild(an);
|
|
nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));
|
|
nd.appendChild(AMcreateElementXHTML("p"));
|
|
return nd;
|
|
}
|
|
|
|
function AMisMathMLavailable() {
|
|
var regex = /KHTML/; /* ASCIIMathML.js - copyright Peter Jipsen, released under the GPL
|
|
See http://www1.chapman.edu/~jipsen/mathml/asciimath.html/ */
|
|
if (navigator.appName.slice(0,8)=="Netscape")
|
|
if (navigator.appVersion.slice(0,1)>="5" && !regex.test(navigator.userAgent)) return null;
|
|
else return AMnoMathMLNote();
|
|
else if (navigator.appName.slice(0,9)=="Microsoft")
|
|
try {
|
|
var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
|
|
return null;
|
|
} catch (e) {
|
|
return AMnoMathMLNote();
|
|
}
|
|
else return AMnoMathMLNote();
|
|
}
|
|
|
|
// character lists for Mozilla/Netscape fonts
|
|
var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
|
|
var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
|
|
var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];
|
|
|
|
var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,
|
|
RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
|
|
LEFTRIGHT = 9, TEXT = 10; // token types
|
|
|
|
var AMsqrt = {input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY},
|
|
AMroot = {input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY},
|
|
AMfrac = {input:"frac", tag:"mfrac", output:"/", tex:null, ttype:BINARY},
|
|
AMdiv = {input:"/", tag:"mfrac", output:"/", tex:null, ttype:INFIX},
|
|
AMover = {input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
|
|
AMsub = {input:"_", tag:"msub", output:"_", tex:null, ttype:INFIX},
|
|
AMsup = {input:"^", tag:"msup", output:"^", tex:null, ttype:INFIX},
|
|
AMtext = {input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT},
|
|
AMmbox = {input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT},
|
|
AMquote = {input:"\"", tag:"mtext", output:"mbox", tex:null, ttype:TEXT};
|
|
|
|
var AMsymbols = [
|
|
//some greek symbols
|
|
{input:"alpha", tag:"mi", output:"\u03B1", tex:null, ttype:CONST},
|
|
{input:"beta", tag:"mi", output:"\u03B2", tex:null, ttype:CONST},
|
|
{input:"chi", tag:"mi", output:"\u03C7", tex:null, ttype:CONST},
|
|
{input:"delta", tag:"mi", output:"\u03B4", tex:null, ttype:CONST},
|
|
{input:"Delta", tag:"mo", output:"\u0394", tex:null, ttype:CONST},
|
|
{input:"epsi", tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST},
|
|
{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST},
|
|
{input:"eta", tag:"mi", output:"\u03B7", tex:null, ttype:CONST},
|
|
{input:"gamma", tag:"mi", output:"\u03B3", tex:null, ttype:CONST},
|
|
{input:"Gamma", tag:"mo", output:"\u0393", tex:null, ttype:CONST},
|
|
{input:"iota", tag:"mi", output:"\u03B9", tex:null, ttype:CONST},
|
|
{input:"kappa", tag:"mi", output:"\u03BA", tex:null, ttype:CONST},
|
|
{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
|
|
{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
|
|
{input:"mu", tag:"mi", output:"\u03BC", tex:null, ttype:CONST},
|
|
{input:"nu", tag:"mi", output:"\u03BD", tex:null, ttype:CONST},
|
|
{input:"omega", tag:"mi", output:"\u03C9", tex:null, ttype:CONST},
|
|
{input:"Omega", tag:"mo", output:"\u03A9", tex:null, ttype:CONST},
|
|
{input:"phi", tag:"mi", output:"\u03C6", tex:null, ttype:CONST},
|
|
{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST},
|
|
{input:"Phi", tag:"mo", output:"\u03A6", tex:null, ttype:CONST},
|
|
{input:"pi", tag:"mi", output:"\u03C0", tex:null, ttype:CONST},
|
|
{input:"Pi", tag:"mo", output:"\u03A0", tex:null, ttype:CONST},
|
|
{input:"psi", tag:"mi", output:"\u03C8", tex:null, ttype:CONST},
|
|
{input:"Psi", tag:"mi", output:"\u03A8", tex:null, ttype:CONST},
|
|
{input:"rho", tag:"mi", output:"\u03C1", tex:null, ttype:CONST},
|
|
{input:"sigma", tag:"mi", output:"\u03C3", tex:null, ttype:CONST},
|
|
{input:"Sigma", tag:"mo", output:"\u03A3", tex:null, ttype:CONST},
|
|
{input:"tau", tag:"mi", output:"\u03C4", tex:null, ttype:CONST},
|
|
{input:"theta", tag:"mi", output:"\u03B8", tex:null, ttype:CONST},
|
|
{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST},
|
|
{input:"Theta", tag:"mo", output:"\u0398", tex:null, ttype:CONST},
|
|
{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST},
|
|
{input:"xi", tag:"mi", output:"\u03BE", tex:null, ttype:CONST},
|
|
{input:"Xi", tag:"mo", output:"\u039E", tex:null, ttype:CONST},
|
|
{input:"zeta", tag:"mi", output:"\u03B6", tex:null, ttype:CONST},
|
|
|
|
//binary operation symbols
|
|
{input:"*", tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST},
|
|
{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST},
|
|
{input:"//", tag:"mo", output:"/", tex:null, ttype:CONST},
|
|
{input:"\\\\", tag:"mo", output:"\\", tex:"backslash", ttype:CONST},
|
|
{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST},
|
|
{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST},
|
|
{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST},
|
|
{input:"@", tag:"mo", output:"\u2218", tex:"circ", ttype:CONST},
|
|
{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST},
|
|
{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST},
|
|
{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST},
|
|
{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER},
|
|
{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER},
|
|
{input:"^^", tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST},
|
|
{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER},
|
|
{input:"vv", tag:"mo", output:"\u2228", tex:"vee", ttype:CONST},
|
|
{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER},
|
|
{input:"nn", tag:"mo", output:"\u2229", tex:"cap", ttype:CONST},
|
|
{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER},
|
|
{input:"uu", tag:"mo", output:"\u222A", tex:"cup", ttype:CONST},
|
|
{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER},
|
|
|
|
//binary relation symbols
|
|
{input:"!=", tag:"mo", output:"\u2260", tex:"ne", ttype:CONST},
|
|
{input:":=", tag:"mo", output:":=", tex:null, ttype:CONST},
|
|
{input:"lt", tag:"mo", output:"<", tex:null, ttype:CONST},
|
|
{input:"<=", tag:"mo", output:"\u2264", tex:"le", ttype:CONST},
|
|
{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST},
|
|
{input:">=", tag:"mo", output:"\u2265", tex:"ge", ttype:CONST},
|
|
{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST},
|
|
{input:"-<", tag:"mo", output:"\u227A", tex:"prec", ttype:CONST},
|
|
{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST},
|
|
{input:">-", tag:"mo", output:"\u227B", tex:"succ", ttype:CONST},
|
|
{input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST},
|
|
{input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST},
|
|
{input:"in", tag:"mo", output:"\u2208", tex:null, ttype:CONST},
|
|
{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST},
|
|
{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST},
|
|
{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST},
|
|
{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST},
|
|
{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST},
|
|
{input:"-=", tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST},
|
|
{input:"~=", tag:"mo", output:"\u2245", tex:"cong", ttype:CONST},
|
|
{input:"~~", tag:"mo", output:"\u2248", tex:"approx", ttype:CONST},
|
|
{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST},
|
|
|
|
//logical symbols
|
|
{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE},
|
|
{input:"or", tag:"mtext", output:"or", tex:null, ttype:SPACE},
|
|
{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST},
|
|
{input:"=>", tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST},
|
|
{input:"if", tag:"mo", output:"if", tex:null, ttype:SPACE},
|
|
{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST},
|
|
{input:"AA", tag:"mo", output:"\u2200", tex:"forall", ttype:CONST},
|
|
{input:"EE", tag:"mo", output:"\u2203", tex:"exists", ttype:CONST},
|
|
{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST},
|
|
{input:"TT", tag:"mo", output:"\u22A4", tex:"top", ttype:CONST},
|
|
{input:"|--", tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST},
|
|
{input:"|==", tag:"mo", output:"\u22A8", tex:"models", ttype:CONST},
|
|
|
|
//grouping brackets
|
|
{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET},
|
|
{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET},
|
|
{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET},
|
|
{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET},
|
|
{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET},
|
|
{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET},
|
|
{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT},
|
|
//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT},
|
|
{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET},
|
|
{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET},
|
|
{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET},
|
|
{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET},
|
|
{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true},
|
|
{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true},
|
|
|
|
//miscellaneous symbols
|
|
{input:"int", tag:"mo", output:"\u222B", tex:null, ttype:CONST},
|
|
{input:"dx", tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION},
|
|
{input:"dy", tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION},
|
|
{input:"dz", tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION},
|
|
{input:"dt", tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION},
|
|
{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST},
|
|
{input:"del", tag:"mo", output:"\u2202", tex:"partial", ttype:CONST},
|
|
{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST},
|
|
{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
|
|
{input:"O/", tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST},
|
|
{input:"oo", tag:"mo", output:"\u221E", tex:"infty", ttype:CONST},
|
|
{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST},
|
|
{input:"...", tag:"mo", output:"...", tex:"ldots", ttype:CONST},
|
|
{input:":.", tag:"mo", output:"\u2234", tex:"therefore", ttype:CONST},
|
|
{input:"/_", tag:"mo", output:"\u2220", tex:"angle", ttype:CONST},
|
|
{input:"\\ ", tag:"mo", output:"\u00A0", tex:null, ttype:CONST},
|
|
{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST},
|
|
{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST},
|
|
{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST},
|
|
{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST},
|
|
{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST},
|
|
{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST},
|
|
{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST},
|
|
{input:"|__", tag:"mo", output:"\u230A", tex:"lfloor", ttype:CONST},
|
|
{input:"__|", tag:"mo", output:"\u230B", tex:"rfloor", ttype:CONST},
|
|
{input:"|~", tag:"mo", output:"\u2308", tex:"lceiling", ttype:CONST},
|
|
{input:"~|", tag:"mo", output:"\u2309", tex:"rceiling", ttype:CONST},
|
|
{input:"CC", tag:"mo", output:"\u2102", tex:null, ttype:CONST},
|
|
{input:"NN", tag:"mo", output:"\u2115", tex:null, ttype:CONST},
|
|
{input:"QQ", tag:"mo", output:"\u211A", tex:null, ttype:CONST},
|
|
{input:"RR", tag:"mo", output:"\u211D", tex:null, ttype:CONST},
|
|
{input:"ZZ", tag:"mo", output:"\u2124", tex:null, ttype:CONST},
|
|
{input:"f", tag:"mi", output:"f", tex:null, ttype:UNARY, func:true},
|
|
{input:"g", tag:"mi", output:"g", tex:null, ttype:UNARY, func:true},
|
|
|
|
//standard functions
|
|
{input:"lim", tag:"mo", output:"lim", tex:null, ttype:UNDEROVER},
|
|
{input:"Lim", tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER},
|
|
{input:"sin", tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true},
|
|
{input:"cos", tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true},
|
|
{input:"tan", tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true},
|
|
{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true},
|
|
{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true},
|
|
{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true},
|
|
{input:"cot", tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true},
|
|
{input:"sec", tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true},
|
|
{input:"csc", tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true},
|
|
{input:"log", tag:"mo", output:"log", tex:null, ttype:UNARY, func:true},
|
|
{input:"ln", tag:"mo", output:"ln", tex:null, ttype:UNARY, func:true},
|
|
{input:"det", tag:"mo", output:"det", tex:null, ttype:UNARY, func:true},
|
|
{input:"dim", tag:"mo", output:"dim", tex:null, ttype:CONST},
|
|
{input:"mod", tag:"mo", output:"mod", tex:null, ttype:CONST},
|
|
{input:"gcd", tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true},
|
|
{input:"lcm", tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true},
|
|
{input:"lub", tag:"mo", output:"lub", tex:null, ttype:CONST},
|
|
{input:"glb", tag:"mo", output:"glb", tex:null, ttype:CONST},
|
|
{input:"min", tag:"mo", output:"min", tex:null, ttype:UNDEROVER},
|
|
{input:"max", tag:"mo", output:"max", tex:null, ttype:UNDEROVER},
|
|
|
|
//arrows
|
|
{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},
|
|
{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},
|
|
{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},
|
|
{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST},
|
|
{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},
|
|
{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},
|
|
{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},
|
|
{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},
|
|
{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},
|
|
{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},
|
|
|
|
//commands with argument
|
|
AMsqrt, AMroot, AMfrac, AMdiv, AMover, AMsub, AMsup,
|
|
{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},
|
|
{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},
|
|
{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},
|
|
{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true},
|
|
{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true},
|
|
{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},
|
|
AMtext, AMmbox, AMquote,
|
|
{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY},
|
|
{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},
|
|
{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},
|
|
{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},
|
|
{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},
|
|
{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
|
|
{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},
|
|
{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},
|
|
{input:"tt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY},
|
|
{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},
|
|
{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},
|
|
{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}
|
|
];
|
|
|
|
function compareNames(s1,s2) {
|
|
if (s1.input > s2.input) return 1
|
|
else return -1;
|
|
}
|
|
|
|
var AMnames = []; //list of input symbols
|
|
|
|
function AMinitSymbols() {
|
|
var texsymbols = [], i;
|
|
for (i=0; i<AMsymbols.length; i++)
|
|
if (AMsymbols[i].tex)
|
|
texsymbols[texsymbols.length] = {input:AMsymbols[i].tex,
|
|
tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype};
|
|
AMsymbols = AMsymbols.concat(texsymbols);
|
|
AMsymbols.sort(compareNames);
|
|
for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
|
|
}
|
|
|
|
var AMmathml = "http://www.w3.org/1998/Math/MathML";
|
|
|
|
function AMcreateElementMathML(t) {
|
|
if (isIE) return document.createElement("m:"+t);
|
|
else return document.createElementNS(AMmathml,t);
|
|
}
|
|
|
|
function AMcreateMmlNode(t,frag) {
|
|
// var node = AMcreateElementMathML(name);
|
|
if (isIE) var node = document.createElement("m:"+t);
|
|
else var node = document.createElementNS(AMmathml,t);
|
|
node.appendChild(frag);
|
|
return node;
|
|
}
|
|
|
|
function newcommand(oldstr,newstr) {
|
|
AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,
|
|
tex:null, ttype:DEFINITION}]);
|
|
}
|
|
|
|
function AMremoveCharsAndBlanks(str,n) {
|
|
//remove n characters and any following blanks
|
|
var st;
|
|
if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ")
|
|
st = str.slice(n+1);
|
|
else st = str.slice(n);
|
|
for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
|
|
return st.slice(i);
|
|
}
|
|
|
|
function AMposition(arr, str, n) {
|
|
// return position >=n where str appears or would be inserted
|
|
// assumes arr is sorted
|
|
if (n==0) {
|
|
var h,m;
|
|
n = -1;
|
|
h = arr.length;
|
|
while (n+1<h) {
|
|
m = (n+h) >> 1;
|
|
if (arr[m]<str) n = m; else h = m;
|
|
}
|
|
return h;
|
|
} else
|
|
for (var i=n; i<arr.length && arr[i]<str; i++);
|
|
return i; // i=arr.length || arr[i]>=str
|
|
}
|
|
|
|
function AMgetSymbol(str) {
|
|
//return maximal initial substring of str that appears in names
|
|
//return null if there is none
|
|
var k = 0; //new pos
|
|
var j = 0; //old pos
|
|
var mk; //match pos
|
|
var st;
|
|
var tagst;
|
|
var match = "";
|
|
var more = true;
|
|
for (var i=1; i<=str.length && more; i++) {
|
|
st = str.slice(0,i); //initial substring of length i
|
|
j = k;
|
|
k = AMposition(AMnames, st, j);
|
|
if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
|
|
match = AMnames[k];
|
|
mk = k;
|
|
i = match.length;
|
|
}
|
|
more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
|
|
}
|
|
AMpreviousSymbol=AMcurrentSymbol;
|
|
if (match!=""){
|
|
AMcurrentSymbol=AMsymbols[mk].ttype;
|
|
return AMsymbols[mk];
|
|
}
|
|
// if str[0] is a digit or - return maxsubstring of digits.digits
|
|
AMcurrentSymbol=CONST;
|
|
k = 1;
|
|
st = str.slice(0,1);
|
|
var integ = true;
|
|
while ("0"<=st && st<="9" && k<=str.length) {
|
|
st = str.slice(k,k+1);
|
|
k++;
|
|
}
|
|
if (st == decimalsign) {
|
|
st = str.slice(k,k+1);
|
|
if ("0"<=st && st<="9") {
|
|
integ = false;
|
|
k++;
|
|
while ("0"<=st && st<="9" && k<=str.length) {
|
|
st = str.slice(k,k+1);
|
|
k++;
|
|
}
|
|
}
|
|
}
|
|
if ((integ && k>1) || k>2) {
|
|
st = str.slice(0,k-1);
|
|
tagst = "mn";
|
|
} else {
|
|
k = 2;
|
|
st = str.slice(0,1); //take 1 character
|
|
tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
|
|
}
|
|
if (st=="-" && AMpreviousSymbol==INFIX) {
|
|
AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse
|
|
return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
|
|
}
|
|
return {input:st, tag:tagst, output:st, ttype:CONST};
|
|
}
|
|
|
|
function AMremoveBrackets(node) {
|
|
var st;
|
|
if (node.nodeName=="mrow") {
|
|
st = node.firstChild.firstChild.nodeValue;
|
|
if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild);
|
|
}
|
|
if (node.nodeName=="mrow") {
|
|
st = node.lastChild.firstChild.nodeValue;
|
|
if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild);
|
|
}
|
|
}
|
|
|
|
/* ASCIIMathML.js - copyright Peter Jipsen, released under the GPL
|
|
See http://www1.chapman.edu/~jipsen/mathml/asciimath.html/ */
|
|
|
|
var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol;
|
|
|
|
function AMparseSexpr(str) { //parses str and returns [node,tailstr]
|
|
var symbol, node, result, i, st,// rightvert = false,
|
|
newFrag = document.createDocumentFragment();
|
|
str = AMremoveCharsAndBlanks(str,0);
|
|
symbol = AMgetSymbol(str); //either a token or a bracket or empty
|
|
if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) {
|
|
return [null,str];
|
|
}
|
|
if (symbol.ttype == DEFINITION) {
|
|
str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
symbol = AMgetSymbol(str);
|
|
}
|
|
switch (symbol.ttype) {
|
|
case UNDEROVER:
|
|
case CONST:
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
return [AMcreateMmlNode(symbol.tag, //its a constant
|
|
document.createTextNode(symbol.output)),str];
|
|
case LEFTBRACKET: //read (expr+)
|
|
AMnestingDepth++;
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
result = AMparseExpr(str,true);
|
|
AMnestingDepth--;
|
|
if (typeof symbol.invisible == "boolean" && symbol.invisible)
|
|
node = AMcreateMmlNode("mrow",result[0]);
|
|
else {
|
|
node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
|
|
node = AMcreateMmlNode("mrow",node);
|
|
node.appendChild(result[0]);
|
|
}
|
|
return [node,result[1]];
|
|
case TEXT:
|
|
if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
if (str.charAt(0)=="{") i=str.indexOf("}");
|
|
else if (str.charAt(0)=="(") i=str.indexOf(")");
|
|
else if (str.charAt(0)=="[") i=str.indexOf("]");
|
|
else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1;
|
|
else i = 0;
|
|
if (i==-1) i = str.length;
|
|
st = str.slice(1,i);
|
|
if (st.charAt(0) == " ") {
|
|
node = AMcreateElementMathML("mspace");
|
|
node.setAttribute("width","1ex");
|
|
newFrag.appendChild(node);
|
|
}
|
|
newFrag.appendChild(
|
|
AMcreateMmlNode(symbol.tag,document.createTextNode(st)));
|
|
if (st.charAt(st.length-1) == " ") {
|
|
node = AMcreateElementMathML("mspace");
|
|
node.setAttribute("width","1ex");
|
|
newFrag.appendChild(node);
|
|
}
|
|
str = AMremoveCharsAndBlanks(str,i+1);
|
|
return [AMcreateMmlNode("mrow",newFrag),str];
|
|
case UNARY:
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
result = AMparseSexpr(str);
|
|
if (result[0]==null) return [AMcreateMmlNode(symbol.tag,
|
|
document.createTextNode(symbol.output)),str];
|
|
if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
|
|
st = str.charAt(0);
|
|
if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {
|
|
return [AMcreateMmlNode(symbol.tag,
|
|
document.createTextNode(symbol.output)),str];
|
|
} else {
|
|
node = AMcreateMmlNode("mrow",
|
|
AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));
|
|
node.appendChild(result[0]);
|
|
return [node,result[1]];
|
|
}
|
|
}
|
|
AMremoveBrackets(result[0]);
|
|
if (symbol.input == "sqrt") { // sqrt
|
|
return [AMcreateMmlNode(symbol.tag,result[0]),result[1]];
|
|
} else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent
|
|
node = AMcreateMmlNode(symbol.tag,result[0]);
|
|
node.appendChild(AMcreateMmlNode("mo",document.createTextNode(symbol.output)));
|
|
return [node,result[1]];
|
|
} else { // font change command
|
|
if (!isIE && typeof symbol.codes != "undefined") {
|
|
for (i=0; i<result[0].childNodes.length; i++)
|
|
if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
|
|
st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
|
|
result[0].childNodes[i].firstChild.nodeValue);
|
|
var newst = [];
|
|
for (var j=0; j<st.length; j++)
|
|
if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
|
|
String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
|
|
else newst = newst + st.charAt(j);
|
|
if (result[0].nodeName=="mi")
|
|
result[0]=AMcreateElementMathML("mo").
|
|
appendChild(document.createTextNode(newst));
|
|
else result[0].replaceChild(AMcreateElementMathML("mo").
|
|
appendChild(document.createTextNode(newst)),result[0].childNodes[i]);
|
|
}
|
|
}
|
|
node = AMcreateMmlNode(symbol.tag,result[0]);
|
|
node.setAttribute(symbol.atname,symbol.atval);
|
|
return [node,result[1]];
|
|
}
|
|
case BINARY:
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
result = AMparseSexpr(str);
|
|
if (result[0]==null) return [AMcreateMmlNode("mo",
|
|
document.createTextNode(symbol.input)),str];
|
|
AMremoveBrackets(result[0]);
|
|
var result2 = AMparseSexpr(result[1]);
|
|
if (result2[0]==null) return [AMcreateMmlNode("mo",
|
|
document.createTextNode(symbol.input)),str];
|
|
AMremoveBrackets(result2[0]);
|
|
if (symbol.input=="root" || symbol.input=="stackrel")
|
|
newFrag.appendChild(result2[0]);
|
|
newFrag.appendChild(result[0]);
|
|
if (symbol.input=="frac") newFrag.appendChild(result2[0]);
|
|
return [AMcreateMmlNode(symbol.tag,newFrag),result2[1]];
|
|
case INFIX:
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),str];
|
|
case SPACE:
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
node = AMcreateElementMathML("mspace");
|
|
node.setAttribute("width","1ex");
|
|
newFrag.appendChild(node);
|
|
newFrag.appendChild(
|
|
AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));
|
|
node = AMcreateElementMathML("mspace");
|
|
node.setAttribute("width","1ex");
|
|
newFrag.appendChild(node);
|
|
return [AMcreateMmlNode("mrow",newFrag),str];
|
|
case LEFTRIGHT:
|
|
// if (rightvert) return [null,str]; else rightvert = true;
|
|
AMnestingDepth++;
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
result = AMparseExpr(str,false);
|
|
AMnestingDepth--;
|
|
var st = "";
|
|
if (result[0].lastChild!=null)
|
|
st = result[0].lastChild.firstChild.nodeValue;
|
|
if (st == "|") { // its an absolute value subterm
|
|
node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
|
|
node = AMcreateMmlNode("mrow",node);
|
|
node.appendChild(result[0]);
|
|
return [node,result[1]];
|
|
} else { // the "|" is a \mid
|
|
node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
|
|
node = AMcreateMmlNode("mrow",node);
|
|
return [node,str];
|
|
}
|
|
default:
|
|
//alert("default");
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
return [AMcreateMmlNode(symbol.tag, //its a constant
|
|
document.createTextNode(symbol.output)),str];
|
|
}
|
|
}
|
|
|
|
function AMparseIexpr(str) {
|
|
var symbol, sym1, sym2, node, result, underover;
|
|
str = AMremoveCharsAndBlanks(str,0);
|
|
sym1 = AMgetSymbol(str);
|
|
result = AMparseSexpr(str);
|
|
node = result[0];
|
|
str = result[1];
|
|
symbol = AMgetSymbol(str);
|
|
if (symbol.ttype == INFIX && symbol.input != "/") {
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
// if (symbol.input == "/") result = AMparseIexpr(str); else ...
|
|
result = AMparseSexpr(str);
|
|
if (result[0] == null) // show box in place of missing argument
|
|
result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));
|
|
else AMremoveBrackets(result[0]);
|
|
str = result[1];
|
|
// if (symbol.input == "/") AMremoveBrackets(node);
|
|
if (symbol.input == "_") {
|
|
sym2 = AMgetSymbol(str);
|
|
underover = (sym1.ttype == UNDEROVER);
|
|
if (sym2.input == "^") {
|
|
str = AMremoveCharsAndBlanks(str,sym2.input.length);
|
|
var res2 = AMparseSexpr(str);
|
|
AMremoveBrackets(res2[0]);
|
|
str = res2[1];
|
|
node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);
|
|
node.appendChild(result[0]);
|
|
node.appendChild(res2[0]);
|
|
node = AMcreateMmlNode("mrow",node); // so sum does not stretch
|
|
} else {
|
|
node = AMcreateMmlNode((underover?"munder":"msub"),node);
|
|
node.appendChild(result[0]);
|
|
}
|
|
} else {
|
|
node = AMcreateMmlNode(symbol.tag,node);
|
|
node.appendChild(result[0]);
|
|
}
|
|
}
|
|
return [node,str];
|
|
}
|
|
|
|
function AMparseExpr(str,rightbracket) {
|
|
var symbol, node, result, i, nodeList = [],
|
|
newFrag = document.createDocumentFragment();
|
|
do {
|
|
str = AMremoveCharsAndBlanks(str,0);
|
|
result = AMparseIexpr(str);
|
|
node = result[0];
|
|
str = result[1];
|
|
symbol = AMgetSymbol(str);
|
|
if (symbol.ttype == INFIX && symbol.input == "/") {
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
result = AMparseIexpr(str);
|
|
if (result[0] == null) // show box in place of missing argument
|
|
result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));
|
|
else AMremoveBrackets(result[0]);
|
|
str = result[1];
|
|
AMremoveBrackets(node);
|
|
node = AMcreateMmlNode(symbol.tag,node);
|
|
node.appendChild(result[0]);
|
|
newFrag.appendChild(node);
|
|
symbol = AMgetSymbol(str);
|
|
}
|
|
else if (node!=undefined) newFrag.appendChild(node);
|
|
} while ((symbol.ttype != RIGHTBRACKET &&
|
|
(symbol.ttype != LEFTRIGHT || rightbracket)
|
|
|| AMnestingDepth == 0) && symbol!=null && symbol.output!="");
|
|
if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) {
|
|
// if (AMnestingDepth > 0) AMnestingDepth--;
|
|
var len = newFrag.childNodes.length;
|
|
if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&
|
|
newFrag.childNodes[len-2].nodeName == "mo" &&
|
|
newFrag.childNodes[len-2].firstChild.nodeValue == ",") { //matrix
|
|
var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue;
|
|
if (right==")" || right=="]") {
|
|
var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue;
|
|
if (left=="(" && right==")" && symbol.output != "}" ||
|
|
left=="[" && right=="]") {
|
|
var pos = []; // positions of commas
|
|
var matrix = true;
|
|
var m = newFrag.childNodes.length;
|
|
for (i=0; matrix && i<m; i=i+2) {
|
|
pos[i] = [];
|
|
node = newFrag.childNodes[i];
|
|
if (matrix) matrix = node.nodeName=="mrow" &&
|
|
(i==m-1 || node.nextSibling.nodeName=="mo" &&
|
|
node.nextSibling.firstChild.nodeValue==",")&&
|
|
node.firstChild.firstChild.nodeValue==left &&
|
|
node.lastChild.firstChild.nodeValue==right;
|
|
if (matrix)
|
|
for (var j=0; j<node.childNodes.length; j++)
|
|
if (node.childNodes[j].firstChild.nodeValue==",")
|
|
pos[i][pos[i].length]=j;
|
|
if (matrix && i>1) matrix = pos[i].length == pos[i-2].length;
|
|
}
|
|
if (matrix) {
|
|
var row, frag, n, k, table = document.createDocumentFragment();
|
|
for (i=0; i<m; i=i+2) {
|
|
row = document.createDocumentFragment();
|
|
frag = document.createDocumentFragment();
|
|
node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow>
|
|
n = node.childNodes.length;
|
|
k = 0;
|
|
node.removeChild(node.firstChild); //remove (
|
|
for (j=1; j<n-1; j++) {
|
|
if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
|
|
node.removeChild(node.firstChild); //remove ,
|
|
row.appendChild(AMcreateMmlNode("mtd",frag));
|
|
k++;
|
|
} else frag.appendChild(node.firstChild);
|
|
}
|
|
row.appendChild(AMcreateMmlNode("mtd",frag));
|
|
if (newFrag.childNodes.length>2) {
|
|
newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow>
|
|
newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo>
|
|
}
|
|
table.appendChild(AMcreateMmlNode("mtr",row));
|
|
}
|
|
node = AMcreateMmlNode("mtable",table);
|
|
if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left");
|
|
newFrag.replaceChild(node,newFrag.firstChild);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
|
if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
|
|
node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
|
|
newFrag.appendChild(node);
|
|
}
|
|
}
|
|
return [newFrag,str];
|
|
}
|
|
|
|
function AMparseMath(str) {
|
|
var result, node = AMcreateElementMathML("mstyle");
|
|
if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);
|
|
if (displaystyle) node.setAttribute("displaystyle","true");
|
|
if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);
|
|
AMnestingDepth = 0;
|
|
node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false)[0]);
|
|
node = AMcreateMmlNode("math",node);
|
|
if (showasciiformulaonhover) //fixed by djhsu so newline
|
|
node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko
|
|
if (mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {
|
|
var fnode = AMcreateElementXHTML("font");
|
|
fnode.setAttribute("face",mathfontfamily);
|
|
fnode.appendChild(node);
|
|
return fnode;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
function AMstrarr2docFrag(arr, linebreaks) {
|
|
var newFrag=document.createDocumentFragment();
|
|
var expr = false;
|
|
for (var i=0; i<arr.length; i++) {
|
|
if (expr) newFrag.appendChild(AMparseMath(arr[i]));
|
|
else {
|
|
var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);
|
|
newFrag.appendChild(AMcreateElementXHTML("span").
|
|
appendChild(document.createTextNode(arri[0])));
|
|
for (var j=1; j<arri.length; j++) {
|
|
newFrag.appendChild(AMcreateElementXHTML("p"));
|
|
newFrag.appendChild(AMcreateElementXHTML("span").
|
|
appendChild(document.createTextNode(arri[j])));
|
|
}
|
|
}
|
|
expr = !expr;
|
|
}
|
|
return newFrag;
|
|
}
|
|
|
|
function AMprocessNodeR(n, linebreaks) {
|
|
var mtch, str, arr, frg, i;
|
|
if (n.childNodes.length == 0) {
|
|
if ((n.nodeType!=8 || linebreaks) &&
|
|
n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&
|
|
n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&
|
|
n.parentNode.nodeName!="code" && n.parentNode.nodeName!="CODE" && /* ASCIIMathML.js - copyright Peter Jipsen, released under the GPL
|
|
See http://www1.chapman.edu/~jipsen/mathml/asciimath.html/ */
|
|
n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {
|
|
str = n.nodeValue;
|
|
if (!(str == null)) {
|
|
str = str.replace(/\r\n\r\n/g,"\n\n");
|
|
if (doubleblankmathdelimiter) {
|
|
str = str.replace(/\x20\x20\./g," "+AMdelimiter1+".");
|
|
str = str.replace(/\x20\x20,/g," "+AMdelimiter1+",");
|
|
str = str.replace(/\x20\x20/g," "+AMdelimiter1+" ");
|
|
}
|
|
str = str.replace(/\x20+/g," ");
|
|
str = str.replace(/\s*\r\n/g," ");
|
|
mtch = false;
|
|
str = str.replace(new RegExp(AMescape2, "g"),
|
|
function(st){mtch=true;return "AMescape2"});
|
|
str = str.replace(new RegExp(AMescape1, "g"),
|
|
function(st){mtch=true;return "AMescape1"});
|
|
str = str.replace(new RegExp(AMdelimiter2regexp, "g"),AMdelimiter1);
|
|
arr = str.split(AMdelimiter1);
|
|
for (i=0; i<arr.length; i++)
|
|
arr[i]=arr[i].replace(/AMescape2/g,AMdelimiter2).
|
|
replace(/AMescape1/g,AMdelimiter1);
|
|
if (arr.length>1 || mtch) {
|
|
if (checkForMathML) {
|
|
checkForMathML = false;
|
|
var nd = AMisMathMLavailable();
|
|
AMnoMathML = nd != null;
|
|
if (AMnoMathML && notifyIfNoMathML)
|
|
if (alertIfNoMathML)
|
|
alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\
|
|
or Firefox/Mozilla/Netscape");
|
|
else AMbody.insertBefore(nd,AMbody.childNodes[0]);
|
|
}
|
|
if (!AMnoMathML) {
|
|
frg = AMstrarr2docFrag(arr,n.nodeType==8);
|
|
var len = frg.childNodes.length;
|
|
n.parentNode.replaceChild(frg,n);
|
|
return len-1;
|
|
} else return 0;
|
|
}
|
|
}
|
|
} else return 0;
|
|
} else if (n.nodeName!="math") {
|
|
for (i=0; i<n.childNodes.length; i++)
|
|
i += AMprocessNodeR(n.childNodes[i], linebreaks);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function AMprocessNode(n, linebreaks, spanclassAM) {
|
|
var frag,st;
|
|
if (spanclassAM!=null) {
|
|
frag = document.getElementsByTagName("span")
|
|
for (var i=0;i<frag.length;i++)
|
|
if (frag[i].className == "AM")
|
|
AMprocessNodeR(frag[i],linebreaks);
|
|
} else {
|
|
try {
|
|
st = n.innerHTML;
|
|
} catch(err) {}
|
|
if (st==null ||
|
|
st.indexOf(AMdelimiter1)!=-1 || st.indexOf(AMdelimiter2)!=-1)
|
|
AMprocessNodeR(n,linebreaks);
|
|
}
|
|
if (isIE) { //needed to match size and font of formula to surrounding text
|
|
frag = document.getElementsByTagName('math');
|
|
for (var i=0;i<frag.length;i++) frag[i].update()
|
|
}
|
|
}
|
|
|
|
var AMbody;
|
|
var AMnoMathML = false, AMtranslated = false;
|
|
|
|
function translate(spanclassAM) {
|
|
if (!AMtranslated) { // run this only once
|
|
AMtranslated = true;
|
|
AMinitSymbols();
|
|
AMbody = document.getElementsByTagName("body")[0];
|
|
AMprocessNode(AMbody, false, spanclassAM);
|
|
}
|
|
}
|
|
|
|
if (isIE) { // avoid adding MathPlayer info explicitly to each webpage
|
|
document.write("<object id=\"mathplayer\"\
|
|
classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");
|
|
document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");
|
|
}
|
|
|
|
// GO1.1 Generic onload by Brothercake
|
|
// http://www.brothercake.com/
|
|
//onload function (replaces the onload="translate()" in the <body> tag)
|
|
function generic()
|
|
{
|
|
translate();
|
|
};
|
|
//setup onload function
|
|
if(typeof window.addEventListener != 'undefined')
|
|
{
|
|
//.. gecko, safari, konqueror and standard
|
|
window.addEventListener('load', generic, false);
|
|
}
|
|
else if(typeof document.addEventListener != 'undefined')
|
|
{
|
|
//.. opera 7
|
|
document.addEventListener('load', generic, false);
|
|
}
|
|
else if(typeof window.attachEvent != 'undefined')
|
|
{
|
|
//.. win/ie
|
|
window.attachEvent('onload', generic);
|
|
}
|
|
//** remove this condition to degrade older browsers
|
|
else
|
|
{
|
|
//.. mac/ie5 and anything else that gets this far
|
|
//if there's an existing onload function
|
|
if(typeof window.onload == 'function')
|
|
{
|
|
//store it
|
|
var existing = onload;
|
|
//add new onload handler
|
|
window.onload = function()
|
|
{
|
|
//call existing onload function
|
|
existing();
|
|
//call generic onload function
|
|
generic();
|
|
};
|
|
}
|
|
else
|
|
{
|
|
//setup onload function
|
|
window.onload = generic;
|
|
}
|
|
}
|
|
</script>
|
|
<meta name="author" content="Sam Smith, Jen Jones" />
|
|
<meta name="date" content="July 15, 2006" />
|
|
<title>My S5 Document</title>
|
|
</head>
|
|
<body>
|
|
<div class="layout">
|
|
<div id="controls"></div>
|
|
<div id="currentSlide"></div>
|
|
<div id="header"></div>
|
|
<div id="footer">
|
|
<h1>July 15, 2006</h1>
|
|
<h2>My S5 Document</h2>
|
|
</div>
|
|
</div>
|
|
<div class="presentation">
|
|
|
|
<div class="slide">
|
|
<h1>My S5 Document</h1>
|
|
<h3>Sam Smith, Jen Jones</h3>
|
|
<h4>July 15, 2006</h4>
|
|
</div>
|
|
<div class="slide">
|
|
<h1>First slide</h1>
|
|
<ul class="incremental">
|
|
<li>first bullet</li>
|
|
<li>second bullet</li>
|
|
</ul>
|
|
</div>
|
|
<div class="slide">
|
|
<h1>Smarty</h1>
|
|
<ul>
|
|
<li>“Hello there”</li>
|
|
<li>Here’s a—dash</li>
|
|
<li>And ‘ellipses’…</li>
|
|
</ul>
|
|
</div>
|
|
<div class="slide">
|
|
<h1>Math</h1>
|
|
<ul class="incremental">
|
|
<li>$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|