asciimathsyntax.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>ASCIIMathML: Syntax and constants</title>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <script type="text/javascript" src="ASCIIMathML.js"></script>
  8. <style type="text/css">
  9. #menu, #title, #subtitle, #author {text-align: center}
  10. body {font-family: Arial; background-color:beige}
  11. p,table {font-family: Times}
  12. </style>
  13. </head>
  14. <body>
  15. <div id="menu">
  16. | <a href="asciimath.html">Home Page</a> |
  17. <a href="asciimathsyntax.html">Syntax</a> |
  18. <a href="asciimathdemo.html">Try it</a> |
  19. <a href="asciimathcalculator.html">Calculator</a> |
  20. <a href="http://mathcs.chapman.edu/~jipsen/mathml/asciimathdownload.html">Download</a> |
  21. <a href="http://mathcs.chapman.edu/~jipsen/math/index.php/ASCIIMathML/ASCIIMathGraphs.html">Graphs</a> |
  22. <a href="http://mathcs.chapman.edu/~jipsen/math/index.php/ASCIIMathML/ASCIIMathFAQ.html">ASCIIMath FAQ</a> |
  23. <a href="http://mathcs.chapman.edu/~jipsen/math/index.php/ASCIIMathML/ASCIIMathMLSandbox.html">Sandbox</a> |
  24. <a href="http://mathcs.chapman.edu/~jipsen/math/index.php/ASCIIMathML/ASCIIMathCommentsAndSuggestions.html">Comments</a> |
  25. </div>
  26. <hr/>
  27. <h2 id="title">
  28. ASCIIMathML.js (ver 2.0): Syntax and List of Constants
  29. </h2>
  30. <h4 id="subtitle">
  31. The main aims of the ASCIIMathML syntax are: -- 1. close to standard
  32. mathematical notation -- 2. easy to read -- 3. easy to type
  33. </h4>
  34. <p>
  35. You can use your favorite editor to write HTML pages that use this
  36. JavaScript program. If the page is viewed by a browser that does not
  37. support MathML or JavaScript, the ASCII formulas are still quite
  38. readable. Most users will not have to read the technicalities on
  39. this page. If you type
  40. </p>
  41. <pre>amath x^2 or a_(m n) or a_{m n} or (x+1)/y or sqrtx endamath</pre>
  42. <p>
  43. you pretty much get what you expect: amath x^2 or a_(m n) or a_{m n} or
  44. (x+1)/y or sqrtx endamath. The a``math ... enda``math tokens are used to
  45. start/stop the <b>new auto-math-recognize mode</b>. Of course one can still use
  46. the \`...\` back-quotes to delimit math formulas explicitly
  47. (\$...\$ should only be used for LaTeX formulas).
  48. The choice of grouping parenthesis is up to you
  49. (they don't have to match either). If the displayed expression can be
  50. parsed uniquely without them, they are omitted. Printing the table of
  51. constant symbols (below) may be helpful (but is not necessary if you
  52. know the LaTeX equivalents).
  53. </p>
  54. <p>
  55. It is hoped that this simple input format for MathML will further
  56. encourage its use on the web. The remainder of this page gives a fairly
  57. detailed specification of the ASCII syntax. <b>The expressions described here
  58. correspond to a wellspecified subset of Presentation MathML and behave
  59. in a predictable way.</b>
  60. </p>
  61. <p>
  62. The syntax is very permissive and does not generate syntax
  63. errors. This allows mathematically incorrect expressions to be
  64. displayed, which is important for teaching purposes. It also causes
  65. less frustration when previewing formulas.
  66. </p>
  67. <p>
  68. The parser uses no operator precedence and only respects the grouping
  69. brackets, subscripts, superscript, fractions and (square) roots. This
  70. is done for reasons of efficiency and generality. The resulting MathML
  71. code can quite easily be processed further to ensure additional syntactic
  72. requirements of any particular application.
  73. </p>
  74. <p>
  75. <b>The grammar:</b> Here is a definition of the grammar used to parse
  76. ASCIIMathML expressions. In the Backus-Naur form given below, the
  77. letter on the left of the ::= represents a category of symbols that
  78. could be one of the possible sequences of symbols listed on the right.
  79. The vertical bar | separates the alternatives.
  80. </p>
  81. <pre>c ::= [A-z] | numbers | greek letters | other constant symbols (see below)
  82. u ::= 'sqrt' | 'text' | 'bb' | other unary symbols for font commands
  83. b ::= 'frac' | 'root' | 'stackrel' binary symbols
  84. l ::= ( | [ | { | (: | {: left brackets
  85. r ::= ) | ] | } | :) | :} right brackets
  86. S ::= c | lEr | uS | bSS | "any" simple expression
  87. E ::= SE | S/S |S_S | S^S | S_S^S expression (fraction, sub-, super-, subsuperscript)
  88. </pre>
  89. <p>
  90. <b>The translation rules:</b> Each terminal symbol is translated into
  91. a corresponding MathML node. The constants are mostly converted to
  92. their respective Unicode symbols. The other expressions are converted
  93. as follows:<br/>
  94. <table>
  95. <tr><td>l`S`r</td><td>`to`</td><td>&lt;mrow>l`S`r&lt;/mrow>
  96. (note that any pair of brackets can be used to delimit subexpressions,
  97. they don't have to match)</td></tr>
  98. <tr><td>sqrt `S`</td><td>`to`</td><td>&lt;msqrt>`S'`&lt;/msqrt></td></tr>
  99. <tr><td>text `S`</td><td>`to`</td><td>&lt;mtext>`S'`&lt;/mtext></td></tr>
  100. <tr><td>"any"</td><td>`to`</td><td>&lt;mtext>any&lt;/mtext></td></tr>
  101. <tr><td>
  102. frac `S_1` `S_2`</td><td>`to`</td><td>&lt;mfrac>`S_1'` `S_2'`&lt;/mfrac>
  103. </td></tr>
  104. <tr><td>
  105. root `S_1` `S_2`</td><td>`to`</td><td>&lt;mroot>`S_2'` `S_1'`&lt;/mroot>
  106. </td></tr>
  107. <tr><td>
  108. stackrel `S_1` `S_2`</td><td>`to`</td><td>&lt;mover>`S_2'` `S_1'`&lt;/mover>
  109. </td></tr>
  110. <tr><td>
  111. `S_1`/`S_2`</td><td>`to`</td><td>&lt;mfrac>`S_1'` `S_2'`&lt;/mfrac>
  112. </td></tr>
  113. <tr><td>
  114. `S_1`_`S_2`</td><td>`to`</td><td>&lt;msub>`S_1` `S_2'`&lt;/msub>
  115. </td></tr>
  116. <tr><td>
  117. `S_1`^`S_2`</td><td>`to`</td><td>&lt;msup>`S_1` `S_2'`&lt;/msup>
  118. </td></tr>
  119. <tr><td>
  120. `S_1`_`S_2`^`S_3`</td><td>`to`</td>
  121. <td>&lt;msubsup>`S_1` `S_2'` `S_3'`&lt;/msubsup> or
  122. &lt;munderover>`S_1` `S_2'` `S_3'`&lt;/munderover> (in some cases)
  123. </td></tr>
  124. </table>
  125. In the rules above, the expression `S'` is the same as `S`, except that if
  126. `S` has an outer level of brackets, then `S'` is the expression inside
  127. these brackets.
  128. <p>
  129. <b>Matrices:</b> A simple syntax for matrices is also recognized:
  130. <br/>
  131. <tt>l(`S_(11)`,...,`S_(1n)`),(...),(`S_(m1)`,...,`S_(mn)`)r</tt>
  132. &#x00A0; &#x00A0; or &#x00A0; &#x00A0;
  133. <tt>l[`S_(11)`,...,`S_(1n)`],[...],[`S_(m1)`,...,`S_(mn)`]r</tt>.
  134. <br/>
  135. Here <tt>l</tt> and <tt>r</tt> stand for any of the left and right
  136. brackets (just like in the grammar they do not have to match). Both of
  137. these expressions are translated to
  138. <br/>
  139. &lt;mrow>l&lt;mtable>&lt;mtr>&lt;mtd>`S_(11)`&lt;/mtd>...
  140. &lt;mtd>`S_(1n)`&lt;/mtd>&lt;/mtr>...
  141. &lt;mtr>&lt;mtd>`S_(m1)`&lt;/mtd>...
  142. &lt;mtd>`S_(mn)`&lt;/mtd>&lt;/mtr>&lt;/mtable>r&lt;/mrow>.
  143. <br/>
  144. For example
  145. <tt>{(S_(11),...,S_(1n)),(vdots,ddots,vdots),(S_(m1),...,S_(mn))]</tt>
  146. displays as `{(S_(11),...,S_(1n)),(vdots,ddots,vdots),(S_(m1),...,S_(mn))]`.
  147. <br/>
  148. Note that each row must have the same number of expressions, and there
  149. should be at least two rows.
  150. <p>
  151. <b>Tokenization:</b> The input formula is broken into tokens using a
  152. "longest matching initial substring search". Suppose the input formula
  153. has been processed from left to right up to a fixed position. The
  154. longest string from the list of constants (given below) that matches
  155. the initial part of the remainder of the formula is the next token. If
  156. there is no matching string, then the first character of the remainder
  157. is the next token. The symbol table at the top of the ASCIIMathML.js
  158. script specifies whether a symbol is a math operator (surrounded by a
  159. &lt;mo> tag) or a math identifier (surrounded by a &lt;mi> tag). For
  160. single character tokens, letters are treated as math identifiers, and
  161. non-alphanumeric characters are treated as math operators. For digits,
  162. see "Numbers" below.
  163. <p>
  164. Spaces are significant when they separate characters and thus prevent
  165. a certain string of characters from matching one of the
  166. constants. Multiple spaces and end-of-line characters are equivalent
  167. to a single space.
  168. </p>
  169. <h4>
  170. Now for a complete list of constants (<a
  171. href="http://math.chapman.edu/cgi-bin/mathxml.pl?Complete_list_of_LaTeX_constants">standard
  172. LaTeX names</a> also work):
  173. </h4>
  174. <p>
  175. Numbers: A string of digits, optionally preceded by a minus sign, and
  176. optionally followed by a decimal point (a period) and another string
  177. of digits, is parsed as a single token and converted to a MathML
  178. number, i.e., enclosed with the &lt;mn> tag. If it is not desirable to
  179. have a preceding minus sign be part of the number, a space should be inserted.
  180. Thus <tt>x-1</tt> is converted to &lt;mi>x&lt;/mi>&lt;mn>-1&lt;/mn>, whereas
  181. <tt>x - 1</tt> is converted to &lt;mi>x&lt;/mi>&lt;mo>-&lt;/mo>&lt;mn>1&lt;/mn>.
  182. </p>
  183. <p>
  184. Greek letters:
  185. alpha `alpha`
  186. beta `beta`
  187. chi `chi`
  188. delta `delta`
  189. Delta `Delta`
  190. epsilon `epsilon`
  191. varepsilon `varepsilon`
  192. eta `eta`
  193. gamma `gamma`
  194. Gamma `Gamma`
  195. iota `iota`
  196. kappa `kappa`
  197. lambda `lambda`
  198. Lambda `Lambda`
  199. mu `mu`
  200. nu `nu`
  201. omega `omega`
  202. Omega `Omega`
  203. phi `phi`
  204. varphi `varphi`
  205. Phi `Phi`
  206. pi `pi`
  207. Pi `Pi`
  208. psi `psi`
  209. Psi `Psi`
  210. rho `rho`
  211. sigma `sigma`
  212. Sigma `Sigma`
  213. tau `tau`
  214. theta `theta`
  215. vartheta `vartheta`
  216. Theta `Theta`
  217. upsilon `upsilon`
  218. xi `xi`
  219. Xi `Xi`
  220. zeta `zeta`
  221. </p>
  222. <table border="5" cellpadding="10">
  223. <tr valign="top"><td>
  224. Operation symbols
  225. <table border="5" cellpadding="10">
  226. <tr><th>Type</th><th>See</th></tr>
  227. <tr><td>+</td><td>`+`</td></tr>
  228. <tr><td>-</td><td>`-`</td></tr>
  229. <tr><td>*</td><td>`*`</td></tr>
  230. <tr><td>**</td><td>`**`</td></tr>
  231. <tr><td>//</td><td>`//`</td></tr>
  232. <tr><td>\\</td><td>`\\ `</td></tr>
  233. <tr><td>xx</td><td>`xx`</td></tr>
  234. <tr><td>-:</td><td>`-:`</td></tr>
  235. <tr><td>@</td><td>`@`</td></tr>
  236. <tr><td>o+</td><td>`o+`</td></tr>
  237. <tr><td>ox</td><td>`ox`</td></tr>
  238. <tr><td>o.</td><td>`o.`</td></tr>
  239. <tr><td>sum</td><td>`sum`</td></tr>
  240. <tr><td>prod</td><td>`prod`</td></tr>
  241. <tr><td>^^</td><td>`^^`</td></tr>
  242. <tr><td>^^^</td><td>`^^^`</td></tr>
  243. <tr><td>vv</td><td>`vv`</td></tr>
  244. <tr><td>vvv</td><td>`vvv`</td></tr>
  245. <tr><td>nn</td><td>`nn`</td></tr>
  246. <tr><td>nnn</td><td>`nnn`</td></tr>
  247. <tr><td>uu</td><td>`uu`</td></tr>
  248. <tr><td>uuu</td><td>`uuu`</td></tr>
  249. </table>
  250. </td><td>
  251. Relation symbols
  252. <table border="5" cellpadding="10">
  253. <tr><th>Type</th><th>See</th></tr>
  254. <tr><td>=</td><td>`=`</td></tr>
  255. <tr><td>!=</td><td>`!=`</td></tr>
  256. <tr><td>< </td><td>`<`</td></tr>
  257. <tr><td>></td><td>`>`</td></tr>
  258. <tr><td><=</td><td>`<=`</td></tr>
  259. <tr><td>>=</td><td>`>=`</td></tr>
  260. <tr><td>-<</td><td>`-<`</td></tr>
  261. <tr><td>>-</td><td>`>-`</td></tr>
  262. <tr><td>in</td><td>`in`</td></tr>
  263. <tr><td>!in</td><td>`notin`</td></tr>
  264. <tr><td>sub</td><td>`sub`</td></tr>
  265. <tr><td>sup</td><td>`sup`</td></tr>
  266. <tr><td>sube</td><td>`sube`</td></tr>
  267. <tr><td>supe</td><td>`supe`</td></tr>
  268. <tr><td>-=</td><td>`-=`</td></tr>
  269. <tr><td>~=</td><td>`~=`</td></tr>
  270. <tr><td>~~</td><td>`~~`</td></tr>
  271. <tr><td>prop</td><td>`prop`</td></tr>
  272. </table>
  273. </td><td>
  274. Logical symbols
  275. <table border="5" cellpadding="10">
  276. <tr><th>Type</th><th>See</th></tr>
  277. <tr><td>and</td><td>`and`</td></tr>
  278. <tr><td>or</td><td>`or`</td></tr>
  279. <tr><td>not</td><td>`not`</td></tr>
  280. <tr><td>=></td><td>`=>`</td></tr>
  281. <tr><td>if</td><td>`if`</td></tr>
  282. <tr><td>iff</td><td>`iff`</td></tr>
  283. <tr><td>AA</td><td>`AA`</td></tr>
  284. <tr><td>EE</td><td>`EE`</td></tr>
  285. <tr><td>_|_</td><td>`_|_`</td></tr>
  286. <tr><td>TT</td><td>`TT`</td></tr>
  287. <tr><td>|--</td><td>`|--`</td></tr>
  288. <tr><td>|==</td><td>`|==`</td></tr>
  289. </table>
  290. <p>
  291. Grouping brackets
  292. <table border="5" cellpadding="10">
  293. <tr><th>Type</th><th>See</th></tr>
  294. <tr><td>(</td><td>`(`</td></tr>
  295. <tr><td>)</td><td>`)`</td></tr>
  296. <tr><td>[</td><td>`[`</td></tr>
  297. <tr><td>]</td><td>`]`</td></tr>
  298. <tr><td>{</td><td>`{`</td></tr>
  299. <tr><td>}</td><td>`}`</td></tr>
  300. <tr><td>(:</td><td>`(:`</td></tr>
  301. <tr><td>:)</td><td>`:)`</td></tr>
  302. <tr><td>{:</td><td>`{:`</td></tr>
  303. <tr><td>:}</td><td>`{::}`</td></tr>
  304. </table>
  305. </td><td>
  306. Miscellaneous symbols
  307. <table border="5" cellpadding="10">
  308. <tr><th>Type</th><th>See</th></tr>
  309. <tr><td>int</td><td>`int`</td></tr>
  310. <tr><td>oint</td><td>`oint`</td></tr>
  311. <tr><td>del</td><td>`del`</td></tr>
  312. <tr><td>grad</td><td>`grad`</td></tr>
  313. <tr><td>+-</td><td>`+-`</td></tr>
  314. <tr><td>O/</td><td>`O/`</td></tr>
  315. <tr><td>oo</td><td>`oo`</td></tr>
  316. <tr><td>aleph</td><td>`aleph`</td></tr>
  317. <tr><td>/_</td><td>`/_`</td></tr>
  318. <tr><td>:.</td><td>`:.`</td></tr>
  319. <tr><td>|...|</td><td>|`...`|</td></tr>
  320. <tr><td>|cdots|</td><td>|`cdots`|</td></tr>
  321. <tr><td>vdots</td><td>`vdots`</td></tr>
  322. <tr><td>ddots</td><td>`ddots`</td></tr>
  323. <tr><td>|\ |</td><td>|`\ `|</td></tr>
  324. <tr><td>|quad|</td><td>|`quad`|</td></tr>
  325. <tr><td>diamond</td><td>`diamond`</td></tr>
  326. <tr><td>square</td><td>`square`</td></tr>
  327. <tr><td>|__</td><td>`|__`</td></tr>
  328. <tr><td>__|</td><td>`__|`</td></tr>
  329. <tr><td>|~</td><td>`|~`</td></tr>
  330. <tr><td>~|</td><td>`~|`</td></tr>
  331. <tr><td>CC</td><td>`CC`</td></tr>
  332. <tr><td>NN</td><td>`NN`</td></tr>
  333. <tr><td>QQ</td><td>`QQ`</td></tr>
  334. <tr><td>RR</td><td>`RR`</td></tr>
  335. <tr><td>ZZ</td><td>`ZZ`</td></tr>
  336. </table>
  337. </td><td>
  338. Standard functions
  339. <table border="5" cellpadding="10">
  340. <tr><th>Type</th><th>See</th></tr>
  341. <tr><td>sin</td><td>`sin`</td></tr>
  342. <tr><td>cos</td><td>`cos`</td></tr>
  343. <tr><td>tan</td><td>`tan`</td></tr>
  344. <tr><td>csc</td><td>`csc`</td></tr>
  345. <tr><td>sec</td><td>`sec`</td></tr>
  346. <tr><td>cot</td><td>`cot`</td></tr>
  347. <tr><td>sinh</td><td>`sinh`</td></tr>
  348. <tr><td>cosh</td><td>`cosh`</td></tr>
  349. <tr><td>tanh</td><td>`tanh`</td></tr>
  350. <tr><td>log</td><td>`log`</td></tr>
  351. <tr><td>ln</td><td>`ln`</td></tr>
  352. <tr><td>det</td><td>`det`</td></tr>
  353. <tr><td>dim</td><td>`dim`</td></tr>
  354. <tr><td>lim</td><td>`lim`</td></tr>
  355. <tr><td>mod</td><td>`mod`</td></tr>
  356. <tr><td>gcd</td><td>`gcd`</td></tr>
  357. <tr><td>lcm</td><td>`lcm`</td></tr>
  358. <tr><td>min</td><td>`min`</td></tr>
  359. <tr><td>max</td><td>`max`</td></tr>
  360. </table>
  361. <p>
  362. Accents
  363. <table border="5" cellpadding="10">
  364. <tr><th>Type</th><th>See</th></tr>
  365. <tr><td>hat x</td><td>`hat x`</td></tr>
  366. <tr><td>bar x</td><td>`bar x`</td></tr>
  367. <tr><td>ul x</td><td>`ul x`</td></tr>
  368. <tr><td>vec x</td><td>`vec x`</td></tr>
  369. <tr><td>dot x</td><td>`dot x`</td></tr>
  370. <tr><td>ddot x</td><td>`ddot x`</td></tr>
  371. </table>
  372. </td><td>
  373. Arrows
  374. <table border="5" cellpadding="10">
  375. <tr><th>Type</th><th>See</th></tr>
  376. <tr><td>uarr</td><td>`uarr`</td></tr>
  377. <tr><td>darr</td><td>`darr`</td></tr>
  378. <tr><td>rarr</td><td>`rarr`</td></tr>
  379. <tr><td>-></td><td>`->`</td></tr>
  380. <tr><td>|-></td><td>`|->`</td></tr>
  381. <tr><td>larr</td><td>`larr`</td></tr>
  382. <tr><td>harr</td><td>`harr`</td></tr>
  383. <tr><td>rArr</td><td>`rArr`</td></tr>
  384. <tr><td>lArr</td><td>`lArr`</td></tr>
  385. <tr><td>hArr</td><td>`hArr`</td></tr>
  386. </table>
  387. <p>
  388. Font commands
  389. <table border="5" cellpadding="10">
  390. <tr><th>Type</th><th>See</th></tr>
  391. <tr><td>bb A</td><td>`bb A`</td></tr>
  392. <tr><td>bbb A</td><td>`bbb A`</td></tr>
  393. <tr><td>cc A</td><td>`cc A`</td></tr>
  394. <tr><td>tt A</td><td>`tt A`</td></tr>
  395. <tr><td>fr A</td><td>`fr A`</td></tr>
  396. <tr><td>sf A</td><td>`sf A`</td></tr>
  397. </table>
  398. </td></tr>
  399. </table>
  400. <p>
  401. Of course you may want or need other symbols from the thousands of <a
  402. href="http://www.ctan.org/tex-archive/info/symbols/comprehensive/symbols-letter.pdf">LaTeX
  403. symbols</a> or <a
  404. href="http://www.alanwood.net/unicode/#links">unicode
  405. symbols</a>. Fortunately ASCIIMathML.js is very <a
  406. href="asciimathextend.html">easy
  407. to extend</a>, so you can tailor it to your specific needs. (This
  408. could be compared to the LaTeX macro files that many users have
  409. developed over the years.)
  410. </p>
  411. <!--p>
  412. Large files with many formulas can take quite some time to display,
  413. especially on older hardware. To address this problem, there is a
  414. version ASCIIMathMLite.js that has a shorter symbol table (without the
  415. LaTeX symbol names) and slightly simplified parser. Send me an email
  416. at <a href="mailto:jipsen@chapman.edu">jipsen@chapman.edu</a> if you
  417. would like a copy.
  418. </p>
  419. <p>
  420. Another version that also recognizes some <a
  421. href="http://www.latex-project.org/">LaTeX</a> layout commands and
  422. (the fairly standard) <a
  423. href="http://en.wikipedia.org/wiki/Wikipedia:How_to_edit_a_page">Wiki
  424. formatting codes</a> for ASCII text is in the works. This further
  425. simplifies producing mathematical content for the web. However such a
  426. development is less easily justified since there are good free HTML
  427. editors and the HTML syntax is a well-established standard that is
  428. simple enough to be coded by hand.
  429. </p-->
  430. <hr/>
  431. <div id="author">
  432. <a href="http://www.chapman.edu/~jipsen/">Peter Jipsen</a>,
  433. <a href="http://www.chapman.edu/">Chapman University</a>, September 2007
  434. <a href="http://validator.w3.org/check/referer"><img border="0"
  435. src="http://www.w3.org/Icons/valid-html401"
  436. alt="Valid HTML 4.01!" height="31" width="88"></a>
  437. </div>
  438. </body>
  439. </html>