﻿<?xml version="1.0" encoding="utf-8"?>
<!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" xml:lang="en">
	<head>
	<title>XSL-TeX in Action</title>
	<link rel="stylesheet" type="text/css" href="math.css"/>
	<style type="text/css">
	html
		{background-color:menu}
	body
		{font-family:"Palatino Linotype",serif;
		font-size:12pt;}
	</style>
	<script type="application/ecmascript">
	<![CDATA[
function tex2xml(tex)
	{tex = tex.replace(/</g,'&lt;').replace(/[\f\n\r\t\v]+/g,' ').replace(/\\\{/g,'¢l').replace(/\\\}/g,'¢r').replace(/\\\\/g,'¢n').replace(/\\_/g,'¢u').replace(/\\\^/g,'¢h');
	tex = tex.replace(/\\left\{/g,'\\fence{c').replace(/\\left/g,'\\fence{').replace(/\\right\}/g,'c}').replace(/\\right([\])\|])/g,'$1}');
	tex = tex.replace(/([\u220f\u2210\u2211\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u22c0\u22c1\u22c2\u22c3\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a0a\u2a0b])/g,'\\ope{$1}').replace(/\\ope\{[ ]*\\ope\{([^\{\}]*)\}[ ]*\}/g,'\\ope{$1}');
	if(tex.search(/[_\^]/g)!=-1)
		{tex = tex.replace(/\^([^\{\\])/g,'^{$1}').replace(/_([^\{\\])/g,'_{$1}');}
	for(k=0;tex.search(/[\{\}]/g)!=-1&&k!=16;k++)
	{if(tex.search(/\\(case|det|mat|under|over|ope|pre|inf|sur|strike)/g)!=-1)
		{tex = tex.replace(/\\pre\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<float><sur>$1</sur><inf>$2</inf></float>');
		tex = tex.replace(/\\case\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<case><value>$1</value><scope>$2</scope></case>');
		tex = tex.replace(/\\underbrace\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<under><ker>$1</ker><underbrace/><sat>$2</sat></under>');
		tex = tex.replace(/\\overbrace\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'<over><sat>$2</sat><overbrace/><ker>$1</ker></over>');
		tex = tex.replace(/\\underbrace\{([^\{\}]*)\}([^\^_])/g,'<under><ker>$1</ker><underbrace/></under> $2').replace(/\\overbrace\{([^\{\}]*)\}[ ]*([^\^_])/g,'<over><overbrace/><ker>$1</ker></over>$2').replace(/\\underbrace\{([^\{\}]*)\}[ ]*$/g,'<under><ker>$1</ker><underbrace/></under>').replace(/\\overbrace\{([^\{\}]*)\}$/g,'<over><overbrace/><ker>$1</ker></over>');
		tex = tex.replace(/\\mathbf\{([^\{\}]*)\}/g,'<bold>$1</bold>').replace(/\\mathsl\{([^\{\}]*)\}/g,'<italic>$1</italic>');
		tex = tex.replace(/\\(cases|det|inf|sur|overline|underline|strike)\{([^\{\}]*)\}/g,'<$1>$2</$1>');
		tex = tex.replace(/\\matrix\{([^\{\}]*)\}/g,'\\apply{<matrix>$1</matrix>}').replace(/\\ope\{([^\{\}]*)\}/g,'\\opgroup{<ope>$1</ope>}');
		}
	if(tex.search(/\\(frac|stack|sqrt|rad|)/g)!=-1)
		{tex = tex.replace(/\\frac\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<fraction><num>$1</num><den>$2</den></fraction>');
		tex = tex.replace(/\\stackrel\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<over><sat>$1</sat><ker>$2</ker></over>');
		tex = tex.replace(/\\stackrev\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<under><ker>$1</ker><sat>$2</sat></under>');
		tex = tex.replace(/\\sqrt\{([^\{\}]*)\}/g,'<radical><radix/><radicand>$1</radicand></radical>').replace(/\\rad\{([^\}]*)\}\{([^\{\}]*)\}/g,'<radical><radix>$1</radix><radicand>$2</radicand></radical>');}
	if(tex.search(/\\vector/g)!=-1)
		{tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry><entry>$4</entry><entry>$5</entry><entry>$6</entry><entry>$7</entry><entry>$8</entry></vector>}$9');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry><entry>$4</entry><entry>$5</entry><entry>$6</entry><entry>$7</entry></vector>}$8');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry><entry>$4</entry><entry>$5</entry><entry>$6</entry></vector>}$7');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry><entry>$4</entry><entry>$5</entry></vector>}$6');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry><entry>$4</entry></vector>}$5');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry><entry>$3</entry></vector>}$4');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<vector><entry>$1</entry><entry>$2</entry></vector>}$3');}
	if(tex.search(/\\row/g)!=-1)
		{tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell><cell>$4</cell><cell>$5</cell><cell>$6</cell><cell>$7</cell><cell>$8</cell></row>$9');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell><cell>$4</cell><cell>$5</cell><cell>$6</cell><cell>$7</cell></row>$8');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell><cell>$4</cell><cell>$5</cell><cell>$6</cell></row>$7');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell><cell>$4</cell><cell>$5</cell></row>$6');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell><cell>$4</cell></row>$5');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell><cell>$3</cell></row>$4');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<row><cell>$1</cell><cell>$2</cell></row>$3');}
	if(tex.search(/[_\^]/g)!=-1)
		{tex = tex.replace(/_\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'^{$2}_{$1}');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}[ ]*_\{([^\{\}]*)\}/g,'$1<float><sup>$2</sup><sub>$3</sub></float>');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}([^_])/g,'$1<sup>$2</sup>$3').replace(/([^\}])_\{([^\{\}]*)\}([^\^])/g,'$1<sub>$2</sub>$3');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}$/g,'$1<sup>$2</sup>').replace(/([^\}])_\{([^\{\}]*)\}$/g,'$1<sub>$2</sub>');}
	if(tex.search(/\\(apply|fence|opgroup)/g)!=-1)
		{tex = tex.replace(/\\fence\{([\[\|(.c])([^\{\}]*)([\]\|)c])\}/g,'\\fenced{<fence left¢$1¢ right¢$3¢>$2</fence>}');
		tex = tex.replace(/left¢\(¢/g,'left="round"').replace(/left¢\[¢/g,'left="square"').replace(/left¢c¢/g,'left="curly"').replace(/left¢\|¢/g,'left="solid"').replace(/left¢\.¢/g,'left="none"');
		tex = tex.replace(/right¢\)¢/g,'right="round"').replace(/right¢\]¢/g,'right="square"').replace(/right¢c¢/g,'right="curly"').replace(/right¢\|¢/g,'right="solid"');
		tex = tex.replace(/_\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'^{$2}_{$1}');
		tex = tex.replace(/\\(fenced|opgroup)\{([^\{\}]*)\}\^\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<$1>$2<markers><marker>$3</marker><submarker>$4</submarker></markers></$1>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'<$1>$2<marker>$3</marker></$1>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<$1>$2<submarker>$3</submarker></$1>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}([^_\^])/g,'$2$3').replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}$/g,'$2');}
				}
	tex = tex.replace(/¢n/g,'<line/>').replace(/\\wrap/g,'<wrap/>');
	tex = tex.replace(/¢l/g,'{').replace(/¢r/g,'}').replace(/¢u/g,'_').replace(/¢h/g,'^').replace(/\\b/g,'\\').replace(/\\s/g,'\$');
	return tex;}

