Accept attributes in inline image syntax
[multimarkdown] / MultiMarkdownXSLTMathML / cmarkup.xsl
1 <?xml version='1.0' encoding="UTF-8"?>\r
2 <xsl:stylesheet\r
3                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\r
4                 xmlns:m="http://www.w3.org/1998/Math/MathML"\r
5                 version='1.0'>\r
6                 \r
7 <!-- ====================================================================== -->\r
8 <!-- $Id: cmarkup.xsl 149 2006-09-12 21:23:53Z fletcher $\r
9      This file is part of the XSLT MathML Library distribution.\r
10      See ./README or http://www.raleigh.ru/MathML/mmltex for\r
11      copyright and other information\r
12      Modified by Fletcher T. Penney for MultiMarkdown Version 2.0.a             -->\r
13 <!-- ====================================================================== -->\r
14 \r
15 <!-- 4.4.1.1 cn -->\r
16 <xsl:template match="m:cn"><xsl:apply-templates/></xsl:template>\r
17 \r
18 <xsl:template match="m:cn[@type='complex-cartesian']">\r
19         <xsl:apply-templates select="text()[1]"/>\r
20         <xsl:text>+</xsl:text>\r
21         <xsl:apply-templates select="text()[2]"/>\r
22         <xsl:text>i</xsl:text>\r
23 </xsl:template>\r
24 \r
25 <xsl:template match="m:cn[@type='rational']">\r
26         <xsl:apply-templates select="text()[1]"/>\r
27         <xsl:text>/</xsl:text>\r
28         <xsl:apply-templates select="text()[2]"/>\r
29 </xsl:template>\r
30 \r
31 <xsl:template match="m:cn[@type='integer' and @base!=10]">\r
32                 <xsl:apply-templates/>\r
33                 <xsl:text>_{</xsl:text><xsl:value-of select="@base"/><xsl:text>}</xsl:text>\r
34 </xsl:template>\r
35 \r
36 <xsl:template match="m:cn[@type='complex-polar']">\r
37         <xsl:apply-templates select="text()[1]"/>\r
38         <xsl:text>e^{i </xsl:text>\r
39         <xsl:apply-templates select="text()[2]"/>\r
40         <xsl:text>}</xsl:text>\r
41 </xsl:template>\r
42 \r
43 <xsl:template match="m:cn[@type='e-notation']">\r
44     <xsl:apply-templates select="text()[1]"/>\r
45     <xsl:text>E</xsl:text>\r
46     <xsl:apply-templates select="text()[2]"/>\r
47 </xsl:template>\r
48 \r
49 <!-- 4.4.1.1 ci 4.4.1.2 csymbol -->\r
50 <xsl:template match="m:ci | m:csymbol">\r
51         <xsl:choose>\r
52                 <xsl:when test="string-length(normalize-space(text()))>1">\r
53                         <xsl:text>\mathrm{</xsl:text><xsl:apply-templates/><xsl:text>}</xsl:text>\r
54                 </xsl:when>\r
55                 <xsl:otherwise><xsl:apply-templates/></xsl:otherwise>\r
56         </xsl:choose>\r
57 </xsl:template>\r
58 \r
59 <!-- 4.4.2.1 apply 4.4.2.2 reln -->\r
60 <xsl:template match="m:apply | m:reln">\r
61         <xsl:apply-templates select="*[1]">\r
62         <!-- <? -->\r
63                 <xsl:with-param name="p" select="10"/>\r
64         </xsl:apply-templates>\r
65         <!-- ?> -->\r
66         <xsl:text>(</xsl:text>\r
67         <xsl:for-each select="*[position()>1]">\r
68                 <xsl:apply-templates select="."/>\r
69                 <xsl:if test="not(position()=last())"><xsl:text>, </xsl:text></xsl:if>\r
70         </xsl:for-each>\r
71         <xsl:text>)</xsl:text>\r
72 </xsl:template>\r
73 \r
74 <!-- 4.4.2.3 fn -->\r
75 <xsl:template match="m:fn[m:apply[1]]"> <!-- for m:fn using default rule -->\r
76         <xsl:text>(</xsl:text><xsl:apply-templates/><xsl:text>)</xsl:text>\r
77 </xsl:template>\r
78 \r
79 <!-- 4.4.2.4 interval -->\r
80 <xsl:template match="m:interval[*[2]]">\r
81         <xsl:choose>\r
82                 <xsl:when test="@closure='open' or @closure='open-closed'">\r
83                         <xsl:text>\left(</xsl:text>             \r
84                 </xsl:when>\r
85                 <xsl:otherwise><xsl:text>\left[</xsl:text></xsl:otherwise> \r
86         </xsl:choose>\r
87         <xsl:apply-templates select="*[1]"/>\r
88         <xsl:text> , </xsl:text>\r
89         <xsl:apply-templates select="*[2]"/>\r
90         <xsl:choose>\r
91                 <xsl:when test="@closure='open' or @closure='closed-open'">\r
92                         <xsl:text>\right)</xsl:text>            \r
93                 </xsl:when>\r
94                 <xsl:otherwise><xsl:text>\right]</xsl:text></xsl:otherwise> \r
95         </xsl:choose>\r
96 </xsl:template>\r
97 \r
98 <xsl:template match="m:interval">\r
99         <xsl:text>\left\{</xsl:text><xsl:apply-templates/><xsl:text>\right\}</xsl:text>\r
100 </xsl:template>\r
101 \r
102 <!-- 4.4.2.5 inverse -->\r
103 <xsl:template match="m:apply[*[1][self::m:inverse]]">\r
104         <xsl:apply-templates select="*[2]"/><xsl:text>^{(-1)}</xsl:text>\r
105 </xsl:template>\r
106 \r
107 <!-- 4.4.2.6 sep 4.4.2.7 condition -->\r
108 <xsl:template match="m:sep | m:condition"><xsl:apply-templates/></xsl:template>\r
109 \r
110 <!-- 4.4.2.9 lambda -->\r
111 <xsl:template match="m:lambda">\r
112         <xsl:apply-templates select="m:bvar/*"/>\r
113   <xsl:text>\mapsto </xsl:text>\r
114   <xsl:apply-templates select="*[last()]"/>\r
115 <!--    Other variant \r
116         <xsl:text>\mathrm{lambda}\: </xsl:text>\r
117         <xsl:apply-templates select="m:bvar/*"/>\r
118         <xsl:text>.\: </xsl:text>\r
119   <xsl:apply-templates select="*[last()]"/> -->\r
120 </xsl:template>\r
121 \r
122 <!-- 4.4.2.10 compose -->\r
123 <xsl:template match="m:apply[*[1][self::m:compose]]">\r
124         <xsl:param name="p" select="0"/>\r
125         <xsl:call-template name="infix">\r
126                 <xsl:with-param name="this-p" select="1"/>\r
127                 <xsl:with-param name="p" select="$p"/>\r
128                 <xsl:with-param name="mo">\circ </xsl:with-param>\r
129         </xsl:call-template>\r
130 </xsl:template>\r
131 \r
132 <!-- 4.4.2.11 ident -->\r
133 <xsl:template match="m:ident"><xsl:text>\mathrm{id}</xsl:text></xsl:template>\r
134 \r
135 <!-- 4.4.2.12 domain 4.4.2.13 codomain 4.4.2.14 image 4.4.3.21 arg 4.4.3.24 lcm\r
136                 4.4.5.9 grad 4.4.5.10 curl 4.4.9.4 median 4.4.9.5 mode-->\r
137 <xsl:template match="m:domain | m:codomain | m:image | m:arg | m:lcm | m:grad |\r
138                                                                  m:curl | m:median | m:mode">\r
139         <xsl:text>\mathop{\mathrm{</xsl:text>\r
140         <xsl:value-of select="local-name()"/>\r
141         <xsl:text>}}</xsl:text>\r
142 </xsl:template>\r
143 \r
144 <!-- 4.4.2.15 domainofapplication -->\r
145 <xsl:template match="m:domainofapplication"/>\r
146 \r
147 <!-- 4.4.2.16 piecewise -->\r
148 <xsl:template match="m:piecewise">\r
149         <xsl:text>\begin{cases}</xsl:text>\r
150         <xsl:apply-templates select="m:piece"/>\r
151         <xsl:apply-templates select="m:otherwise"/>\r
152         <xsl:text>\end{cases}</xsl:text>\r
153 </xsl:template>\r
154 \r
155 <xsl:template match="m:piece">\r
156                 <xsl:apply-templates select="*[1]"/>\r
157                 <xsl:text> &amp; \text{if $</xsl:text>\r
158                 <xsl:apply-templates select="*[2]"/>\r
159                 <xsl:text>$}</xsl:text>\r
160                 <xsl:if test="not(position()=last()) or ../m:otherwise"><xsl:text>\\ </xsl:text></xsl:if>\r
161 </xsl:template>\r
162 \r
163 <xsl:template match="m:otherwise">\r
164         <xsl:apply-templates select="*[1]"/>\r
165         <xsl:text> &amp; \text{otherwise}</xsl:text>\r
166 </xsl:template>\r
167 \r
168 <!-- 4.4.3.1 quotient -->\r
169 <xsl:template match="m:apply[*[1][self::m:quotient]]">\r
170         <xsl:text>\left\lfloor\frac{</xsl:text>\r
171         <xsl:apply-templates select="*[2]"/>\r
172         <xsl:text>}{</xsl:text>\r
173         <xsl:apply-templates select="*[3]"/>\r
174         <xsl:text>}\right\rfloor </xsl:text>\r
175 </xsl:template>\r
176 \r
177 <!-- 4.4.3.2 factorial -->\r
178 <xsl:template match="m:apply[*[1][self::m:factorial]]">\r
179         <xsl:apply-templates select="*[2]">\r
180                 <xsl:with-param name="p" select="7"/>\r
181         </xsl:apply-templates>\r
182         <xsl:text>!</xsl:text>\r
183 </xsl:template>\r
184 \r
185 <!-- 4.4.3.3 divide -->\r
186 <xsl:template match="m:apply[*[1][self::m:divide]]">\r
187         <xsl:param name="p" select="0"/>\r
188   <xsl:param name="this-p" select="3"/>\r
189   <xsl:if test="$this-p &lt; $p"><xsl:text>\left(</xsl:text></xsl:if>\r
190   <xsl:text>\frac{</xsl:text>\r
191         <xsl:apply-templates select="*[2]"/>\r
192 <!--            <xsl:with-param name="p" select="$this-p"/>\r
193         </xsl:apply-templates>-->\r
194         <xsl:text>}{</xsl:text>\r
195         <xsl:apply-templates select="*[3]"/>\r
196 <!--            <xsl:with-param name="p" select="$this-p"/>\r
197         </xsl:apply-templates>-->\r
198         <xsl:text>}</xsl:text>\r
199         <xsl:if test="$this-p &lt; $p"><xsl:text>\right)</xsl:text></xsl:if>\r
200 </xsl:template>\r
201 \r
202 <!-- 4.4.3.4 max min -->\r
203 <xsl:template match="m:apply[*[1][self::m:max or self::m:min]]">\r
204         <xsl:text>\</xsl:text>\r
205         <xsl:value-of select="local-name(*[1])"/>\r
206         <xsl:text>\{</xsl:text>\r
207    <xsl:choose>\r
208                 <xsl:when test="m:condition">\r
209                 <xsl:apply-templates select="*[last()]"/>\r
210                 <xsl:text>\mid </xsl:text>\r
211                         <xsl:apply-templates select="m:condition/node()"/>\r
212                 </xsl:when>\r
213                 <xsl:otherwise>\r
214                         <xsl:for-each select="*[position() &gt; 1]">\r
215                                 <xsl:apply-templates select="."/>\r
216                                 <xsl:if test="position() !=last()"><xsl:text> , </xsl:text></xsl:if>\r
217                         </xsl:for-each>\r
218                 </xsl:otherwise>\r
219    </xsl:choose>\r
220         <xsl:text>\}</xsl:text>\r
221 </xsl:template>\r
222 \r
223 <!-- 4.4.3.5  minus-->\r
224 <xsl:template match="m:apply[*[1][self::m:minus] and count(*)=2]">\r
225         <xsl:text>-</xsl:text>\r
226         <xsl:apply-templates select="*[2]">\r
227                 <xsl:with-param name="p" select="5"/>\r
228         </xsl:apply-templates>\r
229 </xsl:template>\r
230 \r
231 <xsl:template match="m:apply[*[1][self::m:minus] and count(*)&gt;2]">\r
232         <xsl:param name="p" select="0"/>\r
233         <xsl:call-template name="binary">\r
234                 <xsl:with-param name="mo">-</xsl:with-param>\r
235                 <xsl:with-param name="p" select="$p"/>\r
236                 <xsl:with-param name="this-p" select="2"/>\r
237         </xsl:call-template>\r
238 </xsl:template>\r
239 \r
240 <!-- 4.4.3.6  plus-->\r
241 <xsl:template match="m:apply[*[1][self::m:plus]]">\r
242   <xsl:param name="p" select="0"/>\r
243   <xsl:if test="$p &gt; 2">\r
244                 <xsl:text>(</xsl:text>\r
245         </xsl:if>\r
246   <xsl:for-each select="*[position()&gt;1]">\r
247    <xsl:if test="position() &gt; 1">\r
248     <xsl:choose>\r
249       <xsl:when test="self::m:apply[*[1][self::m:times] and\r
250       *[2][self::m:apply/*[1][self::m:minus] or self::m:cn[not(m:sep) and\r
251       (number(.) &lt; 0)]]]">-</xsl:when>\r
252       <xsl:otherwise>+</xsl:otherwise>\r
253     </xsl:choose>\r
254    </xsl:if>   \r
255     <xsl:choose>\r
256       <xsl:when test="self::m:apply[*[1][self::m:times] and\r
257       *[2][self::m:cn[not(m:sep) and (number(.) &lt;0)]]]">\r
258                         <xsl:value-of select="-(*[2])"/>\r
259                         <xsl:apply-templates select=".">\r
260                      <xsl:with-param name="first" select="2"/>\r
261                      <xsl:with-param name="p" select="2"/>\r
262                    </xsl:apply-templates>\r
263        </xsl:when>\r
264       <xsl:when test="self::m:apply[*[1][self::m:times] and\r
265       *[2][self::m:apply/*[1][self::m:minus]]]">\r
266                                 <xsl:apply-templates select="./*[2]/*[2]"/>\r
267                                 <xsl:apply-templates select=".">\r
268                                         <xsl:with-param name="first" select="2"/>\r
269                                         <xsl:with-param name="p" select="2"/>\r
270                                 </xsl:apply-templates>\r
271                         </xsl:when>\r
272                         <xsl:otherwise>\r
273                                 <xsl:apply-templates select=".">\r
274                                         <xsl:with-param name="p" select="2"/>\r
275                                 </xsl:apply-templates>\r
276                         </xsl:otherwise>\r
277                 </xsl:choose>\r
278         </xsl:for-each>\r
279         <xsl:if test="$p &gt; 2">\r
280                 <xsl:text>)</xsl:text>\r
281         </xsl:if>\r
282 </xsl:template>\r
283 \r
284 <!-- 4.4.3.7 power -->\r
285 <xsl:template match="m:apply[*[1][self::m:power]]">\r
286         <xsl:apply-templates select="*[2]">\r
287                 <xsl:with-param name="p" select="5"/>\r
288         </xsl:apply-templates>\r
289         <xsl:text>^{</xsl:text>\r
290         <xsl:apply-templates select="*[3]">\r
291                 <xsl:with-param name="p" select="5"/>\r
292         </xsl:apply-templates>\r
293         <xsl:text>}</xsl:text>\r
294 </xsl:template>\r
295 \r
296 <!-- 4.4.3.8 remainder -->\r
297 <xsl:template match="m:apply[*[1][self::m:rem]]">\r
298         <xsl:param name="p" select="0"/>\r
299         <xsl:call-template name="binary">\r
300                 <xsl:with-param name="mo">\mod </xsl:with-param>\r
301                 <xsl:with-param name="p" select="$p"/>\r
302                 <xsl:with-param name="this-p" select="3"/>\r
303         </xsl:call-template>\r
304 </xsl:template>\r
305 \r
306 <!-- 4.4.3.9  times-->\r
307 <xsl:template match="m:apply[*[1][self::m:times]]" name="times">\r
308   <xsl:param name="p" select="0"/>\r
309   <xsl:param name="first" select="1"/>\r
310   <xsl:if test="$p &gt; 3"><xsl:text>(</xsl:text></xsl:if>\r
311   <xsl:for-each select="*[position()&gt;1]">\r
312                 <xsl:if test="position() &gt; 1">\r
313                         <xsl:choose>\r
314                                 <xsl:when test="self::m:cn">\times <!-- times --></xsl:when>\r
315                                 <xsl:otherwise><!--invisible times--></xsl:otherwise>\r
316                         </xsl:choose>\r
317                 </xsl:if> \r
318                 <xsl:if test="position()&gt;= $first">\r
319                         <xsl:apply-templates select=".">\r
320                                 <xsl:with-param name="p" select="3"/>\r
321                         </xsl:apply-templates>\r
322                 </xsl:if>\r
323         </xsl:for-each>\r
324   <xsl:if test="$p &gt; 3"><xsl:text>)</xsl:text></xsl:if>\r
325 </xsl:template>\r
326 \r
327 <!-- 4.4.3.10 root -->\r
328 <xsl:template match="m:apply[*[1][self::m:root]]">\r
329         <xsl:text>\sqrt</xsl:text>\r
330         <xsl:if test="m:degree!=2">\r
331                 <xsl:text>[</xsl:text>\r
332                 <xsl:apply-templates select="m:degree/*"/>\r
333                 <xsl:text>]</xsl:text>\r
334         </xsl:if>\r
335         <xsl:text>{</xsl:text>\r
336         <xsl:apply-templates select="*[position()&gt;1 and not(self::m:degree)]"/>\r
337         <xsl:text>}</xsl:text>\r
338 </xsl:template>\r
339 \r
340 <!-- 4.4.3.11 gcd -->\r
341 <xsl:template match="m:gcd"><xsl:text>\gcd </xsl:text></xsl:template>\r
342 \r
343 <!-- 4.4.3.12 and -->\r
344 <xsl:template match="m:apply[*[1][self::m:and]]">\r
345         <xsl:param name="p" select="0"/>\r
346         <xsl:call-template name="infix">\r
347                 <xsl:with-param name="this-p" select="2"/>\r
348                 <xsl:with-param name="p" select="$p"/>\r
349                 <xsl:with-param name="mo">\land <!-- and --></xsl:with-param>\r
350         </xsl:call-template>\r
351 </xsl:template>\r
352 \r
353 <!-- 4.4.3.13 or -->\r
354 <xsl:template match="m:apply[*[1][self::m:or]]">\r
355         <xsl:param name="p" select="0"/>\r
356         <xsl:call-template name="infix">\r
357                 <xsl:with-param name="this-p" select="3"/>\r
358                 <xsl:with-param name="p" select="$p"/>\r
359                 <xsl:with-param name="mo">\lor </xsl:with-param>\r
360         </xsl:call-template>\r
361 </xsl:template>\r
362 \r
363 <!-- 4.4.3.14 xor -->\r
364 <xsl:template match="m:apply[*[1][self::m:xor]]">\r
365         <xsl:param name="p" select="0"/>\r
366         <xsl:call-template name="infix">\r
367                 <xsl:with-param name="this-p" select="3"/>\r
368                 <xsl:with-param name="p" select="$p"/>\r
369                 <xsl:with-param name="mo">\mathop{\mathrm{xor}}</xsl:with-param>\r
370         </xsl:call-template>\r
371 </xsl:template>\r
372 \r
373 <!-- 4.4.3.15 not -->\r
374 <xsl:template match="m:apply[*[1][self::m:not]]">\r
375         <xsl:text>\neg </xsl:text>\r
376         <xsl:apply-templates select="*[2]">\r
377                 <xsl:with-param name="p" select="7"/>\r
378         </xsl:apply-templates>\r
379 </xsl:template>\r
380 \r
381 <!-- 4.4.3.16 implies -->\r
382 <xsl:template match="m:apply[*[1][self::m:implies]] | m:reln[*[1][self::m:implies]]">\r
383         <xsl:param name="p" select="0"/>\r
384         <xsl:call-template name="binary">\r
385                 <xsl:with-param name="mo">\implies </xsl:with-param>\r
386                 <xsl:with-param name="p" select="$p"/>\r
387                 <xsl:with-param name="this-p" select="3"/>\r
388         </xsl:call-template>\r
389 </xsl:template>\r
390 \r
391 <!-- 4.4.3.17 forall 4.4.3.18 exists -->\r
392 <xsl:template match="m:apply[*[1][self::m:forall or self::m:exists]]">\r
393         <xsl:text>\</xsl:text>\r
394         <xsl:value-of select="local-name(*[1])"/>\r
395         <xsl:text> </xsl:text>\r
396         <xsl:apply-templates select="m:bvar"/>\r
397         <xsl:if test="m:condition">\r
398                 <xsl:text>, </xsl:text><xsl:apply-templates select="m:condition"/>\r
399         </xsl:if>\r
400         <xsl:if test="*[last()][local-name()!='condition'][local-name()!='bvar']">\r
401                 <xsl:text>\colon </xsl:text>\r
402           <xsl:apply-templates select="*[last()]"/>\r
403   </xsl:if>\r
404 </xsl:template>\r
405 \r
406 <!-- 4.4.3.19 abs -->\r
407 <xsl:template match="m:apply[*[1][self::m:abs]]">\r
408         <xsl:text>\left|</xsl:text>\r
409         <xsl:apply-templates select="*[2]"/>\r
410         <xsl:text>\right|</xsl:text>\r
411 </xsl:template>\r
412 \r
413 <!-- 4.4.3.20 conjugate -->\r
414 <xsl:template match="m:apply[*[1][self::m:conjugate]]">\r
415         <xsl:text>\overline{</xsl:text><xsl:apply-templates select="*[2]"/><xsl:text>}</xsl:text>\r
416 </xsl:template>\r
417 \r
418 <!-- 4.4.3.22 real -->\r
419 <xsl:template match="m:real"><xsl:text>\Re </xsl:text></xsl:template>\r
420 \r
421 <!-- 4.4.3.23 imaginary -->\r
422 <xsl:template match="m:imaginary"><xsl:text>\Im </xsl:text></xsl:template>\r
423 \r
424 <!-- 4.4.3.25 floor -->\r
425 <xsl:template match="m:apply[*[1][self::m:floor]]">\r
426         <xsl:text>\lfloor </xsl:text>\r
427         <xsl:apply-templates select="*[2]"/>\r
428         <xsl:text>\rfloor </xsl:text>\r
429 </xsl:template>\r
430 \r
431 <!-- 4.4.3.25 ceiling -->\r
432 <xsl:template match="m:apply[*[1][self::m:ceiling]]">\r
433         <xsl:text>\lceil </xsl:text>\r
434         <xsl:apply-templates select="*[2]"/>\r
435         <xsl:text>\rceil </xsl:text>\r
436 </xsl:template>\r
437 \r
438 <!-- 4.4.4.1 eq -->\r
439 <xsl:template match="m:apply[*[1][self::m:eq]] | m:reln[*[1][self::m:eq]]">\r
440         <xsl:param name="p" select="0"/>\r
441         <xsl:call-template name="infix">\r
442                 <xsl:with-param name="this-p" select="1"/>\r
443                 <xsl:with-param name="p" select="$p"/>\r
444                 <xsl:with-param name="mo">=</xsl:with-param>\r
445         </xsl:call-template>\r
446 </xsl:template>\r
447 \r
448 <!-- 4.4.4.2 neq -->\r
449 <xsl:template match="m:apply[*[1][self::m:neq]] | m:reln[*[1][self::m:neq]]">\r
450         <xsl:param name="p" select="0"/>\r
451         <xsl:call-template name="infix">\r
452                 <xsl:with-param name="this-p" select="1"/>\r
453                 <xsl:with-param name="p" select="$p"/>\r
454                 <xsl:with-param name="mo">\neq </xsl:with-param>\r
455         </xsl:call-template>\r
456 </xsl:template>\r
457 \r
458 <!-- 4.4.4.3 gt -->\r
459 <xsl:template match="m:apply[*[1][self::m:gt]] | m:reln[*[1][self::m:gt]]">\r
460 <xsl:param name="p" select="0"/>\r
461 <xsl:call-template name="infix">\r
462         <xsl:with-param name="this-p" select="1"/>\r
463         <xsl:with-param name="p" select="$p"/>\r
464         <xsl:with-param name="mo">&gt; </xsl:with-param>\r
465 </xsl:call-template>\r
466 </xsl:template>\r
467 \r
468 <!-- 4.4.4.4 lt -->\r
469 <xsl:template match="m:apply[*[1][self::m:lt]] | m:reln[*[1][self::m:lt]]">\r
470 <xsl:param name="p" select="0"/>\r
471 <xsl:call-template name="infix">\r
472         <xsl:with-param name="this-p" select="1"/>\r
473         <xsl:with-param name="p" select="$p"/>\r
474         <xsl:with-param name="mo">&lt; </xsl:with-param>\r
475 </xsl:call-template>\r
476 </xsl:template>\r
477 \r
478 <!-- 4.4.4.5 geq -->\r
479 <xsl:template match="m:apply[*[1][self::m:geq]] | m:reln[*[1][self::m:geq]]">\r
480         <xsl:param name="p" select="0"/>\r
481         <xsl:call-template name="infix">\r
482                 <xsl:with-param name="this-p" select="1"/>\r
483                 <xsl:with-param name="p" select="$p"/>\r
484                 <xsl:with-param name="mo">\ge </xsl:with-param>\r
485         </xsl:call-template>\r
486 </xsl:template>\r
487 \r
488 <!-- 4.4.4.6 leq -->\r
489 <xsl:template match="m:apply[*[1][self::m:leq]] | m:reln[*[1][self::m:leq]]">\r
490         <xsl:param name="p" select="0"/>\r
491         <xsl:call-template name="infix">\r
492                 <xsl:with-param name="this-p" select="1"/>\r
493                 <xsl:with-param name="p" select="$p"/>\r
494                 <xsl:with-param name="mo">\le </xsl:with-param>\r
495         </xsl:call-template>\r
496 </xsl:template>\r
497 \r
498 <!-- 4.4.4.7 equivalent -->\r
499 <xsl:template match="m:apply[*[1][self::m:equivalent]] | m:reln[*[1][self::m:equivalent]]">\r
500         <xsl:param name="p" select="0"/>\r
501         <xsl:call-template name="infix">\r
502                 <xsl:with-param name="this-p" select="1"/>\r
503                 <xsl:with-param name="p" select="$p"/>\r
504                 <xsl:with-param name="mo">\equiv </xsl:with-param>\r
505         </xsl:call-template>\r
506 </xsl:template>\r
507 \r
508 <!-- 4.4.4.8 approx -->\r
509 <xsl:template match="m:apply[*[1][self::m:approx]] | m:reln[*[1][self::m:approx]]">\r
510         <xsl:param name="p" select="0"/>\r
511         <xsl:call-template name="infix">\r
512                 <xsl:with-param name="this-p" select="1"/>\r
513                 <xsl:with-param name="p" select="$p"/>\r
514                 <xsl:with-param name="mo">\approx </xsl:with-param>\r
515         </xsl:call-template>\r
516 </xsl:template>\r
517 \r
518 <!-- 4.4.4.9 factorof -->\r
519 <xsl:template match="m:apply[*[1][self::m:factorof]] | m:reln[*[1][self::m:factorof]]">\r
520         <xsl:param name="p" select="0"/>\r
521         <xsl:call-template name="binary">\r
522                 <xsl:with-param name="mo"> | </xsl:with-param>\r
523                 <xsl:with-param name="p" select="$p"/>\r
524                 <xsl:with-param name="this-p" select="3"/>\r
525         </xsl:call-template>\r
526 </xsl:template>\r
527 \r
528 <!-- 4.4.5.1 int -->\r
529 <xsl:template match="m:apply[*[1][self::m:int]]">\r
530         <xsl:text>\int</xsl:text>\r
531         <xsl:if test="m:lowlimit/*|m:interval/*[1]|m:condition/*">\r
532                 <xsl:text>_{</xsl:text>\r
533                 <xsl:apply-templates select="m:lowlimit/*|m:interval/*[1]|m:condition/*"/>\r
534                 <xsl:text>}</xsl:text>\r
535         </xsl:if>\r
536         <xsl:if test="m:uplimit/*|m:interval/*[2]">\r
537                 <xsl:text>^{</xsl:text>\r
538                 <xsl:apply-templates select="m:uplimit/*|m:interval/*[2]"/>\r
539                 <xsl:text>}</xsl:text>\r
540         </xsl:if>\r
541         <xsl:text> </xsl:text>\r
542         <xsl:apply-templates select="*[last()]"/>\r
543         <xsl:text>\,d </xsl:text>\r
544         <xsl:apply-templates select="m:bvar"/>\r
545 </xsl:template>\r
546 \r
547 <!-- 4.4.5.2 diff -->\r
548 <xsl:template match="m:apply[*[1][self::m:diff] and m:ci and count(*)=2]" priority="2">\r
549         <xsl:apply-templates select="*[2]"/>\r
550         <xsl:text>^\prime </xsl:text>\r
551 </xsl:template>\r
552 \r
553 <xsl:template match="m:apply[*[1][self::m:diff]]" priority="1">\r
554         <xsl:text>\frac{</xsl:text>\r
555         <xsl:choose>\r
556                 <xsl:when test="m:bvar/m:degree">\r
557                         <xsl:text>d^{</xsl:text>\r
558                         <xsl:apply-templates select="m:bvar/m:degree/node()"/>\r
559                         <xsl:text>}</xsl:text>\r
560                         <xsl:apply-templates select="*[last()]"/>\r
561                         <xsl:text>}{d</xsl:text>\r
562                         <xsl:apply-templates select="m:bvar/node()"/>\r
563                         <xsl:text>^{</xsl:text>\r
564                         <xsl:apply-templates select="m:bvar/m:degree/node()"/>\r
565                         <xsl:text>}</xsl:text>\r
566                 </xsl:when>\r
567                 <xsl:otherwise>\r
568                         <xsl:text>d </xsl:text>\r
569                         <xsl:apply-templates select="*[last()]"/>\r
570                         <xsl:text>}{d </xsl:text>\r
571                         <xsl:apply-templates select="m:bvar"/>\r
572                 </xsl:otherwise>\r
573         </xsl:choose>\r
574         <xsl:text>}</xsl:text>\r
575 </xsl:template>\r
576 \r
577 <!-- 4.4.5.3 partialdiff -->\r
578 <xsl:template match="m:apply[*[1][self::m:partialdiff] and m:list and m:ci and count(*)=3]" priority="2">\r
579         <xsl:text>D_{</xsl:text>\r
580         <xsl:for-each select="m:list[1]/*">\r
581                 <xsl:apply-templates select="."/>\r
582                 <xsl:if test="position()&lt;last()"><xsl:text>, </xsl:text></xsl:if>\r
583         </xsl:for-each>\r
584         <xsl:text>}</xsl:text>\r
585         <xsl:apply-templates select="*[3]"/>\r
586 </xsl:template>\r
587 \r
588 <xsl:template match="m:apply[*[1][self::m:partialdiff]]" priority="1">\r
589         <xsl:text>\frac{\partial^{</xsl:text>\r
590         <xsl:choose>\r
591                 <xsl:when test="m:degree">\r
592                         <xsl:apply-templates select="m:degree/node()"/>\r
593                 </xsl:when>\r
594                 <xsl:when test="m:bvar/m:degree[string(number(.))='NaN']">\r
595                         <xsl:for-each select="m:bvar/m:degree">\r
596                                 <xsl:apply-templates select="node()"/>\r
597                                 <xsl:if test="position()&lt;last()"><xsl:text>+</xsl:text></xsl:if>\r
598                         </xsl:for-each>\r
599                         <xsl:if test="count(m:bvar[not(m:degree)])&gt;0">\r
600                                 <xsl:text>+</xsl:text>\r
601                                 <xsl:value-of select="count(m:bvar[not(m:degree)])"/>\r
602                         </xsl:if>\r
603                 </xsl:when>\r
604                 <xsl:otherwise>\r
605                         <xsl:value-of select="sum(m:bvar/m:degree)+count(m:bvar[not(m:degree)])"/>\r
606                 </xsl:otherwise>\r
607         </xsl:choose>\r
608         <xsl:text>}</xsl:text>\r
609         <xsl:apply-templates select="*[last()]"/>\r
610         <xsl:text>}{</xsl:text>\r
611         <xsl:for-each select="m:bvar">\r
612                 <xsl:text>\partial </xsl:text>\r
613                 <xsl:apply-templates select="node()"/>\r
614                 <xsl:if test="m:degree">\r
615                         <xsl:text>^{</xsl:text>\r
616                         <xsl:apply-templates select="m:degree/node()"/>\r
617                         <xsl:text>}</xsl:text>\r
618                 </xsl:if>\r
619         </xsl:for-each>\r
620         <xsl:text>}</xsl:text>\r
621 </xsl:template>\r
622 \r
623 <!-- 4.4.2.8 declare 4.4.5.4 lowlimit 4.4.5.5 uplimit 4.4.5.7 degree 4.4.9.5 momentabout -->\r
624 <xsl:template match="m:declare | m:lowlimit | m:uplimit | m:degree | m:momentabout"/>\r
625 \r
626 <!-- 4.4.5.6  bvar-->\r
627 <xsl:template match="m:bvar">\r
628         <xsl:apply-templates/>\r
629         <xsl:if test="following-sibling::m:bvar"><xsl:text>, </xsl:text></xsl:if>\r
630 </xsl:template>\r
631 \r
632 <!-- 4.4.5.8 divergence-->\r
633 <xsl:template match="m:divergence"><xsl:text>\mathop{\mathrm{div}}</xsl:text></xsl:template>\r
634 \r
635 <!-- 4.4.5.11 laplacian-->\r
636 <xsl:template match="m:laplacian"><xsl:text>\nabla^2 </xsl:text></xsl:template>\r
637 \r
638 <!-- 4.4.6.1 set -->\r
639 <xsl:template match="m:set">\r
640         <xsl:text>\{</xsl:text><xsl:call-template name="set"/><xsl:text>\}</xsl:text>\r
641 </xsl:template>\r
642 \r
643 <!-- 4.4.6.2 list -->\r
644 <xsl:template match="m:list">\r
645         <xsl:text>\left[</xsl:text><xsl:call-template name="set"/><xsl:text>\right]</xsl:text>\r
646 </xsl:template>\r
647 \r
648 <xsl:template name="set">\r
649    <xsl:choose>\r
650                 <xsl:when test="m:condition">\r
651                 <xsl:apply-templates select="m:bvar/*[not(self::bvar or self::condition)]"/>\r
652                 <xsl:text>\colon </xsl:text>\r
653                         <xsl:apply-templates select="m:condition/node()"/>\r
654                 </xsl:when>\r
655                 <xsl:otherwise>\r
656                         <xsl:for-each select="*">\r
657                                 <xsl:apply-templates select="."/>\r
658                                 <xsl:if test="position()!=last()"><xsl:text>, </xsl:text></xsl:if>\r
659                         </xsl:for-each>\r
660                 </xsl:otherwise>\r
661    </xsl:choose>\r
662 </xsl:template>\r
663 \r
664 <!-- 4.4.6.3 union -->\r
665 <xsl:template match="m:apply[*[1][self::m:union]]">\r
666         <xsl:param name="p" select="0"/>\r
667         <xsl:call-template name="infix">\r
668                 <xsl:with-param name="this-p" select="2"/>\r
669                 <xsl:with-param name="p" select="$p"/>\r
670                 <xsl:with-param name="mo">\cup </xsl:with-param>\r
671         </xsl:call-template>\r
672 </xsl:template>\r
673 \r
674 <!-- 4.4.6.4 intersect -->\r
675 <xsl:template match="m:apply[*[1][self::m:intersect]]">\r
676         <xsl:param name="p" select="0"/>\r
677         <xsl:call-template name="infix">\r
678                 <xsl:with-param name="this-p" select="3"/>\r
679                 <xsl:with-param name="p" select="$p"/>\r
680                 <xsl:with-param name="mo">\cap </xsl:with-param>\r
681         </xsl:call-template>\r
682 </xsl:template>\r
683 \r
684 <!-- 4.4.6.5 in -->\r
685 <xsl:template match="m:apply[*[1][self::m:in]] | m:reln[*[1][self::m:in]]">\r
686         <xsl:param name="p" select="0"/>\r
687         <xsl:call-template name="binary">\r
688                 <xsl:with-param name="mo">\in </xsl:with-param>\r
689                 <xsl:with-param name="p" select="$p"/>\r
690                 <xsl:with-param name="this-p" select="3"/>\r
691         </xsl:call-template>\r
692 </xsl:template>\r
693 \r
694 <!-- 4.4.6.6 notin -->\r
695 <xsl:template match="m:apply[*[1][self::m:notin]] | m:reln[*[1][self::m:notin]]">\r
696         <xsl:param name="p" select="0"/>\r
697         <xsl:call-template name="binary">\r
698                 <xsl:with-param name="mo">\notin </xsl:with-param>\r
699                 <xsl:with-param name="p" select="$p"/>\r
700                 <xsl:with-param name="this-p" select="3"/>\r
701         </xsl:call-template>\r
702 </xsl:template>\r
703 \r
704 <!-- 4.4.6.7 subset -->\r
705 <xsl:template match="m:apply[*[1][self::m:subset]] | m:reln[*[1][self::m:subset]]">\r
706         <xsl:param name="p" select="0"/>\r
707         <xsl:call-template name="infix">\r
708                 <xsl:with-param name="this-p" select="2"/>\r
709                 <xsl:with-param name="p" select="$p"/>\r
710                 <xsl:with-param name="mo">\subseteq </xsl:with-param>\r
711         </xsl:call-template>\r
712 </xsl:template>\r
713 \r
714 <!-- 4.4.6.8 prsubset -->\r
715 <xsl:template match="m:apply[*[1][self::m:prsubset]] | m:reln[*[1][self::m:prsubset]]">\r
716         <xsl:param name="p" select="0"/>\r
717         <xsl:call-template name="infix">\r
718                 <xsl:with-param name="this-p" select="2"/>\r
719                 <xsl:with-param name="p" select="$p"/>\r
720                 <xsl:with-param name="mo">\subset </xsl:with-param>\r
721         </xsl:call-template>\r
722 </xsl:template>\r
723 \r
724 <!-- 4.4.6.9 notsubset -->\r
725 <xsl:template match="m:apply[*[1][self::m:notsubset]] | m:reln[*[1][self::m:notsubset]]">\r
726         <xsl:param name="p" select="0"/>\r
727         <xsl:call-template name="binary">\r
728                 <xsl:with-param name="this-p" select="2"/>\r
729                 <xsl:with-param name="p" select="$p"/>\r
730                 <xsl:with-param name="mo">\nsubseteq </xsl:with-param>\r
731         </xsl:call-template>\r
732 </xsl:template>\r
733 \r
734 <!-- 4.4.6.10 notprsubset -->\r
735 <xsl:template match="m:apply[*[1][self::m:notprsubset]] | m:reln[*[1][self::m:notprsubset]]">\r
736         <xsl:param name="p" select="0"/>\r
737         <xsl:call-template name="binary">\r
738                 <xsl:with-param name="this-p" select="2"/>\r
739                 <xsl:with-param name="p" select="$p"/>\r
740                 <xsl:with-param name="mo">\not\subset </xsl:with-param>\r
741         </xsl:call-template>\r
742 </xsl:template>\r
743 \r
744 <!-- 4.4.6.11 setdiff -->\r
745 <xsl:template match="m:apply[*[1][self::m:setdiff]]">\r
746         <xsl:param name="p" select="0"/>\r
747         <xsl:call-template name="binary">\r
748                 <xsl:with-param name="this-p" select="2"/>\r
749                 <xsl:with-param name="p" select="$p"/>\r
750                 <xsl:with-param name="mo">\setminus </xsl:with-param>\r
751         </xsl:call-template>\r
752 </xsl:template>\r
753 \r
754 <!-- 4.4.6.12 card -->\r
755 <xsl:template match="m:apply[*[1][self::m:card]]">\r
756         <xsl:text>|</xsl:text>\r
757         <xsl:apply-templates select="*[2]"/>\r
758         <xsl:text>|</xsl:text>\r
759 </xsl:template>\r
760 \r
761 <!-- 4.4.6.13 cartesianproduct 4.4.10.6 vectorproduct -->\r
762 <xsl:template match="m:apply[*[1][self::m:cartesianproduct or self::m:vectorproduct]]">\r
763         <xsl:param name="p" select="0"/>\r
764         <xsl:call-template name="infix">\r
765                 <xsl:with-param name="this-p" select="2"/>\r
766                 <xsl:with-param name="p" select="$p"/>\r
767                 <xsl:with-param name="mo">\times </xsl:with-param>\r
768         </xsl:call-template>\r
769 </xsl:template>\r
770 \r
771 <xsl:template\r
772 match="m:apply[*[1][self::m:cartesianproduct][count(following-sibling::m:reals)=count(following-sibling::*)]]"\r
773 priority="2">\r
774         <xsl:apply-templates select="*[2]">\r
775                 <xsl:with-param name="p" select="5"/>\r
776         </xsl:apply-templates>\r
777         <xsl:text>^{</xsl:text>\r
778         <xsl:value-of select="count(*)-1"/>\r
779         <xsl:text>}</xsl:text>\r
780 </xsl:template>\r
781 \r
782 <!-- 4.4.7.1 sum -->\r
783 <xsl:template match="m:apply[*[1][self::m:sum]]">\r
784         <xsl:text>\sum</xsl:text><xsl:call-template name="series"/>\r
785 </xsl:template>\r
786 \r
787 <!-- 4.4.7.2 product -->\r
788 <xsl:template match="m:apply[*[1][self::m:product]]">\r
789         <xsl:text>\prod</xsl:text><xsl:call-template name="series"/>\r
790 </xsl:template>\r
791         \r
792 <xsl:template name="series">\r
793         <xsl:if test="m:lowlimit/*|m:interval/*[1]|m:condition/*">\r
794                 <xsl:text>_{</xsl:text>\r
795                 <xsl:if test="not(m:condition)">\r
796                         <xsl:apply-templates select="m:bvar"/>\r
797                         <xsl:text>=</xsl:text>\r
798                 </xsl:if>\r
799                 <xsl:apply-templates select="m:lowlimit/*|m:interval/*[1]|m:condition/*"/>\r
800                 <xsl:text>}</xsl:text>\r
801         </xsl:if>\r
802         <xsl:if test="m:uplimit/*|m:interval/*[2]">\r
803                 <xsl:text>^{</xsl:text>\r
804                 <xsl:apply-templates select="m:uplimit/*|m:interval/*[2]"/>\r
805                 <xsl:text>}</xsl:text>\r
806         </xsl:if>\r
807         <xsl:text> </xsl:text>\r
808         <xsl:apply-templates select="*[last()]"/>\r
809 </xsl:template>\r
810 \r
811 <!-- 4.4.7.3 limit -->\r
812 <xsl:template match="m:apply[*[1][self::m:limit]]">\r
813         <xsl:text>\lim_{</xsl:text>\r
814         <xsl:apply-templates select="m:lowlimit|m:condition/*"/>\r
815         <xsl:text>}</xsl:text>\r
816         <xsl:apply-templates select="*[last()]"/>\r
817 </xsl:template>\r
818 \r
819 <xsl:template match="m:apply[m:limit]/m:lowlimit" priority="3">\r
820         <xsl:apply-templates select="../m:bvar/node()"/>\r
821         <xsl:text>\to </xsl:text>\r
822         <xsl:apply-templates/>\r
823 </xsl:template>\r
824 \r
825 <!-- 4.4.7.4 tendsto -->\r
826 <xsl:template match="m:apply[*[1][self::m:tendsto]] | m:reln[*[1][self::m:tendsto]]">\r
827         <xsl:param name="p"/>\r
828         <xsl:call-template name="binary">\r
829                 <xsl:with-param name="this-p" select="2"/>\r
830                 <xsl:with-param name="p" select="$p"/>\r
831                 <xsl:with-param name="mo">\r
832                         <xsl:choose>\r
833                                 <xsl:when test="*[1][@type='above']">\searrow </xsl:when>\r
834                                 <xsl:when test="*[1][@type='below']">\nearrow </xsl:when>\r
835                                 <xsl:when test="*[1][@type='two-sided']">\rightarrow </xsl:when>\r
836                                 <xsl:otherwise>\to </xsl:otherwise>\r
837                         </xsl:choose>\r
838                 </xsl:with-param>\r
839         </xsl:call-template>\r
840 </xsl:template>\r
841 \r
842 <!-- 4.4.8.1 common tringonometric functions 4.4.8.3 natural logarithm -->\r
843 <xsl:template match="m:apply[*[1][\r
844  self::m:sin or                 self::m:cos or  self::m:tan or          self::m:sec or\r
845  self::m:csc or                 self::m:cot or  self::m:sinh or         self::m:cosh or\r
846  self::m:tanh or                self::m:coth or self::m:arcsin or       self::m:arccos or\r
847  self::m:arctan or      self::m:ln]]">\r
848         <xsl:text>\</xsl:text>\r
849         <xsl:value-of select="local-name(*[1])"/>\r
850         <xsl:text> </xsl:text>\r
851         <xsl:apply-templates select="*[2]">\r
852                 <xsl:with-param name="p" select="7"/>\r
853         </xsl:apply-templates>\r
854 </xsl:template>\r
855 \r
856 <xsl:template match="m:sin | m:cos | m:tan | m:sec | m:csc |\r
857                                                                  m:cot | m:sinh | m:cosh | m:tanh | m:coth |\r
858                                                                  m:arcsin | m:arccos | m:arctan | m:ln">\r
859         <xsl:text>\</xsl:text>\r
860         <xsl:value-of select="local-name(.)"/>\r
861         <xsl:text> </xsl:text>\r
862 </xsl:template>\r
863 \r
864 <xsl:template match="m:apply[*[1][\r
865  self::m:sech or                self::m:csch or         self::m:arccosh or\r
866  self::m:arccot or      self::m:arccoth or      self::m:arccsc or\r
867  self::m:arccsch or self::m:arcsec or   self::m:arcsech or\r
868  self::m:arcsinh or self::m:arctanh]]">\r
869         <xsl:text>\mathrm{</xsl:text>\r
870         <xsl:value-of select="local-name(*[1])"/>\r
871         <xsl:text>\,}</xsl:text>\r
872         <xsl:apply-templates select="*[2]">\r
873                 <xsl:with-param name="p" select="7"/>\r
874         </xsl:apply-templates>\r
875 </xsl:template>\r
876 \r
877 <xsl:template match="m:sech | m:csch | m:arccosh | m:arccot |\r
878                                                                  m:arccoth | m:arccsc |m:arccsch |m:arcsec |\r
879                                                                  m:arcsech | m:arcsinh | m:arctanh">\r
880         <xsl:text>\mathrm{</xsl:text>\r
881         <xsl:value-of select="local-name(.)"/>\r
882         <xsl:text>}</xsl:text>\r
883 </xsl:template>\r
884 \r
885 <!-- 4.4.8.2 exp -->\r
886 <xsl:template match="m:apply[*[1][self::m:exp]]">\r
887         <xsl:text>e^{</xsl:text><xsl:apply-templates select="*[2]"/><xsl:text>}</xsl:text>\r
888 </xsl:template>\r
889 \r
890 <!-- 4.4.8.4 log -->\r
891 <xsl:template match="m:apply[*[1][self::m:log]]">\r
892         <xsl:text>\lg </xsl:text>\r
893         <xsl:apply-templates select="*[last()]">\r
894                 <xsl:with-param name="p" select="7"/>\r
895         </xsl:apply-templates>\r
896 </xsl:template>\r
897 \r
898 <xsl:template match="m:apply[*[1][self::m:log] and m:logbase != 10]">\r
899         <xsl:text>\log_{</xsl:text>\r
900         <xsl:apply-templates select="m:logbase/node()"/>\r
901         <xsl:text>}</xsl:text>\r
902         <xsl:apply-templates select="*[last()]">\r
903                 <xsl:with-param name="p" select="7"/>\r
904         </xsl:apply-templates>\r
905 </xsl:template>\r
906 \r
907 <!-- 4.4.9.1 mean -->\r
908 <xsl:template match="m:apply[*[1][self::m:mean]]">\r
909         <xsl:text>\langle </xsl:text>\r
910         <xsl:for-each select="*[position()&gt;1]">\r
911                 <xsl:apply-templates select="."/>\r
912                 <xsl:if test="position() !=last()"><xsl:text>, </xsl:text></xsl:if>\r
913         </xsl:for-each>\r
914         <xsl:text>\rangle </xsl:text>\r
915 </xsl:template>\r
916 \r
917 <!-- 4.4.9.2 sdef -->\r
918 <xsl:template match="m:sdev"><xsl:text>\sigma </xsl:text></xsl:template>\r
919 \r
920 <!-- 4.4.9.3 variance -->\r
921 <xsl:template match="m:apply[*[1][self::m:variance]]">\r
922         <xsl:text>\sigma(</xsl:text>\r
923         <xsl:apply-templates select="*[2]"/>\r
924         <xsl:text>)^2</xsl:text>\r
925 </xsl:template>\r
926 \r
927 <!-- 4.4.9.5 moment -->\r
928 <xsl:template match="m:apply[*[1][self::m:moment]]">\r
929         <xsl:text>\langle </xsl:text>\r
930         <xsl:apply-templates select="*[last()]"/>\r
931         <xsl:text>^{</xsl:text>\r
932         <xsl:apply-templates select="m:degree/node()"/>\r
933         <xsl:text>}\rangle</xsl:text>\r
934         <xsl:if test="m:momentabout">\r
935                 <xsl:text>_{</xsl:text>\r
936                 <xsl:apply-templates select="m:momentabout/node()"/>\r
937                 <xsl:text>}</xsl:text>\r
938         </xsl:if>\r
939         <xsl:text> </xsl:text>\r
940 </xsl:template>\r
941 \r
942 <!-- 4.4.10.1 vector  -->\r
943 <xsl:template match="m:vector">\r
944         <xsl:text>\left(\begin{array}{c}</xsl:text>\r
945         <xsl:for-each select="*">\r
946                 <xsl:apply-templates select="."/>\r
947                 <xsl:if test="position()!=last()"><xsl:text>\\ </xsl:text></xsl:if>\r
948         </xsl:for-each>\r
949         <xsl:text>\end{array}\right)</xsl:text>\r
950 </xsl:template>\r
951 \r
952 <!-- 4.4.10.2 matrix  -->\r
953 <xsl:template match="m:matrix">\r
954         <xsl:text>\begin{pmatrix}</xsl:text>\r
955         <xsl:apply-templates/>\r
956         <xsl:text>\end{pmatrix}</xsl:text>\r
957 </xsl:template>\r
958 \r
959 <!-- 4.4.10.3 matrixrow  -->\r
960 <xsl:template match="m:matrixrow">\r
961         <xsl:for-each select="*">\r
962                 <xsl:apply-templates select="."/>\r
963                 <xsl:if test="position()!=last()"><xsl:text> &amp; </xsl:text></xsl:if>\r
964         </xsl:for-each>\r
965         <xsl:if test="position()!=last()"><xsl:text>\\ </xsl:text></xsl:if>\r
966 </xsl:template>\r
967 \r
968 <!-- 4.4.10.4 determinant  -->\r
969 <xsl:template match="m:apply[*[1][self::m:determinant]]">\r
970         <xsl:text>\det </xsl:text>\r
971         <xsl:apply-templates select="*[2]">\r
972                 <xsl:with-param name="p" select="7"/>\r
973         </xsl:apply-templates>\r
974 </xsl:template>\r
975 \r
976 <xsl:template match="m:apply[*[1][self::m:determinant]][*[2][self::m:matrix]]" priority="2">\r
977         <xsl:text>\begin{vmatrix}</xsl:text>\r
978         <xsl:apply-templates select="m:matrix/*"/>\r
979         <xsl:text>\end{vmatrix}</xsl:text>\r
980 </xsl:template>\r
981 \r
982 <!-- 4.4.10.5 transpose -->\r
983 <xsl:template match="m:apply[*[1][self::m:transpose]]">\r
984         <xsl:apply-templates select="*[2]">\r
985                 <xsl:with-param name="p" select="7"/>\r
986         </xsl:apply-templates>\r
987         <xsl:text>^T</xsl:text>\r
988 </xsl:template>\r
989 \r
990 <!-- 4.4.10.6 selector -->\r
991 <xsl:template match="m:apply[*[1][self::m:selector]]">\r
992         <xsl:apply-templates select="*[2]">\r
993                 <xsl:with-param name="p" select="7"/>\r
994         </xsl:apply-templates>\r
995         <xsl:text>_{</xsl:text>\r
996         <xsl:for-each select="*[position()&gt;2]">\r
997                 <xsl:apply-templates select="."/>\r
998                 <xsl:if test="position() !=last()"><xsl:text>, </xsl:text></xsl:if>\r
999         </xsl:for-each>\r
1000         <xsl:text>}</xsl:text>\r
1001 </xsl:template>\r
1002 \r
1003 <!-- 4.4.10.8 scalarproduct -->\r
1004 <xsl:template match="m:apply[*[1][self::m:scalarproduct]]">\r
1005         <xsl:param name="p" select="0"/>\r
1006         <xsl:call-template name="infix">\r
1007                 <xsl:with-param name="this-p" select="2"/>\r
1008                 <xsl:with-param name="p" select="$p"/>\r
1009                 <xsl:with-param name="mo">\cdot </xsl:with-param>\r
1010         </xsl:call-template>\r
1011 </xsl:template>\r
1012 \r
1013 <!-- 4.4.10.9 outerproduct -->\r
1014 <xsl:template match="m:apply[*[1][self::m:outerproduct]]">\r
1015         <xsl:param name="p" select="0"/>\r
1016         <xsl:call-template name="infix">\r
1017                 <xsl:with-param name="this-p" select="2"/>\r
1018                 <xsl:with-param name="p" select="$p"/>\r
1019                 <xsl:with-param name="mo">\otimes </xsl:with-param>\r
1020         </xsl:call-template>\r
1021 </xsl:template>\r
1022 \r
1023 <!-- 4.4.11.2 semantics -->\r
1024 <xsl:template match="m:semantics"><xsl:apply-templates select="*[1]"/></xsl:template>\r
1025 \r
1026 <xsl:template match="m:semantics[m:annotation/@encoding='TeX']">\r
1027         <xsl:apply-templates select="m:annotation[@encoding='TeX']/node()"/>\r
1028 </xsl:template>\r
1029 \r
1030 <!-- 4.4.12.1 integers -->\r
1031 <xsl:template match="m:integers"><xsl:text>\mathbb{Z}</xsl:text></xsl:template>\r
1032 \r
1033 <!-- 4.4.12.2 reals -->\r
1034 <xsl:template match="m:reals"><xsl:text>\mathbb{R}</xsl:text></xsl:template>\r
1035 \r
1036 <!-- 4.4.12.3 rationals -->\r
1037 <xsl:template match="m:rationals"><xsl:text>\mathbb{Q}</xsl:text></xsl:template>\r
1038 \r
1039 <!-- 4.4.12.4 naturalnumbers -->\r
1040 <xsl:template match="m:naturalnumbers"><xsl:text>\mathbb{N}</xsl:text></xsl:template>\r
1041 \r
1042 <!-- 4.4.12.5 complexes -->\r
1043 <xsl:template match="m:complexes"><xsl:text>\mathbb{C}</xsl:text></xsl:template>\r
1044 \r
1045 <!-- 4.4.12.6 primes -->\r
1046 <xsl:template match="m:primes"><xsl:text>\mathbb{P}</xsl:text></xsl:template>\r
1047         \r
1048 <!-- 4.4.12.7 exponentiale -->\r
1049 <xsl:template match="m:exponentiale"><xsl:text>e</xsl:text></xsl:template>\r
1050 \r
1051 <!-- 4.4.12.8 imaginaryi -->\r
1052 <xsl:template match="m:imaginaryi"><xsl:text>i</xsl:text></xsl:template>\r
1053 \r
1054 <!-- 4.4.12.9 notanumber -->\r
1055 <xsl:template match="m:notanumber"><xsl:text>NaN</xsl:text></xsl:template>\r
1056 \r
1057 <!-- 4.4.12.10 true -->\r
1058 <xsl:template match="m:true"><xsl:text>\mbox{true}</xsl:text></xsl:template>\r
1059 \r
1060 <!-- 4.4.12.11 false -->\r
1061 <xsl:template match="m:false"><xsl:text>\mbox{false}</xsl:text></xsl:template>\r
1062 \r
1063 <!-- 4.4.12.12 emptyset -->\r
1064 <xsl:template match="m:emptyset"><xsl:text>\emptyset </xsl:text></xsl:template>\r
1065 \r
1066 <!-- 4.4.12.13 pi -->\r
1067 <xsl:template match="m:pi"><xsl:text>\pi </xsl:text></xsl:template>\r
1068 \r
1069 <!-- 4.4.12.14 eulergamma -->\r
1070 <xsl:template match="m:eulergamma"><xsl:text>\gamma </xsl:text></xsl:template>\r
1071 \r
1072 <!-- 4.4.12.15 infinity -->\r
1073 <xsl:template match="m:infinity"><xsl:text>\infty </xsl:text></xsl:template>\r
1074 \r
1075 <!-- ****************************** -->\r
1076 <xsl:template name="infix" >\r
1077   <xsl:param name="mo"/>\r
1078   <xsl:param name="p" select="0"/>\r
1079   <xsl:param name="this-p" select="0"/>\r
1080   <xsl:if test="$this-p &lt; $p"><xsl:text>(</xsl:text></xsl:if>\r
1081   <xsl:for-each select="*[position()&gt;1]">\r
1082                 <xsl:if test="position() &gt; 1">\r
1083                         <xsl:copy-of select="$mo"/>\r
1084                 </xsl:if>   \r
1085                 <xsl:apply-templates select=".">\r
1086                         <xsl:with-param name="p" select="$this-p"/>\r
1087                 </xsl:apply-templates>\r
1088         </xsl:for-each>\r
1089   <xsl:if test="$this-p &lt; $p"><xsl:text>)</xsl:text></xsl:if>\r
1090 </xsl:template>\r
1091 \r
1092 <xsl:template name="binary" >\r
1093   <xsl:param name="mo"/>\r
1094   <xsl:param name="p" select="0"/>\r
1095   <xsl:param name="this-p" select="0"/>\r
1096   <xsl:if test="$this-p &lt; $p"><xsl:text>(</xsl:text></xsl:if>\r
1097         <xsl:apply-templates select="*[2]">\r
1098                 <xsl:with-param name="p" select="$this-p"/>\r
1099         </xsl:apply-templates>\r
1100         <xsl:value-of select="$mo"/>\r
1101         <xsl:apply-templates select="*[3]">\r
1102         <xsl:with-param name="p" select="$this-p"/>\r
1103         </xsl:apply-templates>\r
1104         <xsl:if test="$this-p &lt; $p"><xsl:text>)</xsl:text></xsl:if>\r
1105 </xsl:template>\r
1106 \r
1107 </xsl:stylesheet>