function tex2xhtml(tex)
	{tex = tex.replace(/</g,'&lt;').replace(/[\f\n\r\t\v]+/g,' ').replace(/\\\{/g,'¢l').replace(/\\\}/g,'¢r').replace(/\\\\/g,'¢n').replace(/\\_/g,'¢u').replace(/\\\^/g,'¢h');
	tex = tex.replace(/\\left\{/g,'\\fence{c').replace(/\\left/g,'\\fence{').replace(/\\right\}/g,'c}').replace(/\\right([\])\|])/g,'$1}');
	tex = tex.replace(/([\u220f\u2210\u2211\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u22c0\u22c1\u22c2\u22c3\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a0a\u2a0b])/g,'\\ope{$1}').replace(/\\ope\{[ ]*\\ope\{([^\{\}]*)\}[ ]*\}/g,'\\ope{$1}');
	if(tex.search(/[_\^]/g)!=-1)
		{tex = tex.replace(/\^([^\{\\])/g,'^{$1}').replace(/_([^\{\\])/g,'_{$1}');}
	for(k=0;tex.search(/[\{\}]/g)!=-1&&k!=16;k++)
	{if(tex.search(/\\(case|det|mat|under|over|ope|pre|inf|sur|strike)/g)!=-1)
		{tex = tex.replace(/\\pre\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<span class="prescripts"><sup>$1</sup><sub>$2</sub></span>');
		tex = tex.replace(/\\case\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<span class="case"><span>$1</span><span>$2</span></span>');
		tex = tex.replace(/\\underbrace\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<span class="under"><span class="base">$1</span><span class="underbrace"/><span class="sat">$2</span></span>');
		tex = tex.replace(/\\overbrace\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'<span class="over"><span class="sat">$2</span><span class="overbrace"/><span class="base">$1</span></span>');
		tex = tex.replace(/\\underbrace\{([^\{\}]*)\}([^\^_])/g,'<span class="under"><span class="base">$1</span><span class="underbrace"/></span> $2').replace(/\\overbrace\{([^\{\}]*)\}[ ]*([^\^_])/g,'<span class="over"><span class="overbrace"/><span class="base">$1</span></span>$2').replace(/\\underbrace\{([^\{\}]*)\}[ ]*$/g,'<span class="under"><span class="base">$1</span><span class="underbrace"/></span>').replace(/\\overbrace\{([^\{\}]*)\}$/g,'<span class="over"><span class="overbrace"/><span class="base">$1</span></span>');
		tex = tex.replace(/\\mathbf\{([^\{\}]*)\}/g,'<b>$1</b>').replace(/\\mathsl\{([^\{\}]*)\}/g,'<i>$1</i>');
		tex = tex.replace(/\\sur\{([^\{\}]*)\}/g,'<sup>$1</sup>').replace(/\\inf\{([^\{\}]*)\}/g,'<sub>$1</sub>');
		tex = tex.replace(/\\(cases|det|overline|underline|strike)\{([^\{\}]*)\}/g,'<span class="$1">$2</span>');
		tex = tex.replace(/\\matrix\{([^\{\}]*)\}/g,'\\apply{<span class="matrix">$1</span>}').replace(/\\ope\{([^\{\}]*)\}/g,'\\opgroup{<span class="operator">$1</span>}');
		}
	if(tex.search(/\\(frac|stack|sqrt|rad|)/g)!=-1)
		{tex = tex.replace(/\\frac\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<span class="fraction"><span>$1</span><span>$2</span></span>');
		tex = tex.replace(/\\stackrel\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<span class="over"><span class="sat">$1</span><span class="base">$2</span></span>');
		tex = tex.replace(/\\stackrev\{([^\{\}]*)\}\{([^\{\}]*)\}/g,'<span class="under"><span class="base">$1</span><span class="sat">$2</span></span>');
		tex = tex.replace(/\\sqrt\{([^\{\}]*)\}/g,'<span class="radical"><span class="radix"/><span class="radicand">$1</span></span>').replace(/\\rad\{([^\}]*)\}\{([^\{\}]*)\}/g,'<span class="radical"><span class="radix">$1</span><span class="radicand">$2</span></span>');}
	if(tex.search(/\\vector/g)!=-1)
		{tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span><span>$7</span><span>$8</span></span>}$9');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span><span>$7</span></span>}$8');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span></span>}$7');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span></span>}$6');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span><span>$4</span></span>}$5');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span><span>$3</span></span>}$4');
		tex = tex.replace(/\\vector\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'\\apply{<span class="vector"><span>$1</span><span>$2</span></span>}$3');}
	if(tex.search(/\\row/g)!=-1)
		{tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span><span>$7</span><span>$8</span></span>$9');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span><span>$7</span></span>$8');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span><span>$6</span></span>$7');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span><span>$4</span><span>$5</span></span>$6');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span><span>$4</span></span>$5');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span><span>$3</span></span>$4');
		tex = tex.replace(/\\row\{([^\{\}]*)\}\{([^\{\}]*)\}([^\{])/g,'<span class="row"><span>$1</span><span>$2</span></span>$3');}
	if(tex.search(/[_\^]/g)!=-1)
		{tex = tex.replace(/_\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'^{$2}_{$1}');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}[ ]*_\{([^\{\}]*)\}/g,'$1<span class="indices"><sup>$2</sup><sub>$3</sub></span>');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}([^_])/g,'$1<sup>$2</sup>$3').replace(/([^\}])_\{([^\{\}]*)\}([^\^])/g,'$1<sub>$2</sub>$3');
		tex = tex.replace(/([^\}])\^\{([^\{\}]*)\}$/g,'$1<sup>$2</sup>').replace(/([^\}])_\{([^\{\}]*)\}$/g,'$1<sub>$2</sub>');}
	if(tex.search(/\\(apply|fence|opgroup)/g)!=-1)
		{tex = tex.replace(/\\fence\{([\[\|(.c])([^\{\}]*)([\]\|)c])\}/g,'\\fenced{<span class="fence left¢$1¢ right¢$3¢">$2</span>}');
		tex = tex.replace(/left¢\(¢/g,'lround').replace(/left¢\[¢/g,'lsquare').replace(/left¢c¢/g,'lcurly').replace(/left¢\|¢/g,'lsolid').replace(/left¢\.¢/g,'lnone');
		tex = tex.replace(/right¢\)¢/g,'rround').replace(/right¢\]¢/g,'rsquare').replace(/right¢c¢/g,'rcurly').replace(/right¢\|¢/g,'rsolid');
		tex = tex.replace(/_\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'^{$2}_{$1}');
		tex = tex.replace(/\\(fenced|opgroup)\{([^\{\}]*)\}\^\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<span class="$1">$2<span class="markers"><sup>$3</sup><sub>$4</sub></span></span>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}\^\{([^\{\}]*)\}/g,'<span class="$1">$2<sup>$3</sup></span>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}_\{([^\{\}]*)\}/g,'<span class="$1">$2<sub>$3</sub></span>');
		tex = tex.replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}([^_\^])/g,'$2$3').replace(/\\(apply|fenced|opgroup)\{([^\{\}]*)\}$/g,'$2');}
				}
	tex = tex.replace(/¢n/g,'<br/>').replace(/\\wrap/g,'<span class="wrap"/>');
	tex = tex.replace(/¢l/g,'{').replace(/¢r/g,'}').replace(/¢u/g,'_').replace(/¢h/g,'^').replace(/\\b/g,'\\').replace(/\\s/g,'\$');
	return tex;}

function convert(tex,shell,output)
	{switch (output)
		{case '1': result = convert1(tex,shell);break;
		case '2': result = convert2(tex,shell);break;
		}
	return result;}

function convert1(tex,shell)
	{var xml='';
	if(shell==1)
		{xml = '<span class="math">' + tex2xhtml(tex) + '</span>';}
	if(shell==2)
		{xml = '<div class="math">' + tex2xhtml(tex) + '</div>';}
	if(shell==3)
		{var formulae = tex.replace(/\$\$/g,'\$_bl0ck').split(/\$/g);
		for(s = 0; s != formulae.length; s++)
				{var content = formulae[s].replace(/_bl0ck/g,'');
				if(Math.round(s/2) != s/2)
					{if(formulae[s].indexOf('_bl0ck') == 0)
						{xml = xml + '<div class="math">' + tex2xhtml(content) + '</div>';}
					else
						{xml = xml + '<span class="math">' + tex2xhtml(content) + '</span>';}
					}
				else
					{xml = xml + content;}
				}
		}
	return xml;}

function convert2(tex,shell)
	{var xml='';
	if(shell==1)
		{xml = '<math>' + tex2xml(tex) + '</math>';}
	if(shell==2)
		{xml = '<formula>' + tex2xml(tex) + '</formula>';}
	if(shell==3)
		{var formulae = tex.replace(/\$\$/g,'\$_bl0ck').split(/\$/g);
		for(s = 0; s != formulae.length; s++)
				{var content = formulae[s].replace(/_bl0ck/g,'');
				if(Math.round(s/2) != s/2)
					{if(formulae[s].indexOf('_bl0ck') == 0)
						{xml = xml + '<formula>' + tex2xml(content) + '</formula>';}
					else
						{xml = xml + '<math>' + tex2xml(content) + '</math>';}
					}
				else
					{xml = xml + content;}
				}
		}
	return xml;}

function show(string)
	{var parser = new DOMParser();
	var dom = parser.parseFromString(string,"application/xml");
	var child = document.importNode(dom.documentElement,true);
	var show = document.getElementById('show');
	show.replaceChild(child,show.firstChild);}
	]]>
	</script>
	</head>
<body>
<form action="none">
<div>Input format: XSL-TeX 1.0, 
Output format: 
<select name="output">
<option value="1">XHTML 1.0 Strict</option>
<option value="2"  selected="selected">XML MAIDEN 2.1</option>
</select>, Output encoding: UTF-8</div>
<div>
<textarea cols="90" rows="15" style="background-color:silver"></textarea>
</div>
<div>
<textarea cols="90" rows="15" style="background-color:silver">
Type XSL-TeX input in textarea located above and press convert button.
X(HT)ML Output Will Appear here. XSL-TeX input examples are available below.
</textarea>
</div>
<div>
Type:
<select name="input">
<option value="1">inline formula</option>
<option value="2"  selected="selected">displayed formula</option>
<option value="3">document fragment</option>
</select>
<a href="javascript:document.forms[0].elements[2].value=convert(document.forms[0].elements[1].value,document.forms[0].elements[3].value,document.forms[0].elements[0].value);if(document.forms[0].elements[0].value=='2'){show('&lt;div>' + document.forms[0].elements[2].value + '&lt;/div>');}void(0);" style="display:inline-block;vertical-align:middle;padding:1ex;border:solid 1px;">Convert to X(HT)ML</a>
</div>
<div id="show">Formatted output will appear here</div>
<div>Preview Function works in Opera 9TP2 or later (Preview is available for XML MAIDEN output only)</div>
<pre>
[XSL-TeX Input examples]
Subscripts: Base_{subscript} or Base_s
Superscripts: Base^{superscript} or Base^s
Stacked indices: Base_{sub}^{sup} or Base^{sup}_{sub} or Base_s^s or Base^s_s
Presubscript: \inf{sub}Base
Presuperscript: \sur{sup}Base
Stacked prescripts: \pre{sup}{sub}Base
Fractions: \frac{numerator}{denominator}
Overscripts: \stackrel{over}{Base}
Underscripts: \stackrev{Base}{under}
Overbrace: \overbrace{Base}
Overbrace with inscription: \overbrace{Base}^{over}
Underbrace: \underbrace{Base}
Underbrace with inscription: \underbrace{Base}_{under}
Square root: \sqrt{radicand}
Radical: \rad{radix}{radicand}
Operators: \ope{U} \ope{U}_{sub} \ope{U}^{sup} \ope{U}_{sub}^{sup}
Common Operators: ∑ ∑_{sub} ∑^{sup} ∑_{sub}^{sup}
Fences:
\left( content \right)
\left[ content \right]
\left{ content \right}
\left| content \right|
\left. content \right|
Fences with indices:
\left( content \right)_{sub}
\left[ content \right]_{s}
\left{ content \right}_{sub}^{sup}
\left| content \right|^{sup}_{sub}
\left. content \right|_0^1
Vectors: \vector{entry}{entry}{entry}{entry}
Matrices:
\matrix{
\row{cell}{cell}{cell}
\row{cell}{cell}{cell}
\row{cell}{cell}{cell}
} 
Determinants:
\det{
\row{cell}{cell}{cell}
\row{cell}{cell}{cell}
\row{cell}{cell}{cell}
}
Cases:
\cases{
\case{value}{scope}
\case{value}{scope}
}
Bold: \mathbf{Bold}
Italic: \mathsl{Italic}
Strike: \strike{Strike}
Overline: \overline{overline}
Underline:\underline{underline}
Linebreak: \\
Softbreak (wrap point): \wrap
Character escapes: \{ \} \_ \^ \s (for $) \b (for \)
</pre>
</form>
<div>Converter is maintained by <a href="http://www.geocities.com/chavchan/home.xhtml" title="Homepage">George Chavchanidze</a>. Last modified on 14:24 13/05/2006</div>
</body>
</html>
